From 855a09f4eded707941180c9d90acd17c25e29447 Mon Sep 17 00:00:00 2001 From: Ondřej Surý Date: Tue, 9 Mar 2010 11:57:54 +0100 Subject: Imported Upstream version 5.3.2 --- Makefile.global | 18 +- NEWS | 287 +- README.RELEASE_PROCESS | 6 +- README.SUBMITTING_PATCH | 182 +- README.WIN32-BUILD-SYSTEM | 170 +- TSRM/TSRM.c | 2 +- TSRM/TSRM.h | 2 +- TSRM/tsrm_nw.c | 4 +- TSRM/tsrm_nw.h | 2 +- TSRM/tsrm_virtual_cwd.c | 65 +- TSRM/tsrm_virtual_cwd.h | 7 +- TSRM/tsrm_win32.c | 18 +- TSRM/tsrm_win32.h | 4 +- Zend/acconfig.h | 4 +- Zend/header | 4 +- Zend/tests/bug44827.phpt | 11 + Zend/tests/bug47516.phpt | 2 +- Zend/tests/bug48667_1.phpt | 10 + Zend/tests/bug48667_2.phpt | 10 + Zend/tests/bug49472.phpt | 27 + Zend/tests/bug49866.phpt | 10 + Zend/tests/bug50005.phpt | 19 + Zend/tests/bug50146.phpt | 20 + Zend/tests/bug50174.phpt | 33 + Zend/tests/bug50255.phpt | 30 + Zend/tests/bug50261.phpt | 38 + Zend/tests/bug50394.phpt | 24 + Zend/tests/call_user_func_004.phpt | 18 + Zend/tests/call_user_func_005.phpt | 35 + Zend/tests/call_with_refs.phpt | 18 + Zend/tests/closure_035.phpt | 31 + Zend/tests/errmsg_025.phpt | 4 +- Zend/tests/inter_01.phpt | 2 +- Zend/tests/unset_cv05.phpt | 2 +- Zend/tests/unset_cv06.phpt | 2 +- Zend/zend.c | 6 +- Zend/zend.h | 13 +- Zend/zend_API.c | 64 +- Zend/zend_API.h | 4 +- Zend/zend_alloc.c | 57 +- Zend/zend_alloc.h | 4 +- Zend/zend_build.h | 2 +- Zend/zend_builtin_functions.c | 33 +- Zend/zend_builtin_functions.h | 4 +- Zend/zend_closures.c | 8 +- Zend/zend_closures.h | 4 +- Zend/zend_compile.c | 32 +- Zend/zend_compile.h | 4 +- Zend/zend_config.nw.h | 4 +- Zend/zend_config.w32.h | 4 +- Zend/zend_constants.c | 4 +- Zend/zend_constants.h | 4 +- Zend/zend_default_classes.c | 4 +- Zend/zend_dynamic_array.c | 4 +- Zend/zend_dynamic_array.h | 4 +- Zend/zend_errors.h | 4 +- Zend/zend_exceptions.c | 4 +- Zend/zend_exceptions.h | 4 +- Zend/zend_execute.c | 8 +- Zend/zend_execute.h | 6 +- Zend/zend_execute_API.c | 13 +- Zend/zend_extensions.c | 28 +- Zend/zend_extensions.h | 4 +- Zend/zend_fast_cache.h | 4 +- Zend/zend_float.c | 4 +- Zend/zend_float.h | 4 +- Zend/zend_gc.c | 4 +- Zend/zend_gc.h | 4 +- Zend/zend_globals.h | 4 +- Zend/zend_globals_macros.h | 4 +- Zend/zend_hash.c | 4 +- Zend/zend_hash.h | 4 +- Zend/zend_highlight.c | 4 +- Zend/zend_highlight.h | 4 +- Zend/zend_indent.c | 4 +- Zend/zend_indent.h | 4 +- Zend/zend_ini.c | 4 +- Zend/zend_ini.h | 4 +- Zend/zend_ini_parser.c | 4 +- Zend/zend_ini_parser.y | 4 +- Zend/zend_ini_scanner.c | 3917 +-- Zend/zend_ini_scanner.h | 4 +- Zend/zend_ini_scanner.l | 34 +- Zend/zend_ini_scanner_defs.h | 2 +- Zend/zend_interfaces.c | 16 +- Zend/zend_interfaces.h | 4 +- Zend/zend_istdiostream.h | 4 +- Zend/zend_iterators.c | 4 +- Zend/zend_iterators.h | 4 +- Zend/zend_language_parser.c | 4 +- Zend/zend_language_parser.y | 4 +- Zend/zend_language_scanner.c | 14 +- Zend/zend_language_scanner.h | 4 +- Zend/zend_language_scanner.l | 12 +- Zend/zend_language_scanner_defs.h | 2 +- Zend/zend_list.c | 4 +- Zend/zend_list.h | 4 +- Zend/zend_llist.c | 4 +- Zend/zend_llist.h | 4 +- Zend/zend_modules.h | 4 +- Zend/zend_multibyte.c | 4 +- Zend/zend_multibyte.h | 4 +- Zend/zend_multiply.h | 4 +- Zend/zend_object_handlers.c | 4 +- Zend/zend_object_handlers.h | 4 +- Zend/zend_objects.c | 4 +- Zend/zend_objects.h | 4 +- Zend/zend_objects_API.c | 4 +- Zend/zend_objects_API.h | 4 +- Zend/zend_opcode.c | 4 +- Zend/zend_operators.c | 10 +- Zend/zend_operators.h | 4 +- Zend/zend_ptr_stack.c | 4 +- Zend/zend_ptr_stack.h | 4 +- Zend/zend_qsort.c | 4 +- Zend/zend_qsort.h | 4 +- Zend/zend_sprintf.c | 4 +- Zend/zend_stack.c | 4 +- Zend/zend_stack.h | 4 +- Zend/zend_static_allocator.c | 4 +- Zend/zend_static_allocator.h | 4 +- Zend/zend_stream.c | 4 +- Zend/zend_stream.h | 4 +- Zend/zend_strtod.h | 4 +- Zend/zend_ts_hash.c | 4 +- Zend/zend_ts_hash.h | 4 +- Zend/zend_types.h | 4 +- Zend/zend_variables.c | 17 +- Zend/zend_variables.h | 9 +- Zend/zend_vm.h | 4 +- Zend/zend_vm_def.h | 12 +- Zend/zend_vm_execute.h | 54 +- Zend/zend_vm_gen.php | 6 +- Zend/zend_vm_opcodes.h | 2 +- acconfig.h | 4 +- acinclude.m4 | 14 +- aclocal.m4 | 1702 +- build/libtool.m4 | 1686 +- config.guess | 100 +- config.sub | 153 +- configure | 8089 +++--- configure.in | 48 +- ext/bcmath/bcmath.c | 4 +- ext/bcmath/php_bcmath.h | 4 +- ext/bz2/bz2.c | 4 +- ext/bz2/bz2_filter.c | 4 +- ext/bz2/php_bz2.h | 4 +- ext/calendar/cal_unix.c | 2 +- ext/calendar/calendar.c | 4 +- ext/calendar/easter.c | 2 +- ext/com_dotnet/com_com.c | 4 +- ext/com_dotnet/com_dotnet.c | 4 +- ext/com_dotnet/com_extension.c | 4 +- ext/com_dotnet/com_handlers.c | 4 +- ext/com_dotnet/com_iterator.c | 4 +- ext/com_dotnet/com_misc.c | 4 +- ext/com_dotnet/com_olechar.c | 4 +- ext/com_dotnet/com_persist.c | 4 +- ext/com_dotnet/com_saproxy.c | 4 +- ext/com_dotnet/com_typeinfo.c | 4 +- ext/com_dotnet/com_variant.c | 4 +- ext/com_dotnet/com_wrapper.c | 4 +- ext/com_dotnet/php_com_dotnet.h | 4 +- ext/com_dotnet/php_com_dotnet_internal.h | 4 +- ext/ctype/ctype.c | 2 +- ext/ctype/php_ctype.h | 2 +- ext/curl/interface.c | 128 +- ext/curl/multi.c | 4 +- ext/curl/php_curl.h | 4 +- ext/curl/streams.c | 8 +- ext/curl/tests/curl_basic_016.phpt | 10 +- ext/curl/tests/curl_ftp_pasv.phpt | 59 + ext/curl/tests/curl_setopt_basic001.phpt | 2 +- ext/date/config0.m4 | 2 +- ext/date/lib/astro.c | 4 +- ext/date/lib/dow.c | 4 +- ext/date/lib/interval.c | 4 +- ext/date/lib/parse_date.c | 2622 +- ext/date/lib/parse_date.c.orig | 2816 ++- ext/date/lib/parse_date.re | 7 +- ext/date/lib/parse_tz.c | 4 +- ext/date/lib/timelib.c | 4 +- ext/date/lib/timelib.h | 4 +- ext/date/lib/timelib_structs.h | 4 +- ext/date/lib/timezonedb.h | 1302 +- ext/date/lib/tm2unixtime.c | 4 +- ext/date/lib/unixtime2tm.c | 4 +- ext/date/php_date.c | 40 +- ext/date/php_date.h | 4 +- .../tests/DateTimeZone_listIdentifiers_basic1.phpt | 824 +- ext/date/tests/bug45866.phpt | 24 + ext/date/tests/bug46268.phpt | 4 +- ext/date/tests/bug49585.phpt | 16 + ext/date/tests/bug50392.phpt | 63 + ext/date/tests/bug50680.phpt | 9 + ext/date/tests/oo_002.phpt | 2 +- ext/date/tests/sunfuncts.phpt | 42 + .../tests/timezone_identifiers_list_basic1.phpt | 822 +- ext/dba/dba.c | 4 +- ext/dba/dba_cdb.c | 4 +- ext/dba/dba_db1.c | 4 +- ext/dba/dba_db2.c | 4 +- ext/dba/dba_db3.c | 4 +- ext/dba/dba_db4.c | 4 +- ext/dba/dba_dbm.c | 4 +- ext/dba/dba_flatfile.c | 4 +- ext/dba/dba_gdbm.c | 4 +- ext/dba/dba_inifile.c | 4 +- ext/dba/dba_ndbm.c | 4 +- ext/dba/dba_qdbm.c | 4 +- ext/dba/libcdb/cdb.c | 6 +- ext/dba/libcdb/cdb.h | 4 +- ext/dba/libcdb/cdb_make.c | 6 +- ext/dba/libcdb/cdb_make.h | 4 +- ext/dba/libcdb/uint32.c | 4 +- ext/dba/libcdb/uint32.h | 4 +- ext/dba/libflatfile/flatfile.c | 6 +- ext/dba/libflatfile/flatfile.h | 4 +- ext/dba/libinifile/inifile.c | 6 +- ext/dba/libinifile/inifile.h | 4 +- ext/dba/php_dba.h | 4 +- ext/dba/tests/dba_cdb_make.phpt | 2 +- ext/dom/attr.c | 4 +- ext/dom/cdatasection.c | 4 +- ext/dom/characterdata.c | 4 +- ext/dom/comment.c | 4 +- ext/dom/document.c | 23 +- ext/dom/documentfragment.c | 4 +- ext/dom/documenttype.c | 4 +- ext/dom/dom_ce.h | 4 +- ext/dom/dom_fe.h | 4 +- ext/dom/dom_iterators.c | 4 +- ext/dom/dom_properties.h | 4 +- ext/dom/domconfiguration.c | 4 +- ext/dom/domerror.c | 4 +- ext/dom/domerrorhandler.c | 4 +- ext/dom/domexception.c | 4 +- ext/dom/domimplementation.c | 4 +- ext/dom/domimplementationlist.c | 4 +- ext/dom/domimplementationsource.c | 4 +- ext/dom/domlocator.c | 4 +- ext/dom/domstringlist.c | 4 +- ext/dom/element.c | 21 +- ext/dom/entity.c | 4 +- ext/dom/entityreference.c | 4 +- ext/dom/namednodemap.c | 4 +- ext/dom/namelist.c | 4 +- ext/dom/node.c | 8 +- ext/dom/nodelist.c | 4 +- ext/dom/notation.c | 4 +- ext/dom/php_dom.c | 4 +- ext/dom/php_dom.h | 4 +- ext/dom/processinginstruction.c | 4 +- ext/dom/string_extend.c | 4 +- ext/dom/tests/DOMAttr_value_basic_001.phpt | 5 + .../tests/DOMCharacterData_length_error_001.phpt | 7 +- ext/dom/tests/DOMText_appendData_basic.phpt | 7 +- ext/dom/tests/bug42082.phpt | 7 +- ext/dom/tests/bug47848.phpt | 25 + ext/dom/tests/bug49463.phpt | 17 + ext/dom/tests/bug50661.phpt | 16 + .../tests/domdocument_createcomment_error_001.phpt | 7 +- .../domdocument_createentityreference_001.phpt | 9 +- .../domdocument_createentityreference_002.phpt | 7 +- ext/dom/text.c | 4 +- ext/dom/typeinfo.c | 4 +- ext/dom/userdatahandler.c | 4 +- ext/dom/xml_common.h | 4 +- ext/dom/xpath.c | 4 +- ext/enchant/config.m4 | 2 +- ext/enchant/config.w32 | 2 +- ext/enchant/enchant.c | 6 +- ext/enchant/php_enchant.h | 4 +- ext/ereg/ereg.c | 4 +- ext/ereg/php_ereg.h | 4 +- ext/ereg/php_regex.h | 4 +- ext/exif/exif.c | 10 +- ext/exif/php_exif.h | 4 +- ext/exif/tests/exif006.phpt | 2 +- ext/fileinfo/libmagic.patch | 3047 ++- ext/fileinfo/libmagic/apprentice.c | 35 +- ext/fileinfo/libmagic/apptype.c | 3 +- ext/fileinfo/libmagic/ascmagic.c | 12 +- ext/fileinfo/libmagic/cdf.c | 90 +- ext/fileinfo/libmagic/cdf_time.c | 2 +- ext/fileinfo/libmagic/compress.c | 12 +- ext/fileinfo/libmagic/file.h | 13 +- ext/fileinfo/libmagic/fsmagic.c | 2 +- ext/fileinfo/libmagic/funcs.c | 8 +- ext/fileinfo/libmagic/is_tar.c | 2 +- ext/fileinfo/libmagic/magic.c | 12 +- ext/fileinfo/libmagic/magic.h | 4 +- ext/fileinfo/libmagic/patchlevel.h | 12 +- ext/fileinfo/libmagic/print.c | 2 +- ext/fileinfo/libmagic/readcdf.c | 7 +- ext/fileinfo/libmagic/readelf.c | 4 +- ext/fileinfo/libmagic/softmagic.c | 91 +- ext/filter/callback_filter.c | 4 +- ext/filter/filter.c | 42 +- ext/filter/filter_private.h | 5 +- ext/filter/logical_filters.c | 29 +- ext/filter/php_filter.h | 4 +- ext/filter/sanitizing_filters.c | 5 +- ext/filter/tests/033.phpt | 2 +- ext/filter/tests/bug39763.phpt | 2 +- ext/filter/tests/bug42718-2.phpt | 1 + ext/filter/tests/bug50158.phpt | 23 + ext/filter/tests/bug50632.phpt | 11 + ext/ftp/ftp.c | 14 +- ext/ftp/ftp.h | 4 +- ext/ftp/php_ftp.c | 4 +- ext/ftp/php_ftp.h | 4 +- ext/gd/gd.c | 25 +- ext/gd/gd_ctx.c | 4 +- ext/gd/libgd/gd.c | 14 +- ext/gd/libgd/gd_png.c | 2 +- ext/gd/libgd/gdft.c | 3 +- ext/gd/libgd/xbm.c | 4 +- ext/gd/php_gd.h | 4 +- ext/gd/tests/bug49600.phpt | 32 + ext/gd/tests/image_type_to_mime_type_basic.phpt | 5 +- ext/gd/tests/imagecopyresampled_basic.phpt | 2 +- ext/gd/tests/imagedashedline_basic.phpt | 2 +- ext/gd/tests/imagefilledpolygon_basic.phpt | 2 +- ext/gd/tests/imagefilledpolygon_negative.phpt | 15 + ext/gd/tests/imagepolygon_negative.phpt | 15 + ext/gd/tests/imagerectangle_basic.phpt | 2 +- ext/gd/tests/imagerectangle_error2.phpt | 2 +- ext/gd/tests/libgd00100.phpt | 119 + ext/gettext/gettext.c | 4 +- ext/gettext/php_gettext.h | 4 +- ext/gmp/config.w32 | 3 +- ext/gmp/gmp.c | 24 +- ext/gmp/php_gmp.h | 2 +- ext/gmp/tests/bug50283.phpt | 36 + ext/hash/hash.c | 4 +- ext/hash/hash_adler32.c | 4 +- ext/hash/hash_crc32.c | 4 +- ext/hash/hash_gost.c | 4 +- ext/hash/hash_haval.c | 4 +- ext/hash/hash_md.c | 4 +- ext/hash/hash_ripemd.c | 4 +- ext/hash/hash_salsa.c | 4 +- ext/hash/hash_sha.c | 4 +- ext/hash/hash_snefru.c | 4 +- ext/hash/hash_tiger.c | 4 +- ext/hash/hash_whirlpool.c | 4 +- ext/hash/php_hash.h | 4 +- ext/hash/php_hash_adler32.h | 4 +- ext/hash/php_hash_crc32.h | 4 +- ext/hash/php_hash_crc32_tables.h | 4 +- ext/hash/php_hash_gost.h | 4 +- ext/hash/php_hash_haval.h | 4 +- ext/hash/php_hash_md.h | 4 +- ext/hash/php_hash_ripemd.h | 4 +- ext/hash/php_hash_salsa.h | 4 +- ext/hash/php_hash_sha.h | 4 +- ext/hash/php_hash_snefru.h | 4 +- ext/hash/php_hash_snefru_tables.h | 4 +- ext/hash/php_hash_tiger.h | 4 +- ext/hash/php_hash_tiger_tables.h | 4 +- ext/hash/php_hash_types.h | 4 +- ext/hash/php_hash_whirlpool.h | 4 +- ext/hash/php_hash_whirlpool_tables.h | 4 +- ext/iconv/iconv.c | 4 +- ext/iconv/php_iconv.h | 24 +- ext/iconv/tests/iconv_encoding_basic.phpt | 6 +- ext/iconv/tests/iconv_substr_basic.phpt | 6 +- ext/imap/config.m4 | 12 +- ext/imap/config.w32 | 3 +- ext/imap/php_imap.c | 88 +- ext/imap/php_imap.h | 4 +- ext/imap/tests/bug44098.phpt | 20 + ext/imap/tests/imap_body.phpt | 21 + ext/imap/tests/imap_body_basic.phpt | 8 +- ext/imap/tests/imap_bodystruct_basic.phpt | 2 +- ext/imap/tests/imap_clearflag_full_basic.phpt | 2 +- ext/imap/tests/imap_close_variation2.phpt | 2 +- ext/imap/tests/imap_close_variation4.phpt | 2 +- ext/imap/tests/imap_fetch_overview_basic.phpt | 2 +- ext/imap/tests/imap_fetch_overview_error.phpt | 2 +- ext/imap/tests/imap_fetch_overview_variation2.phpt | 2 +- ext/imap/tests/imap_fetch_overview_variation3.phpt | 2 +- ext/imap/tests/imap_fetch_overview_variation5.phpt | 2 +- ext/imap/tests/imap_fetch_overview_variation6.phpt | 2 +- ext/imap/tests/imap_fetchbody_basic.phpt | 2 +- ext/imap/tests/imap_fetchbody_error.phpt | 2 +- ext/imap/tests/imap_fetchbody_variation2.phpt | 2 +- ext/imap/tests/imap_fetchbody_variation4.phpt | 2 +- ext/imap/tests/imap_fetchbody_variation6.phpt | 2 +- ext/imap/tests/imap_fetchheader_variation2.phpt | 8 +- ext/imap/tests/imap_fetchheader_variation3.phpt | 2 +- ext/imap/tests/imap_fetchheader_variation5.phpt | 6 +- ext/imap/tests/imap_fetchstructure_basic.phpt | 70 + ext/imap/tests/imap_gc_error.phpt | 7 + ext/imap/tests/imap_getsubscribed_basic.phpt | 68 + ext/imap/tests/imap_headerinfo_basic.phpt | 129 + ext/imap/tests/imap_headerinfo_error.phpt | 36 + ext/imap/tests/imap_list_basic.phpt | 47 + ext/imap/tests/imap_lsub_basic.phpt | 61 + ext/imap/tests/imap_mail_copy.phpt | 54 + ext/imap/tests/imap_mail_copy_basic.phpt | 46 + ext/imap/tests/imap_mail_move.phpt | 54 + ext/imap/tests/imap_mail_move_basic.phpt | 46 + ext/imap/tests/imap_open_error.phpt | 5 + ext/imap/tests/imap_renamemailbox_basic.phpt | 66 + .../tests/imap_rfc822_parse_headers_basic.phpt | 122 + ext/imap/tests/imap_savebody_basic.phpt | 61 + ext/imap/tests/imap_timeout_basic.phpt | 60 + ext/imap/tests/imap_undelete_basic.phpt | 29 + ext/imap/tests/imap_undelete_error.phpt | 36 + ext/interbase/ibase_blobs.c | 4 +- ext/interbase/ibase_events.c | 4 +- ext/interbase/ibase_query.c | 4 +- ext/interbase/ibase_service.c | 4 +- ext/interbase/interbase.c | 4 +- ext/interbase/php_ibase_includes.h | 4 +- ext/interbase/php_ibase_udf.c | 4 +- ext/interbase/php_interbase.h | 4 +- ext/intl/collator/collator_class.c | 1 + ext/intl/collator/collator_sort.c | 63 + ext/intl/collator/collator_sort.h | 1 + ext/intl/config.m4 | 4 + ext/intl/config.w32 | 7 +- ext/intl/dateformat/dateformat.c | 8 +- ext/intl/formatter/formatter_main.c | 2 +- ext/intl/grapheme/grapheme_string.c | 10 +- ext/intl/grapheme/grapheme_util.c | 8 +- ext/intl/idn/idn.c | 6 +- ext/intl/intl_error.c | 17 +- ext/intl/intl_error.h | 1 + ext/intl/locale/locale_methods.c | 12 +- ext/intl/normalizer/normalizer_class.h | 9 - ext/intl/normalizer/normalizer_normalize.c | 34 +- ext/intl/php_intl.c | 56 +- ext/intl/php_intl.h | 2 +- ext/intl/resourcebundle/TODO | 1 + ext/intl/resourcebundle/resourcebundle.c | 93 + ext/intl/resourcebundle/resourcebundle.h | 28 + ext/intl/resourcebundle/resourcebundle_class.c | 434 + ext/intl/resourcebundle/resourcebundle_class.h | 48 + ext/intl/resourcebundle/resourcebundle_iterator.c | 192 + ext/intl/resourcebundle/resourcebundle_iterator.h | 36 + ext/intl/tests/_files/es-bundle.txt | 21 + ext/intl/tests/_files/res_index.txt | 6 + ext/intl/tests/_files/resourcebundle.txt | 21 + ext/intl/tests/_files/resourcebundle/es.res | Bin 0 -> 384 bytes ext/intl/tests/_files/resourcebundle/res_index.res | Bin 0 -> 128 bytes ext/intl/tests/_files/resourcebundle/root.res | Bin 0 -> 388 bytes ext/intl/tests/badargs.phpt | 25 + ext/intl/tests/collator_get_sort_key.phpt | 97 + ext/intl/tests/resourcebundle.build | 33 + ext/intl/tests/resourcebundle.inc | 13 + ext/intl/tests/resourcebundle_arrayaccess.phpt | 48 + ext/intl/tests/resourcebundle_create.phpt | 62 + ext/intl/tests/resourcebundle_individual.phpt | 55 + ext/intl/tests/resourcebundle_iterator.phpt | 71 + ext/intl/tests/resourcebundle_locales.phpt | 23 + ext/intl/tests/ut_common.inc | 30 +- ext/json/json.c | 4 +- ext/json/php_json.h | 4 +- ext/ldap/ldap.c | 27 +- ext/ldap/php_ldap.h | 4 +- ext/ldap/tests/ldap_bind_basic.phpt | 3 +- ext/ldap/tests/ldap_bind_variation.phpt | 3 +- ext/ldap/tests/ldap_get_entries_variation.phpt | 5 +- ext/ldap/tests/ldap_mod_del_basic.phpt | 5 +- ext/ldap/tests/ldap_search_error.phpt | 5 +- ext/ldap/tests/ldap_start_tls_basic.phpt | 3 +- ext/libxml/libxml.c | 7 +- ext/libxml/php_libxml.h | 4 +- ext/mbstring/config.m4 | 10 +- ext/mbstring/libmbfl/filters/mbfilter_utf16.c | 27 +- ext/mbstring/libmbfl/filters/mbfilter_utf8.c | 2 +- ext/mbstring/libmbfl/mbfl/mbfilter.c | 2 +- ext/mbstring/mb_gpc.c | 4 +- ext/mbstring/mbstring.c | 8 +- ext/mbstring/mbstring.h | 4 +- ext/mbstring/php_mbregex.c | 4 +- ext/mbstring/php_mbregex.h | 4 +- ext/mbstring/php_unicode.c | 2 +- ext/mbstring/php_unicode.h | 2 +- ext/mbstring/tests/bug43994.phpt | 2 +- ext/mbstring/tests/bug45722.phpt | 2 + ext/mbstring/tests/bug47399.phpt | 2 + ext/mbstring/tests/bug48697.phpt | 24 + ext/mbstring/tests/bug49354.phpt | 21 + ext/mbstring/tests/bug49528.phpt | 20 + ext/mbstring/tests/bug49536.phpt | 20 + ext/mbstring/tests/mb_encoding_aliases.phpt | 2 + ext/mbstring/tests/mb_list_encodings.phpt | 2 + ext/mcrypt/mcrypt.c | 4 +- ext/mcrypt/php_mcrypt.h | 4 +- ext/mcrypt/tests/bug46010.phpt | 2 +- ext/mssql/php_mssql.c | 4 +- ext/mssql/php_mssql.h | 4 +- ext/mysql/config.m4 | 25 +- ext/mysql/php_mysql.c | 54 +- ext/mysql/php_mysql.h | 4 +- ext/mysql/php_mysql_structs.h | 9 +- ext/mysql/tests/connect.inc | 48 +- ext/mysql/tests/mysql_connect.phpt | 20 +- ext/mysql/tests/mysql_pconn_disable.phpt | 16 +- ext/mysql/tests/mysql_pconn_max_links.phpt | 13 + ext/mysql/tests/mysql_phpinfo.phpt | 7 +- .../tests/mysql_query_load_data_openbasedir.phpt | 11 + ext/mysqli/mysqli.c | 65 +- ext/mysqli/mysqli_api.c | 145 +- ext/mysqli/mysqli_driver.c | 2 +- ext/mysqli/mysqli_embedded.c | 2 +- ext/mysqli/mysqli_exception.c | 2 +- ext/mysqli/mysqli_fe.c | 4 +- ext/mysqli/mysqli_libmysql.h | 96 +- ext/mysqli/mysqli_mysqlnd.h | 3 +- ext/mysqli/mysqli_nonapi.c | 57 +- ext/mysqli/mysqli_prop.c | 4 +- ext/mysqli/mysqli_report.c | 4 +- ext/mysqli/mysqli_report.h | 4 +- ext/mysqli/mysqli_warning.c | 2 +- ext/mysqli/php_mysqli.h | 4 +- ext/mysqli/php_mysqli_structs.h | 20 +- ext/mysqli/tests/001.phpt | 2 +- ext/mysqli/tests/002.phpt | 4 +- ext/mysqli/tests/003.phpt | 4 +- ext/mysqli/tests/004.phpt | 2 +- ext/mysqli/tests/005.phpt | 4 +- ext/mysqli/tests/006.phpt | 4 +- ext/mysqli/tests/007.phpt | 4 +- ext/mysqli/tests/008.phpt | 4 +- ext/mysqli/tests/009.phpt | 4 +- ext/mysqli/tests/010.phpt | 4 +- ext/mysqli/tests/011.phpt | 4 +- ext/mysqli/tests/012.phpt | 4 +- ext/mysqli/tests/013.phpt | 4 +- ext/mysqli/tests/014.phpt | 4 +- ext/mysqli/tests/015.phpt | 9 +- ext/mysqli/tests/016.phpt | 2 +- ext/mysqli/tests/017.phpt | 2 +- ext/mysqli/tests/018.phpt | 2 +- ext/mysqli/tests/019.phpt | 4 +- ext/mysqli/tests/020.phpt | 4 +- ext/mysqli/tests/021.phpt | 4 +- ext/mysqli/tests/022.phpt | 4 +- ext/mysqli/tests/023.phpt | 4 +- ext/mysqli/tests/024.phpt | 4 +- ext/mysqli/tests/025.phpt | 4 +- ext/mysqli/tests/026.phpt | 4 +- ext/mysqli/tests/027.phpt | 2 +- ext/mysqli/tests/028.phpt | 2 +- ext/mysqli/tests/029.phpt | 4 +- ext/mysqli/tests/030.phpt | 2 +- ext/mysqli/tests/031.phpt | 2 +- ext/mysqli/tests/032.phpt | 4 +- ext/mysqli/tests/033.phpt | 2 +- ext/mysqli/tests/034.phpt | 2 +- ext/mysqli/tests/035.phpt | 2 +- ext/mysqli/tests/036.phpt | 4 +- ext/mysqli/tests/037.phpt | 4 +- ext/mysqli/tests/038.phpt | 5 +- ext/mysqli/tests/039.phpt | 3 +- ext/mysqli/tests/040.phpt | 4 +- ext/mysqli/tests/041.phpt | 4 +- ext/mysqli/tests/042.phpt | 4 +- ext/mysqli/tests/043.phpt | 4 +- ext/mysqli/tests/044.phpt | 2 +- ext/mysqli/tests/045.phpt | 4 +- ext/mysqli/tests/046.phpt | 4 +- ext/mysqli/tests/047.phpt | 4 +- ext/mysqli/tests/048.phpt | 4 +- ext/mysqli/tests/049.phpt | 2 +- ext/mysqli/tests/050.phpt | 2 +- ext/mysqli/tests/051.phpt | 2 +- ext/mysqli/tests/052.phpt | 2 +- ext/mysqli/tests/053.phpt | 2 +- ext/mysqli/tests/054.phpt | 2 +- ext/mysqli/tests/055.phpt | 2 +- ext/mysqli/tests/056.phpt | 2 +- ext/mysqli/tests/057.phpt | 4 +- ext/mysqli/tests/058.phpt | 4 +- ext/mysqli/tests/059.phpt | 4 +- ext/mysqli/tests/060.phpt | 4 +- ext/mysqli/tests/061.phpt | 4 +- ext/mysqli/tests/062.phpt | 2 +- ext/mysqli/tests/063.phpt | 2 +- ext/mysqli/tests/064.phpt | 2 +- ext/mysqli/tests/065.phpt | 2 +- ext/mysqli/tests/066.phpt | 5 +- ext/mysqli/tests/067.phpt | 6 +- ext/mysqli/tests/069.phpt | 2 +- ext/mysqli/tests/070.phpt | 2 +- ext/mysqli/tests/071.phpt | 43 +- ext/mysqli/tests/072.phpt | 2 +- ext/mysqli/tests/073.phpt | 2 +- ext/mysqli/tests/074.phpt | 2 +- ext/mysqli/tests/bug28817.phpt | 8 +- ext/mysqli/tests/bug29311.phpt | 2 +- ext/mysqli/tests/bug30967.phpt | 8 +- ext/mysqli/tests/bug31668.phpt | 2 +- ext/mysqli/tests/bug32405.phpt | 4 +- ext/mysqli/tests/bug33263.phpt | 3 +- ext/mysqli/tests/bug34810.phpt | 8 +- ext/mysqli/tests/bug35103.phpt | 4 +- ext/mysqli/tests/bug35517.phpt | 4 +- ext/mysqli/tests/bug35759.phpt | 4 +- ext/mysqli/tests/bug36420.phpt | 2 +- ext/mysqli/tests/bug36745.phpt | 4 +- ext/mysqli/tests/bug36802.phpt | 2 +- ext/mysqli/tests/bug36949.phpt | 4 +- ext/mysqli/tests/bug37090.phpt | 2 +- ext/mysqli/tests/bug38710.phpt | 2 +- ext/mysqli/tests/bug39457.phpt | 6 +- ext/mysqli/tests/bug42548.phpt | 2 +- ext/mysqli/tests/bug44897.phpt | 3 +- ext/mysqli/tests/bug46109.phpt | 8 +- ext/mysqli/tests/bug48909.phpt | 2 +- ext/mysqli/tests/bug50772.phpt | 36 + ext/mysqli/tests/connect.inc | 79 +- ext/mysqli/tests/mysqli_affected_rows.phpt | 2 +- ext/mysqli/tests/mysqli_affected_rows_oo.phpt | 2 +- ext/mysqli/tests/mysqli_autocommit.phpt | 2 +- ext/mysqli/tests/mysqli_autocommit_oo.phpt | 2 +- ext/mysqli/tests/mysqli_change_user.phpt | 2 +- ext/mysqli/tests/mysqli_change_user_insert_id.phpt | 7 +- ext/mysqli/tests/mysqli_change_user_rollback.phpt | 5 +- ext/mysqli/tests/mysqli_character_set.phpt | 2 +- ext/mysqli/tests/mysqli_character_set_name.phpt | 2 +- ext/mysqli/tests/mysqli_character_set_name_oo.phpt | 2 +- .../tests/mysqli_class_mysqli_interface.phpt | 2 +- .../mysqli_class_mysqli_properties_no_conn.phpt | 282 + ext/mysqli/tests/mysqli_close.phpt | 2 +- ext/mysqli/tests/mysqli_close_oo.phpt | 2 +- ext/mysqli/tests/mysqli_commit.phpt | 2 +- ext/mysqli/tests/mysqli_commit_oo.phpt | 2 +- ext/mysqli/tests/mysqli_connect.phpt | 2 +- ext/mysqli/tests/mysqli_connect_errno.phpt | 2 +- ext/mysqli/tests/mysqli_connect_error.phpt | 6 +- ext/mysqli/tests/mysqli_connect_oo.phpt | 2 +- ext/mysqli/tests/mysqli_connect_oo_defaults.phpt | 43 +- ext/mysqli/tests/mysqli_connect_oo_warnings.phpt | 2 +- ext/mysqli/tests/mysqli_connect_twice.phpt | 2 +- ext/mysqli/tests/mysqli_constants.phpt | 4 +- ext/mysqli/tests/mysqli_data_seek.phpt | 2 +- ext/mysqli/tests/mysqli_data_seek_oo.phpt | 2 +- .../tests/mysqli_disable_reads_from_master.phpt | 2 +- ext/mysqli/tests/mysqli_driver.phpt | 3 +- ext/mysqli/tests/mysqli_dump_debug_info.phpt | 2 +- ext/mysqli/tests/mysqli_dump_debug_info_oo.phpt | 2 +- ext/mysqli/tests/mysqli_embedded_connect.phpt | 6 +- .../tests/mysqli_enable_reads_from_master.phpt | 2 +- ext/mysqli/tests/mysqli_errno.phpt | 2 +- ext/mysqli/tests/mysqli_errno_oo.phpt | 2 +- ext/mysqli/tests/mysqli_error.phpt | 2 +- ext/mysqli/tests/mysqli_error_oo.phpt | 6 +- ext/mysqli/tests/mysqli_error_unicode.phpt | 2 +- ext/mysqli/tests/mysqli_fetch_all.phpt | 2 +- ext/mysqli/tests/mysqli_fetch_all_oo.phpt | 2 +- ext/mysqli/tests/mysqli_fetch_array.phpt | 2 +- ext/mysqli/tests/mysqli_fetch_array_assoc.phpt | 1 - ext/mysqli/tests/mysqli_fetch_array_large.phpt | 30 +- ext/mysqli/tests/mysqli_fetch_array_many_rows.phpt | 1 - ext/mysqli/tests/mysqli_fetch_array_oo.phpt | 2 +- ext/mysqli/tests/mysqli_fetch_assoc.phpt | 2 +- ext/mysqli/tests/mysqli_fetch_assoc_no_alias.phpt | 1 - .../tests/mysqli_fetch_assoc_no_alias_utf8.phpt | 3 +- ext/mysqli/tests/mysqli_fetch_assoc_oo.phpt | 2 +- ext/mysqli/tests/mysqli_fetch_field.phpt | 2 +- ext/mysqli/tests/mysqli_fetch_field_direct.phpt | 2 +- ext/mysqli/tests/mysqli_fetch_field_direct_oo.phpt | 2 +- ext/mysqli/tests/mysqli_fetch_field_flags.phpt | 10 +- ext/mysqli/tests/mysqli_fetch_field_oo.phpt | 2 +- ext/mysqli/tests/mysqli_fetch_field_types.phpt | 1 - ext/mysqli/tests/mysqli_fetch_fields.phpt | 2 +- ext/mysqli/tests/mysqli_fetch_lengths.phpt | 2 +- ext/mysqli/tests/mysqli_fetch_lengths_oo.phpt | 2 +- .../tests/mysqli_fetch_object_no_constructor.phpt | 2 +- .../tests/mysqli_fetch_object_no_object.phpt | 1 - ext/mysqli/tests/mysqli_fetch_object_oo.phpt | 2 +- ext/mysqli/tests/mysqli_fetch_row.phpt | 2 +- ext/mysqli/tests/mysqli_field_count.phpt | 2 +- ext/mysqli/tests/mysqli_field_seek.phpt | 2 +- ext/mysqli/tests/mysqli_field_tell.phpt | 2 +- ext/mysqli/tests/mysqli_fork.phpt | 3 +- ext/mysqli/tests/mysqli_free_result.phpt | 2 +- ext/mysqli/tests/mysqli_get_cache_stats.phpt | 116 - .../mysqli_get_cache_stats_free_buffered.phpt | 99 - ext/mysqli/tests/mysqli_get_charset.phpt | 2 +- ext/mysqli/tests/mysqli_get_client_info.phpt | 6 +- ext/mysqli/tests/mysqli_get_client_stats.phpt | 68 +- ext/mysqli/tests/mysqli_get_connection_stats.phpt | 5 +- ext/mysqli/tests/mysqli_get_host_info.phpt | 7 +- ext/mysqli/tests/mysqli_get_proto_info.phpt | 6 +- ext/mysqli/tests/mysqli_get_server_info.phpt | 2 +- ext/mysqli/tests/mysqli_get_server_version.phpt | 4 +- ext/mysqli/tests/mysqli_get_warnings.phpt | 4 +- ext/mysqli/tests/mysqli_info.phpt | 2 +- ext/mysqli/tests/mysqli_insert_id.phpt | 2 +- ext/mysqli/tests/mysqli_insert_id_variation.phpt | 4 +- .../tests/mysqli_insert_packet_overflow.phpt | 108 + ext/mysqli/tests/mysqli_kill.phpt | 4 +- ext/mysqli/tests/mysqli_more_results.phpt | 2 +- ext/mysqli/tests/mysqli_multi_query.phpt | 2 +- ext/mysqli/tests/mysqli_next_result.phpt | 2 +- ext/mysqli/tests/mysqli_no_reconnect.phpt | 15 +- ext/mysqli/tests/mysqli_num_fields.phpt | 2 +- ext/mysqli/tests/mysqli_num_rows.phpt | 2 +- ext/mysqli/tests/mysqli_options.phpt | 4 +- ext/mysqli/tests/mysqli_options_init_command.phpt | 2 +- ext/mysqli/tests/mysqli_pconn_conn_multiple.phpt | 164 + ext/mysqli/tests/mysqli_pconn_disabled.phpt | 2 +- ext/mysqli/tests/mysqli_pconn_max_links.phpt | 2 +- ext/mysqli/tests/mysqli_pconn_reuse.phpt | 2 +- ext/mysqli/tests/mysqli_pconn_twice.phpt | 79 + ext/mysqli/tests/mysqli_pconnect.phpt | 2 +- ext/mysqli/tests/mysqli_phpinfo.phpt | 3 +- ext/mysqli/tests/mysqli_ping.phpt | 2 +- .../tests/mysqli_poll_mixing_insert_select.phpt | 2 +- ext/mysqli/tests/mysqli_prepare.phpt | 4 +- ext/mysqli/tests/mysqli_prepare_no_object.phpt | 1 - ext/mysqli/tests/mysqli_query.phpt | 4 +- .../tests/mysqli_query_local_infile_large.phpt | 4 +- ext/mysqli/tests/mysqli_query_stored_proc.phpt | 2 +- ext/mysqli/tests/mysqli_real_escape_string.phpt | 6 +- .../tests/mysqli_real_escape_string_unicode.phpt | 6 +- ext/mysqli/tests/mysqli_real_query.phpt | 4 +- ext/mysqli/tests/mysqli_report.phpt | 2 +- ext/mysqli/tests/mysqli_report_wo_ps.phpt | 2 +- ext/mysqli/tests/mysqli_result_unclonable.phpt | 2 +- ext/mysqli/tests/mysqli_rollback.phpt | 2 +- ext/mysqli/tests/mysqli_select_db.phpt | 2 +- ext/mysqli/tests/mysqli_send_query.phpt | 2 +- ext/mysqli/tests/mysqli_set_charset.phpt | 2 +- .../tests/mysqli_set_local_infile_handler.phpt | 2 +- ...qli_set_local_infile_handler_bad_character.phpt | 2 +- ...i_set_local_infile_handler_buffer_overflow.phpt | 2 +- ...mysqli_set_local_infile_handler_close_link.phpt | 5 +- .../mysqli_set_local_infile_handler_closefile.phpt | 5 +- .../mysqli_set_local_infile_handler_closures.phpt | 2 +- .../mysqli_set_local_infile_handler_kill_link.phpt | 5 +- ...sqli_set_local_infile_handler_negative_len.phpt | 2 +- ...ysqli_set_local_infile_handler_nested_call.phpt | 2 +- .../mysqli_set_local_infile_handler_new_query.phpt | 2 +- .../mysqli_set_local_infile_handler_nofileop.phpt | 2 +- ...ysqli_set_local_infile_handler_openbasedir.phpt | 2 +- ...li_set_local_infile_handler_replace_buffer.phpt | 2 +- .../mysqli_set_local_infile_handler_short_len.phpt | 2 +- ...mysqli_set_local_infile_handler_unregister.phpt | 2 +- ext/mysqli/tests/mysqli_set_opt.phpt | 2 +- ...li_set_opt_numeric_and_datetime_as_unicode.phpt | 3 +- ext/mysqli/tests/mysqli_sqlstate.phpt | 2 +- ext/mysqli/tests/mysqli_ssl_set.phpt | 2 +- ext/mysqli/tests/mysqli_stat.phpt | 6 +- ext/mysqli/tests/mysqli_stmt_affected_rows.phpt | 2 +- ext/mysqli/tests/mysqli_stmt_attr_get.phpt | 2 +- .../tests/mysqli_stmt_attr_get_prefetch.phpt | 1 - ext/mysqli/tests/mysqli_stmt_attr_set.phpt | 18 +- ext/mysqli/tests/mysqli_stmt_bind_param.phpt | 2 +- ...sqli_stmt_bind_param_check_param_no_change.phpt | 1 - .../tests/mysqli_stmt_bind_param_references.phpt | 1 - .../mysqli_stmt_bind_param_type_juggling.phpt | 1 - ext/mysqli/tests/mysqli_stmt_bind_result.phpt | 2 +- ext/mysqli/tests/mysqli_stmt_bind_result_bit.phpt | 2 +- .../tests/mysqli_stmt_bind_result_references.phpt | 1 - ext/mysqli/tests/mysqli_stmt_close.phpt | 2 +- ext/mysqli/tests/mysqli_stmt_data_seek.phpt | 2 +- ext/mysqli/tests/mysqli_stmt_datatype_change.phpt | 4 +- ext/mysqli/tests/mysqli_stmt_errno.phpt | 2 +- ext/mysqli/tests/mysqli_stmt_error.phpt | 2 +- ext/mysqli/tests/mysqli_stmt_execute.phpt | 2 +- .../tests/mysqli_stmt_execute_stored_proc.phpt | 2 +- ext/mysqli/tests/mysqli_stmt_fetch.phpt | 2 +- .../mysqli_stmt_fetch_fields_win32_unicode.phpt | 4 +- ext/mysqli/tests/mysqli_stmt_field_count.phpt | 2 +- ext/mysqli/tests/mysqli_stmt_free_result.phpt | 2 +- ext/mysqli/tests/mysqli_stmt_get_result.phpt | 2 +- ext/mysqli/tests/mysqli_stmt_get_result2.phpt | 2 +- .../tests/mysqli_stmt_get_result_field_count.phpt | 1 - .../tests/mysqli_stmt_get_result_metadata.phpt | 1 - ...ysqli_stmt_get_result_metadata_fetch_field.phpt | 1 - .../tests/mysqli_stmt_get_result_non_select.phpt | 1 - ext/mysqli/tests/mysqli_stmt_get_result_seek.phpt | 1 - ext/mysqli/tests/mysqli_stmt_init.phpt | 2 +- ext/mysqli/tests/mysqli_stmt_insert_id.phpt | 2 +- ext/mysqli/tests/mysqli_stmt_num_rows.phpt | 2 +- ext/mysqli/tests/mysqli_stmt_param_count.phpt | 2 +- ext/mysqli/tests/mysqli_stmt_prepare.phpt | 2 +- ext/mysqli/tests/mysqli_stmt_reset.phpt | 2 +- ext/mysqli/tests/mysqli_stmt_result_metadata.phpt | 2 +- .../mysqli_stmt_result_metadata_sqltests.phpt | 1 - ext/mysqli/tests/mysqli_stmt_send_long_data.phpt | 2 +- ...i_stmt_send_long_data_packet_size_libmysql.phpt | 1 - ...li_stmt_send_long_data_packet_size_mysqlnd.phpt | 1 - ext/mysqli/tests/mysqli_stmt_sqlstate.phpt | 2 +- ext/mysqli/tests/mysqli_stmt_store_result.phpt | 2 +- ext/mysqli/tests/mysqli_stmt_unclonable.phpt | 2 +- ext/mysqli/tests/mysqli_store_result.phpt | 2 +- ext/mysqli/tests/mysqli_thread_id.phpt | 2 +- ext/mysqli/tests/mysqli_unclonable.phpt | 2 +- ext/mysqli/tests/mysqli_use_result.phpt | 2 +- ext/mysqli/tests/mysqli_warning_count.phpt | 2 +- ext/mysqli/tests/mysqli_warning_unclonable.phpt | 2 +- ext/mysqlnd/config.w32 | 12 +- ext/mysqlnd/config9.m4 | 33 +- ext/mysqlnd/mysqlnd.c | 879 +- ext/mysqlnd/mysqlnd.h | 165 +- ext/mysqlnd/mysqlnd_block_alloc.c | 6 +- ext/mysqlnd/mysqlnd_block_alloc.h | 6 +- ext/mysqlnd/mysqlnd_charset.c | 59 +- ext/mysqlnd/mysqlnd_charset.h | 2 +- ext/mysqlnd/mysqlnd_debug.c | 158 +- ext/mysqlnd/mysqlnd_debug.h | 71 +- ext/mysqlnd/mysqlnd_enum_n_def.h | 98 +- ext/mysqlnd/mysqlnd_libmysql_compat.h | 2 +- ext/mysqlnd/mysqlnd_loaddata.c | 20 +- ext/mysqlnd/mysqlnd_net.c | 744 + ext/mysqlnd/mysqlnd_net.h | 38 + ext/mysqlnd/mysqlnd_palloc.c | 605 - ext/mysqlnd/mysqlnd_palloc.h | 116 - ext/mysqlnd/mysqlnd_portability.h | 89 +- ext/mysqlnd/mysqlnd_priv.h | 22 +- ext/mysqlnd/mysqlnd_ps.c | 285 +- ext/mysqlnd/mysqlnd_ps_codec.c | 2 +- ext/mysqlnd/mysqlnd_qcache.c | 141 - ext/mysqlnd/mysqlnd_result.c | 817 +- ext/mysqlnd/mysqlnd_result.h | 20 +- ext/mysqlnd/mysqlnd_result_meta.c | 45 +- ext/mysqlnd/mysqlnd_result_meta.h | 4 +- ext/mysqlnd/mysqlnd_statistics.c | 96 +- ext/mysqlnd/mysqlnd_statistics.h | 266 +- ext/mysqlnd/mysqlnd_structs.h | 325 +- ext/mysqlnd/mysqlnd_wireprotocol.c | 857 +- ext/mysqlnd/mysqlnd_wireprotocol.h | 190 +- ext/mysqlnd/php_mysqlnd.c | 33 +- ext/mysqlnd/php_mysqlnd.h | 4 +- ext/oci8/README | 460 +- ext/oci8/oci8.c | 159 +- ext/oci8/oci8_collection.c | 4 +- ext/oci8/oci8_interface.c | 170 +- ext/oci8/oci8_lob.c | 34 +- ext/oci8/oci8_statement.c | 113 +- ext/oci8/package.xml | 112 +- ext/oci8/php_oci8.h | 6 +- ext/oci8/php_oci8_int.h | 21 +- ext/oci8/tests/bind_char_1.phpt | 4 +- ext/oci8/tests/bind_char_2.phpt | 4 +- ext/oci8/tests/bind_char_3.phpt | 4 +- ext/oci8/tests/bind_char_4.phpt | 4 +- ext/oci8/tests/bind_error.phpt | 70 + ext/oci8/tests/bug26133.phpt | 76 +- ext/oci8/tests/bug27303.phpt | 4 +- ext/oci8/tests/bug27303_2.phpt | 4 +- ext/oci8/tests/bug27303_4.phpt | 4 +- ext/oci8/tests/bug32325.phpt | 54 +- ext/oci8/tests/bug36403.phpt | 76 + ext/oci8/tests/bug43497.phpt | 22 +- ext/oci8/tests/bug47281.phpt | 73 + ext/oci8/tests/commit.phpt | 60 +- ext/oci8/tests/conn_attr.inc | 151 + ext/oci8/tests/conn_attr_1.phpt | 104 + ext/oci8/tests/conn_attr_2.phpt | 111 + ext/oci8/tests/conn_attr_3.phpt | 94 + ext/oci8/tests/conn_attr_4.phpt | 121 + ext/oci8/tests/conn_attr_5.phpt | 76 + ext/oci8/tests/cursor_bind_err.phpt | 52 +- ext/oci8/tests/cursors_old.phpt | 66 +- ext/oci8/tests/debug.phpt | 10 +- ext/oci8/tests/default_prefetch.phpt | 49 +- ext/oci8/tests/default_prefetch1.phpt | 50 +- ext/oci8/tests/default_prefetch2.phpt | 49 +- ext/oci8/tests/define.phpt | 51 +- ext/oci8/tests/define1.phpt | 45 +- ext/oci8/tests/define4.phpt | 55 +- ext/oci8/tests/define5.phpt | 60 +- ext/oci8/tests/define_old.phpt | 52 +- ext/oci8/tests/driver_name.phpt | 71 + ext/oci8/tests/drop_table.inc | 15 +- ext/oci8/tests/drop_type.inc | 15 +- ext/oci8/tests/edition_1.phpt | 156 + ext/oci8/tests/edition_2.phpt | 248 + ext/oci8/tests/extauth_01.phpt | 8 +- ext/oci8/tests/extauth_02.phpt | 8 +- ext/oci8/tests/extauth_03.phpt | 8 +- ext/oci8/tests/fetch.phpt | 70 +- ext/oci8/tests/fetch_all.phpt | 139 +- ext/oci8/tests/fetch_all3.phpt | 383 +- ext/oci8/tests/fetch_all4.phpt | 82 + ext/oci8/tests/fetch_all5.phpt | 127 + ext/oci8/tests/fetch_into.phpt | 88 +- ext/oci8/tests/fetch_object.phpt | 155 +- ext/oci8/tests/fetch_object_2.phpt | 127 + ext/oci8/tests/fetch_row.phpt | 86 +- ext/oci8/tests/field_funcs1.phpt | 67 +- ext/oci8/tests/field_funcs2.phpt | 11 +- ext/oci8/tests/lob_043.phpt | 101 + ext/oci8/tests/num.phpt | 65 +- ext/oci8/tests/oci8safemode.phpt | 2 +- ext/oci8/tests/password_new.phpt | 10 +- ext/oci8/tests/password_old.phpt | 10 +- ext/oci8/tests/prefetch.phpt | 51 +- ext/oci8/tests/prefetch_old.phpt | 48 +- ext/oci8/tests/refcur_prefetch_1.phpt | 256 + ext/oci8/tests/refcur_prefetch_2.phpt | 317 + ext/oci8/tests/refcur_prefetch_3.phpt | 161 + ext/oci8/tests/reflection1.phpt | 44 + ext/oci8/tests/xmltype_02.phpt | 197 + ext/odbc/birdstep.c | 4 +- ext/odbc/php_birdstep.h | 4 +- ext/odbc/php_odbc.c | 24 +- ext/odbc/php_odbc.h | 4 +- ext/odbc/php_odbc_includes.h | 4 +- ext/openssl/openssl.c | 25 +- ext/openssl/php_openssl.h | 4 +- ext/openssl/tests/bug48182.phpt | 6 +- ext/openssl/tests/sni_001.phpt | 178 + ext/openssl/xp_ssl.c | 63 +- ext/pcntl/pcntl.c | 21 +- ext/pcntl/php_pcntl.h | 4 +- ext/pcntl/php_signal.c | 4 +- ext/pcntl/php_signal.h | 4 +- ext/pcre/pcrelib/ChangeLog | 164 + ext/pcre/pcrelib/HACKING | 44 +- ext/pcre/pcrelib/LICENCE | 2 +- ext/pcre/pcrelib/NEWS | 15 + ext/pcre/pcrelib/NON-UNIX-USE | 96 +- ext/pcre/pcrelib/README | 52 +- ext/pcre/pcrelib/config.h | 12 +- ext/pcre/pcrelib/doc/pcre.txt | 2888 ++- ext/pcre/pcrelib/pcre.h | 12 +- ext/pcre/pcrelib/pcre_compile.c | 302 +- ext/pcre/pcrelib/pcre_exec.c | 1296 +- ext/pcre/pcrelib/pcre_fullinfo.c | 11 +- ext/pcre/pcrelib/pcre_internal.h | 116 +- ext/pcre/pcrelib/pcre_printint.src | 13 + ext/pcre/pcrelib/pcre_study.c | 424 +- ext/pcre/pcrelib/pcre_try_flipped.c | 6 +- ext/pcre/pcrelib/pcre_ucd.c | 18 + ext/pcre/pcrelib/pcredemo.c | 14 +- ext/pcre/pcrelib/pcreposix.c | 49 +- ext/pcre/pcrelib/pcreposix.h | 21 +- ext/pcre/pcrelib/testdata/grepoutput | 24 + ext/pcre/pcrelib/testdata/testinput1 | 5 +- ext/pcre/pcrelib/testdata/testinput10 | 2 +- ext/pcre/pcrelib/testdata/testinput2 | 854 +- ext/pcre/pcrelib/testdata/testinput3 | 6 +- ext/pcre/pcrelib/testdata/testinput4 | 27 +- ext/pcre/pcrelib/testdata/testinput5 | 307 +- ext/pcre/pcrelib/testdata/testinput6 | 205 +- ext/pcre/pcrelib/testdata/testinput7 | 123 +- ext/pcre/pcrelib/testdata/testinput8 | 26 +- ext/pcre/pcrelib/testdata/testinput9 | 6 +- ext/pcre/pcrelib/testdata/testoutput1 | 5 +- ext/pcre/pcrelib/testdata/testoutput10 | 2 +- ext/pcre/pcrelib/testdata/testoutput2 | 1985 +- ext/pcre/pcrelib/testdata/testoutput3 | 8 +- ext/pcre/pcrelib/testdata/testoutput4 | 44 +- ext/pcre/pcrelib/testdata/testoutput5 | 548 +- ext/pcre/pcrelib/testdata/testoutput6 | 474 +- ext/pcre/pcrelib/testdata/testoutput7 | 222 +- ext/pcre/pcrelib/testdata/testoutput8 | 44 +- ext/pcre/pcrelib/testdata/testoutput9 | 6 +- ext/pcre/php_pcre.c | 8 +- ext/pcre/php_pcre.h | 4 +- ext/pcre/tests/bug33200.phpt | 2 +- ext/pcre/upgrade-pcre.php | 7 +- ext/pdo/pdo.c | 42 +- ext/pdo/pdo_dbh.c | 11 +- ext/pdo/pdo_sql_parser.c | 4 +- ext/pdo/pdo_sql_parser.c.orig | 4 +- ext/pdo/pdo_sql_parser.re | 4 +- ext/pdo/pdo_sqlstate.c | 4 +- ext/pdo/pdo_stmt.c | 118 +- ext/pdo/php_pdo.h | 4 +- ext/pdo/php_pdo_driver.h | 4 +- ext/pdo/php_pdo_int.h | 4 +- ext/pdo/tests/bug_44861.phpt | 2 +- ext/pdo/tests/bug_50458.phpt | 29 + ext/pdo_dblib/config.m4 | 2 +- ext/pdo_dblib/dblib_driver.c | 6 +- ext/pdo_dblib/dblib_stmt.c | 4 +- ext/pdo_dblib/pdo_dblib.c | 4 +- ext/pdo_dblib/php_pdo_dblib.h | 4 +- ext/pdo_dblib/php_pdo_dblib_int.h | 4 +- ext/pdo_firebird/config.m4 | 2 +- ext/pdo_firebird/firebird_driver.c | 6 +- ext/pdo_firebird/firebird_statement.c | 4 +- ext/pdo_firebird/pdo_firebird.c | 4 +- ext/pdo_firebird/php_pdo_firebird.h | 4 +- ext/pdo_firebird/php_pdo_firebird_int.h | 4 +- ext/pdo_mysql/config.m4 | 71 +- ext/pdo_mysql/mysql_driver.c | 10 +- ext/pdo_mysql/mysql_statement.c | 10 +- ext/pdo_mysql/pdo_mysql.c | 55 +- ext/pdo_mysql/php_pdo_mysql.h | 4 +- ext/pdo_mysql/php_pdo_mysql_int.h | 16 +- ext/pdo_mysql/tests/bug44327.phpt | 24 +- ext/pdo_mysql/tests/bug46292.phpt | 21 +- ext/pdo_mysql/tests/bug_33689.phpt | 9 +- ext/pdo_mysql/tests/bug_37445.phpt | 1 - ext/pdo_mysql/tests/bug_39858.phpt | 22 +- ext/pdo_mysql/tests/bug_41125.phpt | 7 + ext/pdo_mysql/tests/bug_41698.phpt | 10 +- ext/pdo_mysql/tests/bug_41997.phpt | 14 +- ext/pdo_mysql/tests/bug_42499.phpt | 8 +- ext/pdo_mysql/tests/bug_44454.phpt | 8 +- ext/pdo_mysql/tests/bug_44707.phpt | 10 +- ext/pdo_mysql/tests/bug_45120.phpt | 2 - ext/pdo_mysql/tests/bug_50323.phpt | 61 + ext/pdo_mysql/tests/bug_pecl_12925.phpt | 10 +- ext/pdo_mysql/tests/bug_pecl_7976.phpt | 25 +- ext/pdo_mysql/tests/mysql_pdo_test.inc | 9 +- ext/pdo_mysql/tests/pdo_mysql___construct.phpt | 6 +- ext/pdo_mysql/tests/pdo_mysql___construct_ini.phpt | 2 +- .../tests/pdo_mysql___construct_options.phpt | 14 +- .../pdo_mysql___construct_options_libmysql.phpt | 8 +- ext/pdo_mysql/tests/pdo_mysql___construct_uri.phpt | 1 + ext/pdo_mysql/tests/pdo_mysql_attr_autocommit.phpt | 7 +- ext/pdo_mysql/tests/pdo_mysql_attr_case.phpt | 131 +- .../tests/pdo_mysql_attr_client_version.phpt | 1 + .../tests/pdo_mysql_attr_connection_status.phpt | 1 + .../tests/pdo_mysql_attr_driver_name.phpt | 3 +- .../tests/pdo_mysql_attr_fetch_table_names.phpt | 9 +- .../tests/pdo_mysql_attr_init_command.phpt | 3 +- .../tests/pdo_mysql_attr_max_buffer_size.phpt | 7 + .../tests/pdo_mysql_attr_oracle_nulls.phpt | 41 +- .../tests/pdo_mysql_attr_server_version.phpt | 1 + .../tests/pdo_mysql_attr_statement_class.phpt | 25 +- .../tests/pdo_mysql_begintransaction.phpt | 29 +- ext/pdo_mysql/tests/pdo_mysql_bit.phpt | 15 +- ext/pdo_mysql/tests/pdo_mysql_class_constants.phpt | 6 +- ext/pdo_mysql/tests/pdo_mysql_commit.phpt | 8 +- ext/pdo_mysql/tests/pdo_mysql_errorcode.phpt | 7 +- ext/pdo_mysql/tests/pdo_mysql_errorinfo.phpt | 8 +- ext/pdo_mysql/tests/pdo_mysql_exec.phpt | 8 +- ext/pdo_mysql/tests/pdo_mysql_exec_ddl.phpt | 18 +- ext/pdo_mysql/tests/pdo_mysql_exec_load_data.phpt | 8 +- ext/pdo_mysql/tests/pdo_mysql_exec_select.phpt | 10 +- ext/pdo_mysql/tests/pdo_mysql_fetch_both.phpt | 18 +- ext/pdo_mysql/tests/pdo_mysql_get_attribute.phpt | 7 +- ext/pdo_mysql/tests/pdo_mysql_last_insert_id.phpt | 7 +- ext/pdo_mysql/tests/pdo_mysql_pconnect.phpt | 6 +- ext/pdo_mysql/tests/pdo_mysql_phpinfo.phpt | 1 + .../tests/pdo_mysql_prepare_emulated.phpt | 75 +- .../pdo_mysql_prepare_emulated_anonymous.phpt | 15 +- ...ql_prepare_emulated_placeholder_everywhere.phpt | 7 +- .../tests/pdo_mysql_prepare_load_data.phpt | 9 +- .../tests/pdo_mysql_prepare_match_against.phpt | 8 +- ext/pdo_mysql/tests/pdo_mysql_prepare_native.phpt | 7 +- .../pdo_mysql_prepare_native_clear_error.phpt | 7 +- .../tests/pdo_mysql_prepare_native_column.phpt | 7 +- ...mysql_prepare_native_dup_named_placeholder.phpt | 7 +- .../pdo_mysql_prepare_native_mixed_style.phpt | 6 +- ...pdo_mysql_prepare_native_named_placeholder.phpt | 7 +- ...ysql_prepare_native_placeholder_everywhere.phpt | 7 +- ext/pdo_mysql/tests/pdo_mysql_rollback.phpt | 10 +- ext/pdo_mysql/tests/pdo_mysql_stmt_bindcolumn.phpt | 7 +- ext/pdo_mysql/tests/pdo_mysql_stmt_bindparam.phpt | 6 +- .../tests/pdo_mysql_stmt_bindparam_types.phpt | 6 +- ext/pdo_mysql/tests/pdo_mysql_stmt_bindvalue.phpt | 6 +- .../tests/pdo_mysql_stmt_blobfromsteam.phpt | 11 +- ext/pdo_mysql/tests/pdo_mysql_stmt_blobs.phpt | 7 + .../tests/pdo_mysql_stmt_closecursor.phpt | 8 +- .../tests/pdo_mysql_stmt_closecursor_empty.phpt | 5 + .../tests/pdo_mysql_stmt_columncount.phpt | 6 +- ext/pdo_mysql/tests/pdo_mysql_stmt_errorcode.phpt | 2 - ext/pdo_mysql/tests/pdo_mysql_stmt_errorinfo.phpt | 27 +- .../tests/pdo_mysql_stmt_fetch_non_select.phpt | 6 +- .../tests/pdo_mysql_stmt_fetch_serialize.phpt | 25 +- .../tests/pdo_mysql_stmt_fetchobject.phpt | 16 +- ext/pdo_mysql/tests/pdo_mysql_stmt_multiquery.phpt | 22 +- ext/pdo_mysql/tests/pdo_mysql_stmt_nextrowset.phpt | 166 +- ext/pdo_mysql/tests/pdo_mysql_stmt_rowcount.phpt | 6 +- .../tests/pdo_mysql_stmt_unbuffered_2050.phpt | 54 +- .../tests/pdo_mysql_stmt_variable_columncount.phpt | 1 + ext/pdo_mysql/tests/pdo_mysql_subclass.phpt | 14 +- ext/pdo_mysql/tests/pdo_mysql_types.phpt | 6 + ext/pdo_mysql/tests/pdo_mysql_types_zerofill.phpt | 6 + ext/pdo_mysql/tests/pecl_bug_5200.phpt | 8 +- ext/pdo_mysql/tests/pecl_bug_5780.phpt | 15 +- ext/pdo_mysql/tests/pecl_bug_5802.phpt | 21 +- ext/pdo_oci/config.m4 | 4 +- ext/pdo_oci/oci_driver.c | 6 +- ext/pdo_oci/oci_statement.c | 4 +- ext/pdo_oci/pdo_oci.c | 4 +- ext/pdo_oci/php_pdo_oci.h | 4 +- ext/pdo_oci/php_pdo_oci_int.h | 4 +- ext/pdo_odbc/config.m4 | 2 +- ext/pdo_odbc/odbc_driver.c | 6 +- ext/pdo_odbc/odbc_stmt.c | 4 +- ext/pdo_odbc/pdo_odbc.c | 4 +- ext/pdo_odbc/php_pdo_odbc.h | 4 +- ext/pdo_odbc/php_pdo_odbc_int.h | 4 +- ext/pdo_pgsql/config.m4 | 2 +- ext/pdo_pgsql/pdo_pgsql.c | 8 +- ext/pdo_pgsql/pgsql_driver.c | 36 +- ext/pdo_pgsql/pgsql_statement.c | 6 +- ext/pdo_pgsql/php_pdo_pgsql.h | 4 +- ext/pdo_pgsql/php_pdo_pgsql_int.h | 12 +- ext/pdo_pgsql/tests/bug48764.phpt | 134 + ext/pdo_pgsql/tests/bug_33876.phpt | 10 +- ext/pdo_pgsql/tests/bug_49985.phpt | 35 + ext/pdo_sqlite/config.m4 | 2 +- ext/pdo_sqlite/config.w32 | 4 +- ext/pdo_sqlite/pdo_sqlite.c | 4 +- ext/pdo_sqlite/php_pdo_sqlite.h | 4 +- ext/pdo_sqlite/php_pdo_sqlite_int.h | 4 +- ext/pdo_sqlite/sqlite_driver.c | 18 +- ext/pdo_sqlite/sqlite_statement.c | 4 +- ext/pdo_sqlite/tests/bug50728.phpt | 16 + ext/pdo_sqlite/tests/pdo_fetch_func_001.phpt | 130 + ext/pgsql/pgsql.c | 28 +- ext/pgsql/php_pgsql.h | 4 +- ext/pgsql/tests/10pg_convert.phpt | 5 +- ext/pgsql/tests/10pg_convert_85.phpt | 29 + ext/pgsql/tests/12pg_insert.phpt | 5 +- ext/pgsql/tests/12pg_insert_85.phpt | 24 + ext/pgsql/tests/13pg_select.phpt | 5 +- ext/pgsql/tests/13pg_select_85.phpt | 37 + ext/pgsql/tests/14pg_update.phpt | 5 +- ext/pgsql/tests/14pg_update_85.phpt | 25 + ext/pgsql/tests/bug37100.phpt | 5 +- ext/pgsql/tests/bug37100_85.phpt | 46 + ext/pgsql/tests/skipif.inc | 15 +- ext/phar/phar.c | 6 +- ext/phar/phar_object.c | 4 +- ext/phar/php_phar.h | 2 +- ext/phar/tests/phar_begin_setstub_commit.phpt | 4 +- ext/phar/tests/phar_begin_setstub_commitU.phpt | 4 +- ext/phar/tests/phar_buildfromdirectory6.phpt | 2 +- ext/phar/tests/tar/phar_begin_setstub_commit.phpt | 4 +- ext/phar/tests/tar/phar_begin_setstub_commitU.phpt | 4 +- ext/phar/tests/zip/phar_begin_setstub_commit.phpt | 4 +- ext/phar/tests/zip/phar_begin_setstub_commitU.phpt | 4 +- ext/phar/tests/zip/phar_stub.phpt | 6 - ext/posix/php_posix.h | 4 +- ext/posix/posix.c | 6 +- ext/posix/tests/posix_access.phpt | 2 +- ext/posix/tests/posix_access_error_modes.phpt | 2 +- .../tests/posix_access_error_wrongparams.phpt | 2 +- ext/posix/tests/posix_access_safemode.phpt | 2 +- ext/posix/tests/posix_errno_variation1.phpt | 1 + ext/posix/tests/posix_errno_variation2.phpt | 1 + ext/posix/tests/posix_mkfifo_safemode.phpt | 2 +- ext/posix/tests/posix_seteuid_variation2.phpt | 1 + ext/posix/tests/posix_seteuid_variation3.phpt | 1 + ext/posix/tests/posix_seteuid_variation4.phpt | 1 + ext/posix/tests/posix_seteuid_variation5.phpt | 1 + ext/posix/tests/posix_setgid_variation2.phpt | 3 +- ext/posix/tests/posix_setgid_variation3.phpt | 1 + ext/posix/tests/posix_setgid_variation4.phpt | 3 +- ext/posix/tests/posix_setgid_variation5.phpt | 3 +- ext/posix/tests/posix_setuid_variation2.phpt | 1 + ext/posix/tests/posix_setuid_variation3.phpt | 1 + ext/posix/tests/posix_setuid_variation4.phpt | 1 + ext/posix/tests/posix_setuid_variation5.phpt | 1 + ext/posix/tests/posix_uname.phpt | 4 +- ext/posix/tests/posix_uname_basic.phpt | 2 +- ext/pspell/php_pspell.h | 4 +- ext/pspell/pspell.c | 4 +- ext/readline/config.m4 | 4 +- ext/readline/php_readline.h | 4 +- ext/readline/readline.c | 8 +- ext/readline/tests/readline_add_history_001.phpt | 2 +- .../readline_callback_handler_install_001.phpt | 2 +- .../readline_callback_handler_remove_001.phpt | 2 +- ext/readline/tests/readline_list_history_001.phpt | 2 +- ext/readline/tests/readline_read_history_001.phpt | 2 +- ext/readline/tests/readline_write_history_001.phpt | 2 +- ext/recode/php_recode.h | 4 +- ext/recode/recode.c | 6 +- ext/reflection/php_reflection.c | 315 +- ext/reflection/php_reflection.h | 4 +- ext/reflection/tests/020.phpt | 1 - .../tests/ReflectionClass_hasProperty_001.phpt | 2 +- .../tests/ReflectionClass_toString_001.phpt | 81 + ext/reflection/tests/ReflectionMethod_basic2.phpt | 10 +- .../tests/ReflectionMethod_setAccessible.phpt | 111 + ext/reflection/tests/bug49719.phpt | 44 + ext/session/mod_files.c | 14 +- ext/session/mod_files.h | 4 +- ext/session/mod_mm.c | 4 +- ext/session/mod_mm.h | 4 +- ext/session/mod_user.c | 4 +- ext/session/mod_user.h | 4 +- ext/session/php_session.h | 4 +- ext/session/session.c | 33 +- ext/session/tests/001.phpt | 2 +- ext/session/tests/003.phpt | 2 +- ext/session/tests/004.phpt | 2 +- ext/session/tests/005.phpt | 2 +- ext/session/tests/006.phpt | 2 +- ext/session/tests/007.phpt | 5 +- ext/session/tests/008-php4.2.3.phpt | 2 +- ext/session/tests/009.phpt | 2 +- ext/session/tests/012.phpt | 2 +- ext/session/tests/013.phpt | 2 +- ext/session/tests/014.phpt | 2 +- ext/session/tests/019.phpt | 2 +- ext/shmop/php_shmop.h | 2 +- ext/shmop/shmop.c | 4 +- ext/simplexml/php_simplexml.h | 4 +- ext/simplexml/php_simplexml_exports.h | 4 +- ext/simplexml/simplexml.c | 9 +- ext/simplexml/sxe.c | 4 +- ext/simplexml/sxe.h | 4 +- ext/snmp/config.w32 | 21 +- ext/snmp/php_snmp.h | 4 +- ext/snmp/snmp.c | 9 +- ext/soap/php_encoding.c | 6 +- ext/soap/php_encoding.h | 4 +- ext/soap/php_http.c | 42 +- ext/soap/php_http.h | 4 +- ext/soap/php_packet_soap.c | 4 +- ext/soap/php_packet_soap.h | 4 +- ext/soap/php_schema.c | 4 +- ext/soap/php_schema.h | 4 +- ext/soap/php_sdl.c | 4 +- ext/soap/php_sdl.h | 4 +- ext/soap/php_soap.h | 4 +- ext/soap/php_xml.c | 7 +- ext/soap/php_xml.h | 4 +- ext/soap/readme.html | 646 - ext/soap/soap.c | 20 +- ext/soap/tests/server009.phpt | 3 + ext/sockets/config.m4 | 3 +- ext/sockets/php_sockets.h | 6 +- ext/sockets/sockets.c | 12 +- ext/sockets/tests/socket_getpeername_ipv6loop.phpt | 7 +- ext/sockets/tests/socket_set_option_rcvtimeo.phpt | 2 +- ext/sockets/tests/socket_set_option_seolinger.phpt | 2 +- ext/sockets/tests/socket_set_option_sndtimeo.phpt | 2 +- ext/sockets/unix_socket_constants.h | 4 +- ext/sockets/win32_socket_constants.h | 4 +- ext/spl/php_spl.c | 4 +- ext/spl/php_spl.h | 2 +- ext/spl/spl_array.c | 5 +- ext/spl/spl_array.h | 4 +- ext/spl/spl_directory.c | 4 +- ext/spl/spl_directory.h | 4 +- ext/spl/spl_dllist.c | 4 +- ext/spl/spl_dllist.h | 10 +- ext/spl/spl_engine.c | 2 +- ext/spl/spl_engine.h | 4 +- ext/spl/spl_exceptions.c | 4 +- ext/spl/spl_exceptions.h | 4 +- ext/spl/spl_fixedarray.c | 4 +- ext/spl/spl_fixedarray.h | 6 +- ext/spl/spl_functions.c | 4 +- ext/spl/spl_functions.h | 4 +- ext/spl/spl_heap.c | 4 +- ext/spl/spl_heap.h | 12 +- ext/spl/spl_iterators.c | 14 +- ext/spl/spl_iterators.h | 4 +- ext/spl/spl_observer.c | 6 +- ext/spl/spl_observer.h | 4 +- ext/spl/tests/bug49263.phpt | 54 + ext/spl/tests/bug49972.phpt | 11 + ext/spl/tests/iterator_032.phpt | 2 +- ext/spl/tests/iterator_069.phpt | 17 + ext/spl/tests/iterator_070.phpt | 20 + ext/spl/tests/iterator_071.phpt | 32 + ...ursiveIteratorIterator_beginchildren_error.phpt | 36 + ...siveIteratorIterator_callHasChildren_error.phpt | 36 + ...ecursiveIteratorIterator_endchildren_error.phpt | 42 + ...ecursiveIteratorIterator_nextelement_error.phpt | 36 + ext/sqlite/config.m4 | 2 +- ext/sqlite/pdo_sqlite2.c | 4 +- ext/sqlite/php_sqlite.h | 4 +- ext/sqlite/sess_sqlite.c | 4 +- ext/sqlite/sqlite.c | 6 +- ext/sqlite3/config.w32 | 4 +- ext/sqlite3/libsqlite/sqlite3.c | 25241 ++++++++++--------- ext/sqlite3/libsqlite/sqlite3.h | 2915 ++- ext/sqlite3/libsqlite/sqlite3ext.h | 2 - ext/sqlite3/php_sqlite3.h | 4 +- ext/sqlite3/php_sqlite3_structs.h | 4 +- ext/sqlite3/sqlite3.c | 16 +- ext/standard/array.c | 40 +- ext/standard/assert.c | 4 +- ext/standard/base64.c | 4 +- ext/standard/base64.h | 4 +- ext/standard/basic_functions.c | 60 +- ext/standard/basic_functions.h | 6 +- ext/standard/browscap.c | 13 +- ext/standard/config.m4 | 124 +- ext/standard/config.w32 | 6 +- ext/standard/crc32.c | 4 +- ext/standard/crc32.h | 4 +- ext/standard/credits.c | 4 +- ext/standard/credits.h | 4 +- ext/standard/crypt.c | 102 +- ext/standard/crypt_blowfish.c | 3 +- ext/standard/crypt_freesec.c | 130 +- ext/standard/crypt_sha256.c | 759 + ext/standard/crypt_sha512.c | 823 + ext/standard/css.c | 4 +- ext/standard/css.h | 4 +- ext/standard/cyr_convert.c | 4 +- ext/standard/cyr_convert.h | 4 +- ext/standard/datetime.c | 4 +- ext/standard/datetime.h | 4 +- ext/standard/dir.c | 4 +- ext/standard/dl.c | 14 +- ext/standard/dl.h | 4 +- ext/standard/dns.c | 16 +- ext/standard/exec.c | 8 +- ext/standard/exec.h | 4 +- ext/standard/file.c | 23 +- ext/standard/file.h | 4 +- ext/standard/filestat.c | 71 +- ext/standard/filters.c | 4 +- ext/standard/flock_compat.c | 4 +- ext/standard/flock_compat.h | 13 +- ext/standard/formatted_print.c | 8 +- ext/standard/fsock.c | 4 +- ext/standard/fsock.h | 4 +- ext/standard/ftok.c | 4 +- ext/standard/ftp_fopen_wrapper.c | 17 +- ext/standard/head.c | 4 +- ext/standard/head.h | 4 +- ext/standard/html.c | 308 +- ext/standard/html.h | 4 +- ext/standard/http.c | 4 +- ext/standard/http_fopen_wrapper.c | 23 +- ext/standard/image.c | 4 +- ext/standard/incomplete_class.c | 4 +- ext/standard/info.c | 4 +- ext/standard/info.h | 4 +- ext/standard/iptc.c | 4 +- ext/standard/lcg.c | 11 +- ext/standard/levenshtein.c | 4 +- ext/standard/link.c | 4 +- ext/standard/link_win32.c | 4 +- ext/standard/mail.c | 6 +- ext/standard/math.c | 4 +- ext/standard/md5.c | 4 +- ext/standard/md5.h | 4 +- ext/standard/metaphone.c | 4 +- ext/standard/microtime.c | 4 +- ext/standard/microtime.h | 4 +- ext/standard/pack.c | 4 +- ext/standard/pack.h | 4 +- ext/standard/pageinfo.c | 8 +- ext/standard/pageinfo.h | 4 +- ext/standard/php_array.h | 4 +- ext/standard/php_assert.h | 4 +- ext/standard/php_browscap.h | 4 +- ext/standard/php_crypt.h | 4 +- ext/standard/php_crypt_r.c | 4 +- ext/standard/php_crypt_r.h | 6 +- ext/standard/php_dir.h | 4 +- ext/standard/php_dns.h | 8 +- ext/standard/php_ext_syslog.h | 4 +- ext/standard/php_filestat.h | 6 +- ext/standard/php_fopen_wrapper.c | 4 +- ext/standard/php_fopen_wrappers.h | 4 +- ext/standard/php_ftok.h | 4 +- ext/standard/php_http.h | 4 +- ext/standard/php_image.h | 4 +- ext/standard/php_incomplete_class.h | 4 +- ext/standard/php_iptc.h | 4 +- ext/standard/php_lcg.h | 4 +- ext/standard/php_link.h | 4 +- ext/standard/php_mail.h | 4 +- ext/standard/php_math.h | 4 +- ext/standard/php_metaphone.h | 4 +- ext/standard/php_rand.h | 4 +- ext/standard/php_smart_str.h | 4 +- ext/standard/php_smart_str_public.h | 4 +- ext/standard/php_standard.h | 4 +- ext/standard/php_string.h | 4 +- ext/standard/php_type.h | 4 +- ext/standard/php_uuencode.h | 4 +- ext/standard/php_var.h | 4 +- ext/standard/php_versioning.h | 4 +- ext/standard/proc_open.c | 4 +- ext/standard/proc_open.h | 4 +- ext/standard/quot_print.c | 4 +- ext/standard/quot_print.h | 4 +- ext/standard/rand.c | 4 +- ext/standard/scanf.c | 4 +- ext/standard/scanf.h | 4 +- ext/standard/sha1.c | 4 +- ext/standard/sha1.h | 4 +- ext/standard/soundex.c | 4 +- ext/standard/streamsfuncs.c | 28 +- ext/standard/streamsfuncs.h | 5 +- ext/standard/string.c | 62 +- ext/standard/strnatcmp.c | 2 +- ext/standard/syslog.c | 4 +- .../tests/array/array_flip_variation2.phpt | Bin 2178 -> 2179 bytes ext/standard/tests/array/bug50006.phpt | 29 + ext/standard/tests/array/bug50006_1.phpt | 29 + ext/standard/tests/array/bug50006_2.phpt | 29 + ext/standard/tests/array/uasort_variation5.phpt | 2 +- ext/standard/tests/bug49244.phpt | 32 + ext/standard/tests/file/005_variation2-win32.phpt | 10 +- ext/standard/tests/file/bug26615.phpt | 2 +- ext/standard/tests/file/bug47767.phpt | 5 + ext/standard/tests/file/chmod_variation3.phpt | 16 +- ext/standard/tests/file/fflush_basic.phpt | 4 + ext/standard/tests/file/fgetss_basic1.phpt | 6 +- ext/standard/tests/file/fgetss_basic2-win32.phpt | 4 +- .../tests/file/fgetss_variation1-win32.phpt | 6 +- .../tests/file/fgetss_variation3-win32.phpt | 6 +- ext/standard/tests/file/fgetss_variation4.phpt | 5 + .../tests/file/fgetss_variation5-win32.phpt | 5 +- ext/standard/tests/file/file.inc | 20 +- .../tests/file/fopen_variation10-win32.phpt | 5 + .../tests/file/fopen_variation11-win32.phpt | 4 + ext/standard/tests/file/fopen_variation17.phpt | 2 +- ext/standard/tests/file/fpassthru_basic.phpt | 4 +- .../tests/file/mkdir_variation1-win32.phpt | 16 +- ext/standard/tests/file/realpath_cache.phpt | 30 + ext/standard/tests/file/realpath_cache_win32.phpt | 38 + .../tests/file/rename_variation-win32.phpt | 2 +- .../tests/file/rename_variation11-win32.phpt | 6 +- .../tests/file/rename_variation12-win32.phpt | 121 + ext/standard/tests/file/rename_variation12.phpt | 12 +- .../tests/file/rename_variation13-win32.phpt | Bin 3614 -> 3947 bytes ext/standard/tests/file/rename_variation13.phpt | 19 +- .../tests/file/rename_variation3-win32.phpt | 5 +- .../tests/file/rename_variation6-win32.phpt | 4 + .../tests/file/rename_variation8-win32.phpt | 70 + ext/standard/tests/file/rename_variation8.phpt | 5 + ext/standard/tests/file/rename_variation9.phpt | 2 +- .../tests/file/rmdir_variation1-win32.phpt | 16 +- ext/standard/tests/file/rmdir_variation1.phpt | 2 +- .../tests/file/tempnam_variation3-win32.phpt | 147 +- ext/standard/tests/file/tempnam_variation3.phpt | 2 +- .../tests/file/tempnam_variation7-win32.phpt | 73 +- ext/standard/tests/file/tempnam_variation7.phpt | 2 +- ext/standard/tests/file/unlink_error-win32.phpt | 6 +- ext/standard/tests/file/userstreams_003.phpt | 2 +- ext/standard/tests/file/windows_acls/common.inc | 2 +- .../tests/file/windows_links/bug48746.phpt | 55 + .../tests/file/windows_links/bug48746_1.phpt | 56 + .../tests/file/windows_links/bug48746_2.phpt | 66 + .../tests/file/windows_links/bug48746_3.phpt | 48 + .../.getservbyport_basic.phpt.swp | Bin 12288 -> 0 bytes ext/standard/tests/general_functions/bug49692.ini | 4 + ext/standard/tests/general_functions/bug49692.phpt | 20 + ext/standard/tests/general_functions/bug49847.phpt | 25 + ext/standard/tests/general_functions/bug50690.phpt | 14 + ext/standard/tests/general_functions/bug50732.phpt | 12 + .../general_functions/get_cfg_var_variation8.phpt | 2 +- .../tests/general_functions/import_request.phpt | 12 +- .../general_functions/is_callable_basic1.phpt | 4 +- .../tests/general_functions/phpcredits.phpt | 2 +- .../tests/general_functions/proc_nice_basic.phpt | 4 + .../tests/general_functions/proc_nice_error.phpt | 4 + .../general_functions/proc_nice_variation1.phpt | 4 + .../general_functions/proc_nice_variation2.phpt | 4 + .../general_functions/proc_nice_variation3.phpt | 4 + .../general_functions/proc_nice_variation5.phpt | 5 + .../general_functions/proc_nice_variation6.phpt | 4 + .../general_functions/proc_nice_variation7.phpt | 4 + .../tests/general_functions/putenv_error1.phpt | 2 +- .../tests/general_functions/putenv_error2.phpt | 2 +- ext/standard/tests/general_functions/strval.phpt | 4 +- .../tests/general_functions/sunfuncts.phpt | 42 - ext/standard/tests/mail/mail_basic.phpt | 1 + ext/standard/tests/mail/mail_basic2.phpt | 15 +- ext/standard/tests/mail/mail_variation2.phpt | 11 +- .../tests/misc/syslog_vars_variation1.phpt | 2 +- .../tests/misc/time_sleep_until_error2.phpt | 4 + .../define_syslog_variables_variation-win32.phpt | 97 - .../network/define_syslog_variables_variation.phpt | 13 +- ext/standard/tests/php_ini_loaded_file.phpt | 5 +- ext/standard/tests/streams/bug49936.phpt | 26 + ext/standard/tests/streams/bug49936_win32.phpt | 30 + .../tests/streams/stream_resolve_include_path.phpt | 37 + ext/standard/tests/strings/bug49785.phpt | 4124 +++ ext/standard/tests/strings/bug50052.phpt | 2 +- ext/standard/tests/strings/bug50847.phpt | 10 + ext/standard/tests/strings/bug51059.phpt | 11 + .../strings/crypt_blowfish_invalid_rounds.phpt | 22 + ext/standard/tests/strings/crypt_sha256.phpt | 64 + ext/standard/tests/strings/crypt_sha512.phpt | 65 + .../tests/strings/html_entity_decode_html4.phpt | 516 + ext/standard/tests/strings/htmlentities-utf-2.phpt | 12 +- ext/standard/tests/strings/htmlentities-utf.phpt | 12 +- ext/standard/tests/strings/htmlentities02.phpt | 2 +- ext/standard/tests/strings/htmlentities03.phpt | 2 +- ext/standard/tests/strings/htmlentities04.phpt | 2 +- ext/standard/tests/strings/htmlentities15.phpt | 2 +- ext/standard/tests/strings/htmlentities_html4.phpt | 305 + ext/standard/tests/strings/parse_str_basic3.phpt | 2 +- .../tests/strings/setlocale_variation2.phpt | 8 +- ext/standard/type.c | 4 +- ext/standard/uniqid.c | 4 +- ext/standard/uniqid.h | 4 +- ext/standard/url.c | 27 +- ext/standard/url.h | 4 +- ext/standard/url_scanner_ex.h | 4 +- ext/standard/user_filters.c | 4 +- ext/standard/uuencode.c | 4 +- ext/standard/var.c | 6 +- ext/standard/var_unserializer.c | 6 +- ext/standard/var_unserializer.c.orig | 6 +- ext/standard/var_unserializer.re | 4 +- ext/standard/versioning.c | 4 +- ext/sybase_ct/php_sybase_ct.c | 4 +- ext/sybase_ct/php_sybase_ct.h | 4 +- ext/sysvmsg/php_sysvmsg.h | 4 +- ext/sysvmsg/sysvmsg.c | 6 +- ext/sysvsem/php_sysvsem.h | 4 +- ext/sysvsem/sysvsem.c | 4 +- ext/sysvshm/php_sysvshm.h | 4 +- ext/sysvshm/sysvshm.c | 4 +- ext/tidy/php_tidy.h | 5 +- ext/tidy/tests/023.phpt | 8 - ext/tidy/tests/025.phpt | 14 - ext/tidy/tests/035.phpt | 12 + ext/tidy/tests/bug_50558.phpt | 28 + ext/tidy/tidy.c | 31 +- ext/tokenizer/php_tokenizer.h | 4 +- ext/tokenizer/tokenizer.c | 4 +- ext/tokenizer/tokenizer_data.c | 4 +- ext/wddx/php_wddx.h | 4 +- ext/wddx/php_wddx_api.h | 4 +- ext/wddx/wddx.c | 4 +- ext/xml/compat.c | 2 +- ext/xml/expat_compat.h | 4 +- ext/xml/php_xml.h | 4 +- ext/xml/tests/bug32001b.phpt | 4 +- ext/xml/tests/bug50576.phpt | 133 + ext/xml/xml.c | 12 +- ext/xmlreader/php_xmlreader.c | 4 +- ext/xmlreader/php_xmlreader.h | 4 +- ext/xmlrpc/php_xmlrpc.h | 4 +- ext/xmlrpc/tests/bug50282.phpt | 43 + ext/xmlrpc/tests/bug50285.phpt | 115 + ext/xmlrpc/tests/bug50761.phpt | 62 + ext/xmlrpc/xmlrpc-epi-php.c | 76 +- ext/xmlwriter/php_xmlwriter.c | 4 +- ext/xmlwriter/php_xmlwriter.h | 4 +- ext/xsl/php_xsl.c | 4 +- ext/xsl/php_xsl.h | 4 +- ...rocessor_registerPHPFunctions-funcnostring.phpt | 4 +- ...ltprocessor_registerPHPFunctions-funcundef.phpt | 4 +- ext/xsl/xsl_fe.h | 4 +- ext/xsl/xsltprocessor.c | 4 +- ext/zip/lib/zip_close.c | 9 +- ext/zip/lib/zip_dirent.c | 94 +- ext/zip/lib/zip_file_get_offset.c | 2 +- ext/zip/lib/zip_fread.c | 29 +- ext/zip/lib/zip_open.c | 21 +- ext/zip/lib/zipint.h | 5 +- ext/zip/php_zip.c | 10 +- ext/zip/php_zip.h | 4 +- ext/zip/tests/bug47667.phpt | 3 +- ext/zlib/php_zlib.h | 4 +- ext/zlib/tests/bug_40189.phpt | 2 +- ext/zlib/tests/gzencode_variation1-win32.phpt | 37 + ext/zlib/zlib.c | 29 +- ext/zlib/zlib_filter.c | 4 +- ext/zlib/zlib_fopen_wrapper.c | 4 +- ltmain.sh | 823 +- main/SAPI.c | 4 +- main/SAPI.h | 4 +- main/build-defs.h.in | 3 +- main/fopen_wrappers.c | 67 +- main/fopen_wrappers.h | 4 +- main/getopt.c | 4 +- main/internal_functions_nw.c | 4 +- main/internal_functions_win32.c | 4 +- main/logos.h | 4 +- main/main.c | 99 +- main/network.c | 4 +- main/output.c | 8 +- main/php.h | 7 +- main/php3_compat.h | 4 +- main/php_compat.h | 4 +- main/php_config.h.in | 52 +- main/php_content_types.c | 4 +- main/php_content_types.h | 4 +- main/php_getopt.h | 6 +- main/php_globals.h | 4 +- main/php_ini.c | 6 +- main/php_ini.h | 4 +- main/php_logos.c | 4 +- main/php_logos.h | 4 +- main/php_main.h | 4 +- main/php_memory_streams.h | 4 +- main/php_network.h | 18 +- main/php_open_temporary_file.c | 14 +- main/php_open_temporary_file.h | 4 +- main/php_output.h | 4 +- main/php_reentrancy.h | 4 +- main/php_scandir.c | 4 +- main/php_scandir.h | 4 +- main/php_sprintf.c | 4 +- main/php_streams.h | 4 +- main/php_syslog.h | 4 +- main/php_ticks.c | 4 +- main/php_ticks.h | 4 +- main/php_variables.c | 4 +- main/php_variables.h | 4 +- main/php_version.h | 6 +- main/reentrancy.c | 4 +- main/rfc1867.c | 307 +- main/rfc1867.h | 4 +- main/safe_mode.c | 4 +- main/safe_mode.h | 4 +- main/snprintf.c | 4 +- main/snprintf.h | 4 +- main/spprintf.c | 4 +- main/spprintf.h | 4 +- main/streams/cast.c | 22 +- main/streams/filter.c | 4 +- main/streams/glob_wrapper.c | 4 +- main/streams/memory.c | 4 +- main/streams/mmap.c | 4 +- main/streams/php_stream_context.h | 4 +- main/streams/php_stream_filter_api.h | 4 +- main/streams/php_stream_glob_wrapper.h | 4 +- main/streams/php_stream_mmap.h | 4 +- main/streams/php_stream_plain_wrapper.h | 4 +- main/streams/php_stream_transport.h | 4 +- main/streams/php_stream_userspace.h | 4 +- main/streams/php_streams_int.h | 9 +- main/streams/plain_wrapper.c | 48 +- main/streams/streams.c | 29 +- main/streams/transports.c | 6 +- main/streams/userspace.c | 4 +- main/streams/xp_socket.c | 12 +- main/strlcat.c | 4 +- main/strlcpy.c | 4 +- main/win32_internal_function_disabled.h | 4 +- main/win95nt.h | 4 +- netware/start.c | 2 +- run-tests.php | 66 +- sapi/aolserver/aolserver.c | 8 +- sapi/apache/libpre.c | 4 +- sapi/apache/mod_php5.c | 6 +- sapi/apache/mod_php5.h | 4 +- sapi/apache/php_apache.c | 4 +- sapi/apache/php_apache_http.h | 4 +- sapi/apache/sapi_apache.c | 4 +- sapi/apache2filter/apache_config.c | 4 +- sapi/apache2filter/php_apache.h | 4 +- sapi/apache2filter/php_functions.c | 4 +- sapi/apache2filter/sapi_apache2.c | 6 +- sapi/apache2handler/apache_config.c | 4 +- sapi/apache2handler/mod_php5.c | 4 +- sapi/apache2handler/php_apache.h | 4 +- sapi/apache2handler/php_functions.c | 4 +- sapi/apache2handler/sapi_apache2.c | 45 +- sapi/apache_hooks/mod_php5.c | 4 +- sapi/apache_hooks/mod_php5.h | 4 +- sapi/apache_hooks/php_apache.c | 4 +- sapi/apache_hooks/sapi_apache.c | 4 +- sapi/caudium/caudium.c | 6 +- sapi/cgi/cgi_main.c | 33 +- sapi/cgi/fastcgi.c | 7 +- sapi/cgi/fastcgi.h | 4 +- sapi/cli/php.1.in | 15 +- sapi/cli/php_cli.c | 10 +- sapi/cli/php_cli_readline.c | 8 +- sapi/cli/php_cli_readline.h | 4 +- sapi/cli/tests/006.phpt | 4 +- sapi/continuity/capi.c | 4 +- sapi/embed/php_embed.c | 4 +- sapi/embed/php_embed.h | 4 +- sapi/isapi/php5isapi.c | 4 +- sapi/milter/php_milter.c | 6 +- sapi/nsapi/nsapi.c | 78 +- sapi/phttpd/php_phttpd.h | 2 +- sapi/phttpd/phttpd.c | 2 +- sapi/pi3web/pi3web_sapi.c | 6 +- sapi/roxen/roxen.c | 6 +- sapi/thttpd/php_thttpd.h | 2 +- sapi/thttpd/thttpd.c | 4 +- sapi/tux/php_tux.c | 2 +- sapi/webjames/php_webjames.h | 2 +- sapi/webjames/webjames.c | 2 +- server-tests.php | 2 +- tests/basic/bug46313-win.phpt | 4 +- tests/basic/bug46313.phpt | 1 + tests/basic/bug46759.phpt | 1 + .../interface_constant_inheritance_001.phpt | 2 +- .../interface_constant_inheritance_002.phpt | 2 +- .../interface_constant_inheritance_003.phpt | 2 +- tests/output/ob_011.phpt | 3 +- tests/output/ob_start_basic_unerasable_005.phpt | 2 +- tests/security/magic_quotes_gpc.phpt | 1 + win32/build/Makefile | 2 +- win32/build/config.w32 | 11 +- win32/build/config.w32.h.in | 4 +- win32/build/confutils.js | 2 + win32/build/deplister.c | 4 +- win32/globals.c | 4 +- win32/grp.h | 4 +- win32/php_stdbool.h | 11 + win32/php_stdint.h | 7 +- win32/php_win32_globals.h | 4 +- win32/select.c | 4 +- win32/select.h | 4 +- win32/sockets.c | 4 +- win32/sockets.h | 4 +- win32/syslog.h | 4 +- win32/winutil.c | 19 +- win32/winutil.h | 3 +- 1702 files changed, 64120 insertions(+), 41014 deletions(-) create mode 100644 Zend/tests/bug44827.phpt create mode 100644 Zend/tests/bug48667_1.phpt create mode 100644 Zend/tests/bug48667_2.phpt create mode 100644 Zend/tests/bug49472.phpt create mode 100644 Zend/tests/bug49866.phpt create mode 100644 Zend/tests/bug50005.phpt create mode 100644 Zend/tests/bug50146.phpt create mode 100644 Zend/tests/bug50174.phpt create mode 100644 Zend/tests/bug50255.phpt create mode 100644 Zend/tests/bug50261.phpt create mode 100644 Zend/tests/bug50394.phpt create mode 100644 Zend/tests/call_user_func_004.phpt create mode 100644 Zend/tests/call_user_func_005.phpt create mode 100644 Zend/tests/call_with_refs.phpt create mode 100644 Zend/tests/closure_035.phpt create mode 100644 ext/curl/tests/curl_ftp_pasv.phpt create mode 100644 ext/date/tests/bug45866.phpt create mode 100644 ext/date/tests/bug49585.phpt create mode 100644 ext/date/tests/bug50392.phpt create mode 100644 ext/date/tests/bug50680.phpt create mode 100644 ext/date/tests/sunfuncts.phpt create mode 100644 ext/dom/tests/bug47848.phpt create mode 100644 ext/dom/tests/bug49463.phpt create mode 100644 ext/dom/tests/bug50661.phpt create mode 100644 ext/filter/tests/bug50158.phpt create mode 100644 ext/filter/tests/bug50632.phpt create mode 100644 ext/gd/tests/bug49600.phpt create mode 100644 ext/gd/tests/imagefilledpolygon_negative.phpt create mode 100644 ext/gd/tests/imagepolygon_negative.phpt create mode 100644 ext/gd/tests/libgd00100.phpt create mode 100644 ext/gmp/tests/bug50283.phpt create mode 100644 ext/imap/tests/bug44098.phpt create mode 100644 ext/imap/tests/imap_fetchstructure_basic.phpt create mode 100644 ext/imap/tests/imap_getsubscribed_basic.phpt create mode 100644 ext/imap/tests/imap_headerinfo_basic.phpt create mode 100644 ext/imap/tests/imap_headerinfo_error.phpt create mode 100644 ext/imap/tests/imap_list_basic.phpt create mode 100644 ext/imap/tests/imap_lsub_basic.phpt create mode 100644 ext/imap/tests/imap_mail_copy.phpt create mode 100644 ext/imap/tests/imap_mail_copy_basic.phpt create mode 100644 ext/imap/tests/imap_mail_move.phpt create mode 100644 ext/imap/tests/imap_mail_move_basic.phpt create mode 100644 ext/imap/tests/imap_renamemailbox_basic.phpt create mode 100644 ext/imap/tests/imap_rfc822_parse_headers_basic.phpt create mode 100644 ext/imap/tests/imap_savebody_basic.phpt create mode 100644 ext/imap/tests/imap_timeout_basic.phpt create mode 100644 ext/imap/tests/imap_undelete_basic.phpt create mode 100644 ext/imap/tests/imap_undelete_error.phpt create mode 100755 ext/intl/resourcebundle/TODO create mode 100644 ext/intl/resourcebundle/resourcebundle.c create mode 100644 ext/intl/resourcebundle/resourcebundle.h create mode 100644 ext/intl/resourcebundle/resourcebundle_class.c create mode 100644 ext/intl/resourcebundle/resourcebundle_class.h create mode 100644 ext/intl/resourcebundle/resourcebundle_iterator.c create mode 100644 ext/intl/resourcebundle/resourcebundle_iterator.h create mode 100755 ext/intl/tests/_files/es-bundle.txt create mode 100755 ext/intl/tests/_files/res_index.txt create mode 100755 ext/intl/tests/_files/resourcebundle.txt create mode 100755 ext/intl/tests/_files/resourcebundle/es.res create mode 100755 ext/intl/tests/_files/resourcebundle/res_index.res create mode 100755 ext/intl/tests/_files/resourcebundle/root.res create mode 100755 ext/intl/tests/badargs.phpt create mode 100755 ext/intl/tests/collator_get_sort_key.phpt create mode 100755 ext/intl/tests/resourcebundle.build create mode 100644 ext/intl/tests/resourcebundle.inc create mode 100644 ext/intl/tests/resourcebundle_arrayaccess.phpt create mode 100644 ext/intl/tests/resourcebundle_create.phpt create mode 100644 ext/intl/tests/resourcebundle_individual.phpt create mode 100644 ext/intl/tests/resourcebundle_iterator.phpt create mode 100755 ext/intl/tests/resourcebundle_locales.phpt create mode 100644 ext/mbstring/tests/bug48697.phpt create mode 100644 ext/mbstring/tests/bug49354.phpt create mode 100644 ext/mbstring/tests/bug49528.phpt create mode 100644 ext/mbstring/tests/bug49536.phpt create mode 100644 ext/mysqli/tests/bug50772.phpt create mode 100644 ext/mysqli/tests/mysqli_class_mysqli_properties_no_conn.phpt delete mode 100644 ext/mysqli/tests/mysqli_get_cache_stats.phpt delete mode 100644 ext/mysqli/tests/mysqli_get_cache_stats_free_buffered.phpt create mode 100644 ext/mysqli/tests/mysqli_insert_packet_overflow.phpt create mode 100644 ext/mysqli/tests/mysqli_pconn_conn_multiple.phpt create mode 100644 ext/mysqli/tests/mysqli_pconn_twice.phpt create mode 100644 ext/mysqlnd/mysqlnd_net.c create mode 100644 ext/mysqlnd/mysqlnd_net.h delete mode 100644 ext/mysqlnd/mysqlnd_palloc.c delete mode 100644 ext/mysqlnd/mysqlnd_palloc.h delete mode 100644 ext/mysqlnd/mysqlnd_qcache.c create mode 100644 ext/oci8/tests/bind_error.phpt create mode 100644 ext/oci8/tests/bug36403.phpt create mode 100644 ext/oci8/tests/bug47281.phpt create mode 100644 ext/oci8/tests/conn_attr.inc create mode 100644 ext/oci8/tests/conn_attr_1.phpt create mode 100644 ext/oci8/tests/conn_attr_2.phpt create mode 100644 ext/oci8/tests/conn_attr_3.phpt create mode 100644 ext/oci8/tests/conn_attr_4.phpt create mode 100644 ext/oci8/tests/conn_attr_5.phpt create mode 100644 ext/oci8/tests/driver_name.phpt create mode 100644 ext/oci8/tests/edition_1.phpt create mode 100644 ext/oci8/tests/edition_2.phpt create mode 100644 ext/oci8/tests/fetch_all4.phpt create mode 100644 ext/oci8/tests/fetch_all5.phpt create mode 100644 ext/oci8/tests/fetch_object_2.phpt create mode 100644 ext/oci8/tests/lob_043.phpt create mode 100644 ext/oci8/tests/refcur_prefetch_1.phpt create mode 100644 ext/oci8/tests/refcur_prefetch_2.phpt create mode 100644 ext/oci8/tests/refcur_prefetch_3.phpt create mode 100644 ext/oci8/tests/xmltype_02.phpt create mode 100644 ext/openssl/tests/sni_001.phpt create mode 100644 ext/pdo/tests/bug_50458.phpt create mode 100644 ext/pdo_mysql/tests/bug_50323.phpt create mode 100644 ext/pdo_pgsql/tests/bug48764.phpt create mode 100644 ext/pdo_pgsql/tests/bug_49985.phpt create mode 100644 ext/pdo_sqlite/tests/bug50728.phpt create mode 100644 ext/pdo_sqlite/tests/pdo_fetch_func_001.phpt create mode 100644 ext/pgsql/tests/10pg_convert_85.phpt create mode 100644 ext/pgsql/tests/12pg_insert_85.phpt create mode 100644 ext/pgsql/tests/13pg_select_85.phpt create mode 100644 ext/pgsql/tests/14pg_update_85.phpt create mode 100644 ext/pgsql/tests/bug37100_85.phpt create mode 100644 ext/reflection/tests/ReflectionMethod_setAccessible.phpt create mode 100644 ext/reflection/tests/bug49719.phpt delete mode 100644 ext/soap/readme.html create mode 100644 ext/spl/tests/bug49263.phpt create mode 100755 ext/spl/tests/bug49972.phpt create mode 100644 ext/spl/tests/iterator_069.phpt create mode 100644 ext/spl/tests/iterator_070.phpt create mode 100644 ext/spl/tests/iterator_071.phpt create mode 100644 ext/spl/tests/recursiveIteratorIterator_beginchildren_error.phpt create mode 100644 ext/spl/tests/recursiveIteratorIterator_callHasChildren_error.phpt create mode 100644 ext/spl/tests/recursiveIteratorIterator_endchildren_error.phpt create mode 100644 ext/spl/tests/recursiveIteratorIterator_nextelement_error.phpt create mode 100644 ext/standard/crypt_sha256.c create mode 100644 ext/standard/crypt_sha512.c create mode 100644 ext/standard/tests/array/bug50006.phpt create mode 100644 ext/standard/tests/array/bug50006_1.phpt create mode 100644 ext/standard/tests/array/bug50006_2.phpt create mode 100644 ext/standard/tests/bug49244.phpt create mode 100644 ext/standard/tests/file/realpath_cache.phpt create mode 100644 ext/standard/tests/file/realpath_cache_win32.phpt create mode 100644 ext/standard/tests/file/rename_variation12-win32.phpt create mode 100644 ext/standard/tests/file/rename_variation8-win32.phpt create mode 100644 ext/standard/tests/file/windows_links/bug48746.phpt create mode 100644 ext/standard/tests/file/windows_links/bug48746_1.phpt create mode 100644 ext/standard/tests/file/windows_links/bug48746_2.phpt create mode 100644 ext/standard/tests/file/windows_links/bug48746_3.phpt delete mode 100644 ext/standard/tests/general_functions/.getservbyport_basic.phpt.swp create mode 100644 ext/standard/tests/general_functions/bug49692.ini create mode 100644 ext/standard/tests/general_functions/bug49692.phpt create mode 100644 ext/standard/tests/general_functions/bug49847.phpt create mode 100644 ext/standard/tests/general_functions/bug50690.phpt create mode 100644 ext/standard/tests/general_functions/bug50732.phpt delete mode 100644 ext/standard/tests/general_functions/sunfuncts.phpt delete mode 100644 ext/standard/tests/network/define_syslog_variables_variation-win32.phpt create mode 100644 ext/standard/tests/streams/bug49936.phpt create mode 100644 ext/standard/tests/streams/bug49936_win32.phpt create mode 100644 ext/standard/tests/streams/stream_resolve_include_path.phpt create mode 100644 ext/standard/tests/strings/bug49785.phpt create mode 100644 ext/standard/tests/strings/bug50847.phpt create mode 100644 ext/standard/tests/strings/bug51059.phpt create mode 100644 ext/standard/tests/strings/crypt_blowfish_invalid_rounds.phpt create mode 100644 ext/standard/tests/strings/crypt_sha256.phpt create mode 100644 ext/standard/tests/strings/crypt_sha512.phpt create mode 100644 ext/standard/tests/strings/html_entity_decode_html4.phpt create mode 100644 ext/standard/tests/strings/htmlentities_html4.phpt create mode 100644 ext/tidy/tests/035.phpt create mode 100644 ext/tidy/tests/bug_50558.phpt create mode 100644 ext/xml/tests/bug50576.phpt create mode 100644 ext/xmlrpc/tests/bug50282.phpt create mode 100644 ext/xmlrpc/tests/bug50285.phpt create mode 100644 ext/xmlrpc/tests/bug50761.phpt create mode 100644 ext/zlib/tests/gzencode_variation1-win32.phpt create mode 100644 win32/php_stdbool.h diff --git a/Makefile.global b/Makefile.global index 36d9e424d..4f7d6d9e9 100644 --- a/Makefile.global +++ b/Makefile.global @@ -79,29 +79,25 @@ PHP_TEST_SHARED_EXTENSIONS = ` \ . $$i; $(top_srcdir)/build/shtool echo -n -- " -d $(ZEND_EXT_TYPE)=$(top_builddir)/modules/$$dlname"; \ done; \ fi` +PHP_DEPRECATED_DIRECTIVES_REGEX = '^(define_syslog_variables|register_(globals|long_arrays)?|safe_mode|magic_quotes_(gpc|runtime|sybase)?|(zend_)?extension(_debug)?(_ts)?)[\t\ ]*=' test: all -@if test ! -z "$(PHP_EXECUTABLE)" && test -x "$(PHP_EXECUTABLE)"; then \ - TEST_PHP_EXECUTABLE=$(PHP_EXECUTABLE) \ - TEST_PHP_SRCDIR=$(top_srcdir) \ - CC="$(CC)" \ - $(PHP_EXECUTABLE) $(PHP_TEST_SETTINGS) $(top_srcdir)/run-tests.php -d extension_dir=modules/ $(PHP_TEST_SHARED_EXTENSIONS) tests/; \ - elif test ! -z "$(SAPI_CLI_PATH)" && test -x "$(SAPI_CLI_PATH)"; then \ - INI_FILE=`$(top_builddir)/$(SAPI_CLI_PATH) -d 'display_errors=stderr' -r 'echo php_ini_loaded_file();' 2> /dev/null`; \ + INI_FILE=`$(PHP_EXECUTABLE) -d 'display_errors=stderr' -r 'echo php_ini_loaded_file();' 2> /dev/null`; \ if test "$$INI_FILE"; then \ - $(EGREP) -v '^(magic_quotes_(gpc|runtime|sybase)?|(zend_)?extension(_debug)?(_ts)?)[\t\ ]*=' "$$INI_FILE" > $(top_builddir)/tmp-php.ini; \ + $(EGREP) -h -v $(PHP_DEPRECATED_DIRECTIVES_REGEX) "$$INI_FILE" > $(top_builddir)/tmp-php.ini; \ else \ echo > $(top_builddir)/tmp-php.ini; \ fi; \ - INI_SCANNED_PATH=`$(top_builddir)/$(SAPI_CLI_PATH) -d 'display_errors=stderr' -r '$$a = explode(",\n", trim(php_ini_scanned_files())); echo $$a[0];' 2> /dev/null`; \ + INI_SCANNED_PATH=`$(PHP_EXECUTABLE) -d 'display_errors=stderr' -r '$$a = explode(",\n", trim(php_ini_scanned_files())); echo $$a[0];' 2> /dev/null`; \ if test "$$INI_SCANNED_PATH"; then \ INI_SCANNED_PATH=`$(top_srcdir)/build/shtool path -d $$INI_SCANNED_PATH`; \ - $(EGREP) -h -v '^(magic_quotes_(gpc|runtime|sybase)?|(zend_)?extension(_debug)?(_ts)?)[\t\ ]*=' "$$INI_SCANNED_PATH"/*.ini >> $(top_builddir)/tmp-php.ini; \ + $(EGREP) -h -v $(PHP_DEPRECATED_DIRECTIVES_REGEX) "$$INI_SCANNED_PATH"/*.ini >> $(top_builddir)/tmp-php.ini; \ fi; \ - TEST_PHP_EXECUTABLE=$(top_builddir)/$(SAPI_CLI_PATH) \ + TEST_PHP_EXECUTABLE=$(PHP_EXECUTABLE) \ TEST_PHP_SRCDIR=$(top_srcdir) \ CC="$(CC)" \ - $(top_builddir)/$(SAPI_CLI_PATH) -n -c $(top_builddir)/tmp-php.ini $(PHP_TEST_SETTINGS) $(top_srcdir)/run-tests.php -n -c $(top_builddir)/tmp-php.ini -d extension_dir=$(top_builddir)/modules/ $(PHP_TEST_SHARED_EXTENSIONS) $(TESTS); \ + $(PHP_EXECUTABLE) -n -c $(top_builddir)/tmp-php.ini $(PHP_TEST_SETTINGS) $(top_srcdir)/run-tests.php -n -c $(top_builddir)/tmp-php.ini -d extension_dir=$(top_builddir)/modules/ $(PHP_TEST_SHARED_EXTENSIONS) $(TESTS); \ else \ echo "ERROR: Cannot run tests without CLI sapi."; \ fi diff --git a/NEWS b/NEWS index 18ec48211..bea460ada 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,251 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| +04 Mar 2010, PHP 5.3.2 + +- Upgraded bundled sqlite to version 3.6.22. (Ilia) +- Upgraded bundled libmagic to version 5.03. (Mikko) +- Upgraded bundled PCRE to version 8.00. (Scott) +- Updated timezone database to version 2010.3. (Derick) + +- Improved LCG entropy. (Rasmus, Samy Kamkar) +- Improved crypt support for edge cases (UFC compatibility). (Solar Designer, + Joey, Pierre) + +- Reverted fix for bug #49521 (PDO fetchObject sets values before calling + constructor). (Pierrick, Johannes) + +- Changed gmp_strval() to use full range from 2 to 62, and -2 to -36. FR #50283 + (David Soria Parra) +- Changed "post_max_size" php.ini directive to allow unlimited post size by + setting it to 0. (Rasmus) +- Changed tidyNode class to disallow manual node creation. (Pierrick) + +- Removed automatic file descriptor unlocking happening on shutdown and/or + stream close (on all OSes). (Tony, Ilia) + +- Added libpng 1.4.0 support. (Pierre) +- Added support for DISABLE_AUTHENTICATOR for imap_open. (Pierre) +- Added missing host validation for HTTP urls inside FILTER_VALIDATE_URL. + (Ilia) +- Added stream_resolve_include_path(). (Mikko) +- Added INTERNALDATE support to imap_append. (nick at mailtrust dot com) +- Added support for SHA-256 and SHA-512 to php's crypt. (Pierre) +- Added realpath_cache_size() and realpath_cache_get() functions. (Stas) +- Added FILTER_FLAG_STRIP_BACKTICK option to the filter extension. (Ilia) +- Added protection for $_SESSION from interrupt corruption and improved + "session.save_path" check. (Stas) +- Added LIBXML_PARSEHUGE constant to override the maximum text size of a + single text node when using libxml2.7.3+. (Kalle) +- Added ReflectionMethod::setAccessible() for invoking non-public methods + through the Reflection API. (Sebastian) +- Added Collator::getSortKey for intl extension. (Stas) +- Added support for CURLOPT_POSTREDIR. FR #49571. (Sriram Natarajan) +- Added support for CURLOPT_CERTINFO. FR #49253. + (Linus Nielsen Feltzing ) +- Added client-side server name indication support in openssl. (Arnaud) + +- Improved fix for bug #50006 (Segfault caused by uksort()). (Stas) + +- Fixed mysqlnd hang when queries exactly 16777214 bytes long are sent. (Andrey) +- Fixed incorrect decoding of 5-byte BIT sequences in mysqlnd. (Andrey) +- Fixed error_log() to be binary safe when using message_type 3. (Jani) +- Fixed unnecessary invocation of setitimer when timeouts have been disabled. + (Arvind Srinivasan) +- Fixed memory leak in extension loading when an error occurs on Windows. + (Pierre) +- Fixed safe_mode validation inside tempnam() when the directory path does + not end with a /). (Martin Jansen) +- Fixed a possible open_basedir/safe_mode bypass in session extension + identified by Grzegorz Stachowiak. (Ilia) +- Fixed possible crash when a error/warning is raised during php startup. + (Pierre) +- Fixed possible bad behavior of rename on windows when used with symbolic + links or invalid paths. (Pierre) +- Fixed error output to stderr on Windows. (Pierre) +- Fixed memory leaks in is_writable/readable/etc on Windows. (Pierre) +- Fixed memory leaks in the ACL function on Windows. (Pierre) +- Fixed memory leak in the realpath cache on Windows. (Pierre) +- Fixed memory leak in zip_close. (Pierre) +- Fixed crypt's blowfish sanity check of the "setting" string, to reject + iteration counts encoded as 36 through 39. (Solar Designer, Joey, Pierre) + +- Fixed bug #51059 (crypt crashes when invalid salt are given). (Pierre) +- Fixed bug #50952 (allow underscore _ in constants parsed in php.ini files). + (Jani) +- Fixed bug #50940 (Custom content-length set incorrectly in Apache SAPIs). + (Brian France, Rasmus) +- Fixed bug #50930 (Wrong date by php_date.c patch with ancient gcc/glibc + versions). (Derick) +- Fixed bug #50907 (X-PHP-Originating-Script adding two new lines in *NIX). + (Ilia) +- Fixed bug #50859 (build fails with openssl 1.0 due to md2 deprecation). + (Ilia, hanno at hboeck dot de) +- Fixed bug #50847 (strip_tags() removes all tags greater then 1023 bytes + long). (Ilia) +- Fixed bug #50829 (php.ini directive pdo_mysql.default_socket is ignored). + (Ilia) +- Fixed bug #50832 (HTTP fopen wrapper does not support passwordless HTTP + authentication). (Jani) +- Fixed bug #50787 (stream_set_write_buffer() has no effect on socket streams). + (vnegrier at optilian dot com, Ilia) +- Fixed bug #50761 (system.multiCall crashes in xmlrpc extension). + (hiroaki dot kawai at gmail dot com, Ilia) +- Fixed bug #50756 (CURLOPT_FTP_SKIP_PASV_IP does not exist). (Sriram) +- Fixed bug #50732 (exec() adds single byte twice to $output array). (Ilia) +- Fixed bug #50728 (All PDOExceptions hardcode 'code' property to 0). + (Joey, Ilia) +- Fixed bug #50723 (Bug in garbage collector causes crash). (Dmitry) +- Fixed bug #50690 (putenv does not set ENV when the value is only one char). + (Pierre) +- Fixed bug #50680 (strtotime() does not support eighth ordinal number). (Ilia) +- Fixed bug #50661 (DOMDocument::loadXML does not allow UTF-16). (Rob) +- Fixed bug #50657 (copy() with an empty (zero-byte) HTTP source succeeds but + returns false). (Ilia) +- Fixed bug #50636 (MySQLi_Result sets values before calling constructor). + (Pierrick) +- Fixed bug #50632 (filter_input() does not return default value if the + variable does not exist). (Ilia) +- Fixed bug #50576 (XML_OPTION_SKIP_TAGSTART option has no effect). (Pierrick) +- Fixed bug #50558 (Broken object model when extending tidy). (Pierrick) +- Fixed bug #50540 (Crash while running ldap_next_reference test cases). + (Sriram) +- Fixed bug #50519 (segfault in garbage collection when using set_error_handler + and DomDocument). (Dmitry) +- Fixed bug #50508 (compile failure: Conflicting HEADER type declarations). + (Jani) +- Fixed bug #50496 (Use of is valid only in a c99 compilation + environment. (Sriram) +- Fixed bug #50464 (declare encoding doesn't work within an included file). + (Felipe) +- Fixed bug #50458 (PDO::FETCH_FUNC fails with Closures). (Felipe, Pierrick) +- Fixed bug #50445 (PDO-ODBC stored procedure call from Solaris 64-bit causes + seg fault). (davbrown4 at yahoo dot com, Felipe) +- Fixed bug #50416 (PROCEDURE db.myproc can't return a result set in the given + context). (Andrey) +- Fixed bug #50394 (Reference argument converted to value in __call). (Stas) +- Fixed bug #50351 (performance regression handling objects, ten times slower + in 5.3 than in 5.2). (Dmitry) +- Fixed bug #50392 (date_create_from_format() enforces 6 digits for 'u' + format character). (Ilia) +- Fixed bug #50345 (nanosleep not detected properly on some solaris versions). + (Jani) +- Fixed bug #50340 (php.ini parser does not allow spaces in ini keys). (Jani) +- Fixed bug #50334 (crypt ignores sha512 prefix). (Pierre) +- Fixed bug #50323 (Allow use of ; in values via ;; in PDO DSN). + (Ilia, Pierrick) +- Fixed bug #50285 (xmlrpc does not preserve keys in encoded indexed arrays). + (Felipe) +- Fixed bug #50282 (xmlrpc_encode_request() changes object into array in + calling function). (Felipe) +- Fixed bug #50267 (get_browser(null) does not use HTTP_USER_AGENT). (Jani) +- Fixed bug #50266 (conflicting types for llabs). (Jani) +- Fixed bug #50261 (Crash When Calling Parent Constructor with + call_user_func()). (Dmitry) +- Fixed bug #50255 (isset() and empty() silently casts array to object). + (Felipe) +- Fixed bug #50240 (pdo_mysql.default_socket in php.ini shouldn't used + if it is empty). (foutrelis at gmail dot com, Ilia) +- Fixed bug #50231 (Socket path passed using --with-mysql-sock is ignored when + mysqlnd is enabled). (Jani) +- Fixed bug #50219 (soap call Segmentation fault on a redirected url). + (Pierrick) +- Fixed bug #50212 (crash by ldap_get_option() with LDAP_OPT_NETWORK_TIMEOUT). + (Ilia, shigeru_kitazaki at cybozu dot co dot jp) +- Fixed bug #50209 (Compiling with libedit cannot find readline.h). + (tcallawa at redhat dot com) +- Fixed bug #50207 (segmentation fault when concatenating very large strings on + 64bit linux). (Ilia) +- Fixed bug #50196 (stream_copy_to_stream() produces warning when source is + not file). (Stas) +- Fixed bug #50195 (pg_copy_to() fails when table name contains schema. (Ilia) +- Fixed bug #50185 (ldap_get_entries() return false instead of an empty array + when there is no error). (Jani) +- Fixed bug #50174 (Incorrectly matched docComment). (Felipe) +- Fixed bug #50168 (FastCGI fails with wrong error on HEAD request to + non-existant file). (Dmitry) +- Fixed bug #50162 (Memory leak when fetching timestamp column from Oracle + database). (Felipe) +- Fixed bug #50159 (wrong working directory in symlinked files). (Dmitry) +- Fixed bug #50158 (FILTER_VALIDATE_EMAIL fails with valid addresses + containing = or ?). (Pierrick) +- Fixed bug #50152 (ReflectionClass::hasProperty behaves like isset() not + property_exists). (Felipe) +- Fixed bug #50146 (property_exists: Closure object cannot have properties). + (Felipe) +- Fixed bug #50145 (crash while running bug35634.phpt). (Felipe) +- Fixed bug #50140 (With default compilation option, php symbols are unresolved + for nsapi). (Uwe Schindler) +- Fixed bug #50087 (NSAPI performance improvements). (Uwe Schindler) +- Fixed bug #50073 (parse_url() incorrect when ? in fragment). (Ilia) +- Fixed bug #50023 (pdo_mysql doesn't use PHP_MYSQL_UNIX_SOCK_ADDR). (Ilia) +- Fixed bug #50005 (Throwing through Reflection modified Exception object + makes segmentation fault). (Felipe) +- Fixed bug #49990 (SNMP3 warning message about security level printed twice). + (Jani) +- Fixed bug #49985 (pdo_pgsql prepare() re-use previous aborted + transaction). (ben dot pineau at gmail dot com, Ilia, Matteo) +- Fixed bug #49938 (Phar::isBuffering() returns inverted value). (Greg) +- Fixed bug #49936 (crash with ftp stream in php_stream_context_get_option()). + (Pierrick) +- Fixed bug #49921 (Curl post upload functions changed). (Ilia) +- Fixed bug #49866 (Making reference on string offsets crashes PHP). (Dmitry) +- Fixed bug #49855 (import_request_variables() always returns NULL). (Ilia, + sjoerd at php dot net) +- Fixed bug #49851, #50451 (http wrapper breaks on 1024 char long headers). + (Ilia) +- Fixed bug #49800 (SimpleXML allow (un)serialize() calls without warning). + (Ilia, wmeler at wp-sa dot pl) +- Fixed bug #49719 (ReflectionClass::hasProperty returns true for a private + property in base class). (Felipe) +- Fixed bug #49677 (ini parser crashes with apache2 and using ${something} + ini variables). (Jani) +- Fixed bug #49660 (libxml 2.7.3+ limits text nodes to 10MB). (Felipe) +- Fixed bug #49647 (DOMUserData does not exist). (Rob) +- Fixed bug #49600 (imageTTFText text shifted right). (Takeshi Abe) +- Fixed bug #49585 (date_format buffer not long enough for >4 digit years). + (Derick, Adam) +- Fixed bug #49560 (oci8: using LOBs causes slow PHP shutdown). (Oracle Corp.) +- Fixed bug #49521 (PDO fetchObject sets values before calling constructor). + (Pierrick) +- Fixed bug #49472 (Constants defined in Interfaces can be overridden). + (Felipe) +- Fixed bug #49463 (setAttributeNS fails setting default namespace). (Rob) +- Fixed bug #49244 (Floating point NaN cause garbage characters). (Sjoerd) +- Fixed bug #49224 (Compile error due to old DNS functions on AIX systems). + (Scott) +- Fixed bug #49174 (crash when extending PDOStatement and trying to set + queryString property). (Felipe) +- Fixed bug #48811 (Directives in PATH section do not get applied to + subdirectories). (Patch by: ct at swin dot edu dot au) +- Fixed bug #48590 (SoapClient does not honor max_redirects). (Sriram) +- Fixed bug #48190 (Content-type parameter "boundary" is not case-insensitive + in HTTP uploads). (Ilia) +- Fixed bug #47848 (importNode doesn't preserve attribute namespaces). (Rob) +- Fixed bug #47409 (extract() problem with array containing word "this"). + (Ilia, chrisstocktonaz at gmail dot com) +- Fixed bug #47281 ($php_errormsg is limited in size of characters) + (Oracle Corp.) +- Fixed bug #46478 (htmlentities() uses obsolete mapping table for character + entity references). (Moriyoshi) +- Fixed bug #45599 (strip_tags() truncates rest of string with invalid + attribute). (Ilia, hradtke) +- Fixed bug #45120 (PDOStatement->execute() returns true then false for same + statement). (Pierrick) +- Fixed bug #44827 (define() allows :: in constant names). (Ilia) +- Fixed bug #44098 (imap_utf8() returns only capital letters). + (steffen at dislabs dot de, Pierre) +- Fixed bug #34852 (Failure in odbc_exec() using oracle-supplied odbc + driver). (tim dot tassonis at trivadis dot com) + 19 Nov 2009, PHP 5.3.1 +- Upgraded bundled sqlite to version 3.6.19. (Scott) +- Updated timezone database to version 2009.17 (2009q). (Derick) + +- Changed ini file directives [PATH=](on Win32) and [HOST=](on all) to be case + insensitive. (garretts) + +- Restored shebang line check to CGI sapi (not checked by scanner anymore). + (Jani) - Added "max_file_uploads" INI directive, which can be set to limit the number of file uploads per-request to 20 by default, to prevent possible @@ -11,8 +256,16 @@ PHP NEWS - Added support for ACL on Windows for thread safe SAPI (Apache2 for example) and fix its support on NTS. (Pierre) -- Upgraded bundled sqlite to version 3.6.19. (Scott) -- Updated timezone database to version 2009.17 (2009q). (Derick) +- Improved symbolic, mounted volume and junctions support for realpath on + Windows. (Pierre) +- Improved readlink on Windows, suppress \??\ and use the drive syntax only. + (Pierre) +- Improved dns_get_record() AAAA support on windows. Always available when + IPv6 is support is installed, format is now the same than on unix. (Pierre) +- Improved the DNS functions on OSX to use newer APIs, also use Bind 9 API + where available on other platforms. (Scott) +- Improved shared extension loading on OSX to use the standard Unix dlopen() + API. (Scott) - Fixed crash in com_print_typeinfo when an invalid typelib is given. (Pierre) - Fixed a safe_mode bypass in tempnam() identified by Grzegorz Stachowiak. @@ -41,26 +294,14 @@ PHP NEWS - Fixed memory leak in stream_is_local(). (Felipe, Tony) - Fixed BC break in mime_content_type(), removes the content encoding. (Scott) -- Changed ini file directives [PATH=](on Win32) and [HOST=](on all) to be case - insensitive (garretts) -- Restored shebang line check to CGI sapi (not checked by scanner anymore). - (Jani) - -- Improve symbolic, mounted volume and junctions support for realpath on - Windows. (Pierre) -- Improved readlink on Windows, suppress \??\ and use the drive syntax only. - (Pierre) -- Improved dns_get_record() AAAA support on windows. Always available when - IPv6 is support is installed, format is now the same than on unix. (Pierre) -- Improved the DNS functions on OSX to use newer APIs, also use Bind 9 API - where available on other platforms. (Scott) -- Improved shared extension loading on OSX to use the standard Unix dlopen() - API. (Scott) +- Fixed PECL bug #16842 (oci_error return false when NO_DATA_FOUND is raised). + (Chris Jones) - Fixed bug #50063 (safe_mode_include_dir fails). (Johannes, christian at elmerot dot se) - Fixed bug #50052 (Different Hashes on Windows and Linux on wrong Salt size). (Pierre) +- Fixed bug #49986 (Missing ICU DLLs on windows package). (Pierre) - Fixed bug #49910 (no support for ././@LongLink for long filenames in phar tar support). (Greg) - Fixed bug #49908 (throwing exception in __autoload crashes when interface @@ -87,9 +328,9 @@ PHP NEWS - Fixed bug #49447 (php engine need to correctly check for socket API return status on windows). (Sriram Natarajan) - Fixed bug #49391 (ldap.c utilizing deprecated ldap_modify_s). (Ilia) +- Fixed bug #49372 (segfault in php_curl_option_curl). (Pierre) - Fixed bug #49361 (wordwrap() wraps incorrectly on end of line boundaries). (Ilia, code-it at mail dot ru) -- Fixed bug #49372 (segfault in php_curl_option_curl). (Pierre) - Fixed bug #49306 (inside pdo_mysql default socket settings are ignored). (Ilia) - Fixed bug #49289 (bcmath module doesn't compile with phpize configure). @@ -106,7 +347,6 @@ PHP NEWS authentication details). (Dmitry) - Fixed bug #49142 (crash when exception thrown from __tostring()). (David Soria Parra) -- Fixed bug #49986 (Missing ICU DLLs on windows package). (Pierre) - Fixed bug #49132 (posix_times returns false without error). (phpbugs at gunnu dot us) - Fixed bug #49125 (Error in dba_exists C code). (jdornan at stanford dot edu) @@ -135,14 +375,14 @@ PHP NEWS - Fixed bug #49027 (mysqli_options() doesn't work when using mysqlnd). (Andrey) - Fixed bug #49026 (proc_open() can bypass safe_mode_protected_env_vars restrictions). (Ilia) -- Fixed bug #49012 (phar tar signature algorithm reports as Unknown (0) in - getSignature() call). (Greg) - Fixed bug #49020 (phar misinterprets ustar long filename standard). (Greg) - Fixed bug #49018 (phar tar stores long filenames wit prefix/name reversed). (Greg) - Fixed bug #49014 (dechunked filter broken when serving more than 8192 bytes in a chunk). (andreas dot streichardt at globalpark dot com, Ilia) +- Fixed bug #49012 (phar tar signature algorithm reports as Unknown (0) in + getSignature() call). (Greg) - Fixed bug #49000 (PHP CLI in Interactive mode (php -a) crashes when including files from function). (Stas) - Fixed bug #48994 (zlib.output_compression does not output HTTP headers when @@ -160,12 +400,12 @@ PHP NEWS - Fixed bug #48899 (is_callable returns true even if method does not exist in parent class). (Felipe) - Fixed bug #48893 (Problems compiling with Curl). (Felipe) +- Fixed bug #48880 (Random Appearing open_basedir problem). (Rasmus, Gwynne) - Fixed bug #48872 (string.c: errors: duplicate case values). (Kalle) - Fixed bug #48854 (array_merge_recursive modifies arrays after first one). (Felipe) - Fixed bug #48805 (IPv6 socket transport is not working). (Ilia) - Fixed bug #48802 (printf() returns incorrect outputted length). (Jani) -- Fixed bug #48880 (Random Appearing open_basedir problem). (Rasmus, Gwynne) - Fixed bug #48791 (open office files always reported as corrupted). (Greg) - Fixed bug #48788 (RecursiveDirectoryIterator doesn't descend into symlinked directories). (Ilia) @@ -245,8 +485,7 @@ PHP NEWS - Fixed bug #28038 (Sent incorrect RCPT TO commands to SMTP server) (Garrett) - Fixed bug #27051 (Impersonation with FastCGI does not exec process as impersonated user). (Pierre) -- Fixed PECL bug #16842 (oci_error return false when NO_DATA_FOUND is raised). - (Chris Jones) + 30 Jun 2009, PHP 5.3.0 - Upgraded bundled PCRE to version 7.9. (Nuno) diff --git a/README.RELEASE_PROCESS b/README.RELEASE_PROCESS index d99c4ff38..684c420e3 100644 --- a/README.RELEASE_PROCESS +++ b/README.RELEASE_PROCESS @@ -100,9 +100,9 @@ Derick) run the following commands for you: ``sudo -u ezmlm ezmlm-sub ~ezmlm/primary-qa-tester/mod moderator-email-address`` -3. Update the MD5 sums in ``qaweb/include/rc-md5sums.txt`` (no empty lines). +3. Update the MD5 sums in ``web/qa/trunk/include/rc-md5sums.txt`` (no empty lines). -4. Update in ``qaweb/include/release-qa.php`` constants with the new RC and +4. Update in ``web/qa/trunk/include/release-qa.php`` constants with the new RC and commit this. a. ``$BUILD_TEST_RELEASES`` = array("4.4.7RC1", "5.2.2RC1") @@ -111,7 +111,7 @@ commit this. c. ``$RELEASE_PROCESS`` = array(4 => true, 5 => true) -1. Update in ``php-bugs-web/include/functions.inc`` the ``show_version_option`` +1. Update in ``php-bugs/trunk/include/functions.inc`` the ``show_version_option`` function to include the new RC and commit. 2. Update ``phpweb/include/version.inc`` (x=major version number) diff --git a/README.SUBMITTING_PATCH b/README.SUBMITTING_PATCH index 8229bf075..aa80a2ce1 100644 --- a/README.SUBMITTING_PATCH +++ b/README.SUBMITTING_PATCH @@ -1,106 +1,136 @@ -Submitting Patch for PHP -======================== +Submitting Patches to PHP +========================= -This document describes how to submit a patch for PHP. Since you are -reading this document, you are willing to submit a patch for PHP. -Please keep reading! Submitting a patch for PHP is easy. The hard -part is making it acceptable for inclusion into our repository. :-) +This document describes how to submit a patch for PHP. Creating a +patch for PHP is easy! -How to create patch? --------------------- -We use Subversion (SVN) for revision control. You need to get the -source from SVN in order to create a patch. Read -http://www.php.net/svn.php for help on using SVN. You can check out -older branches, but make sure you get trunk as well and make your -patch work there. +You don't need any login accounts or special access to download, +build, debug and begin submitting PHP code, tests or documentation for +inclusion in PHP. Once you've followed this README and had several +patches accepted, PHP commit privileges are often quickly granted. -Read CODING_STANDARDS file before you start working. +An excellent article to read first is: +http://phpadvent.org/2008/less-whining-more-coding-by-elizabeth-smith -Now you are ready to create a patch. Modify source to fix a bug in PHP or -add a new feature to PHP. After you finished editing, please test your -patch. Read README.TESTING for testing. -After you finish testing your patch, take diff file using -"svn diff > your.patch" command. +Prework +------- +If you are fixing broken functionality then create a bug or identify +an existing bug at http://bugs.php.net/. This can be used to track +the patch progress and prevent your changes getting lost in the PHP +mail archives. -Read README.TESTING for submitting a test script for your patch. This is -not strictly required, but it is preferred to submit a test script along -with your patch. Making new test script is very easy. It also helps us -to understand what you have been fixed or added to PHP. +If your code change is large then first discuss it with the extension +maintainer and/or a development mail list. Extension maintainers can +be found in the EXTENSIONS file in the PHP source. Use the +internals@lists.php.net mail list to discuss changes to the base PHP +code. Use pecl-dev@lists.php.net for changes to code that is only +available from PECL (http://pecl.php.net/). Use pear-dev@lists.php.net +for PEAR modules (http://pear.php.net/). Mail list subscription is +explained on http://www.php.net/mailing-lists.php. +If a PHP or PECL patch affects user-functionality or makes significant +internal changes then create a simple RFC on http://wiki.php.net/rfc +before starting discussion. This RFC can be used for initial +discussion and later for documentation. Wiki accounts can be requested +on http://wiki.php.net/start?do=register -Tips for creating patch ------------------------ -If you would like to fix multiple bugs. It is easier for us if you -could create 1 patch for 1 bug, but this is not strictly required. -Note though that you might get little response, if your patch is -too hard to review. +There are several IRC channels where PHP developers are often +available to discuss questions. They include #php.pecl on the EFNet +network and #php-dev-win on FreeNode. -If you would like change/add many lines, it is better to ask module -maintainer and/or internals@lists.php.net, or pear-dev@lists.php.net if -you are patching PEAR. Official module maintainers can be found in -EXTENSIONS file in PHP source. -If you are new to SVN (Subversion), visit -http://svnbook.red-bean.com/ for details. +How to create your patch +------------------------ +PHP uses Subversion (SVN) for revision control. Read +http://www.php.net/svn.php for help on using SVN to get and build PHP +source code. We recommend using a Sparse Directory checkout described +in http://wiki.php.net/vcs/svnfaq. If you are new to SVN, read +http://svnbook.red-bean.com. +Generally we ask that patches work on the current stable PHP +development branch and on "trunk". -Check list for submitting patch -------------------------------- - - Did you run "make test" to check if your patch didn't break - other features? - - Did you compile PHP with --enable-debug and check the PHP and - web server error logs when you test your patch? - - Did you build PHP for multi-threaded web servers. (Optional) - - Did you create test script for "make test"? (Recommended) - - Did you update SVN source before you take final patch? - - Did you read the patch again? +Read CODING_STANDARDS before you start working. +After modifying the source see README.TESTING and +http://qa.php.net/write-test.php for how to test. Submitting test +scripts helps us to understand what functionality has changed. It is +important for the stability and maintainability of PHP that tests are +comprehensive. -Where to send your patch? -------------------------- -If you are patching C source, send the patch to internals@lists.php.net. -If you are patching a module, you should also send the patch to the -maintainer. Official module maintainers are listed in EXTENSION file -in source. +After testing is finished, create a patch file using the command: -If you are patching PEAR, send the patch to pear-dev@lists.php.net. + svn diff > your_patch.txt -Please add the prefix "[PATCH]" to your email subject and make sure -to include the patch as a MIME attachment even if it is short. +For ease of review and later troubleshooting, submit individual +patches for each bug or feature. -NOTE: only MIME attachments of type 'text/*' are accepted. The - easiest way to accomplish this, is to make the extension - '.txt'. -Test scripts should be included in the same email. -Explain what has been fixed/added/changed by your patch. +Checklist for submitting your patch +----------------------------------- + - Update SVN source just before running your final 'diff' and + before testing. + - Run "make test" to check your patch doesn't break other features. + - Rebuild PHP with --enable-debug (which will show some kinds of + memory errors) and check the PHP and web server error logs after + running the PHP tests. + - Rebuild PHP with --enable-maintainer-zts to check your patch compiles + on multi-threaded web servers. + - Create test scripts for use with "make test". + - Add in-line comments and/or have external documentation ready. + - Review the patch once more just before submitting it. -Finally, add the bug Id(s) which can be closed by your patch, if any. +Where to send your patch +------------------------ +If you are patching PHP C source then email the patch to +internals@lists.php.net -What happens after you submit your patch ----------------------------------------- -If your patch is easy to review and has obviously no side-effects, -it might take up to a few hours until someone commits it. +If you patching a PECL extension then send the patch to +pecl-dev@lists.php.net + +If you are patching PEAR then send the patch to +pear-dev@lists.php.net + +The mail can be CC'd to the extension maintainer (see EXTENSIONS). + +Please make the subject prefix "[PATCH]". + +Include the patch as an attachment. Note: only MIME attachments of +type 'text/*' are accepted. The easiest way to accomplish this is to +make the file extension '.txt'. + +Explain what has been fixed/added/changed by your patch. Test scripts +should be included in the email. -Because this is a volunteer-driven effort, more complex patches will -require more patience on your side. +Include the bug id(s) which can be closed by your patch. -If you did not receive any feedback in a few days, please consider -resubmitting the description of your patch, along-side with +Finally, update any open bugs and add a link to the source of your +patch. + + +What happens after you submit your patch +---------------------------------------- +If your patch is easy to review and obviously has no side-effects, +it might be committed relatively quickly. + +Because PHP is a volunteer-driven effort more complex patches will +require patience on your side. If you do not receive feedback in a few +days, consider resubmitting the patch. Before doing this think about these questions: -- Is my patch too hard to review? Because of which factors? -- Should I split it up in multiple parts? -- Are there any unwanted whitespace changes? + - Did I review the mail list archives to see if these kind of + changes had been discussed before? + - Did I explain my patch clearly? + - Is my patch too hard to review? Because of which factors? + - Are there any unwanted white space changes? -What happens when your patch is applied? ----------------------------------------- +What happens when your patch is applied +--------------------------------------- Your name will be included together with your email address in the SVN -commit log. If your patch affects end-users, a brief description +commit log. If your patch affects end users, a brief description and your name might be added to the NEWS file. - -Thank you for submitting patch for PHP! +Thank you for patching PHP! diff --git a/README.WIN32-BUILD-SYSTEM b/README.WIN32-BUILD-SYSTEM index ae864d0b4..d7d6e5c2b 100644 --- a/README.WIN32-BUILD-SYSTEM +++ b/README.WIN32-BUILD-SYSTEM @@ -1,174 +1,6 @@ The Win32 Build System. -$Id: README.WIN32-BUILD-SYSTEM 242949 2007-09-26 15:44:16Z cvs2svn $ -Wez Furlong -If you need help with the build system, send mail to -internals@lists.php.net; please don't email me directly. - -=========================================================== -Contents: -1. How to build PHP under windows - a. Requirements - b. Opening a command prompt - c. Generating configure.js - d. Configuring - e. Building - f. Cleaning up - g. Running the test suite - h. snapshot building - -2. How to write config.w32 files - x. to be written. - -=========================================================== -1. How to build PHP under windows -a. Requirements - - You need: - - Windows Scripting Host (cscript.exe) - - Microsoft Build Tools from: - Microsoft Visual Studio (VC6) or later - - You also need: - - bindlib_w32 [http://www.php.net/extra/bindlib_w32.zip] - - win32build [http://www.php.net/extra/win32build.zip] - - b. Opening the Build Environment Command Prompt: - - Using Visual Studio (VC6) - 1. Install it - 2. If you have a VC++ Command Prompt icon on your start menu, - click on it to get a Command Prompt with the env vars - set up correctly. - - If not, create a new shortcut and set the Target to: - - %comspec% /k "C:\Program Files\Microsoft Visual Studio\VC98\Bin\vcvars32.bat" - - You might also want to set the prompt to start in - a convenient location (such as the root of your - PHP source checkout). - - - Using Visual Studio .Net - 1. Install it. - 2. Under the Visual Studio .Net Tools sub menu of your start - menu, you should have a Visual Studio .Net Command Prompt - icon. If not, create a new shortcut and set the Target to: - - %comspec% /k "C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\Tools\vsvars32.bat" - - You might also want to set the prompt to start in - a convenient location (such as the root of your - PHP source checkout). - - - Using the Platform SDK tools - 1. Download the Platform SDK: - http://www.microsoft.com/msdownload/platformsdk/sdkupdate/ - - - You need the Core SDK, which is approx 200MB to download - and requires approx 500MB of disk space. - - The other components of the SDK are not required by PHP - - You might be able to reduce the download size by downloading - the installer control component first and then selecting - only the Build Environment (around 30MB), but I haven't - tried this. - - ** Note: it seems that MS don't include the 32 bit - build tools in the platform SDK any longer, so - you will probably have very limited luck if you - don't also have VC++ or VS.Net already installed. - - 2. Once installed, you will have an icon on your start menu - that will launch the build environment; the latest SDK's - install a number of different versions of this; you probably - want to choose the Windows 2000 Retail build environment. - Clicking on this will open a command prompt with its Path, - Include and Lib env vars set to point to the build tools - and win32 headers. - -c. Generating configure - - Change directory to where you have your PHP 5 sources. - Run buildconf.bat. - -d. Configuring - - cscript /nologo configure.js --help - - Will give you a list of configuration options; these will - have the form: - - --enable-foo or --disable-foo or --with-foo or --without-foo. - - --enable-foo will turn something on, and is equivalent to - specifying --enable-foo=yes - - --disable-foo will turn something off, and is equivalent to - specifying --enable-foo=no - - --enable-foo=shared will attempt to build that feature as - a shared, dynamically loadable module. - - Sometimes a configure option needs additional information - about where to find headers and libraries; quite often - you can specify --enable-foo=option where option could be - the path to where to find those files. If you want to - specify a parameter and build it as shared, you can use - this syntax instead: --enable-foo=shared,option - - The same rules all apply to --with-foo and --without-foo; - the only difference is the way the options are named; - the convention is that --enable-foo means that you are - switching on something that comes with PHP, whereas - --with-foo means that you want to build in something - external to PHP. - -e. Building - - Once you have successfully configured your build (make - sure you read the output from the command to make sure - it worked correctly), you can build the code; simply type - - "nmake" at the command prompt, and it will build everthing - you asked for. - - Once the build has completed, you will find your binaries - in the build dir determined by configure; this is typically - Release_TS for release builds or Debug_TS for debug builds. - If you build a non-thread-safe build, it will use Release - or Debug to store the files. Also in this build dir you - will find sub directories for each module that went into - your PHP build. The files you'll want to keep are the - .exe and .dll files directly in your build dir. - -f. Cleaning Up - - You can automatically delete everything that was built - by running "nmake clean". This will delete everything - that was put there when you ran nmake, including the - .exe and .dll files. - -g. Running the test suite - - You can verify that your build is working well by running - the regression test suite. You do this by typing - "nmake test". You can specify the tests you want to run - by defing the TESTS variable - if you wanted to run the - sqlite test suite only, you would type - "nmake /D TESTS=ext/sqlite/tests test" - -h. Snapshot Building - - If you want to set up an automated build that will tolerate - breakages in some of the modules, you can use the - --enable-snapshot-build configure option to generate a - makefile optimized for that purpose. A snapshot build will - switch the argument parser so that the default option for - configure switches that your don't specify will be set - to "shared". The effect of this is to turn on all options - unless you explicitly disable them. When you have configured - your snapshot build, you can use "nmake build-snap" to build - everything, ignoring build errors in individual extensions - or SAPI. +See http://wiki.php.net/internals/windows/stepbystepbuild vim:tw=78:sw=1:ts=1:et diff --git a/TSRM/TSRM.c b/TSRM/TSRM.c index 625bd5d85..368178ed0 100644 --- a/TSRM/TSRM.c +++ b/TSRM/TSRM.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Thread Safe Resource Manager | +----------------------------------------------------------------------+ - | Copyright (c) 1999-2009, Andi Gutmans, Sascha Schumann, Zeev Suraski | + | Copyright (c) 1999-2010, Andi Gutmans, Sascha Schumann, Zeev Suraski | | This source file is subject to the TSRM license, that is bundled | | with this package in the file LICENSE | +----------------------------------------------------------------------+ diff --git a/TSRM/TSRM.h b/TSRM/TSRM.h index 5343779d9..cd6618f91 100644 --- a/TSRM/TSRM.h +++ b/TSRM/TSRM.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Thread Safe Resource Manager | +----------------------------------------------------------------------+ - | Copyright (c) 1999-2009, Andi Gutmans, Sascha Schumann, Zeev Suraski | + | Copyright (c) 1999-2010, Andi Gutmans, Sascha Schumann, Zeev Suraski | | This source file is subject to the TSRM license, that is bundled | | with this package in the file LICENSE | +----------------------------------------------------------------------+ diff --git a/TSRM/tsrm_nw.c b/TSRM/tsrm_nw.c index 4a9ccabdd..ac566a411 100644 --- a/TSRM/tsrm_nw.c +++ b/TSRM/tsrm_nw.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: tsrm_nw.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: tsrm_nw.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include #include diff --git a/TSRM/tsrm_nw.h b/TSRM/tsrm_nw.h index e2fe4f539..489505954 100644 --- a/TSRM/tsrm_nw.h +++ b/TSRM/tsrm_nw.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | diff --git a/TSRM/tsrm_virtual_cwd.c b/TSRM/tsrm_virtual_cwd.c index 37b9820ea..251fd2f8d 100644 --- a/TSRM/tsrm_virtual_cwd.c +++ b/TSRM/tsrm_virtual_cwd.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: tsrm_virtual_cwd.c 289780 2009-10-19 23:38:55Z pajoye $ */ +/* $Id: tsrm_virtual_cwd.c 294520 2010-02-04 09:57:30Z pajoye $ */ #include #include @@ -432,8 +432,8 @@ CWD_API char *virtual_getcwd(char *buf, size_t size TSRMLS_DC) /* {{{ */ static inline unsigned long realpath_cache_key(const char *path, int path_len TSRMLS_DC) /* {{{ */ { register unsigned long h; - char *bucket_key = tsrm_win32_get_path_sid_key(path TSRMLS_CC); - char *bucket_key_start = (char *)bucket_key; + char *bucket_key_start = tsrm_win32_get_path_sid_key(path TSRMLS_CC); + char *bucket_key = (char *)bucket_key_start; const char *e = bucket_key + strlen(bucket_key); if (!bucket_key) { @@ -444,11 +444,7 @@ static inline unsigned long realpath_cache_key(const char *path, int path_len TS h *= 16777619; h ^= *bucket_key++; } - /* if no SID were present the path is returned. Otherwise a Heap - allocated string is returned. */ - if (bucket_key_start != path) { - LocalFree(bucket_key_start); - } + HeapFree(GetProcessHeap(), 0, (LPVOID)bucket_key_start); return h; } /* }}} */ @@ -590,6 +586,22 @@ CWD_API realpath_cache_bucket* realpath_cache_lookup(const char *path, int path_ } /* }}} */ +CWD_API int realpath_cache_size(TSRMLS_D) +{ + return CWDG(realpath_cache_size); +} + +CWD_API int realpath_cache_max_buckets(TSRMLS_D) +{ + return (sizeof(CWDG(realpath_cache)) / sizeof(CWDG(realpath_cache)[0])); +} + +CWD_API realpath_cache_bucket** realpath_cache_get_buckets(TSRMLS_D) +{ + return CWDG(realpath_cache); +} + + #undef LINK_MAX #define LINK_MAX 32 @@ -702,7 +714,9 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i tmp = tsrm_do_alloca(len+1, use_heap); memcpy(tmp, path, len+1); - if(save && (data.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT)) { + if(save && + !(IS_UNC_PATH(path, len) && len >= 3 && path[2] != '?') && + (data.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT)) { /* File is a reparse point. Get the target */ HANDLE hLink = NULL; REPARSE_DATA_BUFFER * pbuffer; @@ -983,9 +997,19 @@ CWD_API int virtual_file_ex(cwd_state *state, const char *path, verify_path_func time_t t; int ret; int add_slash; + void *tmp; TSRMLS_FETCH(); if (path_length == 0 || path_length >= MAXPATHLEN-1) { +#ifdef TSRM_WIN32 +# if _MSC_VER < 1300 + errno = EINVAL; +# else + _set_errno(EINVAL); +# endif +#else + errno = EINVAL; +#endif return 1; } @@ -1127,7 +1151,16 @@ verify: CWD_STATE_COPY(&old_state, state); state->cwd_length = path_length; - state->cwd = (char *) realloc(state->cwd, state->cwd_length+1); + + tmp = realloc(state->cwd, state->cwd_length+1); + if (tmp == NULL) { +#if VIRTUAL_CWD_DEBUG + fprintf (stderr, "Out of memory\n"); +#endif + return 1; + } + state->cwd = (char *) tmp; + memcpy(state->cwd, resolved_path, state->cwd_length+1); if (verify_path(state)) { CWD_STATE_FREE(state); @@ -1139,7 +1172,15 @@ verify: } } else { state->cwd_length = path_length; - state->cwd = (char *) realloc(state->cwd, state->cwd_length+1); + tmp = realloc(state->cwd, state->cwd_length+1); + if (tmp == NULL) { +#if VIRTUAL_CWD_DEBUG + fprintf (stderr, "Out of memory\n"); +#endif + return 1; + } + state->cwd = (char *) tmp; + memcpy(state->cwd, resolved_path, state->cwd_length+1); ret = 0; } diff --git a/TSRM/tsrm_virtual_cwd.h b/TSRM/tsrm_virtual_cwd.h index 7f612bfec..c18bc0f4b 100644 --- a/TSRM/tsrm_virtual_cwd.h +++ b/TSRM/tsrm_virtual_cwd.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: tsrm_virtual_cwd.h 287673 2009-08-25 09:16:53Z pajoye $ */ +/* $Id: tsrm_virtual_cwd.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef VIRTUAL_CWD_H #define VIRTUAL_CWD_H @@ -238,6 +238,9 @@ extern virtual_cwd_globals cwd_globals; CWD_API void realpath_cache_clean(TSRMLS_D); CWD_API void realpath_cache_del(const char *path, int path_len TSRMLS_DC); CWD_API realpath_cache_bucket* realpath_cache_lookup(const char *path, int path_len, time_t t TSRMLS_DC); +CWD_API int realpath_cache_size(TSRMLS_D); +CWD_API int realpath_cache_max_buckets(TSRMLS_D); +CWD_API realpath_cache_bucket** realpath_cache_get_buckets(TSRMLS_D); /* The actual macros to be used in programs using TSRM * If the program defines VIRTUAL_DIR it will use the diff --git a/TSRM/tsrm_win32.c b/TSRM/tsrm_win32.c index b224d4b10..2267488a9 100644 --- a/TSRM/tsrm_win32.c +++ b/TSRM/tsrm_win32.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: tsrm_win32.c 290166 2009-11-03 10:48:12Z pajoye $ */ +/* $Id: tsrm_win32.c 294728 2010-02-07 21:09:19Z pajoye $ */ #include #include @@ -176,6 +176,7 @@ PSID tsrm_win32_get_token_sid(HANDLE hToken) if (!CopySid(sid_len, pResultSid, pTokenUser->User.Sid)) { goto Finished; } + HeapFree(GetProcessHeap(), 0, (LPVOID)pTokenUser); return pResultSid; Finished: @@ -222,11 +223,13 @@ TSRM_API int tsrm_win32_access(const char *pathname, int mode) } if(access(pathname, mode)) { + free(real_path); return errno; } /* If only existence check is made, return now */ if (mode == 0) { + free(real_path); return 0; } @@ -271,6 +274,9 @@ TSRM_API int tsrm_win32_access(const char *pathname, int mode) if (!DuplicateToken(thread_token, SecurityImpersonation, &TWG(impersonation_token))) { goto Finished; } + } else { + /* we already have it, free it then */ + free(token_sid); } if (CWDG(realpath_cache_size_limit)) { @@ -299,7 +305,7 @@ TSRM_API int tsrm_win32_access(const char *pathname, int mode) fAccess = bucket->is_writable; goto Finished; } - desired_access = FILE_GENERIC_READ | FILE_GENERIC_WRITE; + desired_access = FILE_GENERIC_WRITE; } else if(mode <= 4) { if(bucket != NULL && bucket->is_rvalid) { fAccess = bucket->is_readable; @@ -344,6 +350,11 @@ TSRM_API int tsrm_win32_access(const char *pathname, int mode) else if(desired_access == FILE_GENERIC_WRITE) { bucket->is_wvalid = 1; bucket->is_writable = fAccess; + } else if (desired_access == (FILE_GENERIC_READ | FILE_GENERIC_WRITE)) { + bucket->is_rvalid = 1; + bucket->is_readable = fAccess; + bucket->is_wvalid = 1; + bucket->is_writable = fAccess; } } @@ -518,7 +529,6 @@ TSRM_API FILE *popen_ex(const char *command, const char *type, const char *cwd, if (err == ERROR_NO_TOKEN) { asuser = FALSE; } - } cmd = (char*)malloc(strlen(command)+strlen(TWG(comspec))+sizeof(" /c ")+2); diff --git a/TSRM/tsrm_win32.h b/TSRM/tsrm_win32.h index 7cd966918..0d6f2ab7c 100644 --- a/TSRM/tsrm_win32.h +++ b/TSRM/tsrm_win32.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: tsrm_win32.h 289780 2009-10-19 23:38:55Z pajoye $ */ +/* $Id: tsrm_win32.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef TSRM_WIN32_H #define TSRM_WIN32_H diff --git a/Zend/acconfig.h b/Zend/acconfig.h index bb949a6cb..75d1cd82e 100644 --- a/Zend/acconfig.h +++ b/Zend/acconfig.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: acconfig.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: acconfig.h 293155 2010-01-05 20:46:53Z sebastian $ */ #if defined(__GNUC__) && __GNUC__ >= 4 # define ZEND_API __attribute__ ((visibility("default"))) diff --git a/Zend/header b/Zend/header index 68bf97b36..868606211 100644 --- a/Zend/header +++ b/Zend/header @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,4 +16,4 @@ +----------------------------------------------------------------------+ */ -/* $Id: header 272619 2009-01-02 20:45:43Z felipe $ */ +/* $Id: header 294437 2010-02-03 18:47:13Z pajoye $ */ diff --git a/Zend/tests/bug44827.phpt b/Zend/tests/bug44827.phpt new file mode 100644 index 000000000..a9f1d87d2 --- /dev/null +++ b/Zend/tests/bug44827.phpt @@ -0,0 +1,11 @@ +--TEST-- +Bug #44827 (define() allows :: in constant names) +--FILE-- + +--EXPECTF-- +Warning: Class constants cannot be defined or redefined in %sbug44827.php on line %d + +Warning: Class constants cannot be defined or redefined in %sbug44827.php on line %d diff --git a/Zend/tests/bug47516.phpt b/Zend/tests/bug47516.phpt index 66304fe3b..a9a20710d 100644 --- a/Zend/tests/bug47516.phpt +++ b/Zend/tests/bug47516.phpt @@ -30,7 +30,7 @@ ppp echo "$htm\n"; ?> ---EXPECT--- +--EXPECT-- abc abc abc diff --git a/Zend/tests/bug48667_1.phpt b/Zend/tests/bug48667_1.phpt new file mode 100644 index 000000000..2d94aed2b --- /dev/null +++ b/Zend/tests/bug48667_1.phpt @@ -0,0 +1,10 @@ +--TEST-- +Bug #48667 (Implementing both iterator and iteratoraggregate) +--FILE-- + +--EXPECTF-- +Fatal error: Class A cannot implement both IteratorAggregate and Iterator at the same time in %s on line %d diff --git a/Zend/tests/bug48667_2.phpt b/Zend/tests/bug48667_2.phpt new file mode 100644 index 000000000..57cd5eb8b --- /dev/null +++ b/Zend/tests/bug48667_2.phpt @@ -0,0 +1,10 @@ +--TEST-- +Bug #48667 (Implementing both iterator and iteratoraggregate) +--FILE-- + +--EXPECTF-- +Fatal error: Class A cannot implement both Iterator and IteratorAggregate at the same time in %s on line %d diff --git a/Zend/tests/bug49472.phpt b/Zend/tests/bug49472.phpt new file mode 100644 index 000000000..1803d1848 --- /dev/null +++ b/Zend/tests/bug49472.phpt @@ -0,0 +1,27 @@ +--TEST-- +Bug #49472 (Constants defined in Interfaces can be overridden) +--FILE-- + +--EXPECTF-- +Fatal error: Cannot inherit previously-inherited or override constant c from interface ia in %s on line %d diff --git a/Zend/tests/bug49866.phpt b/Zend/tests/bug49866.phpt new file mode 100644 index 000000000..7fbc0d802 --- /dev/null +++ b/Zend/tests/bug49866.phpt @@ -0,0 +1,10 @@ +--TEST-- +Bug #49866 (Making reference on string offsets crashes PHP) +--FILE-- +file = null; + } +} + +throw new a; + +?> +--EXPECTF-- +Fatal error: Uncaught exception 'a' in :%d +Stack trace: +#0 {main} + thrown in Unknown on line %d diff --git a/Zend/tests/bug50146.phpt b/Zend/tests/bug50146.phpt new file mode 100644 index 000000000..7aa26a650 --- /dev/null +++ b/Zend/tests/bug50146.phpt @@ -0,0 +1,20 @@ +--TEST-- +Bug #50146 (property_exists: Closure object cannot have properties) +--FILE-- +hasProperty('b')); + +var_dump(isset($obj->a)); + +?> +--EXPECTF-- +bool(false) +bool(false) + +Catchable fatal error: Closure object cannot have properties in %s on line %d diff --git a/Zend/tests/bug50174.phpt b/Zend/tests/bug50174.phpt new file mode 100644 index 000000000..fef65136b --- /dev/null +++ b/Zend/tests/bug50174.phpt @@ -0,0 +1,33 @@ +--TEST-- +Bug #50174 (Incorrectly matched docComment) +--SKIPIF-- + +--FILE-- +getDocComment()); + +class TestClass2 +{ + /** const comment */ + const C = 0; + + public $x; +} + +$rp = new ReflectionProperty('TestClass2', 'x'); +var_dump($rp->getDocComment()); + +?> +--EXPECT-- +bool(false) +bool(false) diff --git a/Zend/tests/bug50255.phpt b/Zend/tests/bug50255.phpt new file mode 100644 index 000000000..9f390af7c --- /dev/null +++ b/Zend/tests/bug50255.phpt @@ -0,0 +1,30 @@ +--TEST-- +Bug #50255 (isset() and empty() silently casts array to object) +--FILE-- + 'bar'); + +print "isset\n"; +var_dump(isset($arr->foo)); +var_dump(isset($arr->bar)); +var_dump(isset($arr['foo'])); +var_dump(isset($arr['bar'])); +print "empty\n"; +var_dump(empty($arr->foo)); +var_dump(empty($arr->bar)); +var_dump(empty($arr['foo'])); +var_dump(empty($arr['bar'])); + +?> +--EXPECT-- +isset +bool(false) +bool(false) +bool(true) +bool(false) +empty +bool(true) +bool(true) +bool(false) +bool(true) diff --git a/Zend/tests/bug50261.phpt b/Zend/tests/bug50261.phpt new file mode 100644 index 000000000..271a2c480 --- /dev/null +++ b/Zend/tests/bug50261.phpt @@ -0,0 +1,38 @@ +--TEST-- +Bug #50261 (Crash When Calling Parent Constructor with call_user_func()) +--FILE-- + +--EXPECT-- +testClass::testClass (1) +testClass::testClass (2) +testClass::testClass (3) +testClass::testClass (4) +testClass::testClass (5) diff --git a/Zend/tests/bug50394.phpt b/Zend/tests/bug50394.phpt new file mode 100644 index 000000000..e6069d366 --- /dev/null +++ b/Zend/tests/bug50394.phpt @@ -0,0 +1,24 @@ +--TEST-- +Bug #50394: Reference argument converted to value in __call +--FILE-- +a = 1; + } +} + +call_user_func(array('foo', 'teste')); + +?> +--EXPECTF-- +Strict Standards: call_user_func() expects parameter 1 to be a valid callback, non-static method foo::teste() should not be called statically in %s on line %d + +Fatal error: Using $this when not in object context in %s on line %d diff --git a/Zend/tests/call_user_func_005.phpt b/Zend/tests/call_user_func_005.phpt new file mode 100644 index 000000000..6c1fa1973 --- /dev/null +++ b/Zend/tests/call_user_func_005.phpt @@ -0,0 +1,35 @@ +--TEST-- +Passing Closure as parameter to an non-existent function +--FILE-- + +--EXPECTF-- +Strict Standards: call_user_func() expects parameter 1 to be a valid callback, non-static method foo::teste() should not be called statically in %s on line %d +%string|unicode%(1) "x" +array(1) { + [0]=> + object(Closure)#%d (1) { + ["parameter"]=> + array(2) { + ["$a"]=> + string(10) "" + ["$b"]=> + string(10) "" + } + } +} +int(1) diff --git a/Zend/tests/call_with_refs.phpt b/Zend/tests/call_with_refs.phpt new file mode 100644 index 000000000..acad134f8 --- /dev/null +++ b/Zend/tests/call_with_refs.phpt @@ -0,0 +1,18 @@ +--TEST-- +Check call to non-ref function with call-time refs +--FILE-- + +--EXPECTF-- +object(Closure)#%d (1) { + ["static"]=> + array(1) { + [%u|b%"x"]=> + &object(Closure)#%d (1) { + ["static"]=> + array(1) { + [%u|b%"x"]=> + *RECURSION* + } + } + } +} +int(1) diff --git a/Zend/tests/errmsg_025.phpt b/Zend/tests/errmsg_025.phpt index d853f7342..014b40947 100644 --- a/Zend/tests/errmsg_025.phpt +++ b/Zend/tests/errmsg_025.phpt @@ -16,5 +16,5 @@ class test implements test1, test2 { echo "Done\n"; ?> ---EXPECTF-- -Fatal error: Cannot inherit previously-inherited constant FOO from interface test2 in %s on line %d +--EXPECTF-- +Fatal error: Cannot inherit previously-inherited or override constant FOO from interface test2 in %s on line %d diff --git a/Zend/tests/inter_01.phpt b/Zend/tests/inter_01.phpt index db2e86d20..c73397c91 100644 --- a/Zend/tests/inter_01.phpt +++ b/Zend/tests/inter_01.phpt @@ -15,4 +15,4 @@ class foobar implements foo { } ?> --EXPECTF-- -Fatal error: Cannot inherit previously-inherited constant foo from interface foo in %s on line %d +Fatal error: Cannot inherit previously-inherited or override constant foo from interface foo in %s on line %d diff --git a/Zend/tests/unset_cv05.phpt b/Zend/tests/unset_cv05.phpt index 24f9c0091..8e3c6349b 100644 --- a/Zend/tests/unset_cv05.phpt +++ b/Zend/tests/unset_cv05.phpt @@ -19,7 +19,7 @@ echo $HTTP_SESSION_VARS; echo "\nok\n"; ?> --EXPECTF-- -PHP Warning: Directive 'register_long_arrays' is deprecated in PHP %d.%d and greater in Unknown on line 0 +Warning: Directive 'register_long_arrays' is deprecated in PHP %d.%d and greater in Unknown on line 0 ok Warning: session_start(): Cannot send session cookie - headers already sent by (output started at %sunset_cv05.php on line %d diff --git a/Zend/tests/unset_cv06.phpt b/Zend/tests/unset_cv06.phpt index b6825947b..b1ef0cc2a 100644 --- a/Zend/tests/unset_cv06.phpt +++ b/Zend/tests/unset_cv06.phpt @@ -19,7 +19,7 @@ echo $x; echo "ok\n"; ?> --EXPECTF-- -PHP Warning: Directive 'register_globals' is deprecated in PHP %d.%d and greater in Unknown on line 0 +Warning: Directive 'register_globals' is deprecated in PHP %d.%d and greater in Unknown on line 0 1 Deprecated: Function session_register() is deprecated in %s on line %d diff --git a/Zend/zend.c b/Zend/zend.c index df9a86cbd..cd8ba7776 100644 --- a/Zend/zend.c +++ b/Zend/zend.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend.c 290026 2009-10-28 11:08:33Z pajoye $ */ +/* $Id: zend.c 293155 2010-01-05 20:46:53Z sebastian $ */ #include "zend.h" #include "zend_extensions.h" @@ -114,7 +114,7 @@ ZEND_API zval zval_used_for_init; /* True global variable */ /* version information */ static char *zend_version_info; static uint zend_version_info_length; -#define ZEND_CORE_VERSION_INFO "Zend Engine v" ZEND_VERSION ", Copyright (c) 1998-2009 Zend Technologies\n" +#define ZEND_CORE_VERSION_INFO "Zend Engine v" ZEND_VERSION ", Copyright (c) 1998-2010 Zend Technologies\n" #define PRINT_ZVAL_INDENT 4 static void print_hash(zend_write_func_t write_func, HashTable *ht, int indent, zend_bool is_object TSRMLS_DC) /* {{{ */ diff --git a/Zend/zend.h b/Zend/zend.h index 58f0e5984..3332e7c93 100644 --- a/Zend/zend.h +++ b/Zend/zend.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend.h 286859 2009-08-06 01:33:54Z scottmac $ */ +/* $Id: zend.h 294459 2010-02-03 20:44:43Z pajoye $ */ #ifndef ZEND_H #define ZEND_H @@ -166,7 +166,7 @@ char *alloca (); # define ZEND_ATTRIBUTE_DEPRECATED #endif -#if defined(__GNUC__) && ZEND_GCC_VERSION >= 3400 && defined(__i386__) +#if defined(__GNUC__) && ZEND_GCC_VERSION >= 3004 && defined(__i386__) # define ZEND_FASTCALL __attribute__((fastcall)) #elif defined(_MSC_VER) && defined(_M_IX86) # define ZEND_FASTCALL __fastcall @@ -174,7 +174,7 @@ char *alloca (); # define ZEND_FASTCALL #endif -#if defined(__GNUC__) && ZEND_GCC_VERSION >= 3400 +#if defined(__GNUC__) && ZEND_GCC_VERSION >= 3004 #else # define __restrict__ #endif @@ -710,6 +710,11 @@ END_EXTERN_C() FREE_ZVAL(pzv); \ } \ INIT_PZVAL(&(zv)); + +#define MAKE_COPY_ZVAL(ppzv, pzv) \ + *(pzv) = **(ppzv); \ + zval_copy_ctor((pzv)); \ + INIT_PZVAL((pzv)); #define REPLACE_ZVAL_VALUE(ppzv_dest, pzv_src, copy) { \ int is_ref, refcount; \ diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 6a5c5f87a..6d939e682 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_API.c 289431 2009-10-09 17:21:20Z pajoye $ */ +/* $Id: zend_API.c 293980 2010-01-25 14:02:09Z johannes $ */ #include "zend.h" #include "zend_execute.h" @@ -923,7 +923,7 @@ ZEND_API int zend_parse_method_parameters_ex(int flags, int num_args TSRMLS_DC, RETURN_IF_ZERO_ARGS(num_args, p, quiet); va_start(va, type_spec); - retval = zend_parse_va_args(num_args, type_spec, &va, 0 TSRMLS_CC); + retval = zend_parse_va_args(num_args, type_spec, &va, flags TSRMLS_CC); va_end(va); } else { p++; @@ -2335,12 +2335,13 @@ ZEND_API int zend_disable_class(char *class_name, uint class_name_length TSRMLS_ } /* }}} */ -static int zend_is_callable_check_class(const char *name, int name_len, zend_fcall_info_cache *fcc, char **error TSRMLS_DC) /* {{{ */ +static int zend_is_callable_check_class(const char *name, int name_len, zend_fcall_info_cache *fcc, int *strict_class, char **error TSRMLS_DC) /* {{{ */ { int ret = 0; zend_class_entry **pce; char *lcname = zend_str_tolower_dup(name, name_len); + *strict_class = 0; if (name_len == sizeof("self") - 1 && !memcmp(lcname, "self", sizeof("self") - 1)) { if (!EG(scope)) { @@ -2365,6 +2366,7 @@ static int zend_is_callable_check_class(const char *name, int name_len, zend_fca if (!fcc->object_ptr) { fcc->object_ptr = EG(This); } + *strict_class = 1; ret = 1; } } else if (name_len == sizeof("static") - 1 && @@ -2377,6 +2379,7 @@ static int zend_is_callable_check_class(const char *name, int name_len, zend_fca if (!fcc->object_ptr) { fcc->object_ptr = EG(This); } + *strict_class = 1; ret = 1; } } else if (zend_lookup_class_ex(name, name_len, 1, &pce TSRMLS_CC) == SUCCESS) { @@ -2391,6 +2394,7 @@ static int zend_is_callable_check_class(const char *name, int name_len, zend_fca } else { fcc->called_scope = fcc->object_ptr ? Z_OBJCE_P(fcc->object_ptr) : fcc->calling_scope; } + *strict_class = 1; ret = 1; } else { if (error) zend_spprintf(error, 0, "class '%.*s' not found", name_len, name); @@ -2401,7 +2405,7 @@ static int zend_is_callable_check_class(const char *name, int name_len, zend_fca /* }}} */ -static int zend_is_callable_check_func(int check_flags, zval *callable, zend_fcall_info_cache *fcc, char **error TSRMLS_DC) /* {{{ */ +static int zend_is_callable_check_func(int check_flags, zval *callable, zend_fcall_info_cache *fcc, int strict_class, char **error TSRMLS_DC) /* {{{ */ { zend_class_entry *ce_org = fcc->calling_scope; int retval = 0; @@ -2459,7 +2463,7 @@ static int zend_is_callable_check_func(int check_flags, zval *callable, zend_fca EG(scope) = ce_org; } - if (!zend_is_callable_check_class(Z_STRVAL_P(callable), clen, fcc, error TSRMLS_CC)) { + if (!zend_is_callable_check_class(Z_STRVAL_P(callable), clen, fcc, &strict_class, error TSRMLS_CC)) { EG(scope) = last_scope; return 0; } @@ -2486,7 +2490,15 @@ static int zend_is_callable_check_func(int check_flags, zval *callable, zend_fca } lmname = zend_str_tolower_dup(mname, mlen); - if (zend_hash_find(ftable, lmname, mlen+1, (void**)&fcc->function_handler) == SUCCESS) { + if (strict_class && + fcc->calling_scope && + mlen == sizeof(ZEND_CONSTRUCTOR_FUNC_NAME)-1 && + !memcmp(lmname, ZEND_CONSTRUCTOR_FUNC_NAME, sizeof(ZEND_CONSTRUCTOR_FUNC_NAME))) { + fcc->function_handler = fcc->calling_scope->constructor; + if (fcc->function_handler) { + retval = 1; + } + } else if (zend_hash_find(ftable, lmname, mlen+1, (void**)&fcc->function_handler) == SUCCESS) { retval = 1; if ((fcc->function_handler->op_array.fn_flags & ZEND_ACC_CHANGED) && EG(scope) && @@ -2520,11 +2532,36 @@ static int zend_is_callable_check_func(int check_flags, zval *callable, zend_fca } else { get_function_via_handler: if (fcc->object_ptr && fcc->calling_scope == ce_org) { - if (Z_OBJ_HT_P(fcc->object_ptr)->get_method) { + if (strict_class && ce_org->__call) { + fcc->function_handler = emalloc(sizeof(zend_internal_function)); + fcc->function_handler->internal_function.type = ZEND_INTERNAL_FUNCTION; + fcc->function_handler->internal_function.module = ce_org->module; + fcc->function_handler->internal_function.handler = zend_std_call_user_call; + fcc->function_handler->internal_function.arg_info = NULL; + fcc->function_handler->internal_function.num_args = 0; + fcc->function_handler->internal_function.scope = ce_org; + fcc->function_handler->internal_function.fn_flags = ZEND_ACC_CALL_VIA_HANDLER; + fcc->function_handler->internal_function.function_name = estrndup(mname, mlen); + fcc->function_handler->internal_function.pass_rest_by_reference = 0; + fcc->function_handler->internal_function.return_reference = ZEND_RETURN_VALUE; + call_via_handler = 1; + retval = 1; + } else if (Z_OBJ_HT_P(fcc->object_ptr)->get_method) { fcc->function_handler = Z_OBJ_HT_P(fcc->object_ptr)->get_method(&fcc->object_ptr, mname, mlen TSRMLS_CC); if (fcc->function_handler) { - retval = 1; - call_via_handler = (fcc->function_handler->common.fn_flags & ZEND_ACC_CALL_VIA_HANDLER) != 0; + if (strict_class && + (!fcc->function_handler->common.scope || + !instanceof_function(ce_org, fcc->function_handler->common.scope TSRMLS_CC))) { + if ((fcc->function_handler->common.fn_flags & ZEND_ACC_CALL_VIA_HANDLER) != 0) { + if (fcc->function_handler->type != ZEND_OVERLOADED_FUNCTION) { + efree(fcc->function_handler->common.function_name); + } + efree(fcc->function_handler); + } + } else { + retval = 1; + call_via_handler = (fcc->function_handler->common.fn_flags & ZEND_ACC_CALL_VIA_HANDLER) != 0; + } } } } else if (fcc->calling_scope) { @@ -2680,7 +2717,7 @@ ZEND_API zend_bool zend_is_callable_ex(zval *callable, zval *object_ptr, uint ch return 1; } - ret = zend_is_callable_check_func(check_flags, callable, fcc, error TSRMLS_CC); + ret = zend_is_callable_check_func(check_flags, callable, fcc, 0, error TSRMLS_CC); if (fcc == &fcc_local && fcc->function_handler && ((fcc->function_handler->type == ZEND_INTERNAL_FUNCTION && @@ -2698,6 +2735,7 @@ ZEND_API zend_bool zend_is_callable_ex(zval *callable, zval *object_ptr, uint ch { zval **method = NULL; zval **obj = NULL; + int strict_class = 0; if (zend_hash_num_elements(Z_ARRVAL_P(callable)) == 2) { zend_hash_index_find(Z_ARRVAL_P(callable), 0, (void **) &obj); @@ -2725,7 +2763,7 @@ ZEND_API zend_bool zend_is_callable_ex(zval *callable, zval *object_ptr, uint ch return 1; } - if (!zend_is_callable_check_class(Z_STRVAL_PP(obj), Z_STRLEN_PP(obj), fcc, error TSRMLS_CC)) { + if (!zend_is_callable_check_class(Z_STRVAL_PP(obj), Z_STRLEN_PP(obj), fcc, &strict_class, error TSRMLS_CC)) { return 0; } @@ -2757,7 +2795,7 @@ ZEND_API zend_bool zend_is_callable_ex(zval *callable, zval *object_ptr, uint ch } } - ret = zend_is_callable_check_func(check_flags, *method, fcc, error TSRMLS_CC); + ret = zend_is_callable_check_func(check_flags, *method, fcc, strict_class, error TSRMLS_CC); if (fcc == &fcc_local && fcc->function_handler && ((fcc->function_handler->type == ZEND_INTERNAL_FUNCTION && diff --git a/Zend/zend_API.h b/Zend/zend_API.h index 032f83017..73689583a 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_API.h 286469 2009-07-28 21:12:42Z jani $ */ +/* $Id: zend_API.h 293155 2010-01-05 20:46:53Z sebastian $ */ #ifndef ZEND_API_H #define ZEND_API_H diff --git a/Zend/zend_alloc.c b/Zend/zend_alloc.c index 683ccf960..dac54543d 100644 --- a/Zend/zend_alloc.c +++ b/Zend/zend_alloc.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_alloc.c 287992 2009-09-03 14:33:11Z dmitry $ */ +/* $Id: zend_alloc.c 294518 2010-02-04 09:48:02Z pajoye $ */ #include "zend.h" #include "zend_alloc.h" @@ -84,6 +84,10 @@ static void zend_mm_panic(const char *message) __attribute__ ((noreturn)); static void zend_mm_panic(const char *message) { fprintf(stderr, "%s\n", message); +/* See http://support.microsoft.com/kb/190351 */ +#ifdef PHP_WIN32 + fflush(stderr); +#endif #if ZEND_DEBUG && defined(HAVE_KILL) && defined(HAVE_GETPID) kill(getpid(), SIGSEGV); #endif @@ -940,15 +944,27 @@ static void zend_mm_free_cache(zend_mm_heap *heap) #endif #if ZEND_MM_HEAP_PROTECTION || ZEND_MM_COOKIES -static void zend_mm_random(unsigned char *buf, size_t size) +static void zend_mm_random(unsigned char *buf, size_t size) /* {{{ */ { size_t i = 0; unsigned char t; #ifdef ZEND_WIN32 HCRYPTPROV hCryptProv; - - if (CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, 0)) { + int has_context = 0; + + if (!CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, 0)) { + /* Could mean that the key container does not exist, let try + again by asking for a new one */ + if (GetLastError() == NTE_BAD_KEYSET) { + if (CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, CRYPT_NEWKEYSET)) { + has_context = 1; + } + } + } else { + has_context = 1; + } + if (has_context) { do { BOOL ret = CryptGenRandom(hCryptProv, size, buf); CryptReleaseContext(hCryptProv, 0); @@ -957,7 +973,7 @@ static void zend_mm_random(unsigned char *buf, size_t size) i++; } if (i == size) { - return; + return; } } } while (0); @@ -986,6 +1002,7 @@ static void zend_mm_random(unsigned char *buf, size_t size) t = buf[i++] << 1; } } +/* }}} */ #endif /* Notes: @@ -1031,11 +1048,19 @@ ZEND_API zend_mm_heap *zend_mm_startup_ex(const zend_mm_mem_handlers *handlers, if (zend_mm_low_bit(block_size) != zend_mm_high_bit(block_size)) { fprintf(stderr, "'block_size' must be a power of two\n"); +/* See http://support.microsoft.com/kb/190351 */ +#ifdef PHP_WIN32 + fflush(stderr); +#endif exit(255); } storage = handlers->init(params); if (!storage) { fprintf(stderr, "Cannot initialize zend_mm storage [%s]\n", handlers->name); +/* See http://support.microsoft.com/kb/190351 */ +#ifdef PHP_WIN32 + fflush(stderr); +#endif exit(255); } storage->handlers = handlers; @@ -1118,9 +1143,17 @@ ZEND_API zend_mm_heap *zend_mm_startup(void) if (!mem_handlers[i].name) { fprintf(stderr, "Wrong or unsupported zend_mm storage type '%s'\n", mem_type); fprintf(stderr, " supported types:\n"); +/* See http://support.microsoft.com/kb/190351 */ +#ifdef PHP_WIN32 + fflush(stderr); +#endif for (i = 0; mem_handlers[i].name; i++) { fprintf(stderr, " '%s'\n", mem_handlers[i].name); } +/* See http://support.microsoft.com/kb/190351 */ +#ifdef PHP_WIN32 + fflush(stderr); +#endif exit(255); } } @@ -1131,9 +1164,17 @@ ZEND_API zend_mm_heap *zend_mm_startup(void) seg_size = zend_atoi(tmp, 0); if (zend_mm_low_bit(seg_size) != zend_mm_high_bit(seg_size)) { fprintf(stderr, "ZEND_MM_SEG_SIZE must be a power of two\n"); +/* See http://support.microsoft.com/kb/190351 */ +#ifdef PHP_WIN32 + fflush(stderr); +#endif exit(255); } else if (seg_size < ZEND_MM_ALIGNED_SEGMENT_SIZE + ZEND_MM_ALIGNED_HEADER_SIZE) { fprintf(stderr, "ZEND_MM_SEG_SIZE is too small\n"); +/* See http://support.microsoft.com/kb/190351 */ +#ifdef PHP_WIN32 + fflush(stderr); +#endif exit(255); } } else { @@ -1672,6 +1713,10 @@ static void zend_mm_safe_error(zend_mm_heap *heap, size); fprintf(stderr, " in %s on line %d\n", error_filename, error_lineno); } +/* See http://support.microsoft.com/kb/190351 */ +#ifdef PHP_WIN32 + fflush(stderr); +#endif } zend_end_try(); } else { heap->overflow = 2; diff --git a/Zend/zend_alloc.h b/Zend/zend_alloc.h index b1ecab948..ac64a3011 100644 --- a/Zend/zend_alloc.h +++ b/Zend/zend_alloc.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_alloc.h 287992 2009-09-03 14:33:11Z dmitry $ */ +/* $Id: zend_alloc.h 293155 2010-01-05 20:46:53Z sebastian $ */ #ifndef ZEND_ALLOC_H #define ZEND_ALLOC_H diff --git a/Zend/zend_build.h b/Zend/zend_build.h index 4c81fccb7..2c821f353 100755 --- a/Zend/zend_build.h +++ b/Zend/zend_build.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c index ec29a4934..93dbe49ab 100644 --- a/Zend/zend_builtin_functions.c +++ b/Zend/zend_builtin_functions.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_builtin_functions.c 286878 2009-08-06 11:02:25Z jani $ */ +/* $Id: zend_builtin_functions.c 294034 2010-01-25 23:41:18Z johannes $ */ #include "zend.h" #include "zend_API.h" @@ -629,7 +629,6 @@ ZEND_FUNCTION(define) zend_bool non_cs = 0; int case_sensitive = CONST_CS; zend_constant c; - char *p; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sz|b", &name, &name_len, &val, &non_cs) == FAILURE) { return; @@ -640,31 +639,9 @@ ZEND_FUNCTION(define) } /* class constant, check if there is name and make sure class is valid & exists */ - if ((p = zend_memnstr(name, "::", sizeof("::") - 1, name + name_len))) { - char *class_name; - int found; - zend_class_entry **ce; - ALLOCA_FLAG(use_heap) - - if (p == (name + name_len - sizeof("::") + 1)) { - zend_error(E_WARNING, "Class constant must have a name"); - RETURN_FALSE; - } else if (p == name) { - zend_error(E_WARNING, "Missing class name"); - RETURN_FALSE; - } - - class_name = do_alloca((p - name + 1), use_heap); - zend_str_tolower_copy(class_name, name, (p - name)); - - found = zend_hash_find(EG(class_table), class_name, p - name + 1, (void **) &ce); - - if (found != SUCCESS) { - zend_error(E_WARNING, "Class '%s' does not exist", class_name); - free_alloca(class_name, use_heap); - RETURN_FALSE; - } - free_alloca(class_name, use_heap); + if (zend_memnstr(name, "::", sizeof("::") - 1, name + name_len)) { + zend_error(E_WARNING, "Class constants cannot be defined or redefined"); + RETURN_FALSE; } repeat: diff --git a/Zend/zend_builtin_functions.h b/Zend/zend_builtin_functions.h index aca6d77e8..03bfd37e5 100644 --- a/Zend/zend_builtin_functions.h +++ b/Zend/zend_builtin_functions.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_builtin_functions.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: zend_builtin_functions.h 293155 2010-01-05 20:46:53Z sebastian $ */ #ifndef ZEND_BUILTIN_FUNCTIONS_H #define ZEND_BUILTIN_FUNCTIONS_H diff --git a/Zend/zend_closures.c b/Zend/zend_closures.c index 96fc56748..a5a2f8472 100644 --- a/Zend/zend_closures.c +++ b/Zend/zend_closures.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_closures.c 287043 2009-08-10 15:18:13Z colder $ */ +/* $Id: zend_closures.c 293155 2010-01-05 20:46:53Z sebastian $ */ #include "zend.h" #include "zend_API.h" @@ -152,7 +152,9 @@ static zval **zend_closure_get_property_ptr_ptr(zval *object, zval *member TSRML static int zend_closure_has_property(zval *object, zval *member, int has_set_exists TSRMLS_DC) /* {{{ */ { - ZEND_CLOSURE_PROPERTY_ERROR(); + if (has_set_exists != 2) { + ZEND_CLOSURE_PROPERTY_ERROR(); + } return 0; } /* }}} */ diff --git a/Zend/zend_closures.h b/Zend/zend_closures.h index 64c476b48..c51079e21 100644 --- a/Zend/zend_closures.h +++ b/Zend/zend_closures.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_closures.h 274683 2009-01-26 22:54:34Z cseiler $ */ +/* $Id: zend_closures.h 293155 2010-01-05 20:46:53Z sebastian $ */ #ifndef ZEND_CLOSURES_H #define ZEND_CLOSURES_H diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index a02278f27..791a08ed3 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_compile.c 289432 2009-10-09 17:23:01Z pajoye $ */ +/* $Id: zend_compile.c 293155 2010-01-05 20:46:53Z sebastian $ */ #include #include "zend.h" @@ -161,6 +161,7 @@ void zend_init_compiler_data_structures(TSRMLS_D) /* {{{ */ CG(encoding_detector) = NULL; CG(encoding_converter) = NULL; CG(encoding_oddlen) = NULL; + CG(encoding_declared) = 0; #endif /* ZEND_MULTIBYTE */ } /* }}} */ @@ -2875,8 +2876,8 @@ static zend_bool do_inherit_constant_check(HashTable *child_constants_table, con zval **old_constant; if (zend_hash_quick_find(child_constants_table, hash_key->arKey, hash_key->nKeyLength, hash_key->h, (void**)&old_constant) == SUCCESS) { - if (*old_constant != *parent_constant) { - zend_error(E_COMPILE_ERROR, "Cannot inherit previously-inherited constant %s from interface %s", hash_key->arKey, iface->name); + if (*old_constant != *parent_constant) { + zend_error(E_COMPILE_ERROR, "Cannot inherit previously-inherited or override constant %s from interface %s", hash_key->arKey, iface->name); } return 0; } @@ -2884,6 +2885,16 @@ static zend_bool do_inherit_constant_check(HashTable *child_constants_table, con } /* }}} */ +static int do_interface_constant_check(zval **val TSRMLS_DC, int num_args, va_list args, const zend_hash_key *key) /* {{{ */ +{ + zend_class_entry **iface = va_arg(args, zend_class_entry**); + + do_inherit_constant_check(&(*iface)->constants_table, (const zval **) val, key, *iface); + + return ZEND_HASH_APPLY_KEEP; +} +/* }}} */ + ZEND_API void zend_do_implement_interface(zend_class_entry *ce, zend_class_entry *iface TSRMLS_DC) /* {{{ */ { zend_uint i, ignore = 0; @@ -2902,7 +2913,10 @@ ZEND_API void zend_do_implement_interface(zend_class_entry *ce, zend_class_entry } } } - if (!ignore) { + if (ignore) { + /* Check for attempt to redeclare interface constants */ + zend_hash_apply_with_arguments(&ce->constants_table TSRMLS_CC, (apply_func_args_t) do_interface_constant_check, 1, &iface); + } else { if (ce->num_interfaces >= current_iface_num) { if (ce->type == ZEND_INTERNAL_CLASS) { ce->interfaces = (zend_class_entry **) realloc(ce->interfaces, sizeof(zend_class_entry *) * (++current_iface_num)); @@ -3658,6 +3672,12 @@ void zend_do_declare_class_constant(znode *var_name, const znode *value TSRMLS_D zend_error(E_COMPILE_ERROR, "Cannot redefine class constant %s::%s", CG(active_class_entry)->name, var_name->u.constant.value.str.val); } FREE_PNODE(var_name); + + if (CG(doc_comment)) { + efree(CG(doc_comment)); + CG(doc_comment) = NULL; + CG(doc_comment_len) = 0; + } } /* }}} */ @@ -4644,7 +4664,7 @@ void zend_do_declare_stmt(znode *var, znode *val TSRMLS_DC) /* {{{ */ --num; } - if (num > 0 || CG(encoding_declared)) { + if (num > 0) { zend_error(E_COMPILE_ERROR, "Encoding declaration pragma must be the very first statement in the script"); } } diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index 3ccd199ba..6b24d09b7 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_compile.h 281737 2009-06-05 23:20:59Z shire $ */ +/* $Id: zend_compile.h 293155 2010-01-05 20:46:53Z sebastian $ */ #ifndef ZEND_COMPILE_H #define ZEND_COMPILE_H diff --git a/Zend/zend_config.nw.h b/Zend/zend_config.nw.h index ce2a49e20..14467c2d6 100644 --- a/Zend/zend_config.nw.h +++ b/Zend/zend_config.nw.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_config.nw.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: zend_config.nw.h 293155 2010-01-05 20:46:53Z sebastian $ */ #ifndef ZEND_CONFIG_NW_H #define ZEND_CONFIG_NW_H diff --git a/Zend/zend_config.w32.h b/Zend/zend_config.w32.h index 57f08b168..4313ec185 100644 --- a/Zend/zend_config.w32.h +++ b/Zend/zend_config.w32.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_config.w32.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: zend_config.w32.h 293155 2010-01-05 20:46:53Z sebastian $ */ #ifndef ZEND_CONFIG_W32_H #define ZEND_CONFIG_W32_H diff --git a/Zend/zend_constants.c b/Zend/zend_constants.c index d7f13de57..2713019cb 100644 --- a/Zend/zend_constants.c +++ b/Zend/zend_constants.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_constants.c 273405 2009-01-12 21:54:37Z stas $ */ +/* $Id: zend_constants.c 293155 2010-01-05 20:46:53Z sebastian $ */ #include "zend.h" #include "zend_constants.h" diff --git a/Zend/zend_constants.h b/Zend/zend_constants.h index 0ae833783..b041c984b 100644 --- a/Zend/zend_constants.h +++ b/Zend/zend_constants.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_constants.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: zend_constants.h 293155 2010-01-05 20:46:53Z sebastian $ */ #ifndef ZEND_CONSTANTS_H #define ZEND_CONSTANTS_H diff --git a/Zend/zend_default_classes.c b/Zend/zend_default_classes.c index 52c9588a7..d36dabb60 100644 --- a/Zend/zend_default_classes.c +++ b/Zend/zend_default_classes.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_default_classes.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: zend_default_classes.c 293155 2010-01-05 20:46:53Z sebastian $ */ #include "zend.h" #include "zend_API.h" diff --git a/Zend/zend_dynamic_array.c b/Zend/zend_dynamic_array.c index 3c98ffaae..b6ad4193d 100644 --- a/Zend/zend_dynamic_array.c +++ b/Zend/zend_dynamic_array.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_dynamic_array.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: zend_dynamic_array.c 293155 2010-01-05 20:46:53Z sebastian $ */ #include "zend.h" diff --git a/Zend/zend_dynamic_array.h b/Zend/zend_dynamic_array.h index b153a3469..c0e22f6d2 100644 --- a/Zend/zend_dynamic_array.h +++ b/Zend/zend_dynamic_array.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_dynamic_array.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: zend_dynamic_array.h 293155 2010-01-05 20:46:53Z sebastian $ */ #ifndef ZEND_DYNAMIC_ARRAY_H #define ZEND_DYNAMIC_ARRAY_H diff --git a/Zend/zend_errors.h b/Zend/zend_errors.h index dbfba460b..df5da6ed5 100644 --- a/Zend/zend_errors.h +++ b/Zend/zend_errors.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_errors.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: zend_errors.h 293155 2010-01-05 20:46:53Z sebastian $ */ #ifndef ZEND_ERRORS_H #define ZEND_ERRORS_H diff --git a/Zend/zend_exceptions.c b/Zend/zend_exceptions.c index 6c3560d05..fcd9f2551 100644 --- a/Zend/zend_exceptions.c +++ b/Zend/zend_exceptions.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -19,7 +19,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_exceptions.c 280362 2009-05-11 15:03:47Z felipe $ */ +/* $Id: zend_exceptions.c 293155 2010-01-05 20:46:53Z sebastian $ */ #include "zend.h" #include "zend_API.h" diff --git a/Zend/zend_exceptions.h b/Zend/zend_exceptions.h index 28a9be88b..ee2ced932 100644 --- a/Zend/zend_exceptions.h +++ b/Zend/zend_exceptions.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -19,7 +19,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_exceptions.h 272584 2009-01-02 13:14:49Z helly $ */ +/* $Id: zend_exceptions.h 293155 2010-01-05 20:46:53Z sebastian $ */ #ifndef ZEND_EXCEPTIONS_H #define ZEND_EXCEPTIONS_H diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 696112f52..e20312ed4 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_execute.c 281670 2009-06-04 18:20:45Z mattwil $ */ +/* $Id: zend_execute.c 294505 2010-02-04 09:13:14Z pajoye $ */ #define ZEND_INTENSIVE_DEBUGGING 0 @@ -1232,6 +1232,10 @@ static int zend_check_symbol(zval **pz TSRMLS_DC) { if (Z_TYPE_PP(pz) > 9) { fprintf(stderr, "Warning! %x has invalid type!\n", *pz); +/* See http://support.microsoft.com/kb/190351 */ +#ifdef PHP_WIN32 + fflush(stderr); +#endif } else if (Z_TYPE_PP(pz) == IS_ARRAY) { zend_hash_apply(Z_ARRVAL_PP(pz), (apply_func_t) zend_check_symbol TSRMLS_CC); } else if (Z_TYPE_PP(pz) == IS_OBJECT) { diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index 6a1f06ab3..6ea325f8e 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_execute.h 287992 2009-09-03 14:33:11Z dmitry $ */ +/* $Id: zend_execute.h 294526 2010-02-04 10:21:05Z pajoye $ */ #ifndef ZEND_EXECUTE_H #define ZEND_EXECUTE_H @@ -228,7 +228,7 @@ static inline void *zend_vm_stack_alloc(size_t size TSRMLS_DC) int extra = (ZEND_MM_ALIGNMENT - ((zend_uintptr_t)EG(argument_stack)->top & (ZEND_MM_ALIGNMENT - 1))) / sizeof(void*); if (UNEXPECTED(size + extra + ZEND_MM_ALIGNED_SIZE(sizeof(void*)) / sizeof(void*) > - EG(argument_stack)->end - EG(argument_stack)->top)) { + (zend_uintptr_t)(EG(argument_stack)->end - EG(argument_stack)->top))) { zend_vm_stack_extend(size TSRMLS_CC); } else { void **old_top = EG(argument_stack)->top; diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index 88df13e2c..849391bef 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_execute_API.c 287466 2009-08-18 20:51:49Z stas $ */ +/* $Id: zend_execute_API.c 294505 2010-02-04 09:13:14Z pajoye $ */ #include #include @@ -74,6 +74,10 @@ static void zend_handle_sigsegv(int dummy) /* {{{ */ get_active_function_name(TSRMLS_C), zend_get_executed_filename(TSRMLS_C), zend_get_executed_lineno(TSRMLS_C)); +/* See http://support.microsoft.com/kb/190351 */ +#ifdef PHP_WIN32 + fflush(stderr); +#endif } if (original_sigsegv_handler!=zend_handle_sigsegv) { original_sigsegv_handler(dummy); @@ -837,7 +841,8 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache TS for (i=0; iparam_count; i++) { zval *param; - if(EX(function_state).function->type == ZEND_INTERNAL_FUNCTION + if (EX(function_state).function->type == ZEND_INTERNAL_FUNCTION + && (EX(function_state).function->common.fn_flags & ZEND_ACC_CALL_VIA_HANDLER) == 0 && !ARG_SHOULD_BE_SENT_BY_REF(EX(function_state).function, i + 1) && PZVAL_IS_REF(*fci->params[i])) { SEPARATE_ZVAL(fci->params[i]); @@ -1481,7 +1486,7 @@ void zend_unset_timeout(TSRMLS_D) /* {{{ */ } #else # ifdef HAVE_SETITIMER - { + if (EG(timeout_seconds)) { struct itimerval no_timeout; no_timeout.it_value.tv_sec = no_timeout.it_value.tv_usec = no_timeout.it_interval.tv_sec = no_timeout.it_interval.tv_usec = 0; diff --git a/Zend/zend_extensions.c b/Zend/zend_extensions.c index 0a15a8cd0..cbe6b86a3 100644 --- a/Zend/zend_extensions.c +++ b/Zend/zend_extensions.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_extensions.c 286859 2009-08-06 01:33:54Z scottmac $ */ +/* $Id: zend_extensions.c 294505 2010-02-04 09:13:14Z pajoye $ */ #include "zend_extensions.h" @@ -35,6 +35,10 @@ int zend_load_extension(const char *path) if (!handle) { #ifndef ZEND_WIN32 fprintf(stderr, "Failed loading %s: %s\n", path, DL_ERROR()); +/* See http://support.microsoft.com/kb/190351 */ +#ifdef PHP_WIN32 + fflush(stderr); +#endif #else fprintf(stderr, "Failed loading %s\n", path); #endif @@ -51,6 +55,10 @@ int zend_load_extension(const char *path) } if (!extension_version_info || !new_extension) { fprintf(stderr, "%s doesn't appear to be a valid Zend extension\n", path); +/* See http://support.microsoft.com/kb/190351 */ +#ifdef PHP_WIN32 + fflush(stderr); +#endif DL_UNLOAD(handle); return FAILURE; } @@ -64,6 +72,10 @@ int zend_load_extension(const char *path) new_extension->name, extension_version_info->zend_extension_api_no, ZEND_EXTENSION_API_NO); +/* See http://support.microsoft.com/kb/190351 */ +#ifdef PHP_WIN32 + fflush(stderr); +#endif DL_UNLOAD(handle); return FAILURE; } else if (extension_version_info->zend_extension_api_no < ZEND_EXTENSION_API_NO) { @@ -76,6 +88,10 @@ int zend_load_extension(const char *path) new_extension->author, new_extension->URL, new_extension->name); +/* See http://support.microsoft.com/kb/190351 */ +#ifdef PHP_WIN32 + fflush(stderr); +#endif DL_UNLOAD(handle); return FAILURE; } @@ -83,6 +99,10 @@ int zend_load_extension(const char *path) (!new_extension->build_id_check || new_extension->build_id_check(ZEND_EXTENSION_BUILD_ID) != SUCCESS)) { fprintf(stderr, "Cannot load %s - it was built with configuration %s, whereas running engine is %s\n", new_extension->name, extension_version_info->build_id, ZEND_EXTENSION_BUILD_ID); +/* See http://support.microsoft.com/kb/190351 */ +#ifdef PHP_WIN32 + fflush(stderr); +#endif DL_UNLOAD(handle); return FAILURE; } @@ -90,6 +110,10 @@ int zend_load_extension(const char *path) return zend_register_extension(new_extension, handle); #else fprintf(stderr, "Extensions are not supported on this platform.\n"); +/* See http://support.microsoft.com/kb/190351 */ +#ifdef PHP_WIN32 + fflush(stderr); +#endif return FAILURE; #endif } diff --git a/Zend/zend_extensions.h b/Zend/zend_extensions.h index 449f37bb6..98747cea2 100644 --- a/Zend/zend_extensions.h +++ b/Zend/zend_extensions.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_extensions.h 282827 2009-06-26 15:44:19Z johannes $ */ +/* $Id: zend_extensions.h 293155 2010-01-05 20:46:53Z sebastian $ */ #ifndef ZEND_EXTENSIONS_H #define ZEND_EXTENSIONS_H diff --git a/Zend/zend_fast_cache.h b/Zend/zend_fast_cache.h index e67c09b5a..afc708ba4 100644 --- a/Zend/zend_fast_cache.h +++ b/Zend/zend_fast_cache.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_fast_cache.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: zend_fast_cache.h 293155 2010-01-05 20:46:53Z sebastian $ */ #if 0 #ifndef ZEND_FAST_CACHE_H #define ZEND_FAST_CACHE_H diff --git a/Zend/zend_float.c b/Zend/zend_float.c index 263e0c7d2..d1ac404a9 100644 --- a/Zend/zend_float.c +++ b/Zend/zend_float.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_float.c 277413 2009-03-18 11:53:10Z dmitry $ */ +/* $Id: zend_float.c 293155 2010-01-05 20:46:53Z sebastian $ */ #include "zend.h" #include "zend_compile.h" diff --git a/Zend/zend_float.h b/Zend/zend_float.h index 45acbfd80..9fdb469ec 100644 --- a/Zend/zend_float.h +++ b/Zend/zend_float.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_float.h 277398 2009-03-18 10:18:10Z dmitry $ */ +/* $Id: zend_float.h 293155 2010-01-05 20:46:53Z sebastian $ */ #ifndef ZEND_FLOAT_H #define ZEND_FLOAT_H diff --git a/Zend/zend_gc.c b/Zend/zend_gc.c index 0c3166815..6db682ef0 100644 --- a/Zend/zend_gc.c +++ b/Zend/zend_gc.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_gc.c 278220 2009-04-03 18:52:21Z dmitry $ */ +/* $Id: zend_gc.c 293155 2010-01-05 20:46:53Z sebastian $ */ #include "zend.h" #include "zend_API.h" diff --git a/Zend/zend_gc.h b/Zend/zend_gc.h index 5b99e976f..0fbc9f117 100644 --- a/Zend/zend_gc.h +++ b/Zend/zend_gc.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_gc.h 272619 2009-01-02 20:45:43Z felipe $ */ +/* $Id: zend_gc.h 293155 2010-01-05 20:46:53Z sebastian $ */ #ifndef ZEND_GC_H #define ZEND_GC_H diff --git a/Zend/zend_globals.h b/Zend/zend_globals.h index d199019a0..f1f6c50b8 100644 --- a/Zend/zend_globals.h +++ b/Zend/zend_globals.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_globals.h 277761 2009-03-25 15:23:58Z dmitry $ */ +/* $Id: zend_globals.h 293155 2010-01-05 20:46:53Z sebastian $ */ #ifndef ZEND_GLOBALS_H #define ZEND_GLOBALS_H diff --git a/Zend/zend_globals_macros.h b/Zend/zend_globals_macros.h index 3175fc530..72ea598a1 100644 --- a/Zend/zend_globals_macros.h +++ b/Zend/zend_globals_macros.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_globals_macros.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: zend_globals_macros.h 293155 2010-01-05 20:46:53Z sebastian $ */ #ifndef ZEND_GLOBALS_MACROS_H #define ZEND_GLOBALS_MACROS_H diff --git a/Zend/zend_hash.c b/Zend/zend_hash.c index e62ecbbf4..70d6bf71e 100644 --- a/Zend/zend_hash.c +++ b/Zend/zend_hash.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_hash.c 281778 2009-06-07 19:28:15Z mattwil $ */ +/* $Id: zend_hash.c 293155 2010-01-05 20:46:53Z sebastian $ */ #include "zend.h" diff --git a/Zend/zend_hash.h b/Zend/zend_hash.h index a80cd563e..166003b1e 100644 --- a/Zend/zend_hash.h +++ b/Zend/zend_hash.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_hash.h 281050 2009-05-25 01:18:00Z pollita $ */ +/* $Id: zend_hash.h 293155 2010-01-05 20:46:53Z sebastian $ */ #ifndef ZEND_HASH_H #define ZEND_HASH_H diff --git a/Zend/zend_highlight.c b/Zend/zend_highlight.c index 60b2bc3da..769456540 100644 --- a/Zend/zend_highlight.c +++ b/Zend/zend_highlight.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_highlight.c 279941 2009-05-05 01:35:44Z mattwil $ */ +/* $Id: zend_highlight.c 293155 2010-01-05 20:46:53Z sebastian $ */ #include "zend.h" #include diff --git a/Zend/zend_highlight.h b/Zend/zend_highlight.h index 756175f39..3402f6fa6 100644 --- a/Zend/zend_highlight.h +++ b/Zend/zend_highlight.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_highlight.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: zend_highlight.h 293155 2010-01-05 20:46:53Z sebastian $ */ #ifndef ZEND_HIGHLIGHT_H #define ZEND_HIGHLIGHT_H diff --git a/Zend/zend_indent.c b/Zend/zend_indent.c index 32d99cbfd..7542e4897 100644 --- a/Zend/zend_indent.c +++ b/Zend/zend_indent.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_indent.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: zend_indent.c 293155 2010-01-05 20:46:53Z sebastian $ */ /* This indenter doesn't really work, it's here for no particular reason. */ diff --git a/Zend/zend_indent.h b/Zend/zend_indent.h index cc00d11c6..261516473 100644 --- a/Zend/zend_indent.h +++ b/Zend/zend_indent.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_indent.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: zend_indent.h 293155 2010-01-05 20:46:53Z sebastian $ */ #ifndef ZEND_INDENT_H #define ZEND_INDENT_H diff --git a/Zend/zend_ini.c b/Zend/zend_ini.c index 6914d7bf1..ef6ef3753 100644 --- a/Zend/zend_ini.c +++ b/Zend/zend_ini.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_ini.c 284254 2009-07-17 11:49:50Z jani $ */ +/* $Id: zend_ini.c 293155 2010-01-05 20:46:53Z sebastian $ */ #include "zend.h" #include "zend_qsort.h" diff --git a/Zend/zend_ini.h b/Zend/zend_ini.h index 7f866d9ae..4b4ab02cb 100644 --- a/Zend/zend_ini.h +++ b/Zend/zend_ini.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_ini.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: zend_ini.h 293155 2010-01-05 20:46:53Z sebastian $ */ #ifndef ZEND_INI_H #define ZEND_INI_H diff --git a/Zend/zend_ini_parser.c b/Zend/zend_ini_parser.c index cfaf58304..d4e4084f8 100644 --- a/Zend/zend_ini_parser.c +++ b/Zend/zend_ini_parser.c @@ -116,7 +116,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -131,7 +131,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_ini_parser.y 272368 2008-12-31 11:13:47Z sebastian $ */ +/* $Id: zend_ini_parser.y 293154 2010-01-05 20:40:23Z sebastian $ */ #define DEBUG_CFG_PARSER 0 diff --git a/Zend/zend_ini_parser.y b/Zend/zend_ini_parser.y index 121236dca..e4755fb0f 100644 --- a/Zend/zend_ini_parser.y +++ b/Zend/zend_ini_parser.y @@ -3,7 +3,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_ini_parser.y 272368 2008-12-31 11:13:47Z sebastian $ */ +/* $Id: zend_ini_parser.y 293154 2010-01-05 20:40:23Z sebastian $ */ #define DEBUG_CFG_PARSER 0 diff --git a/Zend/zend_ini_scanner.c b/Zend/zend_ini_scanner.c index b09018e98..d05d78ab6 100644 --- a/Zend/zend_ini_scanner.c +++ b/Zend/zend_ini_scanner.c @@ -1,10 +1,10 @@ -/* Generated by re2c 0.13.5 on Fri Aug 7 18:29:12 2009 */ +/* Generated by re2c 0.13.5 on Sun Feb 7 13:25:37 2010 */ #line 1 "Zend/zend_ini_scanner.l" /* +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -22,7 +22,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_ini_scanner.c 286914 2009-08-07 15:45:56Z jani $ */ +/* $Id: zend_ini_scanner.c 294698 2010-02-07 12:08:22Z pajoye $ */ #include #include "zend.h" @@ -107,6 +107,17 @@ ZEND_API ts_rsrc_id ini_scanner_globals_id; ZEND_API zend_ini_scanner_globals ini_scanner_globals; #endif +/* Eat leading whitespace */ +#define EAT_LEADING_WHITESPACE() \ + while (yytext[0]) { \ + if (yytext[0] == ' ' || yytext[0] == '\t') { \ + SCNG(yy_text)++; \ + yyleng--; \ + } else { \ + break; \ + } \ + } + /* Eat trailing whitespace + extra char */ #define EAT_TRAILING_WHITESPACE_EX(ch) \ while (yyleng > 0 && ( \ @@ -319,7 +330,7 @@ restart: } } -#line 323 "Zend/zend_ini_scanner.c" +#line 334 "Zend/zend_ini_scanner.c" { YYCTYPE yych; unsigned int yyaccept = 0; @@ -356,49 +367,49 @@ restart: yyc_INITIAL: { static const unsigned char yybm[] = { - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 192, 0, 160, 160, 0, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 192, 128, 128, 160, 128, 160, 128, 160, - 128, 128, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 128, 160, 128, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 128, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 128, 128, 128, 128, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 160, 0, 144, 144, 0, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 240, 128, 128, 144, 128, 144, 128, 144, + 128, 128, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 128, 144, 128, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 128, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 128, 128, 128, 128, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, }; YYDEBUG(0, *YYCURSOR); - YYFILL(6); + YYFILL(5); yych = *YYCURSOR; YYDEBUG(-1, yych); switch (yych) { - case '\t': - case ' ': goto yy4; + case '\t': goto yy4; case '\n': goto yy6; case '\r': goto yy8; + case ' ': goto yy9; case '!': case '"': case '$': @@ -408,8 +419,8 @@ yyc_INITIAL: case '{': case '|': case '}': - case '~': goto yy9; - case '#': goto yy11; + case '~': goto yy10; + case '#': goto yy12; case '%': case '\'': case '*': @@ -424,106 +435,136 @@ yyc_INITIAL: case '?': case '@': case ']': - case '^': goto yy12; - case ';': goto yy13; - case '=': goto yy15; + case '^': goto yy13; + case ';': goto yy14; + case '=': goto yy16; case 'F': - case 'f': goto yy17; + case 'f': goto yy18; case 'N': - case 'n': goto yy18; + case 'n': goto yy19; case 'O': - case 'o': goto yy19; + case 'o': goto yy20; case 'T': - case 't': goto yy20; + case 't': goto yy21; case 'Y': - case 'y': goto yy21; - case '[': goto yy22; + case 'y': goto yy22; + case '[': goto yy23; default: goto yy2; } yy2: YYDEBUG(2, *YYCURSOR); ++YYCURSOR; yych = *YYCURSOR; - goto yy25; + goto yy26; yy3: YYDEBUG(3, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 406 "Zend/zend_ini_scanner.l" +#line 426 "Zend/zend_ini_scanner.l" { /* Get option name */ + /* Eat leading whitespace */ + EAT_LEADING_WHITESPACE(); + + /* Eat trailing whitespace */ + EAT_TRAILING_WHITESPACE(); + RETURN_TOKEN(TC_LABEL, yytext, yyleng); } -#line 456 "Zend/zend_ini_scanner.c" +#line 473 "Zend/zend_ini_scanner.c" yy4: YYDEBUG(4, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - goto yy66; + goto yy68; yy5: YYDEBUG(5, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 518 "Zend/zend_ini_scanner.l" +#line 544 "Zend/zend_ini_scanner.l" { /* eat whitespace */ goto restart; } -#line 470 "Zend/zend_ini_scanner.c" +#line 487 "Zend/zend_ini_scanner.c" yy6: YYDEBUG(6, *YYCURSOR); ++YYCURSOR; yy7: YYDEBUG(7, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 523 "Zend/zend_ini_scanner.l" +#line 549 "Zend/zend_ini_scanner.l" { SCNG(lineno)++; return END_OF_LINE; } -#line 482 "Zend/zend_ini_scanner.c" +#line 499 "Zend/zend_ini_scanner.c" yy8: YYDEBUG(8, *YYCURSOR); yych = *++YYCURSOR; - if (yych == '\n') goto yy64; + if (yych == '\n') goto yy71; goto yy7; yy9: YYDEBUG(9, *YYCURSOR); - ++YYCURSOR; + yyaccept = 1; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= ' ') { + if (yych <= '\n') { + if (yych <= 0x08) goto yy26; + if (yych <= '\t') goto yy67; + goto yy71; + } else { + if (yych == '\r') goto yy72; + if (yych <= 0x1F) goto yy26; + goto yy69; + } + } else { + if (yych <= ':') { + if (yych == '#') goto yy58; + goto yy26; + } else { + if (yych <= ';') goto yy53; + if (yych == '=') goto yy51; + goto yy26; + } + } +yy10: YYDEBUG(10, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(11, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 446 "Zend/zend_ini_scanner.l" +#line 472 "Zend/zend_ini_scanner.l" { /* Disallow these chars outside option values */ return yytext[0]; } -#line 497 "Zend/zend_ini_scanner.c" -yy11: - YYDEBUG(11, *YYCURSOR); - yyaccept = 1; - yych = *(YYMARKER = ++YYCURSOR); - goto yy56; +#line 538 "Zend/zend_ini_scanner.c" yy12: YYDEBUG(12, *YYCURSOR); - yych = *++YYCURSOR; - goto yy25; + yyaccept = 1; + yych = *(YYMARKER = ++YYCURSOR); + goto yy59; yy13: YYDEBUG(13, *YYCURSOR); + yych = *++YYCURSOR; + goto yy26; +yy14: + YYDEBUG(14, *YYCURSOR); yyaccept = 2; yych = *(YYMARKER = ++YYCURSOR); - goto yy51; - YYDEBUG(14, *YYCURSOR); + goto yy54; + YYDEBUG(15, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 546 "Zend/zend_ini_scanner.l" +#line 572 "Zend/zend_ini_scanner.l" { return 0; } -#line 518 "Zend/zend_ini_scanner.c" -yy15: - YYDEBUG(15, *YYCURSOR); - ++YYCURSOR; - yych = *YYCURSOR; - goto yy49; +#line 559 "Zend/zend_ini_scanner.c" yy16: YYDEBUG(16, *YYCURSOR); + ++YYCURSOR; + yych = *YYCURSOR; + goto yy52; +yy17: + YYDEBUG(17, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 410 "Zend/zend_ini_scanner.l" +#line 436 "Zend/zend_ini_scanner.l" { /* Start option value */ if (SCNG(scanner_mode) == ZEND_INI_SCANNER_RAW) { yy_push_state(ST_RAW TSRMLS_CC); @@ -532,63 +573,63 @@ yy16: } return '='; } -#line 536 "Zend/zend_ini_scanner.c" -yy17: - YYDEBUG(17, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'A') goto yy45; - if (yych == 'a') goto yy45; - goto yy25; +#line 577 "Zend/zend_ini_scanner.c" yy18: YYDEBUG(18, *YYCURSOR); yych = *++YYCURSOR; + if (yych == 'A') goto yy48; + if (yych == 'a') goto yy48; + goto yy26; +yy19: + YYDEBUG(19, *YYCURSOR); + yych = *++YYCURSOR; if (yych <= 'U') { - if (yych == 'O') goto yy41; - if (yych <= 'T') goto yy25; - goto yy42; + if (yych == 'O') goto yy44; + if (yych <= 'T') goto yy26; + goto yy45; } else { if (yych <= 'o') { - if (yych <= 'n') goto yy25; - goto yy41; + if (yych <= 'n') goto yy26; + goto yy44; } else { - if (yych == 'u') goto yy42; - goto yy25; + if (yych == 'u') goto yy45; + goto yy26; } } -yy19: - YYDEBUG(19, *YYCURSOR); +yy20: + YYDEBUG(20, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'N') { - if (yych == 'F') goto yy36; - if (yych <= 'M') goto yy25; - goto yy30; + if (yych == 'F') goto yy38; + if (yych <= 'M') goto yy26; + goto yy31; } else { if (yych <= 'f') { - if (yych <= 'e') goto yy25; - goto yy36; + if (yych <= 'e') goto yy26; + goto yy38; } else { - if (yych == 'n') goto yy30; - goto yy25; + if (yych == 'n') goto yy31; + goto yy26; } } -yy20: - YYDEBUG(20, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'R') goto yy34; - if (yych == 'r') goto yy34; - goto yy25; yy21: YYDEBUG(21, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy26; - if (yych == 'e') goto yy26; - goto yy25; + if (yych == 'R') goto yy36; + if (yych == 'r') goto yy36; + goto yy26; yy22: YYDEBUG(22, *YYCURSOR); - ++YYCURSOR; + yych = *++YYCURSOR; + if (yych == 'E') goto yy27; + if (yych == 'e') goto yy27; + goto yy26; +yy23: YYDEBUG(23, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(24, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 344 "Zend/zend_ini_scanner.l" +#line 355 "Zend/zend_ini_scanner.l" { /* Section start */ /* Enter section data lookup state */ if (SCNG(scanner_mode) == ZEND_INI_SCANNER_RAW) { @@ -598,38 +639,41 @@ yy22: } return TC_SECTION; } -#line 602 "Zend/zend_ini_scanner.c" -yy24: - YYDEBUG(24, *YYCURSOR); +#line 643 "Zend/zend_ini_scanner.c" +yy25: + YYDEBUG(25, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; -yy25: - YYDEBUG(25, *YYCURSOR); - if (yybm[0+yych] & 32) { - goto yy24; - } - if (yych == '[') goto yy27; - goto yy3; yy26: YYDEBUG(26, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'S') goto yy30; - if (yych == 's') goto yy30; - goto yy25; + if (yybm[0+yych] & 16) { + goto yy25; + } + if (yych == '[') goto yy28; + goto yy3; yy27: YYDEBUG(27, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'S') goto yy31; + if (yych == 's') goto yy31; + goto yy26; +yy28: + YYDEBUG(28, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(28, *YYCURSOR); - if (yybm[0+yych] & 64) { - goto yy27; - } YYDEBUG(29, *YYCURSOR); + if (yybm[0+yych] & 32) { + goto yy28; + } + YYDEBUG(30, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 369 "Zend/zend_ini_scanner.l" +#line 380 "Zend/zend_ini_scanner.l" { /* Start of option with offset */ + /* Eat leading whitespace */ + EAT_LEADING_WHITESPACE(); + /* Eat trailing whitespace and [ */ EAT_TRAILING_WHITESPACE_EX('['); @@ -638,371 +682,431 @@ yy27: RETURN_TOKEN(TC_OFFSET, yytext, yyleng); } -#line 642 "Zend/zend_ini_scanner.c" -yy30: - YYDEBUG(30, *YYCURSOR); +#line 686 "Zend/zend_ini_scanner.c" +yy31: + YYDEBUG(31, *YYCURSOR); ++YYCURSOR; - if ((yych = *YYCURSOR) <= '$') { + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(32, *YYCURSOR); + if (yybm[0+yych] & 64) { + goto yy31; + } + if (yych <= '&') { if (yych <= '\r') { if (yych <= '\t') { if (yych <= 0x08) goto yy25; - goto yy32; + goto yy34; } else { - if (yych <= '\n') goto yy31; + if (yych <= '\n') goto yy33; if (yych <= '\f') goto yy25; } } else { - if (yych <= ' ') { - if (yych <= 0x1F) goto yy25; - goto yy32; + if (yych <= '#') { + if (yych <= ' ') goto yy25; + if (yych >= '#') goto yy25; } else { - if (yych == '#') goto yy25; + if (yych == '%') goto yy25; } } } else { - if (yych <= ':') { - if (yych <= '&') { - if (yych <= '%') goto yy25; - } else { + if (yych <= '<') { + if (yych <= ')') { if (yych <= '\'') goto yy25; - if (yych >= '*') goto yy25; + } else { + if (yych != ';') goto yy25; } } else { - if (yych <= '=') { - if (yych == '<') goto yy25; + if (yych <= '[') { + if (yych <= '=') goto yy33; + if (yych <= 'Z') goto yy25; + goto yy28; } else { if (yych <= 'z') goto yy25; if (yych >= 0x7F) goto yy25; } } } -yy31: - YYDEBUG(31, *YYCURSOR); +yy33: + YYDEBUG(33, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 398 "Zend/zend_ini_scanner.l" +#line 418 "Zend/zend_ini_scanner.l" { /* TRUE value (when used outside option value/offset this causes parse error!) */ RETURN_TOKEN(BOOL_TRUE, "1", 1); } -#line 687 "Zend/zend_ini_scanner.c" -yy32: - YYDEBUG(32, *YYCURSOR); +#line 738 "Zend/zend_ini_scanner.c" +yy34: + YYDEBUG(34, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(33, *YYCURSOR); - if (yych == '\t') goto yy32; - if (yych == ' ') goto yy32; - goto yy31; -yy34: - YYDEBUG(34, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'U') goto yy35; - if (yych != 'u') goto yy25; -yy35: YYDEBUG(35, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'E') goto yy30; - if (yych == 'e') goto yy30; - goto yy25; + if (yych == '\t') goto yy34; + if (yych == ' ') goto yy34; + goto yy33; yy36: YYDEBUG(36, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'F') goto yy37; - if (yych != 'f') goto yy25; + if (yych == 'U') goto yy37; + if (yych != 'u') goto yy26; yy37: YYDEBUG(37, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'E') goto yy31; + if (yych == 'e') goto yy31; + goto yy26; +yy38: + YYDEBUG(38, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'F') goto yy39; + if (yych != 'f') goto yy26; +yy39: + YYDEBUG(39, *YYCURSOR); ++YYCURSOR; - if ((yych = *YYCURSOR) <= '$') { + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(40, *YYCURSOR); + if (yych <= '%') { if (yych <= '\r') { if (yych <= '\t') { if (yych <= 0x08) goto yy25; - goto yy39; + goto yy42; } else { - if (yych <= '\n') goto yy38; + if (yych <= '\n') goto yy41; if (yych <= '\f') goto yy25; } } else { - if (yych <= ' ') { + if (yych <= '"') { if (yych <= 0x1F) goto yy25; - goto yy39; + if (yych <= ' ') goto yy39; } else { - if (yych == '#') goto yy25; + if (yych != '$') goto yy25; } } } else { - if (yych <= ':') { - if (yych <= '&') { - if (yych <= '%') goto yy25; + if (yych <= '<') { + if (yych <= ')') { + if (yych == '\'') goto yy25; } else { - if (yych <= '\'') goto yy25; - if (yych >= '*') goto yy25; + if (yych != ';') goto yy25; } } else { - if (yych <= '=') { - if (yych == '<') goto yy25; + if (yych <= '[') { + if (yych <= '=') goto yy41; + if (yych <= 'Z') goto yy25; + goto yy28; } else { if (yych <= 'z') goto yy25; if (yych >= 0x7F) goto yy25; } } } -yy38: - YYDEBUG(38, *YYCURSOR); +yy41: + YYDEBUG(41, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 402 "Zend/zend_ini_scanner.l" +#line 422 "Zend/zend_ini_scanner.l" { /* FALSE value (when used outside option value/offset this causes parse error!)*/ RETURN_TOKEN(BOOL_FALSE, "", 0); } -#line 757 "Zend/zend_ini_scanner.c" -yy39: - YYDEBUG(39, *YYCURSOR); +#line 812 "Zend/zend_ini_scanner.c" +yy42: + YYDEBUG(42, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(40, *YYCURSOR); - if (yych == '\t') goto yy39; - if (yych == ' ') goto yy39; - goto yy38; -yy41: - YYDEBUG(41, *YYCURSOR); + YYDEBUG(43, *YYCURSOR); + if (yych == '\t') goto yy42; + if (yych == ' ') goto yy42; + goto yy41; +yy44: + YYDEBUG(44, *YYCURSOR); yych = *++YYCURSOR; if (yych <= '&') { if (yych <= 0x1F) { if (yych <= '\n') { - if (yych <= 0x08) goto yy25; - if (yych <= '\t') goto yy39; - goto yy38; + if (yych <= 0x08) goto yy26; + if (yych <= '\t') goto yy42; + goto yy41; } else { - if (yych == '\r') goto yy38; - goto yy25; + if (yych == '\r') goto yy41; + goto yy26; } } else { if (yych <= '#') { if (yych <= ' ') goto yy39; - if (yych <= '"') goto yy38; - goto yy25; + if (yych <= '"') goto yy41; + goto yy26; } else { - if (yych == '%') goto yy25; - goto yy38; + if (yych == '%') goto yy26; + goto yy41; } } } else { if (yych <= '=') { if (yych <= ':') { - if (yych <= '\'') goto yy25; - if (yych <= ')') goto yy38; - goto yy25; + if (yych <= '\'') goto yy26; + if (yych <= ')') goto yy41; + goto yy26; } else { - if (yych == '<') goto yy25; - goto yy38; + if (yych == '<') goto yy26; + goto yy41; } } else { if (yych <= 'm') { - if (yych == 'N') goto yy44; - goto yy25; + if (yych == 'N') goto yy47; + goto yy26; } else { - if (yych <= 'n') goto yy44; - if (yych <= 'z') goto yy25; - if (yych <= '~') goto yy38; - goto yy25; + if (yych <= 'n') goto yy47; + if (yych <= 'z') goto yy26; + if (yych <= '~') goto yy41; + goto yy26; } } } -yy42: - YYDEBUG(42, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'L') goto yy43; - if (yych != 'l') goto yy25; -yy43: - YYDEBUG(43, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'L') goto yy37; - if (yych == 'l') goto yy37; - goto yy25; -yy44: - YYDEBUG(44, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'E') goto yy37; - if (yych == 'e') goto yy37; - goto yy25; yy45: YYDEBUG(45, *YYCURSOR); yych = *++YYCURSOR; if (yych == 'L') goto yy46; - if (yych != 'l') goto yy25; + if (yych != 'l') goto yy26; yy46: YYDEBUG(46, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy47; - if (yych != 's') goto yy25; + if (yych == 'L') goto yy39; + if (yych == 'l') goto yy39; + goto yy26; yy47: YYDEBUG(47, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy37; - if (yych == 'e') goto yy37; - goto yy25; + if (yych == 'E') goto yy39; + if (yych == 'e') goto yy39; + goto yy26; yy48: YYDEBUG(48, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; + yych = *++YYCURSOR; + if (yych == 'L') goto yy49; + if (yych != 'l') goto yy26; yy49: YYDEBUG(49, *YYCURSOR); - if (yych == '\t') goto yy48; - if (yych == ' ') goto yy48; - goto yy16; + yych = *++YYCURSOR; + if (yych == 'S') goto yy50; + if (yych != 's') goto yy26; yy50: YYDEBUG(50, *YYCURSOR); - ++YYCURSOR; - YYFILL(2); - yych = *YYCURSOR; + yych = *++YYCURSOR; + if (yych == 'E') goto yy39; + if (yych == 'e') goto yy39; + goto yy26; yy51: YYDEBUG(51, *YYCURSOR); - if (yybm[0+yych] & 128) { - goto yy50; - } - if (yych >= '\r') goto yy54; + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; yy52: YYDEBUG(52, *YYCURSOR); - ++YYCURSOR; + if (yych == '\t') goto yy51; + if (yych == ' ') goto yy51; + goto yy17; yy53: YYDEBUG(53, *YYCURSOR); + ++YYCURSOR; + YYFILL(2); + yych = *YYCURSOR; +yy54: + YYDEBUG(54, *YYCURSOR); + if (yybm[0+yych] & 128) { + goto yy53; + } + if (yych >= '\r') goto yy57; +yy55: + YYDEBUG(55, *YYCURSOR); + ++YYCURSOR; +yy56: + YYDEBUG(56, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 528 "Zend/zend_ini_scanner.l" +#line 554 "Zend/zend_ini_scanner.l" { /* Comment */ BEGIN(INITIAL); SCNG(lineno)++; return END_OF_LINE; } -#line 878 "Zend/zend_ini_scanner.c" -yy54: - YYDEBUG(54, *YYCURSOR); +#line 933 "Zend/zend_ini_scanner.c" +yy57: + YYDEBUG(57, *YYCURSOR); yych = *++YYCURSOR; - if (yych == '\n') goto yy52; - goto yy53; -yy55: - YYDEBUG(55, *YYCURSOR); + if (yych == '\n') goto yy55; + goto yy56; +yy58: + YYDEBUG(58, *YYCURSOR); yyaccept = 1; YYMARKER = ++YYCURSOR; YYFILL(2); yych = *YYCURSOR; -yy56: - YYDEBUG(56, *YYCURSOR); +yy59: + YYDEBUG(59, *YYCURSOR); if (yych <= '&') { if (yych <= '\r') { if (yych <= '\t') { - if (yych <= 0x08) goto yy55; + if (yych <= 0x08) goto yy58; } else { - if (yych <= '\n') goto yy61; - if (yych <= '\f') goto yy55; - goto yy63; + if (yych <= '\n') goto yy64; + if (yych <= '\f') goto yy58; + goto yy66; } } else { if (yych <= '#') { - if (yych <= 0x1F) goto yy55; - if (yych >= '#') goto yy55; + if (yych <= ' ') goto yy58; + if (yych >= '#') goto yy58; } else { - if (yych == '%') goto yy55; + if (yych == '%') goto yy58; } } } else { if (yych <= '<') { if (yych <= ')') { - if (yych <= '\'') goto yy55; + if (yych <= '\'') goto yy58; } else { - if (yych != ';') goto yy55; + if (yych != ';') goto yy58; } } else { if (yych <= '[') { - if (yych <= '=') goto yy57; - if (yych <= 'Z') goto yy55; - goto yy59; + if (yych <= '=') goto yy60; + if (yych <= 'Z') goto yy58; + goto yy62; } else { - if (yych <= 'z') goto yy55; - if (yych >= 0x7F) goto yy55; + if (yych <= 'z') goto yy58; + if (yych >= 0x7F) goto yy58; } } } -yy57: - YYDEBUG(57, *YYCURSOR); +yy60: + YYDEBUG(60, *YYCURSOR); ++YYCURSOR; YYFILL(2); yych = *YYCURSOR; - YYDEBUG(58, *YYCURSOR); - if (yych == '\n') goto yy61; - if (yych == '\r') goto yy63; - goto yy57; -yy59: - YYDEBUG(59, *YYCURSOR); + YYDEBUG(61, *YYCURSOR); + if (yych == '\n') goto yy64; + if (yych == '\r') goto yy66; + goto yy60; +yy62: + YYDEBUG(62, *YYCURSOR); yyaccept = 3; YYMARKER = ++YYCURSOR; YYFILL(2); yych = *YYCURSOR; - YYDEBUG(60, *YYCURSOR); + YYDEBUG(63, *YYCURSOR); if (yych <= '\f') { - if (yych <= 0x08) goto yy57; - if (yych <= '\t') goto yy59; - if (yych >= '\v') goto yy57; + if (yych <= 0x08) goto yy60; + if (yych <= '\t') goto yy62; + if (yych >= '\v') goto yy60; } else { - if (yych <= '\r') goto yy63; - if (yych == ' ') goto yy59; - goto yy57; + if (yych <= '\r') goto yy66; + if (yych == ' ') goto yy62; + goto yy60; } -yy61: - YYDEBUG(61, *YYCURSOR); +yy64: + YYDEBUG(64, *YYCURSOR); ++YYCURSOR; -yy62: - YYDEBUG(62, *YYCURSOR); +yy65: + YYDEBUG(65, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 534 "Zend/zend_ini_scanner.l" +#line 560 "Zend/zend_ini_scanner.l" { /* #Comment */ zend_error(E_DEPRECATED, "Comments starting with '#' are deprecated in %s on line %d", zend_ini_scanner_get_filename(TSRMLS_C), SCNG(lineno)); BEGIN(INITIAL); SCNG(lineno)++; return END_OF_LINE; } -#line 965 "Zend/zend_ini_scanner.c" -yy63: - YYDEBUG(63, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == '\n') goto yy61; - goto yy62; -yy64: - YYDEBUG(64, *YYCURSOR); +#line 1020 "Zend/zend_ini_scanner.c" +yy66: + YYDEBUG(66, *YYCURSOR); yych = *++YYCURSOR; - goto yy7; -yy65: - YYDEBUG(65, *YYCURSOR); + if (yych == '\n') goto yy64; + goto yy65; +yy67: + YYDEBUG(67, *YYCURSOR); yyaccept = 0; YYMARKER = ++YYCURSOR; YYFILL(2); yych = *YYCURSOR; -yy66: - YYDEBUG(66, *YYCURSOR); +yy68: + YYDEBUG(68, *YYCURSOR); if (yych <= ' ') { if (yych <= '\n') { if (yych <= 0x08) goto yy5; - if (yych <= '\t') goto yy65; - goto yy64; + if (yych <= '\t') goto yy67; + goto yy71; } else { - if (yych == '\r') goto yy67; + if (yych == '\r') goto yy72; if (yych <= 0x1F) goto yy5; - goto yy65; + goto yy67; } } else { if (yych <= ':') { - if (yych == '#') goto yy57; + if (yych == '#') goto yy60; goto yy5; } else { - if (yych <= ';') goto yy50; - if (yych == '=') goto yy48; + if (yych <= ';') goto yy53; + if (yych == '=') goto yy51; goto yy5; } } -yy67: - YYDEBUG(67, *YYCURSOR); +yy69: + YYDEBUG(69, *YYCURSOR); + yyaccept = 1; + YYMARKER = ++YYCURSOR; + YYFILL(2); + yych = *YYCURSOR; + YYDEBUG(70, *YYCURSOR); + if (yych <= '%') { + if (yych <= '\r') { + if (yych <= '\t') { + if (yych <= 0x08) goto yy25; + goto yy67; + } else { + if (yych <= '\n') goto yy71; + if (yych <= '\f') goto yy25; + goto yy72; + } + } else { + if (yych <= '"') { + if (yych <= 0x1F) goto yy25; + if (yych <= ' ') goto yy69; + goto yy3; + } else { + if (yych <= '#') goto yy58; + if (yych <= '$') goto yy3; + goto yy25; + } + } + } else { + if (yych <= '<') { + if (yych <= ')') { + if (yych == '\'') goto yy25; + goto yy3; + } else { + if (yych == ';') goto yy53; + goto yy25; + } + } else { + if (yych <= '[') { + if (yych <= '=') goto yy51; + if (yych <= 'Z') goto yy25; + goto yy28; + } else { + if (yych <= 'z') goto yy25; + if (yych <= '~') goto yy3; + goto yy25; + } + } + } +yy71: + YYDEBUG(71, *YYCURSOR); + yych = *++YYCURSOR; + goto yy7; +yy72: + YYDEBUG(72, *YYCURSOR); ++YYCURSOR; - if ((yych = *YYCURSOR) == '\n') goto yy64; + if ((yych = *YYCURSOR) == '\n') goto yy71; goto yy7; } /* *********************************** */ @@ -1042,17 +1146,17 @@ yyc_ST_DOUBLE_QUOTES: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; - YYDEBUG(68, *YYCURSOR); + YYDEBUG(73, *YYCURSOR); YYFILL(2); yych = *YYCURSOR; - if (yych == '"') goto yy72; - if (yych == '$') goto yy74; - YYDEBUG(70, *YYCURSOR); + if (yych == '"') goto yy77; + if (yych == '$') goto yy79; + YYDEBUG(75, *YYCURSOR); ++YYCURSOR; -yy71: - YYDEBUG(71, *YYCURSOR); +yy76: + YYDEBUG(76, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 478 "Zend/zend_ini_scanner.l" +#line 504 "Zend/zend_ini_scanner.l" { /* Escape double quoted string contents */ if (YYCURSOR > YYLIMIT) { return 0; @@ -1088,46 +1192,46 @@ yy71: zend_ini_escape_string(ini_lval, yytext, yyleng, '"' TSRMLS_CC); return TC_QUOTED_STRING; } -#line 1092 "Zend/zend_ini_scanner.c" -yy72: - YYDEBUG(72, *YYCURSOR); +#line 1196 "Zend/zend_ini_scanner.c" +yy77: + YYDEBUG(77, *YYCURSOR); ++YYCURSOR; yych = *YYCURSOR; - goto yy78; -yy73: - YYDEBUG(73, *YYCURSOR); + goto yy83; +yy78: + YYDEBUG(78, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 473 "Zend/zend_ini_scanner.l" +#line 499 "Zend/zend_ini_scanner.l" { /* Double quoted '"' string ends */ yy_pop_state(TSRMLS_C); return '"'; } -#line 1106 "Zend/zend_ini_scanner.c" -yy74: - YYDEBUG(74, *YYCURSOR); +#line 1210 "Zend/zend_ini_scanner.c" +yy79: + YYDEBUG(79, *YYCURSOR); yych = *++YYCURSOR; - if (yych != '{') goto yy71; - YYDEBUG(75, *YYCURSOR); + if (yych != '{') goto yy76; + YYDEBUG(80, *YYCURSOR); ++YYCURSOR; - YYDEBUG(76, *YYCURSOR); + YYDEBUG(81, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 384 "Zend/zend_ini_scanner.l" +#line 398 "Zend/zend_ini_scanner.l" { /* Variable start */ yy_push_state(ST_VARNAME TSRMLS_CC); return TC_DOLLAR_CURLY; } -#line 1120 "Zend/zend_ini_scanner.c" -yy77: - YYDEBUG(77, *YYCURSOR); +#line 1224 "Zend/zend_ini_scanner.c" +yy82: + YYDEBUG(82, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; -yy78: - YYDEBUG(78, *YYCURSOR); +yy83: + YYDEBUG(83, *YYCURSOR); if (yybm[0+yych] & 128) { - goto yy77; + goto yy82; } - goto yy73; + goto yy78; } /* *********************************** */ yyc_ST_OFFSET: @@ -1166,495 +1270,496 @@ yyc_ST_OFFSET: 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, }; - YYDEBUG(79, *YYCURSOR); + YYDEBUG(84, *YYCURSOR); YYFILL(2); yych = *YYCURSOR; - if (yych <= ',') { + if (yych <= '-') { if (yych <= ' ') { if (yych <= '\n') { - if (yych <= 0x08) goto yy81; - if (yych <= '\t') goto yy83; - goto yy84; + if (yych <= 0x08) goto yy86; + if (yych <= '\t') goto yy88; + goto yy89; } else { - if (yych == '\r') goto yy84; - if (yych >= ' ') goto yy83; + if (yych == '\r') goto yy89; + if (yych >= ' ') goto yy88; } } else { - if (yych <= '#') { - if (yych == '"') goto yy86; + if (yych <= '$') { + if (yych == '"') goto yy91; + if (yych >= '$') goto yy93; } else { - if (yych <= '$') goto yy88; - if (yych == '\'') goto yy89; + if (yych == '\'') goto yy94; + if (yych >= '-') goto yy95; } } } else { - if (yych <= '@') { - if (yych <= '/') { - if (yych <= '-') goto yy90; - if (yych <= '.') goto yy91; + if (yych <= 'Z') { + if (yych <= '9') { + if (yych <= '.') goto yy96; + if (yych >= '0') goto yy97; } else { - if (yych <= '9') goto yy92; - if (yych == ';') goto yy84; + if (yych == ';') goto yy89; + if (yych >= 'A') goto yy99; } } else { - if (yych <= '\\') { - if (yych <= 'Z') goto yy94; - if (yych >= '\\') goto yy96; + if (yych <= '^') { + if (yych <= '[') goto yy86; + if (yych <= '\\') goto yy101; + if (yych <= ']') goto yy102; } else { - if (yych <= ']') goto yy97; - if (yych <= '`') goto yy81; - if (yych <= 'z') goto yy94; + if (yych == '`') goto yy86; + if (yych <= 'z') goto yy99; } } } -yy81: - YYDEBUG(81, *YYCURSOR); +yy86: + YYDEBUG(86, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - goto yy100; -yy82: - YYDEBUG(82, *YYCURSOR); + goto yy105; +yy87: + YYDEBUG(87, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 464 "Zend/zend_ini_scanner.l" +#line 490 "Zend/zend_ini_scanner.l" { /* Get rest as section/offset value */ RETURN_TOKEN(TC_STRING, yytext, yyleng); } -#line 1223 "Zend/zend_ini_scanner.c" -yy83: - YYDEBUG(83, *YYCURSOR); +#line 1328 "Zend/zend_ini_scanner.c" +yy88: + YYDEBUG(88, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yybm[0+yych] & 128) { - goto yy126; + goto yy131; } - if (yych == '"') goto yy128; - if (yych == ']') goto yy129; - goto yy100; -yy84: - YYDEBUG(84, *YYCURSOR); + if (yych == '"') goto yy133; + if (yych == ']') goto yy134; + goto yy105; +yy89: + YYDEBUG(89, *YYCURSOR); ++YYCURSOR; -yy85: - YYDEBUG(85, *YYCURSOR); +yy90: + YYDEBUG(90, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 546 "Zend/zend_ini_scanner.l" +#line 572 "Zend/zend_ini_scanner.l" { return 0; } -#line 1244 "Zend/zend_ini_scanner.c" -yy86: - YYDEBUG(86, *YYCURSOR); +#line 1349 "Zend/zend_ini_scanner.c" +yy91: + YYDEBUG(91, *YYCURSOR); ++YYCURSOR; -yy87: - YYDEBUG(87, *YYCURSOR); +yy92: + YYDEBUG(92, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 468 "Zend/zend_ini_scanner.l" +#line 494 "Zend/zend_ini_scanner.l" { /* Double quoted '"' string start */ yy_push_state(ST_DOUBLE_QUOTES TSRMLS_CC); return '"'; } -#line 1256 "Zend/zend_ini_scanner.c" -yy88: - YYDEBUG(88, *YYCURSOR); +#line 1361 "Zend/zend_ini_scanner.c" +yy93: + YYDEBUG(93, *YYCURSOR); yych = *++YYCURSOR; if (yych <= '\\') { - if (yych <= 0x00) goto yy85; - if (yych <= '[') goto yy99; - goto yy104; + if (yych <= 0x00) goto yy90; + if (yych <= '[') goto yy104; + goto yy109; } else { - if (yych == '{') goto yy124; - goto yy99; + if (yych == '{') goto yy129; + goto yy104; } -yy89: - YYDEBUG(89, *YYCURSOR); +yy94: + YYDEBUG(94, *YYCURSOR); yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); if (yybm[0+yych] & 64) { - goto yy120; + goto yy125; } - goto yy85; -yy90: - YYDEBUG(90, *YYCURSOR); + goto yy90; +yy95: + YYDEBUG(95, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '/') goto yy100; - if (yych <= '9') goto yy118; - goto yy100; -yy91: - YYDEBUG(91, *YYCURSOR); + if (yych <= '/') goto yy105; + if (yych <= '9') goto yy123; + goto yy105; +yy96: + YYDEBUG(96, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '/') goto yy100; - if (yych <= '9') goto yy116; - goto yy100; -yy92: - YYDEBUG(92, *YYCURSOR); + if (yych <= '/') goto yy105; + if (yych <= '9') goto yy121; + goto yy105; +yy97: + YYDEBUG(97, *YYCURSOR); yyaccept = 2; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '\'') { if (yych <= '\r') { - if (yych == '\n') goto yy93; - if (yych <= '\f') goto yy100; + if (yych == '\n') goto yy98; + if (yych <= '\f') goto yy105; } else { - if (yych == '"') goto yy93; - if (yych <= '&') goto yy100; + if (yych == '"') goto yy98; + if (yych <= '&') goto yy105; } } else { if (yych <= '9') { - if (yych == '.') goto yy112; - if (yych <= '/') goto yy100; - goto yy114; + if (yych == '.') goto yy117; + if (yych <= '/') goto yy105; + goto yy119; } else { if (yych <= ';') { - if (yych <= ':') goto yy100; + if (yych <= ':') goto yy105; } else { - if (yych != ']') goto yy100; + if (yych != ']') goto yy105; } } } -yy93: - YYDEBUG(93, *YYCURSOR); +yy98: + YYDEBUG(98, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 442 "Zend/zend_ini_scanner.l" +#line 468 "Zend/zend_ini_scanner.l" { /* Get number option value as string */ RETURN_TOKEN(TC_NUMBER, yytext, yyleng); } -#line 1322 "Zend/zend_ini_scanner.c" -yy94: - YYDEBUG(94, *YYCURSOR); +#line 1427 "Zend/zend_ini_scanner.c" +yy99: + YYDEBUG(99, *YYCURSOR); yyaccept = 3; yych = *(YYMARKER = ++YYCURSOR); if (yybm[0+yych] & 16) { - goto yy110; + goto yy115; } if (yych <= '"') { if (yych <= '\f') { - if (yych != '\n') goto yy100; + if (yych != '\n') goto yy105; } else { - if (yych <= '\r') goto yy95; - if (yych <= '!') goto yy100; + if (yych <= '\r') goto yy100; + if (yych <= '!') goto yy105; } } else { if (yych <= ':') { - if (yych != '\'') goto yy100; + if (yych != '\'') goto yy105; } else { - if (yych <= ';') goto yy95; - if (yych != ']') goto yy100; + if (yych <= ';') goto yy100; + if (yych != ']') goto yy105; } } -yy95: - YYDEBUG(95, *YYCURSOR); +yy100: + YYDEBUG(100, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 438 "Zend/zend_ini_scanner.l" +#line 464 "Zend/zend_ini_scanner.l" { /* Get constant option value */ RETURN_TOKEN(TC_CONSTANT, yytext, yyleng); } -#line 1352 "Zend/zend_ini_scanner.c" -yy96: - YYDEBUG(96, *YYCURSOR); +#line 1457 "Zend/zend_ini_scanner.c" +yy101: + YYDEBUG(101, *YYCURSOR); yych = *++YYCURSOR; - goto yy99; -yy97: - YYDEBUG(97, *YYCURSOR); + goto yy104; +yy102: + YYDEBUG(102, *YYCURSOR); ++YYCURSOR; -yy98: - YYDEBUG(98, *YYCURSOR); +yy103: + YYDEBUG(103, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 379 "Zend/zend_ini_scanner.l" +#line 393 "Zend/zend_ini_scanner.l" { /* End of section or an option offset */ BEGIN(INITIAL); return ']'; } -#line 1368 "Zend/zend_ini_scanner.c" -yy99: - YYDEBUG(99, *YYCURSOR); +#line 1473 "Zend/zend_ini_scanner.c" +yy104: + YYDEBUG(104, *YYCURSOR); yyaccept = 0; YYMARKER = ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; -yy100: - YYDEBUG(100, *YYCURSOR); +yy105: + YYDEBUG(105, *YYCURSOR); if (yybm[0+yych] & 2) { - goto yy99; + goto yy104; } - if (yych == '$') goto yy102; - if (yych != '\\') goto yy82; -yy101: - YYDEBUG(101, *YYCURSOR); + if (yych == '$') goto yy107; + if (yych != '\\') goto yy87; +yy106: + YYDEBUG(106, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - goto yy99; -yy102: - YYDEBUG(102, *YYCURSOR); + goto yy104; +yy107: + YYDEBUG(107, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; if (yych <= '\\') { - if (yych <= 0x00) goto yy103; - if (yych <= '[') goto yy99; - goto yy104; + if (yych <= 0x00) goto yy108; + if (yych <= '[') goto yy104; + goto yy109; } else { - if (yych != '{') goto yy99; + if (yych != '{') goto yy104; } -yy103: - YYDEBUG(103, *YYCURSOR); +yy108: + YYDEBUG(108, *YYCURSOR); YYCURSOR = YYMARKER; if (yyaccept <= 1) { if (yyaccept <= 0) { - goto yy82; + goto yy87; } else { - goto yy85; + goto yy90; } } else { if (yyaccept <= 2) { - goto yy93; + goto yy98; } else { - goto yy95; + goto yy100; } } -yy104: - YYDEBUG(104, *YYCURSOR); +yy109: + YYDEBUG(109, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; if (yybm[0+yych] & 4) { - goto yy105; + goto yy110; } - if (yych == '\\') goto yy107; - goto yy99; -yy105: - YYDEBUG(105, *YYCURSOR); + if (yych == '\\') goto yy112; + goto yy104; +yy110: + YYDEBUG(110, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(106, *YYCURSOR); + YYDEBUG(111, *YYCURSOR); if (yybm[0+yych] & 4) { - goto yy105; + goto yy110; } - if (yych == '\\') goto yy109; - goto yy99; -yy107: - YYDEBUG(107, *YYCURSOR); + if (yych == '\\') goto yy114; + goto yy104; +yy112: + YYDEBUG(112, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(108, *YYCURSOR); + YYDEBUG(113, *YYCURSOR); if (yybm[0+yych] & 4) { - goto yy105; + goto yy110; } - if (yych == '\\') goto yy107; - goto yy99; -yy109: - YYDEBUG(109, *YYCURSOR); + if (yych == '\\') goto yy112; + goto yy104; +yy114: + YYDEBUG(114, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; if (yybm[0+yych] & 4) { - goto yy105; + goto yy110; } - if (yych == '\\') goto yy107; - goto yy99; -yy110: - YYDEBUG(110, *YYCURSOR); + if (yych == '\\') goto yy112; + goto yy104; +yy115: + YYDEBUG(115, *YYCURSOR); yyaccept = 3; YYMARKER = ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(111, *YYCURSOR); + YYDEBUG(116, *YYCURSOR); if (yybm[0+yych] & 16) { - goto yy110; + goto yy115; } if (yych <= '$') { if (yych <= '\r') { - if (yych == '\n') goto yy95; - if (yych <= '\f') goto yy99; - goto yy95; + if (yych == '\n') goto yy100; + if (yych <= '\f') goto yy104; + goto yy100; } else { - if (yych == '"') goto yy95; - if (yych <= '#') goto yy99; - goto yy102; + if (yych == '"') goto yy100; + if (yych <= '#') goto yy104; + goto yy107; } } else { if (yych <= ';') { - if (yych == '\'') goto yy95; - if (yych <= ':') goto yy99; - goto yy95; + if (yych == '\'') goto yy100; + if (yych <= ':') goto yy104; + goto yy100; } else { - if (yych <= '[') goto yy99; - if (yych <= '\\') goto yy101; - if (yych <= ']') goto yy95; - goto yy99; + if (yych <= '[') goto yy104; + if (yych <= '\\') goto yy106; + if (yych <= ']') goto yy100; + goto yy104; } } -yy112: - YYDEBUG(112, *YYCURSOR); +yy117: + YYDEBUG(117, *YYCURSOR); yyaccept = 2; YYMARKER = ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(113, *YYCURSOR); + YYDEBUG(118, *YYCURSOR); if (yybm[0+yych] & 32) { - goto yy112; + goto yy117; } if (yych <= '$') { if (yych <= '\r') { - if (yych == '\n') goto yy93; - if (yych <= '\f') goto yy99; - goto yy93; + if (yych == '\n') goto yy98; + if (yych <= '\f') goto yy104; + goto yy98; } else { - if (yych == '"') goto yy93; - if (yych <= '#') goto yy99; - goto yy102; + if (yych == '"') goto yy98; + if (yych <= '#') goto yy104; + goto yy107; } } else { if (yych <= ';') { - if (yych == '\'') goto yy93; - if (yych <= ':') goto yy99; - goto yy93; + if (yych == '\'') goto yy98; + if (yych <= ':') goto yy104; + goto yy98; } else { - if (yych <= '[') goto yy99; - if (yych <= '\\') goto yy101; - if (yych <= ']') goto yy93; - goto yy99; + if (yych <= '[') goto yy104; + if (yych <= '\\') goto yy106; + if (yych <= ']') goto yy98; + goto yy104; } } -yy114: - YYDEBUG(114, *YYCURSOR); +yy119: + YYDEBUG(119, *YYCURSOR); yyaccept = 2; YYMARKER = ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(115, *YYCURSOR); + YYDEBUG(120, *YYCURSOR); if (yych <= '\'') { if (yych <= '!') { if (yych <= '\n') { - if (yych <= '\t') goto yy99; - goto yy93; + if (yych <= '\t') goto yy104; + goto yy98; } else { - if (yych == '\r') goto yy93; - goto yy99; + if (yych == '\r') goto yy98; + goto yy104; } } else { if (yych <= '#') { - if (yych <= '"') goto yy93; - goto yy99; + if (yych <= '"') goto yy98; + goto yy104; } else { - if (yych <= '$') goto yy102; - if (yych <= '&') goto yy99; - goto yy93; + if (yych <= '$') goto yy107; + if (yych <= '&') goto yy104; + goto yy98; } } } else { if (yych <= ':') { if (yych <= '.') { - if (yych <= '-') goto yy99; - goto yy112; + if (yych <= '-') goto yy104; + goto yy117; } else { - if (yych <= '/') goto yy99; - if (yych <= '9') goto yy114; - goto yy99; + if (yych <= '/') goto yy104; + if (yych <= '9') goto yy119; + goto yy104; } } else { if (yych <= '[') { - if (yych <= ';') goto yy93; - goto yy99; + if (yych <= ';') goto yy98; + goto yy104; } else { - if (yych <= '\\') goto yy101; - if (yych <= ']') goto yy93; - goto yy99; + if (yych <= '\\') goto yy106; + if (yych <= ']') goto yy98; + goto yy104; } } } -yy116: - YYDEBUG(116, *YYCURSOR); +yy121: + YYDEBUG(121, *YYCURSOR); yyaccept = 2; YYMARKER = ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(117, *YYCURSOR); + YYDEBUG(122, *YYCURSOR); if (yych <= '&') { if (yych <= '\r') { - if (yych == '\n') goto yy93; - if (yych <= '\f') goto yy99; - goto yy93; + if (yych == '\n') goto yy98; + if (yych <= '\f') goto yy104; + goto yy98; } else { if (yych <= '"') { - if (yych <= '!') goto yy99; - goto yy93; + if (yych <= '!') goto yy104; + goto yy98; } else { - if (yych == '$') goto yy102; - goto yy99; + if (yych == '$') goto yy107; + goto yy104; } } } else { if (yych <= ':') { - if (yych <= '\'') goto yy93; - if (yych <= '/') goto yy99; - if (yych <= '9') goto yy116; - goto yy99; + if (yych <= '\'') goto yy98; + if (yych <= '/') goto yy104; + if (yych <= '9') goto yy121; + goto yy104; } else { if (yych <= '[') { - if (yych <= ';') goto yy93; - goto yy99; + if (yych <= ';') goto yy98; + goto yy104; } else { - if (yych <= '\\') goto yy101; - if (yych <= ']') goto yy93; - goto yy99; + if (yych <= '\\') goto yy106; + if (yych <= ']') goto yy98; + goto yy104; } } } -yy118: - YYDEBUG(118, *YYCURSOR); +yy123: + YYDEBUG(123, *YYCURSOR); yyaccept = 2; YYMARKER = ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(119, *YYCURSOR); + YYDEBUG(124, *YYCURSOR); if (yych <= '&') { if (yych <= '\r') { - if (yych == '\n') goto yy93; - if (yych <= '\f') goto yy99; - goto yy93; + if (yych == '\n') goto yy98; + if (yych <= '\f') goto yy104; + goto yy98; } else { if (yych <= '"') { - if (yych <= '!') goto yy99; - goto yy93; + if (yych <= '!') goto yy104; + goto yy98; } else { - if (yych == '$') goto yy102; - goto yy99; + if (yych == '$') goto yy107; + goto yy104; } } } else { if (yych <= ':') { - if (yych <= '\'') goto yy93; - if (yych <= '/') goto yy99; - if (yych <= '9') goto yy118; - goto yy99; + if (yych <= '\'') goto yy98; + if (yych <= '/') goto yy104; + if (yych <= '9') goto yy123; + goto yy104; } else { if (yych <= '[') { - if (yych <= ';') goto yy93; - goto yy99; + if (yych <= ';') goto yy98; + goto yy104; } else { - if (yych <= '\\') goto yy101; - if (yych <= ']') goto yy93; - goto yy99; + if (yych <= '\\') goto yy106; + if (yych <= ']') goto yy98; + goto yy104; } } } -yy120: - YYDEBUG(120, *YYCURSOR); +yy125: + YYDEBUG(125, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(121, *YYCURSOR); + YYDEBUG(126, *YYCURSOR); if (yybm[0+yych] & 64) { - goto yy120; + goto yy125; } - YYDEBUG(122, *YYCURSOR); + YYDEBUG(127, *YYCURSOR); ++YYCURSOR; - YYDEBUG(123, *YYCURSOR); + YYDEBUG(128, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 354 "Zend/zend_ini_scanner.l" +#line 365 "Zend/zend_ini_scanner.l" { /* Raw string */ /* Eat leading and trailing single quotes */ if (yytext[0] == '\'' && yytext[yyleng - 1] == '\'') { @@ -1663,59 +1768,59 @@ yy120: } RETURN_TOKEN(TC_RAW, yytext, yyleng); } -#line 1667 "Zend/zend_ini_scanner.c" -yy124: - YYDEBUG(124, *YYCURSOR); +#line 1772 "Zend/zend_ini_scanner.c" +yy129: + YYDEBUG(129, *YYCURSOR); ++YYCURSOR; - YYDEBUG(125, *YYCURSOR); + YYDEBUG(130, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 384 "Zend/zend_ini_scanner.l" +#line 398 "Zend/zend_ini_scanner.l" { /* Variable start */ yy_push_state(ST_VARNAME TSRMLS_CC); return TC_DOLLAR_CURLY; } -#line 1678 "Zend/zend_ini_scanner.c" -yy126: - YYDEBUG(126, *YYCURSOR); +#line 1783 "Zend/zend_ini_scanner.c" +yy131: + YYDEBUG(131, *YYCURSOR); yyaccept = 0; YYMARKER = ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(127, *YYCURSOR); + YYDEBUG(132, *YYCURSOR); if (yybm[0+yych] & 128) { - goto yy126; + goto yy131; } if (yych <= '$') { if (yych <= '\r') { - if (yych == '\n') goto yy82; - if (yych <= '\f') goto yy99; - goto yy82; + if (yych == '\n') goto yy87; + if (yych <= '\f') goto yy104; + goto yy87; } else { - if (yych == '"') goto yy128; - if (yych <= '#') goto yy99; - goto yy102; + if (yych == '"') goto yy133; + if (yych <= '#') goto yy104; + goto yy107; } } else { if (yych <= ';') { - if (yych == '\'') goto yy82; - if (yych <= ':') goto yy99; - goto yy82; + if (yych == '\'') goto yy87; + if (yych <= ':') goto yy104; + goto yy87; } else { - if (yych <= '[') goto yy99; - if (yych <= '\\') goto yy101; - if (yych <= ']') goto yy129; - goto yy99; + if (yych <= '[') goto yy104; + if (yych <= '\\') goto yy106; + if (yych <= ']') goto yy134; + goto yy104; } } -yy128: - YYDEBUG(128, *YYCURSOR); +yy133: + YYDEBUG(133, *YYCURSOR); yych = *++YYCURSOR; - goto yy87; -yy129: - YYDEBUG(129, *YYCURSOR); + goto yy92; +yy134: + YYDEBUG(134, *YYCURSOR); ++YYCURSOR; yych = *YYCURSOR; - goto yy98; + goto yy103; } /* *********************************** */ yyc_ST_RAW: @@ -1754,31 +1859,31 @@ yyc_ST_RAW: 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, }; - YYDEBUG(130, *YYCURSOR); + YYDEBUG(135, *YYCURSOR); YYFILL(3); yych = *YYCURSOR; if (yych <= '\r') { if (yych <= '\t') { - if (yych >= '\t') goto yy134; + if (yych >= '\t') goto yy139; } else { - if (yych <= '\n') goto yy135; - if (yych >= '\r') goto yy137; + if (yych <= '\n') goto yy140; + if (yych >= '\r') goto yy142; } } else { if (yych <= ' ') { - if (yych >= ' ') goto yy134; + if (yych >= ' ') goto yy139; } else { - if (yych == ';') goto yy138; + if (yych == ';') goto yy143; } } - YYDEBUG(132, *YYCURSOR); + YYDEBUG(137, *YYCURSOR); ++YYCURSOR; yych = *YYCURSOR; - goto yy150; -yy133: - YYDEBUG(133, *YYCURSOR); + goto yy155; +yy138: + YYDEBUG(138, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 419 "Zend/zend_ini_scanner.l" +#line 445 "Zend/zend_ini_scanner.l" { /* Raw value, only used when SCNG(scanner_mode) == ZEND_INI_SCANNER_RAW. */ /* Eat leading and trailing double quotes */ if (yytext[0] == '"' && yytext[yyleng - 1] == '"') { @@ -1787,120 +1892,120 @@ yy133: } RETURN_TOKEN(TC_RAW, yytext, yyleng); } -#line 1791 "Zend/zend_ini_scanner.c" -yy134: - YYDEBUG(134, *YYCURSOR); +#line 1896 "Zend/zend_ini_scanner.c" +yy139: + YYDEBUG(139, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yybm[0+yych] & 64) { - goto yy146; + goto yy151; } if (yych <= '\f') { - if (yych == '\n') goto yy145; - goto yy149; + if (yych == '\n') goto yy150; + goto yy154; } else { - if (yych <= '\r') goto yy148; - if (yych == ';') goto yy140; - goto yy149; + if (yych <= '\r') goto yy153; + if (yych == ';') goto yy145; + goto yy154; } -yy135: - YYDEBUG(135, *YYCURSOR); +yy140: + YYDEBUG(140, *YYCURSOR); ++YYCURSOR; -yy136: - YYDEBUG(136, *YYCURSOR); +yy141: + YYDEBUG(141, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 432 "Zend/zend_ini_scanner.l" +#line 458 "Zend/zend_ini_scanner.l" { /* End of option value */ BEGIN(INITIAL); SCNG(lineno)++; return END_OF_LINE; } -#line 1819 "Zend/zend_ini_scanner.c" -yy137: - YYDEBUG(137, *YYCURSOR); +#line 1924 "Zend/zend_ini_scanner.c" +yy142: + YYDEBUG(142, *YYCURSOR); yych = *++YYCURSOR; - if (yych == '\n') goto yy145; - goto yy136; -yy138: - YYDEBUG(138, *YYCURSOR); + if (yych == '\n') goto yy150; + goto yy141; +yy143: + YYDEBUG(143, *YYCURSOR); yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); - goto yy141; - YYDEBUG(139, *YYCURSOR); + goto yy146; + YYDEBUG(144, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 541 "Zend/zend_ini_scanner.l" +#line 567 "Zend/zend_ini_scanner.l" { /* End of option value (if EOF is reached before EOL */ BEGIN(INITIAL); return END_OF_LINE; } -#line 1837 "Zend/zend_ini_scanner.c" -yy140: - YYDEBUG(140, *YYCURSOR); +#line 1942 "Zend/zend_ini_scanner.c" +yy145: + YYDEBUG(145, *YYCURSOR); ++YYCURSOR; YYFILL(2); yych = *YYCURSOR; -yy141: - YYDEBUG(141, *YYCURSOR); +yy146: + YYDEBUG(146, *YYCURSOR); if (yybm[0+yych] & 32) { - goto yy140; + goto yy145; } - if (yych >= '\r') goto yy144; -yy142: - YYDEBUG(142, *YYCURSOR); + if (yych >= '\r') goto yy149; +yy147: + YYDEBUG(147, *YYCURSOR); ++YYCURSOR; -yy143: - YYDEBUG(143, *YYCURSOR); +yy148: + YYDEBUG(148, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 528 "Zend/zend_ini_scanner.l" +#line 554 "Zend/zend_ini_scanner.l" { /* Comment */ BEGIN(INITIAL); SCNG(lineno)++; return END_OF_LINE; } -#line 1861 "Zend/zend_ini_scanner.c" -yy144: - YYDEBUG(144, *YYCURSOR); +#line 1966 "Zend/zend_ini_scanner.c" +yy149: + YYDEBUG(149, *YYCURSOR); yych = *++YYCURSOR; - if (yych == '\n') goto yy142; - goto yy143; -yy145: - YYDEBUG(145, *YYCURSOR); + if (yych == '\n') goto yy147; + goto yy148; +yy150: + YYDEBUG(150, *YYCURSOR); yych = *++YYCURSOR; - goto yy136; -yy146: - YYDEBUG(146, *YYCURSOR); + goto yy141; +yy151: + YYDEBUG(151, *YYCURSOR); yyaccept = 0; YYMARKER = ++YYCURSOR; YYFILL(2); yych = *YYCURSOR; - YYDEBUG(147, *YYCURSOR); + YYDEBUG(152, *YYCURSOR); if (yybm[0+yych] & 64) { - goto yy146; + goto yy151; } if (yych <= '\f') { - if (yych == '\n') goto yy145; - goto yy149; + if (yych == '\n') goto yy150; + goto yy154; } else { - if (yych <= '\r') goto yy148; - if (yych == ';') goto yy140; - goto yy149; + if (yych <= '\r') goto yy153; + if (yych == ';') goto yy145; + goto yy154; } -yy148: - YYDEBUG(148, *YYCURSOR); +yy153: + YYDEBUG(153, *YYCURSOR); yych = *++YYCURSOR; - if (yych == '\n') goto yy145; - goto yy136; -yy149: - YYDEBUG(149, *YYCURSOR); + if (yych == '\n') goto yy150; + goto yy141; +yy154: + YYDEBUG(154, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; -yy150: - YYDEBUG(150, *YYCURSOR); +yy155: + YYDEBUG(155, *YYCURSOR); if (yybm[0+yych] & 128) { - goto yy149; + goto yy154; } - goto yy133; + goto yy138; } /* *********************************** */ yyc_ST_SECTION_RAW: @@ -1939,85 +2044,85 @@ yyc_ST_SECTION_RAW: 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, }; - YYDEBUG(151, *YYCURSOR); + YYDEBUG(156, *YYCURSOR); YYFILL(3); yych = *YYCURSOR; if (yych <= '\f') { - if (yych == '\n') goto yy155; + if (yych == '\n') goto yy160; } else { - if (yych <= '\r') goto yy155; - if (yych == ']') goto yy157; + if (yych <= '\r') goto yy160; + if (yych == ']') goto yy162; } - YYDEBUG(153, *YYCURSOR); + YYDEBUG(158, *YYCURSOR); ++YYCURSOR; yych = *YYCURSOR; - goto yy164; -yy154: - YYDEBUG(154, *YYCURSOR); + goto yy169; +yy159: + YYDEBUG(159, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 428 "Zend/zend_ini_scanner.l" +#line 454 "Zend/zend_ini_scanner.l" { /* Raw value, only used when SCNG(scanner_mode) == ZEND_INI_SCANNER_RAW. */ RETURN_TOKEN(TC_RAW, yytext, yyleng); } -#line 1963 "Zend/zend_ini_scanner.c" -yy155: - YYDEBUG(155, *YYCURSOR); +#line 2068 "Zend/zend_ini_scanner.c" +yy160: + YYDEBUG(160, *YYCURSOR); ++YYCURSOR; - YYDEBUG(156, *YYCURSOR); + YYDEBUG(161, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 546 "Zend/zend_ini_scanner.l" +#line 572 "Zend/zend_ini_scanner.l" { return 0; } -#line 1973 "Zend/zend_ini_scanner.c" -yy157: - YYDEBUG(157, *YYCURSOR); +#line 2078 "Zend/zend_ini_scanner.c" +yy162: + YYDEBUG(162, *YYCURSOR); ++YYCURSOR; yych = *YYCURSOR; - goto yy160; -yy158: - YYDEBUG(158, *YYCURSOR); + goto yy165; +yy163: + YYDEBUG(163, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 363 "Zend/zend_ini_scanner.l" +#line 374 "Zend/zend_ini_scanner.l" { /* End of section */ BEGIN(INITIAL); SCNG(lineno)++; return ']'; } -#line 1988 "Zend/zend_ini_scanner.c" -yy159: - YYDEBUG(159, *YYCURSOR); +#line 2093 "Zend/zend_ini_scanner.c" +yy164: + YYDEBUG(164, *YYCURSOR); ++YYCURSOR; YYFILL(2); yych = *YYCURSOR; -yy160: - YYDEBUG(160, *YYCURSOR); +yy165: + YYDEBUG(165, *YYCURSOR); if (yybm[0+yych] & 64) { - goto yy159; + goto yy164; } - if (yych == '\n') goto yy161; - if (yych == '\r') goto yy162; - goto yy158; -yy161: - YYDEBUG(161, *YYCURSOR); + if (yych == '\n') goto yy166; + if (yych == '\r') goto yy167; + goto yy163; +yy166: + YYDEBUG(166, *YYCURSOR); yych = *++YYCURSOR; - goto yy158; -yy162: - YYDEBUG(162, *YYCURSOR); + goto yy163; +yy167: + YYDEBUG(167, *YYCURSOR); yych = *++YYCURSOR; - if (yych == '\n') goto yy161; - goto yy158; -yy163: - YYDEBUG(163, *YYCURSOR); + if (yych == '\n') goto yy166; + goto yy163; +yy168: + YYDEBUG(168, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; -yy164: - YYDEBUG(164, *YYCURSOR); +yy169: + YYDEBUG(169, *YYCURSOR); if (yybm[0+yych] & 128) { - goto yy163; + goto yy168; } - goto yy154; + goto yy159; } /* *********************************** */ yyc_ST_SECTION_VALUE: @@ -2056,522 +2161,523 @@ yyc_ST_SECTION_VALUE: 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, }; - YYDEBUG(165, *YYCURSOR); + YYDEBUG(170, *YYCURSOR); YYFILL(3); yych = *YYCURSOR; - if (yych <= ',') { + if (yych <= '-') { if (yych <= ' ') { if (yych <= '\n') { - if (yych <= 0x08) goto yy167; - if (yych <= '\t') goto yy169; - goto yy170; + if (yych <= 0x08) goto yy172; + if (yych <= '\t') goto yy174; + goto yy175; } else { - if (yych == '\r') goto yy170; - if (yych >= ' ') goto yy169; + if (yych == '\r') goto yy175; + if (yych >= ' ') goto yy174; } } else { - if (yych <= '#') { - if (yych == '"') goto yy172; + if (yych <= '$') { + if (yych == '"') goto yy177; + if (yych >= '$') goto yy179; } else { - if (yych <= '$') goto yy174; - if (yych == '\'') goto yy175; + if (yych == '\'') goto yy180; + if (yych >= '-') goto yy181; } } } else { - if (yych <= '@') { - if (yych <= '/') { - if (yych <= '-') goto yy176; - if (yych <= '.') goto yy177; + if (yych <= 'Z') { + if (yych <= '9') { + if (yych <= '.') goto yy182; + if (yych >= '0') goto yy183; } else { - if (yych <= '9') goto yy178; - if (yych == ';') goto yy170; + if (yych == ';') goto yy175; + if (yych >= 'A') goto yy185; } } else { - if (yych <= '\\') { - if (yych <= 'Z') goto yy180; - if (yych >= '\\') goto yy182; + if (yych <= '^') { + if (yych <= '[') goto yy172; + if (yych <= '\\') goto yy187; + if (yych <= ']') goto yy188; } else { - if (yych <= ']') goto yy183; - if (yych <= '`') goto yy167; - if (yych <= 'z') goto yy180; + if (yych == '`') goto yy172; + if (yych <= 'z') goto yy185; } } } -yy167: - YYDEBUG(167, *YYCURSOR); +yy172: + YYDEBUG(172, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - goto yy190; -yy168: - YYDEBUG(168, *YYCURSOR); + goto yy195; +yy173: + YYDEBUG(173, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 464 "Zend/zend_ini_scanner.l" +#line 490 "Zend/zend_ini_scanner.l" { /* Get rest as section/offset value */ RETURN_TOKEN(TC_STRING, yytext, yyleng); } -#line 2113 "Zend/zend_ini_scanner.c" -yy169: - YYDEBUG(169, *YYCURSOR); +#line 2219 "Zend/zend_ini_scanner.c" +yy174: + YYDEBUG(174, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 0x1F) { - if (yych == '\t') goto yy216; - goto yy190; + if (yych == '\t') goto yy221; + goto yy195; } else { - if (yych <= ' ') goto yy216; - if (yych == '"') goto yy218; - goto yy190; + if (yych <= ' ') goto yy221; + if (yych == '"') goto yy223; + goto yy195; } -yy170: - YYDEBUG(170, *YYCURSOR); +yy175: + YYDEBUG(175, *YYCURSOR); ++YYCURSOR; -yy171: - YYDEBUG(171, *YYCURSOR); +yy176: + YYDEBUG(176, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 546 "Zend/zend_ini_scanner.l" +#line 572 "Zend/zend_ini_scanner.l" { return 0; } -#line 2136 "Zend/zend_ini_scanner.c" -yy172: - YYDEBUG(172, *YYCURSOR); +#line 2242 "Zend/zend_ini_scanner.c" +yy177: + YYDEBUG(177, *YYCURSOR); ++YYCURSOR; -yy173: - YYDEBUG(173, *YYCURSOR); +yy178: + YYDEBUG(178, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 468 "Zend/zend_ini_scanner.l" +#line 494 "Zend/zend_ini_scanner.l" { /* Double quoted '"' string start */ yy_push_state(ST_DOUBLE_QUOTES TSRMLS_CC); return '"'; } -#line 2148 "Zend/zend_ini_scanner.c" -yy174: - YYDEBUG(174, *YYCURSOR); +#line 2254 "Zend/zend_ini_scanner.c" +yy179: + YYDEBUG(179, *YYCURSOR); yych = *++YYCURSOR; if (yych <= '\\') { - if (yych <= 0x00) goto yy171; - if (yych <= '[') goto yy189; - goto yy194; + if (yych <= 0x00) goto yy176; + if (yych <= '[') goto yy194; + goto yy199; } else { - if (yych == '{') goto yy214; - goto yy189; + if (yych == '{') goto yy219; + goto yy194; } -yy175: - YYDEBUG(175, *YYCURSOR); +yy180: + YYDEBUG(180, *YYCURSOR); yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); if (yybm[0+yych] & 128) { - goto yy210; + goto yy215; } - goto yy171; -yy176: - YYDEBUG(176, *YYCURSOR); + goto yy176; +yy181: + YYDEBUG(181, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '/') goto yy190; - if (yych <= '9') goto yy208; - goto yy190; -yy177: - YYDEBUG(177, *YYCURSOR); + if (yych <= '/') goto yy195; + if (yych <= '9') goto yy213; + goto yy195; +yy182: + YYDEBUG(182, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '/') goto yy190; - if (yych <= '9') goto yy206; - goto yy190; -yy178: - YYDEBUG(178, *YYCURSOR); + if (yych <= '/') goto yy195; + if (yych <= '9') goto yy211; + goto yy195; +yy183: + YYDEBUG(183, *YYCURSOR); yyaccept = 2; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '\'') { if (yych <= '\r') { - if (yych == '\n') goto yy179; - if (yych <= '\f') goto yy190; + if (yych == '\n') goto yy184; + if (yych <= '\f') goto yy195; } else { - if (yych == '"') goto yy179; - if (yych <= '&') goto yy190; + if (yych == '"') goto yy184; + if (yych <= '&') goto yy195; } } else { if (yych <= '9') { - if (yych == '.') goto yy202; - if (yych <= '/') goto yy190; - goto yy204; + if (yych == '.') goto yy207; + if (yych <= '/') goto yy195; + goto yy209; } else { if (yych <= ';') { - if (yych <= ':') goto yy190; + if (yych <= ':') goto yy195; } else { - if (yych != ']') goto yy190; + if (yych != ']') goto yy195; } } } -yy179: - YYDEBUG(179, *YYCURSOR); +yy184: + YYDEBUG(184, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 442 "Zend/zend_ini_scanner.l" +#line 468 "Zend/zend_ini_scanner.l" { /* Get number option value as string */ RETURN_TOKEN(TC_NUMBER, yytext, yyleng); } -#line 2214 "Zend/zend_ini_scanner.c" -yy180: - YYDEBUG(180, *YYCURSOR); +#line 2320 "Zend/zend_ini_scanner.c" +yy185: + YYDEBUG(185, *YYCURSOR); yyaccept = 3; yych = *(YYMARKER = ++YYCURSOR); if (yybm[0+yych] & 32) { - goto yy200; + goto yy205; } if (yych <= '"') { if (yych <= '\f') { - if (yych != '\n') goto yy190; + if (yych != '\n') goto yy195; } else { - if (yych <= '\r') goto yy181; - if (yych <= '!') goto yy190; + if (yych <= '\r') goto yy186; + if (yych <= '!') goto yy195; } } else { if (yych <= ':') { - if (yych != '\'') goto yy190; + if (yych != '\'') goto yy195; } else { - if (yych <= ';') goto yy181; - if (yych != ']') goto yy190; + if (yych <= ';') goto yy186; + if (yych != ']') goto yy195; } } -yy181: - YYDEBUG(181, *YYCURSOR); +yy186: + YYDEBUG(186, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 438 "Zend/zend_ini_scanner.l" +#line 464 "Zend/zend_ini_scanner.l" { /* Get constant option value */ RETURN_TOKEN(TC_CONSTANT, yytext, yyleng); } -#line 2244 "Zend/zend_ini_scanner.c" -yy182: - YYDEBUG(182, *YYCURSOR); +#line 2350 "Zend/zend_ini_scanner.c" +yy187: + YYDEBUG(187, *YYCURSOR); yych = *++YYCURSOR; - goto yy189; -yy183: - YYDEBUG(183, *YYCURSOR); + goto yy194; +yy188: + YYDEBUG(188, *YYCURSOR); ++YYCURSOR; yych = *YYCURSOR; - goto yy186; -yy184: - YYDEBUG(184, *YYCURSOR); + goto yy191; +yy189: + YYDEBUG(189, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 363 "Zend/zend_ini_scanner.l" +#line 374 "Zend/zend_ini_scanner.l" { /* End of section */ BEGIN(INITIAL); SCNG(lineno)++; return ']'; } -#line 2263 "Zend/zend_ini_scanner.c" -yy185: - YYDEBUG(185, *YYCURSOR); +#line 2369 "Zend/zend_ini_scanner.c" +yy190: + YYDEBUG(190, *YYCURSOR); ++YYCURSOR; YYFILL(2); yych = *YYCURSOR; -yy186: - YYDEBUG(186, *YYCURSOR); +yy191: + YYDEBUG(191, *YYCURSOR); if (yybm[0+yych] & 2) { - goto yy185; + goto yy190; } - if (yych == '\n') goto yy187; - if (yych == '\r') goto yy188; - goto yy184; -yy187: - YYDEBUG(187, *YYCURSOR); + if (yych == '\n') goto yy192; + if (yych == '\r') goto yy193; + goto yy189; +yy192: + YYDEBUG(192, *YYCURSOR); yych = *++YYCURSOR; - goto yy184; -yy188: - YYDEBUG(188, *YYCURSOR); + goto yy189; +yy193: + YYDEBUG(193, *YYCURSOR); yych = *++YYCURSOR; - if (yych == '\n') goto yy187; - goto yy184; -yy189: - YYDEBUG(189, *YYCURSOR); + if (yych == '\n') goto yy192; + goto yy189; +yy194: + YYDEBUG(194, *YYCURSOR); yyaccept = 0; YYMARKER = ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; -yy190: - YYDEBUG(190, *YYCURSOR); +yy195: + YYDEBUG(195, *YYCURSOR); if (yybm[0+yych] & 4) { - goto yy189; + goto yy194; } - if (yych == '$') goto yy192; - if (yych != '\\') goto yy168; -yy191: - YYDEBUG(191, *YYCURSOR); + if (yych == '$') goto yy197; + if (yych != '\\') goto yy173; +yy196: + YYDEBUG(196, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - goto yy189; -yy192: - YYDEBUG(192, *YYCURSOR); + goto yy194; +yy197: + YYDEBUG(197, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; if (yych <= '\\') { - if (yych <= 0x00) goto yy193; - if (yych <= '[') goto yy189; - goto yy194; + if (yych <= 0x00) goto yy198; + if (yych <= '[') goto yy194; + goto yy199; } else { - if (yych != '{') goto yy189; + if (yych != '{') goto yy194; } -yy193: - YYDEBUG(193, *YYCURSOR); +yy198: + YYDEBUG(198, *YYCURSOR); YYCURSOR = YYMARKER; if (yyaccept <= 1) { if (yyaccept <= 0) { - goto yy168; + goto yy173; } else { - goto yy171; + goto yy176; } } else { if (yyaccept <= 2) { - goto yy179; + goto yy184; } else { - goto yy181; + goto yy186; } } -yy194: - YYDEBUG(194, *YYCURSOR); +yy199: + YYDEBUG(199, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; if (yybm[0+yych] & 8) { - goto yy195; + goto yy200; } - if (yych == '\\') goto yy197; - goto yy189; -yy195: - YYDEBUG(195, *YYCURSOR); + if (yych == '\\') goto yy202; + goto yy194; +yy200: + YYDEBUG(200, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(196, *YYCURSOR); + YYDEBUG(201, *YYCURSOR); if (yybm[0+yych] & 8) { - goto yy195; + goto yy200; } - if (yych == '\\') goto yy199; - goto yy189; -yy197: - YYDEBUG(197, *YYCURSOR); + if (yych == '\\') goto yy204; + goto yy194; +yy202: + YYDEBUG(202, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(198, *YYCURSOR); + YYDEBUG(203, *YYCURSOR); if (yybm[0+yych] & 8) { - goto yy195; + goto yy200; } - if (yych == '\\') goto yy197; - goto yy189; -yy199: - YYDEBUG(199, *YYCURSOR); + if (yych == '\\') goto yy202; + goto yy194; +yy204: + YYDEBUG(204, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; if (yybm[0+yych] & 8) { - goto yy195; + goto yy200; } - if (yych == '\\') goto yy197; - goto yy189; -yy200: - YYDEBUG(200, *YYCURSOR); + if (yych == '\\') goto yy202; + goto yy194; +yy205: + YYDEBUG(205, *YYCURSOR); yyaccept = 3; YYMARKER = ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(201, *YYCURSOR); + YYDEBUG(206, *YYCURSOR); if (yybm[0+yych] & 32) { - goto yy200; + goto yy205; } if (yych <= '$') { if (yych <= '\r') { - if (yych == '\n') goto yy181; - if (yych <= '\f') goto yy189; - goto yy181; + if (yych == '\n') goto yy186; + if (yych <= '\f') goto yy194; + goto yy186; } else { - if (yych == '"') goto yy181; - if (yych <= '#') goto yy189; - goto yy192; + if (yych == '"') goto yy186; + if (yych <= '#') goto yy194; + goto yy197; } } else { if (yych <= ';') { - if (yych == '\'') goto yy181; - if (yych <= ':') goto yy189; - goto yy181; + if (yych == '\'') goto yy186; + if (yych <= ':') goto yy194; + goto yy186; } else { - if (yych <= '[') goto yy189; - if (yych <= '\\') goto yy191; - if (yych <= ']') goto yy181; - goto yy189; + if (yych <= '[') goto yy194; + if (yych <= '\\') goto yy196; + if (yych <= ']') goto yy186; + goto yy194; } } -yy202: - YYDEBUG(202, *YYCURSOR); +yy207: + YYDEBUG(207, *YYCURSOR); yyaccept = 2; YYMARKER = ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(203, *YYCURSOR); + YYDEBUG(208, *YYCURSOR); if (yybm[0+yych] & 64) { - goto yy202; + goto yy207; } if (yych <= '$') { if (yych <= '\r') { - if (yych == '\n') goto yy179; - if (yych <= '\f') goto yy189; - goto yy179; + if (yych == '\n') goto yy184; + if (yych <= '\f') goto yy194; + goto yy184; } else { - if (yych == '"') goto yy179; - if (yych <= '#') goto yy189; - goto yy192; + if (yych == '"') goto yy184; + if (yych <= '#') goto yy194; + goto yy197; } } else { if (yych <= ';') { - if (yych == '\'') goto yy179; - if (yych <= ':') goto yy189; - goto yy179; + if (yych == '\'') goto yy184; + if (yych <= ':') goto yy194; + goto yy184; } else { - if (yych <= '[') goto yy189; - if (yych <= '\\') goto yy191; - if (yych <= ']') goto yy179; - goto yy189; + if (yych <= '[') goto yy194; + if (yych <= '\\') goto yy196; + if (yych <= ']') goto yy184; + goto yy194; } } -yy204: - YYDEBUG(204, *YYCURSOR); +yy209: + YYDEBUG(209, *YYCURSOR); yyaccept = 2; YYMARKER = ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(205, *YYCURSOR); + YYDEBUG(210, *YYCURSOR); if (yych <= '\'') { if (yych <= '!') { if (yych <= '\n') { - if (yych <= '\t') goto yy189; - goto yy179; + if (yych <= '\t') goto yy194; + goto yy184; } else { - if (yych == '\r') goto yy179; - goto yy189; + if (yych == '\r') goto yy184; + goto yy194; } } else { if (yych <= '#') { - if (yych <= '"') goto yy179; - goto yy189; + if (yych <= '"') goto yy184; + goto yy194; } else { - if (yych <= '$') goto yy192; - if (yych <= '&') goto yy189; - goto yy179; + if (yych <= '$') goto yy197; + if (yych <= '&') goto yy194; + goto yy184; } } } else { if (yych <= ':') { if (yych <= '.') { - if (yych <= '-') goto yy189; - goto yy202; + if (yych <= '-') goto yy194; + goto yy207; } else { - if (yych <= '/') goto yy189; - if (yych <= '9') goto yy204; - goto yy189; + if (yych <= '/') goto yy194; + if (yych <= '9') goto yy209; + goto yy194; } } else { if (yych <= '[') { - if (yych <= ';') goto yy179; - goto yy189; + if (yych <= ';') goto yy184; + goto yy194; } else { - if (yych <= '\\') goto yy191; - if (yych <= ']') goto yy179; - goto yy189; + if (yych <= '\\') goto yy196; + if (yych <= ']') goto yy184; + goto yy194; } } } -yy206: - YYDEBUG(206, *YYCURSOR); +yy211: + YYDEBUG(211, *YYCURSOR); yyaccept = 2; YYMARKER = ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(207, *YYCURSOR); + YYDEBUG(212, *YYCURSOR); if (yych <= '&') { if (yych <= '\r') { - if (yych == '\n') goto yy179; - if (yych <= '\f') goto yy189; - goto yy179; + if (yych == '\n') goto yy184; + if (yych <= '\f') goto yy194; + goto yy184; } else { if (yych <= '"') { - if (yych <= '!') goto yy189; - goto yy179; + if (yych <= '!') goto yy194; + goto yy184; } else { - if (yych == '$') goto yy192; - goto yy189; + if (yych == '$') goto yy197; + goto yy194; } } } else { if (yych <= ':') { - if (yych <= '\'') goto yy179; - if (yych <= '/') goto yy189; - if (yych <= '9') goto yy206; - goto yy189; + if (yych <= '\'') goto yy184; + if (yych <= '/') goto yy194; + if (yych <= '9') goto yy211; + goto yy194; } else { if (yych <= '[') { - if (yych <= ';') goto yy179; - goto yy189; + if (yych <= ';') goto yy184; + goto yy194; } else { - if (yych <= '\\') goto yy191; - if (yych <= ']') goto yy179; - goto yy189; + if (yych <= '\\') goto yy196; + if (yych <= ']') goto yy184; + goto yy194; } } } -yy208: - YYDEBUG(208, *YYCURSOR); +yy213: + YYDEBUG(213, *YYCURSOR); yyaccept = 2; YYMARKER = ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(209, *YYCURSOR); + YYDEBUG(214, *YYCURSOR); if (yych <= '&') { if (yych <= '\r') { - if (yych == '\n') goto yy179; - if (yych <= '\f') goto yy189; - goto yy179; + if (yych == '\n') goto yy184; + if (yych <= '\f') goto yy194; + goto yy184; } else { if (yych <= '"') { - if (yych <= '!') goto yy189; - goto yy179; + if (yych <= '!') goto yy194; + goto yy184; } else { - if (yych == '$') goto yy192; - goto yy189; + if (yych == '$') goto yy197; + goto yy194; } } } else { if (yych <= ':') { - if (yych <= '\'') goto yy179; - if (yych <= '/') goto yy189; - if (yych <= '9') goto yy208; - goto yy189; + if (yych <= '\'') goto yy184; + if (yych <= '/') goto yy194; + if (yych <= '9') goto yy213; + goto yy194; } else { if (yych <= '[') { - if (yych <= ';') goto yy179; - goto yy189; + if (yych <= ';') goto yy184; + goto yy194; } else { - if (yych <= '\\') goto yy191; - if (yych <= ']') goto yy179; - goto yy189; + if (yych <= '\\') goto yy196; + if (yych <= ']') goto yy184; + goto yy194; } } } -yy210: - YYDEBUG(210, *YYCURSOR); +yy215: + YYDEBUG(215, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(211, *YYCURSOR); + YYDEBUG(216, *YYCURSOR); if (yybm[0+yych] & 128) { - goto yy210; + goto yy215; } - YYDEBUG(212, *YYCURSOR); + YYDEBUG(217, *YYCURSOR); ++YYCURSOR; - YYDEBUG(213, *YYCURSOR); + YYDEBUG(218, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 354 "Zend/zend_ini_scanner.l" +#line 365 "Zend/zend_ini_scanner.l" { /* Raw string */ /* Eat leading and trailing single quotes */ if (yytext[0] == '\'' && yytext[yyleng - 1] == '\'') { @@ -2580,65 +2686,65 @@ yy210: } RETURN_TOKEN(TC_RAW, yytext, yyleng); } -#line 2584 "Zend/zend_ini_scanner.c" -yy214: - YYDEBUG(214, *YYCURSOR); +#line 2690 "Zend/zend_ini_scanner.c" +yy219: + YYDEBUG(219, *YYCURSOR); ++YYCURSOR; - YYDEBUG(215, *YYCURSOR); + YYDEBUG(220, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 384 "Zend/zend_ini_scanner.l" +#line 398 "Zend/zend_ini_scanner.l" { /* Variable start */ yy_push_state(ST_VARNAME TSRMLS_CC); return TC_DOLLAR_CURLY; } -#line 2595 "Zend/zend_ini_scanner.c" -yy216: - YYDEBUG(216, *YYCURSOR); +#line 2701 "Zend/zend_ini_scanner.c" +yy221: + YYDEBUG(221, *YYCURSOR); yyaccept = 0; YYMARKER = ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(217, *YYCURSOR); + YYDEBUG(222, *YYCURSOR); if (yych <= '"') { if (yych <= '\f') { - if (yych <= 0x08) goto yy189; - if (yych <= '\t') goto yy216; - if (yych <= '\n') goto yy168; - goto yy189; + if (yych <= 0x08) goto yy194; + if (yych <= '\t') goto yy221; + if (yych <= '\n') goto yy173; + goto yy194; } else { if (yych <= 0x1F) { - if (yych <= '\r') goto yy168; - goto yy189; + if (yych <= '\r') goto yy173; + goto yy194; } else { - if (yych <= ' ') goto yy216; - if (yych <= '!') goto yy189; + if (yych <= ' ') goto yy221; + if (yych <= '!') goto yy194; } } } else { if (yych <= ':') { if (yych <= '$') { - if (yych <= '#') goto yy189; - goto yy192; + if (yych <= '#') goto yy194; + goto yy197; } else { - if (yych == '\'') goto yy168; - goto yy189; + if (yych == '\'') goto yy173; + goto yy194; } } else { if (yych <= '[') { - if (yych <= ';') goto yy168; - goto yy189; + if (yych <= ';') goto yy173; + goto yy194; } else { - if (yych <= '\\') goto yy191; - if (yych <= ']') goto yy168; - goto yy189; + if (yych <= '\\') goto yy196; + if (yych <= ']') goto yy173; + goto yy194; } } } -yy218: - YYDEBUG(218, *YYCURSOR); +yy223: + YYDEBUG(223, *YYCURSOR); ++YYCURSOR; yych = *YYCURSOR; - goto yy173; + goto yy178; } /* *********************************** */ yyc_ST_VALUE: @@ -2677,27 +2783,27 @@ yyc_ST_VALUE: 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, }; - YYDEBUG(219, *YYCURSOR); + YYDEBUG(224, *YYCURSOR); YYFILL(6); yych = *YYCURSOR; YYDEBUG(-1, yych); switch (yych) { - case 0x00: goto yy221; + case 0x00: goto yy226; case '\t': - case ' ': goto yy225; - case '\n': goto yy227; - case '\r': goto yy229; + case ' ': goto yy230; + case '\n': goto yy232; + case '\r': goto yy234; case '!': case '&': case '(': case ')': case '|': - case '~': goto yy230; - case '"': goto yy232; - case '$': goto yy234; - case '\'': goto yy235; - case '-': goto yy236; - case '.': goto yy237; + case '~': goto yy235; + case '"': goto yy237; + case '$': goto yy239; + case '\'': goto yy240; + case '-': goto yy241; + case '.': goto yy242; case '0': case '1': case '2': @@ -2707,9 +2813,9 @@ yyc_ST_VALUE: case '6': case '7': case '8': - case '9': goto yy238; - case ';': goto yy240; - case '=': goto yy241; + case '9': goto yy243; + case ';': goto yy245; + case '=': goto yy246; case 'A': case 'B': case 'C': @@ -2731,6 +2837,7 @@ yyc_ST_VALUE: case 'W': case 'X': case 'Z': + case '_': case 'a': case 'b': case 'c': @@ -2751,1531 +2858,1531 @@ yyc_ST_VALUE: case 'v': case 'w': case 'x': - case 'z': goto yy243; + case 'z': goto yy248; case 'F': - case 'f': goto yy245; + case 'f': goto yy250; case 'N': - case 'n': goto yy246; + case 'n': goto yy251; case 'O': - case 'o': goto yy247; + case 'o': goto yy252; case 'T': - case 't': goto yy248; + case 't': goto yy253; case 'Y': - case 'y': goto yy249; - default: goto yy223; + case 'y': goto yy254; + default: goto yy228; } -yy221: - YYDEBUG(221, *YYCURSOR); +yy226: + YYDEBUG(226, *YYCURSOR); ++YYCURSOR; -yy222: - YYDEBUG(222, *YYCURSOR); +yy227: + YYDEBUG(227, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 541 "Zend/zend_ini_scanner.l" +#line 567 "Zend/zend_ini_scanner.l" { /* End of option value (if EOF is reached before EOL */ BEGIN(INITIAL); return END_OF_LINE; } -#line 2779 "Zend/zend_ini_scanner.c" -yy223: - YYDEBUG(223, *YYCURSOR); +#line 2886 "Zend/zend_ini_scanner.c" +yy228: + YYDEBUG(228, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - goto yy251; -yy224: - YYDEBUG(224, *YYCURSOR); + goto yy256; +yy229: + YYDEBUG(229, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 460 "Zend/zend_ini_scanner.l" +#line 486 "Zend/zend_ini_scanner.l" { /* Get everything else as option/offset value */ RETURN_TOKEN(TC_STRING, yytext, yyleng); } -#line 2792 "Zend/zend_ini_scanner.c" -yy225: - YYDEBUG(225, *YYCURSOR); +#line 2899 "Zend/zend_ini_scanner.c" +yy230: + YYDEBUG(230, *YYCURSOR); yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); - goto yy301; -yy226: - YYDEBUG(226, *YYCURSOR); + goto yy306; +yy231: + YYDEBUG(231, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 514 "Zend/zend_ini_scanner.l" +#line 540 "Zend/zend_ini_scanner.l" { RETURN_TOKEN(TC_WHITESPACE, yytext, yyleng); } -#line 2805 "Zend/zend_ini_scanner.c" -yy227: - YYDEBUG(227, *YYCURSOR); +#line 2912 "Zend/zend_ini_scanner.c" +yy232: + YYDEBUG(232, *YYCURSOR); ++YYCURSOR; -yy228: - YYDEBUG(228, *YYCURSOR); +yy233: + YYDEBUG(233, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 432 "Zend/zend_ini_scanner.l" +#line 458 "Zend/zend_ini_scanner.l" { /* End of option value */ BEGIN(INITIAL); SCNG(lineno)++; return END_OF_LINE; } -#line 2818 "Zend/zend_ini_scanner.c" -yy229: - YYDEBUG(229, *YYCURSOR); +#line 2925 "Zend/zend_ini_scanner.c" +yy234: + YYDEBUG(234, *YYCURSOR); yych = *++YYCURSOR; - if (yych == '\n') goto yy299; - goto yy228; -yy230: - YYDEBUG(230, *YYCURSOR); + if (yych == '\n') goto yy304; + goto yy233; +yy235: + YYDEBUG(235, *YYCURSOR); ++YYCURSOR; yych = *YYCURSOR; - goto yy298; -yy231: - YYDEBUG(231, *YYCURSOR); + goto yy303; +yy236: + YYDEBUG(236, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 450 "Zend/zend_ini_scanner.l" +#line 476 "Zend/zend_ini_scanner.l" { /* Boolean operators */ return yytext[0]; } -#line 2836 "Zend/zend_ini_scanner.c" -yy232: - YYDEBUG(232, *YYCURSOR); +#line 2943 "Zend/zend_ini_scanner.c" +yy237: + YYDEBUG(237, *YYCURSOR); ++YYCURSOR; -yy233: - YYDEBUG(233, *YYCURSOR); +yy238: + YYDEBUG(238, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 468 "Zend/zend_ini_scanner.l" +#line 494 "Zend/zend_ini_scanner.l" { /* Double quoted '"' string start */ yy_push_state(ST_DOUBLE_QUOTES TSRMLS_CC); return '"'; } -#line 2848 "Zend/zend_ini_scanner.c" -yy234: - YYDEBUG(234, *YYCURSOR); +#line 2955 "Zend/zend_ini_scanner.c" +yy239: + YYDEBUG(239, *YYCURSOR); yych = *++YYCURSOR; if (yych <= '\\') { - if (yych <= 0x00) goto yy222; - if (yych <= '[') goto yy250; - goto yy257; + if (yych <= 0x00) goto yy227; + if (yych <= '[') goto yy255; + goto yy262; } else { - if (yych == '{') goto yy295; - goto yy250; + if (yych == '{') goto yy300; + goto yy255; } -yy235: - YYDEBUG(235, *YYCURSOR); +yy240: + YYDEBUG(240, *YYCURSOR); yyaccept = 2; yych = *(YYMARKER = ++YYCURSOR); if (yybm[0+yych] & 128) { - goto yy291; + goto yy296; } - goto yy222; -yy236: - YYDEBUG(236, *YYCURSOR); + goto yy227; +yy241: + YYDEBUG(241, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '/') goto yy251; - if (yych <= '9') goto yy289; - goto yy251; -yy237: - YYDEBUG(237, *YYCURSOR); + if (yych <= '/') goto yy256; + if (yych <= '9') goto yy294; + goto yy256; +yy242: + YYDEBUG(242, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '/') goto yy251; - if (yych <= '9') goto yy287; - goto yy251; -yy238: - YYDEBUG(238, *YYCURSOR); + if (yych <= '/') goto yy256; + if (yych <= '9') goto yy292; + goto yy256; +yy243: + YYDEBUG(243, *YYCURSOR); yyaccept = 3; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '.') { if (yych <= '\r') { if (yych <= 0x08) { - if (yych >= 0x01) goto yy251; + if (yych >= 0x01) goto yy256; } else { - if (yych <= '\n') goto yy239; - if (yych <= '\f') goto yy251; + if (yych <= '\n') goto yy244; + if (yych <= '\f') goto yy256; } } else { if (yych <= '%') { - if (yych <= 0x1F) goto yy251; - if (yych >= '#') goto yy251; + if (yych <= 0x1F) goto yy256; + if (yych >= '#') goto yy256; } else { - if (yych <= ')') goto yy239; - if (yych <= '-') goto yy251; - goto yy283; + if (yych <= ')') goto yy244; + if (yych <= '-') goto yy256; + goto yy288; } } } else { if (yych <= '<') { if (yych <= '9') { - if (yych <= '/') goto yy251; - goto yy285; + if (yych <= '/') goto yy256; + goto yy290; } else { - if (yych != ';') goto yy251; + if (yych != ';') goto yy256; } } else { if (yych <= '|') { - if (yych <= '=') goto yy239; - if (yych <= '{') goto yy251; + if (yych <= '=') goto yy244; + if (yych <= '{') goto yy256; } else { - if (yych != '~') goto yy251; + if (yych != '~') goto yy256; } } } -yy239: - YYDEBUG(239, *YYCURSOR); +yy244: + YYDEBUG(244, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 442 "Zend/zend_ini_scanner.l" +#line 468 "Zend/zend_ini_scanner.l" { /* Get number option value as string */ RETURN_TOKEN(TC_NUMBER, yytext, yyleng); } -#line 2928 "Zend/zend_ini_scanner.c" -yy240: - YYDEBUG(240, *YYCURSOR); +#line 3035 "Zend/zend_ini_scanner.c" +yy245: + YYDEBUG(245, *YYCURSOR); yyaccept = 2; yych = *(YYMARKER = ++YYCURSOR); - goto yy279; -yy241: - YYDEBUG(241, *YYCURSOR); + goto yy284; +yy246: + YYDEBUG(246, *YYCURSOR); ++YYCURSOR; - YYDEBUG(242, *YYCURSOR); + YYDEBUG(247, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 454 "Zend/zend_ini_scanner.l" +#line 480 "Zend/zend_ini_scanner.l" { /* Make = used in option value to trigger error */ yyless(0); BEGIN(INITIAL); return END_OF_LINE; } -#line 2945 "Zend/zend_ini_scanner.c" -yy243: - YYDEBUG(243, *YYCURSOR); +#line 3052 "Zend/zend_ini_scanner.c" +yy248: + YYDEBUG(248, *YYCURSOR); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yybm[0+yych] & 4) { - goto yy252; + goto yy257; } if (yych <= ')') { if (yych <= '\f') { - if (yych <= 0x00) goto yy244; - if (yych <= 0x08) goto yy251; - if (yych >= '\v') goto yy251; + if (yych <= 0x00) goto yy249; + if (yych <= 0x08) goto yy256; + if (yych >= '\v') goto yy256; } else { if (yych <= 0x1F) { - if (yych >= 0x0E) goto yy251; + if (yych >= 0x0E) goto yy256; } else { - if (yych <= '"') goto yy244; - if (yych <= '%') goto yy251; + if (yych <= '"') goto yy249; + if (yych <= '%') goto yy256; } } } else { if (yych <= '=') { - if (yych == ';') goto yy244; - if (yych <= '<') goto yy251; + if (yych == ';') goto yy249; + if (yych <= '<') goto yy256; } else { if (yych <= '|') { - if (yych <= '{') goto yy251; + if (yych <= '{') goto yy256; } else { - if (yych != '~') goto yy251; + if (yych != '~') goto yy256; } } } -yy244: - YYDEBUG(244, *YYCURSOR); +yy249: + YYDEBUG(249, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 438 "Zend/zend_ini_scanner.l" +#line 464 "Zend/zend_ini_scanner.l" { /* Get constant option value */ RETURN_TOKEN(TC_CONSTANT, yytext, yyleng); } -#line 2985 "Zend/zend_ini_scanner.c" -yy245: - YYDEBUG(245, *YYCURSOR); +#line 3092 "Zend/zend_ini_scanner.c" +yy250: + YYDEBUG(250, *YYCURSOR); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '<') { if (yych <= '"') { if (yych <= '\n') { - if (yych <= 0x00) goto yy244; - if (yych <= 0x08) goto yy251; - goto yy244; + if (yych <= 0x00) goto yy249; + if (yych <= 0x08) goto yy256; + goto yy249; } else { - if (yych == '\r') goto yy244; - if (yych <= 0x1F) goto yy251; - goto yy244; + if (yych == '\r') goto yy249; + if (yych <= 0x1F) goto yy256; + goto yy249; } } else { if (yych <= '/') { - if (yych <= '%') goto yy251; - if (yych <= ')') goto yy244; - goto yy251; + if (yych <= '%') goto yy256; + if (yych <= ')') goto yy249; + goto yy256; } else { - if (yych <= '9') goto yy252; - if (yych == ';') goto yy244; - goto yy251; + if (yych <= '9') goto yy257; + if (yych == ';') goto yy249; + goto yy256; } } } else { if (yych <= '`') { if (yych <= 'A') { - if (yych <= '=') goto yy244; - if (yych <= '@') goto yy251; - goto yy275; + if (yych <= '=') goto yy249; + if (yych <= '@') goto yy256; + goto yy280; } else { - if (yych <= 'Z') goto yy252; - if (yych == '_') goto yy252; - goto yy251; + if (yych <= 'Z') goto yy257; + if (yych == '_') goto yy257; + goto yy256; } } else { if (yych <= '{') { - if (yych <= 'a') goto yy275; - if (yych <= 'z') goto yy252; - goto yy251; + if (yych <= 'a') goto yy280; + if (yych <= 'z') goto yy257; + goto yy256; } else { - if (yych == '}') goto yy251; - if (yych <= '~') goto yy244; - goto yy251; + if (yych == '}') goto yy256; + if (yych <= '~') goto yy249; + goto yy256; } } } -yy246: - YYDEBUG(246, *YYCURSOR); +yy251: + YYDEBUG(251, *YYCURSOR); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'N') { if (yych <= '%') { if (yych <= '\f') { - if (yych <= 0x00) goto yy244; - if (yych <= 0x08) goto yy251; - if (yych <= '\n') goto yy244; - goto yy251; + if (yych <= 0x00) goto yy249; + if (yych <= 0x08) goto yy256; + if (yych <= '\n') goto yy249; + goto yy256; } else { - if (yych <= '\r') goto yy244; - if (yych <= 0x1F) goto yy251; - if (yych <= '"') goto yy244; - goto yy251; + if (yych <= '\r') goto yy249; + if (yych <= 0x1F) goto yy256; + if (yych <= '"') goto yy249; + goto yy256; } } else { if (yych <= ':') { - if (yych <= ')') goto yy244; - if (yych <= '/') goto yy251; - if (yych <= '9') goto yy252; - goto yy251; + if (yych <= ')') goto yy249; + if (yych <= '/') goto yy256; + if (yych <= '9') goto yy257; + goto yy256; } else { if (yych <= '<') { - if (yych <= ';') goto yy244; - goto yy251; + if (yych <= ';') goto yy249; + goto yy256; } else { - if (yych <= '=') goto yy244; - if (yych <= '@') goto yy251; - goto yy252; + if (yych <= '=') goto yy249; + if (yych <= '@') goto yy256; + goto yy257; } } } } else { if (yych <= 'n') { if (yych <= 'Z') { - if (yych <= 'O') goto yy271; - if (yych == 'U') goto yy272; - goto yy252; + if (yych <= 'O') goto yy276; + if (yych == 'U') goto yy277; + goto yy257; } else { - if (yych == '_') goto yy252; - if (yych <= '`') goto yy251; - goto yy252; + if (yych == '_') goto yy257; + if (yych <= '`') goto yy256; + goto yy257; } } else { if (yych <= 'z') { - if (yych <= 'o') goto yy271; - if (yych == 'u') goto yy272; - goto yy252; + if (yych <= 'o') goto yy276; + if (yych == 'u') goto yy277; + goto yy257; } else { if (yych <= '|') { - if (yych <= '{') goto yy251; - goto yy244; + if (yych <= '{') goto yy256; + goto yy249; } else { - if (yych == '~') goto yy244; - goto yy251; + if (yych == '~') goto yy249; + goto yy256; } } } } -yy247: - YYDEBUG(247, *YYCURSOR); +yy252: + YYDEBUG(252, *YYCURSOR); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'E') { if (yych <= '%') { if (yych <= '\f') { - if (yych <= 0x00) goto yy244; - if (yych <= 0x08) goto yy251; - if (yych <= '\n') goto yy244; - goto yy251; + if (yych <= 0x00) goto yy249; + if (yych <= 0x08) goto yy256; + if (yych <= '\n') goto yy249; + goto yy256; } else { - if (yych <= '\r') goto yy244; - if (yych <= 0x1F) goto yy251; - if (yych <= '"') goto yy244; - goto yy251; + if (yych <= '\r') goto yy249; + if (yych <= 0x1F) goto yy256; + if (yych <= '"') goto yy249; + goto yy256; } } else { if (yych <= ':') { - if (yych <= ')') goto yy244; - if (yych <= '/') goto yy251; - if (yych <= '9') goto yy252; - goto yy251; + if (yych <= ')') goto yy249; + if (yych <= '/') goto yy256; + if (yych <= '9') goto yy257; + goto yy256; } else { if (yych <= '<') { - if (yych <= ';') goto yy244; - goto yy251; + if (yych <= ';') goto yy249; + goto yy256; } else { - if (yych <= '=') goto yy244; - if (yych <= '@') goto yy251; - goto yy252; + if (yych <= '=') goto yy249; + if (yych <= '@') goto yy256; + goto yy257; } } } } else { if (yych <= 'e') { if (yych <= 'Z') { - if (yych <= 'F') goto yy266; - if (yych == 'N') goto yy260; - goto yy252; + if (yych <= 'F') goto yy271; + if (yych == 'N') goto yy265; + goto yy257; } else { - if (yych == '_') goto yy252; - if (yych <= '`') goto yy251; - goto yy252; + if (yych == '_') goto yy257; + if (yych <= '`') goto yy256; + goto yy257; } } else { if (yych <= 'z') { - if (yych <= 'f') goto yy266; - if (yych == 'n') goto yy260; - goto yy252; + if (yych <= 'f') goto yy271; + if (yych == 'n') goto yy265; + goto yy257; } else { if (yych <= '|') { - if (yych <= '{') goto yy251; - goto yy244; + if (yych <= '{') goto yy256; + goto yy249; } else { - if (yych == '~') goto yy244; - goto yy251; + if (yych == '~') goto yy249; + goto yy256; } } } } -yy248: - YYDEBUG(248, *YYCURSOR); +yy253: + YYDEBUG(253, *YYCURSOR); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '=') { if (yych <= '"') { if (yych <= '\n') { - if (yych <= 0x00) goto yy244; - if (yych <= 0x08) goto yy251; - goto yy244; + if (yych <= 0x00) goto yy249; + if (yych <= 0x08) goto yy256; + goto yy249; } else { - if (yych == '\r') goto yy244; - if (yych <= 0x1F) goto yy251; - goto yy244; + if (yych == '\r') goto yy249; + if (yych <= 0x1F) goto yy256; + goto yy249; } } else { if (yych <= '9') { - if (yych <= '%') goto yy251; - if (yych <= ')') goto yy244; - if (yych <= '/') goto yy251; - goto yy252; + if (yych <= '%') goto yy256; + if (yych <= ')') goto yy249; + if (yych <= '/') goto yy256; + goto yy257; } else { - if (yych == ';') goto yy244; - if (yych <= '<') goto yy251; - goto yy244; + if (yych == ';') goto yy249; + if (yych <= '<') goto yy256; + goto yy249; } } } else { if (yych <= '`') { if (yych <= 'R') { - if (yych <= '@') goto yy251; - if (yych <= 'Q') goto yy252; - goto yy264; + if (yych <= '@') goto yy256; + if (yych <= 'Q') goto yy257; + goto yy269; } else { - if (yych <= 'Z') goto yy252; - if (yych == '_') goto yy252; - goto yy251; + if (yych <= 'Z') goto yy257; + if (yych == '_') goto yy257; + goto yy256; } } else { if (yych <= '{') { - if (yych == 'r') goto yy264; - if (yych <= 'z') goto yy252; - goto yy251; + if (yych == 'r') goto yy269; + if (yych <= 'z') goto yy257; + goto yy256; } else { - if (yych == '}') goto yy251; - if (yych <= '~') goto yy244; - goto yy251; + if (yych == '}') goto yy256; + if (yych <= '~') goto yy249; + goto yy256; } } } -yy249: - YYDEBUG(249, *YYCURSOR); +yy254: + YYDEBUG(254, *YYCURSOR); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '=') { if (yych <= '"') { if (yych <= '\n') { - if (yych <= 0x00) goto yy244; - if (yych <= 0x08) goto yy251; - goto yy244; + if (yych <= 0x00) goto yy249; + if (yych <= 0x08) goto yy256; + goto yy249; } else { - if (yych == '\r') goto yy244; - if (yych <= 0x1F) goto yy251; - goto yy244; + if (yych == '\r') goto yy249; + if (yych <= 0x1F) goto yy256; + goto yy249; } } else { if (yych <= '9') { - if (yych <= '%') goto yy251; - if (yych <= ')') goto yy244; - if (yych <= '/') goto yy251; - goto yy252; + if (yych <= '%') goto yy256; + if (yych <= ')') goto yy249; + if (yych <= '/') goto yy256; + goto yy257; } else { - if (yych == ';') goto yy244; - if (yych <= '<') goto yy251; - goto yy244; + if (yych == ';') goto yy249; + if (yych <= '<') goto yy256; + goto yy249; } } } else { if (yych <= '`') { if (yych <= 'E') { - if (yych <= '@') goto yy251; - if (yych <= 'D') goto yy252; - goto yy254; + if (yych <= '@') goto yy256; + if (yych <= 'D') goto yy257; + goto yy259; } else { - if (yych <= 'Z') goto yy252; - if (yych == '_') goto yy252; - goto yy251; + if (yych <= 'Z') goto yy257; + if (yych == '_') goto yy257; + goto yy256; } } else { if (yych <= '{') { - if (yych == 'e') goto yy254; - if (yych <= 'z') goto yy252; - goto yy251; + if (yych == 'e') goto yy259; + if (yych <= 'z') goto yy257; + goto yy256; } else { - if (yych == '}') goto yy251; - if (yych <= '~') goto yy244; - goto yy251; + if (yych == '}') goto yy256; + if (yych <= '~') goto yy249; + goto yy256; } } } -yy250: - YYDEBUG(250, *YYCURSOR); +yy255: + YYDEBUG(255, *YYCURSOR); yyaccept = 0; YYMARKER = ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; -yy251: - YYDEBUG(251, *YYCURSOR); +yy256: + YYDEBUG(256, *YYCURSOR); if (yybm[0+yych] & 2) { - goto yy250; + goto yy255; } - if (yych == '$') goto yy255; - goto yy224; -yy252: - YYDEBUG(252, *YYCURSOR); + if (yych == '$') goto yy260; + goto yy229; +yy257: + YYDEBUG(257, *YYCURSOR); yyaccept = 4; YYMARKER = ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(253, *YYCURSOR); + YYDEBUG(258, *YYCURSOR); if (yybm[0+yych] & 4) { - goto yy252; + goto yy257; } if (yych <= '%') { if (yych <= '\r') { if (yych <= 0x08) { - if (yych <= 0x00) goto yy244; - goto yy250; + if (yych <= 0x00) goto yy249; + goto yy255; } else { - if (yych <= '\n') goto yy244; - if (yych <= '\f') goto yy250; - goto yy244; + if (yych <= '\n') goto yy249; + if (yych <= '\f') goto yy255; + goto yy249; } } else { if (yych <= '"') { - if (yych <= 0x1F) goto yy250; - goto yy244; + if (yych <= 0x1F) goto yy255; + goto yy249; } else { - if (yych == '$') goto yy255; - goto yy250; + if (yych == '$') goto yy260; + goto yy255; } } } else { if (yych <= '=') { if (yych <= ':') { - if (yych <= ')') goto yy244; - goto yy250; + if (yych <= ')') goto yy249; + goto yy255; } else { - if (yych == '<') goto yy250; - goto yy244; + if (yych == '<') goto yy255; + goto yy249; } } else { if (yych <= '|') { - if (yych <= '{') goto yy250; - goto yy244; + if (yych <= '{') goto yy255; + goto yy249; } else { - if (yych == '~') goto yy244; - goto yy250; + if (yych == '~') goto yy249; + goto yy255; } } } -yy254: - YYDEBUG(254, *YYCURSOR); +yy259: + YYDEBUG(259, *YYCURSOR); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '=') { if (yych <= '"') { if (yych <= '\n') { - if (yych <= 0x00) goto yy244; - if (yych <= 0x08) goto yy251; - goto yy244; + if (yych <= 0x00) goto yy249; + if (yych <= 0x08) goto yy256; + goto yy249; } else { - if (yych == '\r') goto yy244; - if (yych <= 0x1F) goto yy251; - goto yy244; + if (yych == '\r') goto yy249; + if (yych <= 0x1F) goto yy256; + goto yy249; } } else { if (yych <= '9') { - if (yych <= '%') goto yy251; - if (yych <= ')') goto yy244; - if (yych <= '/') goto yy251; - goto yy252; + if (yych <= '%') goto yy256; + if (yych <= ')') goto yy249; + if (yych <= '/') goto yy256; + goto yy257; } else { - if (yych == ';') goto yy244; - if (yych <= '<') goto yy251; - goto yy244; + if (yych == ';') goto yy249; + if (yych <= '<') goto yy256; + goto yy249; } } } else { if (yych <= '`') { if (yych <= 'S') { - if (yych <= '@') goto yy251; - if (yych <= 'R') goto yy252; - goto yy260; + if (yych <= '@') goto yy256; + if (yych <= 'R') goto yy257; + goto yy265; } else { - if (yych <= 'Z') goto yy252; - if (yych == '_') goto yy252; - goto yy251; + if (yych <= 'Z') goto yy257; + if (yych == '_') goto yy257; + goto yy256; } } else { if (yych <= '{') { - if (yych == 's') goto yy260; - if (yych <= 'z') goto yy252; - goto yy251; + if (yych == 's') goto yy265; + if (yych <= 'z') goto yy257; + goto yy256; } else { - if (yych == '}') goto yy251; - if (yych <= '~') goto yy244; - goto yy251; + if (yych == '}') goto yy256; + if (yych <= '~') goto yy249; + goto yy256; } } } -yy255: - YYDEBUG(255, *YYCURSOR); +yy260: + YYDEBUG(260, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; if (yych <= '\\') { - if (yych <= 0x00) goto yy256; - if (yych <= '[') goto yy250; - goto yy257; + if (yych <= 0x00) goto yy261; + if (yych <= '[') goto yy255; + goto yy262; } else { - if (yych != '{') goto yy250; + if (yych != '{') goto yy255; } -yy256: - YYDEBUG(256, *YYCURSOR); +yy261: + YYDEBUG(261, *YYCURSOR); YYCURSOR = YYMARKER; if (yyaccept <= 3) { if (yyaccept <= 1) { if (yyaccept <= 0) { - goto yy224; + goto yy229; } else { - goto yy226; + goto yy231; } } else { if (yyaccept <= 2) { - goto yy222; + goto yy227; } else { - goto yy239; + goto yy244; } } } else { if (yyaccept <= 5) { if (yyaccept <= 4) { - goto yy244; + goto yy249; } else { - goto yy261; + goto yy266; } } else { - goto yy268; + goto yy273; } } -yy257: - YYDEBUG(257, *YYCURSOR); +yy262: + YYDEBUG(262, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; if (yybm[0+yych] & 8) { - goto yy258; + goto yy263; } - goto yy250; -yy258: - YYDEBUG(258, *YYCURSOR); + goto yy255; +yy263: + YYDEBUG(263, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(259, *YYCURSOR); + YYDEBUG(264, *YYCURSOR); if (yybm[0+yych] & 8) { - goto yy258; + goto yy263; } - if (yych <= 0x00) goto yy224; - if (yych == '\\') goto yy257; - goto yy250; -yy260: - YYDEBUG(260, *YYCURSOR); + if (yych <= 0x00) goto yy229; + if (yych == '\\') goto yy262; + goto yy255; +yy265: + YYDEBUG(265, *YYCURSOR); yyaccept = 5; yych = *(YYMARKER = ++YYCURSOR); if (yybm[0+yych] & 16) { - goto yy262; + goto yy267; } if (yych <= ';') { if (yych <= ' ') { if (yych <= '\n') { - if (yych <= 0x00) goto yy261; - if (yych <= '\t') goto yy251; + if (yych <= 0x00) goto yy266; + if (yych <= '\t') goto yy256; } else { - if (yych != '\r') goto yy251; + if (yych != '\r') goto yy256; } } else { if (yych <= ')') { - if (yych <= '"') goto yy261; - if (yych <= '%') goto yy251; + if (yych <= '"') goto yy266; + if (yych <= '%') goto yy256; } else { - if (yych <= '/') goto yy251; - if (yych <= '9') goto yy252; - if (yych <= ':') goto yy251; + if (yych <= '/') goto yy256; + if (yych <= '9') goto yy257; + if (yych <= ':') goto yy256; } } } else { if (yych <= '_') { if (yych <= '@') { - if (yych != '=') goto yy251; + if (yych != '=') goto yy256; } else { - if (yych <= 'Z') goto yy252; - if (yych <= '^') goto yy251; - goto yy252; + if (yych <= 'Z') goto yy257; + if (yych <= '^') goto yy256; + goto yy257; } } else { if (yych <= '{') { - if (yych <= '`') goto yy251; - if (yych <= 'z') goto yy252; - goto yy251; + if (yych <= '`') goto yy256; + if (yych <= 'z') goto yy257; + goto yy256; } else { - if (yych == '}') goto yy251; - if (yych >= 0x7F) goto yy251; + if (yych == '}') goto yy256; + if (yych >= 0x7F) goto yy256; } } } -yy261: - YYDEBUG(261, *YYCURSOR); +yy266: + YYDEBUG(266, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 398 "Zend/zend_ini_scanner.l" +#line 418 "Zend/zend_ini_scanner.l" { /* TRUE value (when used outside option value/offset this causes parse error!) */ RETURN_TOKEN(BOOL_TRUE, "1", 1); } -#line 3481 "Zend/zend_ini_scanner.c" -yy262: - YYDEBUG(262, *YYCURSOR); +#line 3588 "Zend/zend_ini_scanner.c" +yy267: + YYDEBUG(267, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(263, *YYCURSOR); + YYDEBUG(268, *YYCURSOR); if (yybm[0+yych] & 16) { - goto yy262; + goto yy267; } - goto yy261; -yy264: - YYDEBUG(264, *YYCURSOR); + goto yy266; +yy269: + YYDEBUG(269, *YYCURSOR); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '=') { if (yych <= '"') { if (yych <= '\n') { - if (yych <= 0x00) goto yy244; - if (yych <= 0x08) goto yy251; - goto yy244; + if (yych <= 0x00) goto yy249; + if (yych <= 0x08) goto yy256; + goto yy249; } else { - if (yych == '\r') goto yy244; - if (yych <= 0x1F) goto yy251; - goto yy244; + if (yych == '\r') goto yy249; + if (yych <= 0x1F) goto yy256; + goto yy249; } } else { if (yych <= '9') { - if (yych <= '%') goto yy251; - if (yych <= ')') goto yy244; - if (yych <= '/') goto yy251; - goto yy252; + if (yych <= '%') goto yy256; + if (yych <= ')') goto yy249; + if (yych <= '/') goto yy256; + goto yy257; } else { - if (yych == ';') goto yy244; - if (yych <= '<') goto yy251; - goto yy244; + if (yych == ';') goto yy249; + if (yych <= '<') goto yy256; + goto yy249; } } } else { if (yych <= '`') { if (yych <= 'U') { - if (yych <= '@') goto yy251; - if (yych <= 'T') goto yy252; + if (yych <= '@') goto yy256; + if (yych <= 'T') goto yy257; } else { - if (yych <= 'Z') goto yy252; - if (yych == '_') goto yy252; - goto yy251; + if (yych <= 'Z') goto yy257; + if (yych == '_') goto yy257; + goto yy256; } } else { if (yych <= '{') { - if (yych == 'u') goto yy265; - if (yych <= 'z') goto yy252; - goto yy251; + if (yych == 'u') goto yy270; + if (yych <= 'z') goto yy257; + goto yy256; } else { - if (yych == '}') goto yy251; - if (yych <= '~') goto yy244; - goto yy251; + if (yych == '}') goto yy256; + if (yych <= '~') goto yy249; + goto yy256; } } } -yy265: - YYDEBUG(265, *YYCURSOR); +yy270: + YYDEBUG(270, *YYCURSOR); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '=') { if (yych <= '"') { if (yych <= '\n') { - if (yych <= 0x00) goto yy244; - if (yych <= 0x08) goto yy251; - goto yy244; + if (yych <= 0x00) goto yy249; + if (yych <= 0x08) goto yy256; + goto yy249; } else { - if (yych == '\r') goto yy244; - if (yych <= 0x1F) goto yy251; - goto yy244; + if (yych == '\r') goto yy249; + if (yych <= 0x1F) goto yy256; + goto yy249; } } else { if (yych <= '9') { - if (yych <= '%') goto yy251; - if (yych <= ')') goto yy244; - if (yych <= '/') goto yy251; - goto yy252; + if (yych <= '%') goto yy256; + if (yych <= ')') goto yy249; + if (yych <= '/') goto yy256; + goto yy257; } else { - if (yych == ';') goto yy244; - if (yych <= '<') goto yy251; - goto yy244; + if (yych == ';') goto yy249; + if (yych <= '<') goto yy256; + goto yy249; } } } else { if (yych <= '`') { if (yych <= 'E') { - if (yych <= '@') goto yy251; - if (yych <= 'D') goto yy252; - goto yy260; + if (yych <= '@') goto yy256; + if (yych <= 'D') goto yy257; + goto yy265; } else { - if (yych <= 'Z') goto yy252; - if (yych == '_') goto yy252; - goto yy251; + if (yych <= 'Z') goto yy257; + if (yych == '_') goto yy257; + goto yy256; } } else { if (yych <= '{') { - if (yych == 'e') goto yy260; - if (yych <= 'z') goto yy252; - goto yy251; + if (yych == 'e') goto yy265; + if (yych <= 'z') goto yy257; + goto yy256; } else { - if (yych == '}') goto yy251; - if (yych <= '~') goto yy244; - goto yy251; + if (yych == '}') goto yy256; + if (yych <= '~') goto yy249; + goto yy256; } } } -yy266: - YYDEBUG(266, *YYCURSOR); +yy271: + YYDEBUG(271, *YYCURSOR); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '=') { if (yych <= '"') { if (yych <= '\n') { - if (yych <= 0x00) goto yy244; - if (yych <= 0x08) goto yy251; - goto yy244; + if (yych <= 0x00) goto yy249; + if (yych <= 0x08) goto yy256; + goto yy249; } else { - if (yych == '\r') goto yy244; - if (yych <= 0x1F) goto yy251; - goto yy244; + if (yych == '\r') goto yy249; + if (yych <= 0x1F) goto yy256; + goto yy249; } } else { if (yych <= '9') { - if (yych <= '%') goto yy251; - if (yych <= ')') goto yy244; - if (yych <= '/') goto yy251; - goto yy252; + if (yych <= '%') goto yy256; + if (yych <= ')') goto yy249; + if (yych <= '/') goto yy256; + goto yy257; } else { - if (yych == ';') goto yy244; - if (yych <= '<') goto yy251; - goto yy244; + if (yych == ';') goto yy249; + if (yych <= '<') goto yy256; + goto yy249; } } } else { if (yych <= '`') { if (yych <= 'F') { - if (yych <= '@') goto yy251; - if (yych <= 'E') goto yy252; + if (yych <= '@') goto yy256; + if (yych <= 'E') goto yy257; } else { - if (yych <= 'Z') goto yy252; - if (yych == '_') goto yy252; - goto yy251; + if (yych <= 'Z') goto yy257; + if (yych == '_') goto yy257; + goto yy256; } } else { if (yych <= '{') { - if (yych == 'f') goto yy267; - if (yych <= 'z') goto yy252; - goto yy251; + if (yych == 'f') goto yy272; + if (yych <= 'z') goto yy257; + goto yy256; } else { - if (yych == '}') goto yy251; - if (yych <= '~') goto yy244; - goto yy251; + if (yych == '}') goto yy256; + if (yych <= '~') goto yy249; + goto yy256; } } } -yy267: - YYDEBUG(267, *YYCURSOR); +yy272: + YYDEBUG(272, *YYCURSOR); yyaccept = 6; yych = *(YYMARKER = ++YYCURSOR); if (yybm[0+yych] & 4) { - goto yy252; + goto yy257; } if (yych <= '%') { if (yych <= '\f') { if (yych <= 0x08) { - if (yych >= 0x01) goto yy251; + if (yych >= 0x01) goto yy256; } else { - if (yych <= '\t') goto yy269; - if (yych >= '\v') goto yy251; + if (yych <= '\t') goto yy274; + if (yych >= '\v') goto yy256; } } else { if (yych <= 0x1F) { - if (yych >= 0x0E) goto yy251; + if (yych >= 0x0E) goto yy256; } else { - if (yych <= ' ') goto yy269; - if (yych >= '#') goto yy251; + if (yych <= ' ') goto yy274; + if (yych >= '#') goto yy256; } } } else { if (yych <= '=') { if (yych <= ':') { - if (yych >= '*') goto yy251; + if (yych >= '*') goto yy256; } else { - if (yych == '<') goto yy251; + if (yych == '<') goto yy256; } } else { if (yych <= '|') { - if (yych <= '{') goto yy251; + if (yych <= '{') goto yy256; } else { - if (yych != '~') goto yy251; + if (yych != '~') goto yy256; } } } -yy268: - YYDEBUG(268, *YYCURSOR); +yy273: + YYDEBUG(273, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 402 "Zend/zend_ini_scanner.l" +#line 422 "Zend/zend_ini_scanner.l" { /* FALSE value (when used outside option value/offset this causes parse error!)*/ RETURN_TOKEN(BOOL_FALSE, "", 0); } -#line 3685 "Zend/zend_ini_scanner.c" -yy269: - YYDEBUG(269, *YYCURSOR); +#line 3792 "Zend/zend_ini_scanner.c" +yy274: + YYDEBUG(274, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(270, *YYCURSOR); - if (yych == '\t') goto yy269; - if (yych == ' ') goto yy269; - goto yy268; -yy271: - YYDEBUG(271, *YYCURSOR); + YYDEBUG(275, *YYCURSOR); + if (yych == '\t') goto yy274; + if (yych == ' ') goto yy274; + goto yy273; +yy276: + YYDEBUG(276, *YYCURSOR); yyaccept = 6; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '<') { if (yych <= ' ') { if (yych <= '\n') { - if (yych <= 0x00) goto yy268; - if (yych <= 0x08) goto yy251; - if (yych <= '\t') goto yy269; - goto yy268; + if (yych <= 0x00) goto yy273; + if (yych <= 0x08) goto yy256; + if (yych <= '\t') goto yy274; + goto yy273; } else { - if (yych == '\r') goto yy268; - if (yych <= 0x1F) goto yy251; - goto yy269; + if (yych == '\r') goto yy273; + if (yych <= 0x1F) goto yy256; + goto yy274; } } else { if (yych <= '/') { - if (yych <= '"') goto yy268; - if (yych <= '%') goto yy251; - if (yych <= ')') goto yy268; - goto yy251; + if (yych <= '"') goto yy273; + if (yych <= '%') goto yy256; + if (yych <= ')') goto yy273; + goto yy256; } else { - if (yych <= '9') goto yy252; - if (yych == ';') goto yy268; - goto yy251; + if (yych <= '9') goto yy257; + if (yych == ';') goto yy273; + goto yy256; } } } else { if (yych <= '`') { if (yych <= 'N') { - if (yych <= '=') goto yy268; - if (yych <= '@') goto yy251; - if (yych <= 'M') goto yy252; - goto yy274; + if (yych <= '=') goto yy273; + if (yych <= '@') goto yy256; + if (yych <= 'M') goto yy257; + goto yy279; } else { - if (yych <= 'Z') goto yy252; - if (yych == '_') goto yy252; - goto yy251; + if (yych <= 'Z') goto yy257; + if (yych == '_') goto yy257; + goto yy256; } } else { if (yych <= '{') { - if (yych == 'n') goto yy274; - if (yych <= 'z') goto yy252; - goto yy251; + if (yych == 'n') goto yy279; + if (yych <= 'z') goto yy257; + goto yy256; } else { - if (yych == '}') goto yy251; - if (yych <= '~') goto yy268; - goto yy251; + if (yych == '}') goto yy256; + if (yych <= '~') goto yy273; + goto yy256; } } } -yy272: - YYDEBUG(272, *YYCURSOR); +yy277: + YYDEBUG(277, *YYCURSOR); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '=') { if (yych <= '"') { if (yych <= '\n') { - if (yych <= 0x00) goto yy244; - if (yych <= 0x08) goto yy251; - goto yy244; + if (yych <= 0x00) goto yy249; + if (yych <= 0x08) goto yy256; + goto yy249; } else { - if (yych == '\r') goto yy244; - if (yych <= 0x1F) goto yy251; - goto yy244; + if (yych == '\r') goto yy249; + if (yych <= 0x1F) goto yy256; + goto yy249; } } else { if (yych <= '9') { - if (yych <= '%') goto yy251; - if (yych <= ')') goto yy244; - if (yych <= '/') goto yy251; - goto yy252; + if (yych <= '%') goto yy256; + if (yych <= ')') goto yy249; + if (yych <= '/') goto yy256; + goto yy257; } else { - if (yych == ';') goto yy244; - if (yych <= '<') goto yy251; - goto yy244; + if (yych == ';') goto yy249; + if (yych <= '<') goto yy256; + goto yy249; } } } else { if (yych <= '`') { if (yych <= 'L') { - if (yych <= '@') goto yy251; - if (yych <= 'K') goto yy252; + if (yych <= '@') goto yy256; + if (yych <= 'K') goto yy257; } else { - if (yych <= 'Z') goto yy252; - if (yych == '_') goto yy252; - goto yy251; + if (yych <= 'Z') goto yy257; + if (yych == '_') goto yy257; + goto yy256; } } else { if (yych <= '{') { - if (yych == 'l') goto yy273; - if (yych <= 'z') goto yy252; - goto yy251; + if (yych == 'l') goto yy278; + if (yych <= 'z') goto yy257; + goto yy256; } else { - if (yych == '}') goto yy251; - if (yych <= '~') goto yy244; - goto yy251; + if (yych == '}') goto yy256; + if (yych <= '~') goto yy249; + goto yy256; } } } -yy273: - YYDEBUG(273, *YYCURSOR); +yy278: + YYDEBUG(278, *YYCURSOR); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '=') { if (yych <= '"') { if (yych <= '\n') { - if (yych <= 0x00) goto yy244; - if (yych <= 0x08) goto yy251; - goto yy244; + if (yych <= 0x00) goto yy249; + if (yych <= 0x08) goto yy256; + goto yy249; } else { - if (yych == '\r') goto yy244; - if (yych <= 0x1F) goto yy251; - goto yy244; + if (yych == '\r') goto yy249; + if (yych <= 0x1F) goto yy256; + goto yy249; } } else { if (yych <= '9') { - if (yych <= '%') goto yy251; - if (yych <= ')') goto yy244; - if (yych <= '/') goto yy251; - goto yy252; + if (yych <= '%') goto yy256; + if (yych <= ')') goto yy249; + if (yych <= '/') goto yy256; + goto yy257; } else { - if (yych == ';') goto yy244; - if (yych <= '<') goto yy251; - goto yy244; + if (yych == ';') goto yy249; + if (yych <= '<') goto yy256; + goto yy249; } } } else { if (yych <= '`') { if (yych <= 'L') { - if (yych <= '@') goto yy251; - if (yych <= 'K') goto yy252; - goto yy267; + if (yych <= '@') goto yy256; + if (yych <= 'K') goto yy257; + goto yy272; } else { - if (yych <= 'Z') goto yy252; - if (yych == '_') goto yy252; - goto yy251; + if (yych <= 'Z') goto yy257; + if (yych == '_') goto yy257; + goto yy256; } } else { if (yych <= '{') { - if (yych == 'l') goto yy267; - if (yych <= 'z') goto yy252; - goto yy251; + if (yych == 'l') goto yy272; + if (yych <= 'z') goto yy257; + goto yy256; } else { - if (yych == '}') goto yy251; - if (yych <= '~') goto yy244; - goto yy251; + if (yych == '}') goto yy256; + if (yych <= '~') goto yy249; + goto yy256; } } } -yy274: - YYDEBUG(274, *YYCURSOR); +yy279: + YYDEBUG(279, *YYCURSOR); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '=') { if (yych <= '"') { if (yych <= '\n') { - if (yych <= 0x00) goto yy244; - if (yych <= 0x08) goto yy251; - goto yy244; + if (yych <= 0x00) goto yy249; + if (yych <= 0x08) goto yy256; + goto yy249; } else { - if (yych == '\r') goto yy244; - if (yych <= 0x1F) goto yy251; - goto yy244; + if (yych == '\r') goto yy249; + if (yych <= 0x1F) goto yy256; + goto yy249; } } else { if (yych <= '9') { - if (yych <= '%') goto yy251; - if (yych <= ')') goto yy244; - if (yych <= '/') goto yy251; - goto yy252; + if (yych <= '%') goto yy256; + if (yych <= ')') goto yy249; + if (yych <= '/') goto yy256; + goto yy257; } else { - if (yych == ';') goto yy244; - if (yych <= '<') goto yy251; - goto yy244; + if (yych == ';') goto yy249; + if (yych <= '<') goto yy256; + goto yy249; } } } else { if (yych <= '`') { if (yych <= 'E') { - if (yych <= '@') goto yy251; - if (yych <= 'D') goto yy252; - goto yy267; + if (yych <= '@') goto yy256; + if (yych <= 'D') goto yy257; + goto yy272; } else { - if (yych <= 'Z') goto yy252; - if (yych == '_') goto yy252; - goto yy251; + if (yych <= 'Z') goto yy257; + if (yych == '_') goto yy257; + goto yy256; } } else { if (yych <= '{') { - if (yych == 'e') goto yy267; - if (yych <= 'z') goto yy252; - goto yy251; + if (yych == 'e') goto yy272; + if (yych <= 'z') goto yy257; + goto yy256; } else { - if (yych == '}') goto yy251; - if (yych <= '~') goto yy244; - goto yy251; + if (yych == '}') goto yy256; + if (yych <= '~') goto yy249; + goto yy256; } } } -yy275: - YYDEBUG(275, *YYCURSOR); +yy280: + YYDEBUG(280, *YYCURSOR); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '=') { if (yych <= '"') { if (yych <= '\n') { - if (yych <= 0x00) goto yy244; - if (yych <= 0x08) goto yy251; - goto yy244; + if (yych <= 0x00) goto yy249; + if (yych <= 0x08) goto yy256; + goto yy249; } else { - if (yych == '\r') goto yy244; - if (yych <= 0x1F) goto yy251; - goto yy244; + if (yych == '\r') goto yy249; + if (yych <= 0x1F) goto yy256; + goto yy249; } } else { if (yych <= '9') { - if (yych <= '%') goto yy251; - if (yych <= ')') goto yy244; - if (yych <= '/') goto yy251; - goto yy252; + if (yych <= '%') goto yy256; + if (yych <= ')') goto yy249; + if (yych <= '/') goto yy256; + goto yy257; } else { - if (yych == ';') goto yy244; - if (yych <= '<') goto yy251; - goto yy244; + if (yych == ';') goto yy249; + if (yych <= '<') goto yy256; + goto yy249; } } } else { if (yych <= '`') { if (yych <= 'L') { - if (yych <= '@') goto yy251; - if (yych <= 'K') goto yy252; + if (yych <= '@') goto yy256; + if (yych <= 'K') goto yy257; } else { - if (yych <= 'Z') goto yy252; - if (yych == '_') goto yy252; - goto yy251; + if (yych <= 'Z') goto yy257; + if (yych == '_') goto yy257; + goto yy256; } } else { if (yych <= '{') { - if (yych == 'l') goto yy276; - if (yych <= 'z') goto yy252; - goto yy251; + if (yych == 'l') goto yy281; + if (yych <= 'z') goto yy257; + goto yy256; } else { - if (yych == '}') goto yy251; - if (yych <= '~') goto yy244; - goto yy251; + if (yych == '}') goto yy256; + if (yych <= '~') goto yy249; + goto yy256; } } } -yy276: - YYDEBUG(276, *YYCURSOR); +yy281: + YYDEBUG(281, *YYCURSOR); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '=') { if (yych <= '"') { if (yych <= '\n') { - if (yych <= 0x00) goto yy244; - if (yych <= 0x08) goto yy251; - goto yy244; + if (yych <= 0x00) goto yy249; + if (yych <= 0x08) goto yy256; + goto yy249; } else { - if (yych == '\r') goto yy244; - if (yych <= 0x1F) goto yy251; - goto yy244; + if (yych == '\r') goto yy249; + if (yych <= 0x1F) goto yy256; + goto yy249; } } else { if (yych <= '9') { - if (yych <= '%') goto yy251; - if (yych <= ')') goto yy244; - if (yych <= '/') goto yy251; - goto yy252; + if (yych <= '%') goto yy256; + if (yych <= ')') goto yy249; + if (yych <= '/') goto yy256; + goto yy257; } else { - if (yych == ';') goto yy244; - if (yych <= '<') goto yy251; - goto yy244; + if (yych == ';') goto yy249; + if (yych <= '<') goto yy256; + goto yy249; } } } else { if (yych <= '`') { if (yych <= 'S') { - if (yych <= '@') goto yy251; - if (yych <= 'R') goto yy252; + if (yych <= '@') goto yy256; + if (yych <= 'R') goto yy257; } else { - if (yych <= 'Z') goto yy252; - if (yych == '_') goto yy252; - goto yy251; + if (yych <= 'Z') goto yy257; + if (yych == '_') goto yy257; + goto yy256; } } else { if (yych <= '{') { - if (yych == 's') goto yy277; - if (yych <= 'z') goto yy252; - goto yy251; + if (yych == 's') goto yy282; + if (yych <= 'z') goto yy257; + goto yy256; } else { - if (yych == '}') goto yy251; - if (yych <= '~') goto yy244; - goto yy251; + if (yych == '}') goto yy256; + if (yych <= '~') goto yy249; + goto yy256; } } } -yy277: - YYDEBUG(277, *YYCURSOR); +yy282: + YYDEBUG(282, *YYCURSOR); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '=') { if (yych <= '"') { if (yych <= '\n') { - if (yych <= 0x00) goto yy244; - if (yych <= 0x08) goto yy251; - goto yy244; + if (yych <= 0x00) goto yy249; + if (yych <= 0x08) goto yy256; + goto yy249; } else { - if (yych == '\r') goto yy244; - if (yych <= 0x1F) goto yy251; - goto yy244; + if (yych == '\r') goto yy249; + if (yych <= 0x1F) goto yy256; + goto yy249; } } else { if (yych <= '9') { - if (yych <= '%') goto yy251; - if (yych <= ')') goto yy244; - if (yych <= '/') goto yy251; - goto yy252; + if (yych <= '%') goto yy256; + if (yych <= ')') goto yy249; + if (yych <= '/') goto yy256; + goto yy257; } else { - if (yych == ';') goto yy244; - if (yych <= '<') goto yy251; - goto yy244; + if (yych == ';') goto yy249; + if (yych <= '<') goto yy256; + goto yy249; } } } else { if (yych <= '`') { if (yych <= 'E') { - if (yych <= '@') goto yy251; - if (yych <= 'D') goto yy252; - goto yy267; + if (yych <= '@') goto yy256; + if (yych <= 'D') goto yy257; + goto yy272; } else { - if (yych <= 'Z') goto yy252; - if (yych == '_') goto yy252; - goto yy251; + if (yych <= 'Z') goto yy257; + if (yych == '_') goto yy257; + goto yy256; } } else { if (yych <= '{') { - if (yych == 'e') goto yy267; - if (yych <= 'z') goto yy252; - goto yy251; + if (yych == 'e') goto yy272; + if (yych <= 'z') goto yy257; + goto yy256; } else { - if (yych == '}') goto yy251; - if (yych <= '~') goto yy244; - goto yy251; + if (yych == '}') goto yy256; + if (yych <= '~') goto yy249; + goto yy256; } } } -yy278: - YYDEBUG(278, *YYCURSOR); +yy283: + YYDEBUG(283, *YYCURSOR); ++YYCURSOR; YYFILL(2); yych = *YYCURSOR; -yy279: - YYDEBUG(279, *YYCURSOR); +yy284: + YYDEBUG(284, *YYCURSOR); if (yybm[0+yych] & 32) { - goto yy278; + goto yy283; } - if (yych >= '\r') goto yy282; -yy280: - YYDEBUG(280, *YYCURSOR); + if (yych >= '\r') goto yy287; +yy285: + YYDEBUG(285, *YYCURSOR); ++YYCURSOR; -yy281: - YYDEBUG(281, *YYCURSOR); +yy286: + YYDEBUG(286, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 528 "Zend/zend_ini_scanner.l" +#line 554 "Zend/zend_ini_scanner.l" { /* Comment */ BEGIN(INITIAL); SCNG(lineno)++; return END_OF_LINE; } -#line 4067 "Zend/zend_ini_scanner.c" -yy282: - YYDEBUG(282, *YYCURSOR); +#line 4174 "Zend/zend_ini_scanner.c" +yy287: + YYDEBUG(287, *YYCURSOR); yych = *++YYCURSOR; - if (yych == '\n') goto yy280; - goto yy281; -yy283: - YYDEBUG(283, *YYCURSOR); + if (yych == '\n') goto yy285; + goto yy286; +yy288: + YYDEBUG(288, *YYCURSOR); yyaccept = 3; YYMARKER = ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(284, *YYCURSOR); + YYDEBUG(289, *YYCURSOR); if (yybm[0+yych] & 64) { - goto yy283; + goto yy288; } if (yych <= '%') { if (yych <= '\r') { if (yych <= 0x08) { - if (yych <= 0x00) goto yy239; - goto yy250; + if (yych <= 0x00) goto yy244; + goto yy255; } else { - if (yych <= '\n') goto yy239; - if (yych <= '\f') goto yy250; - goto yy239; + if (yych <= '\n') goto yy244; + if (yych <= '\f') goto yy255; + goto yy244; } } else { if (yych <= '"') { - if (yych <= 0x1F) goto yy250; - goto yy239; + if (yych <= 0x1F) goto yy255; + goto yy244; } else { - if (yych == '$') goto yy255; - goto yy250; + if (yych == '$') goto yy260; + goto yy255; } } } else { if (yych <= '=') { if (yych <= ':') { - if (yych <= ')') goto yy239; - goto yy250; + if (yych <= ')') goto yy244; + goto yy255; } else { - if (yych == '<') goto yy250; - goto yy239; + if (yych == '<') goto yy255; + goto yy244; } } else { if (yych <= '|') { - if (yych <= '{') goto yy250; - goto yy239; + if (yych <= '{') goto yy255; + goto yy244; } else { - if (yych == '~') goto yy239; - goto yy250; + if (yych == '~') goto yy244; + goto yy255; } } } -yy285: - YYDEBUG(285, *YYCURSOR); +yy290: + YYDEBUG(290, *YYCURSOR); yyaccept = 3; YYMARKER = ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(286, *YYCURSOR); + YYDEBUG(291, *YYCURSOR); if (yych <= '-') { if (yych <= 0x1F) { if (yych <= '\n') { - if (yych <= 0x00) goto yy239; - if (yych <= 0x08) goto yy250; - goto yy239; + if (yych <= 0x00) goto yy244; + if (yych <= 0x08) goto yy255; + goto yy244; } else { - if (yych == '\r') goto yy239; - goto yy250; + if (yych == '\r') goto yy244; + goto yy255; } } else { if (yych <= '$') { - if (yych <= '"') goto yy239; - if (yych <= '#') goto yy250; - goto yy255; + if (yych <= '"') goto yy244; + if (yych <= '#') goto yy255; + goto yy260; } else { - if (yych <= '%') goto yy250; - if (yych <= ')') goto yy239; - goto yy250; + if (yych <= '%') goto yy255; + if (yych <= ')') goto yy244; + goto yy255; } } } else { if (yych <= '<') { if (yych <= '9') { - if (yych <= '.') goto yy283; - if (yych <= '/') goto yy250; - goto yy285; + if (yych <= '.') goto yy288; + if (yych <= '/') goto yy255; + goto yy290; } else { - if (yych == ';') goto yy239; - goto yy250; + if (yych == ';') goto yy244; + goto yy255; } } else { if (yych <= '|') { - if (yych <= '=') goto yy239; - if (yych <= '{') goto yy250; - goto yy239; + if (yych <= '=') goto yy244; + if (yych <= '{') goto yy255; + goto yy244; } else { - if (yych == '~') goto yy239; - goto yy250; + if (yych == '~') goto yy244; + goto yy255; } } } -yy287: - YYDEBUG(287, *YYCURSOR); +yy292: + YYDEBUG(292, *YYCURSOR); yyaccept = 3; YYMARKER = ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(288, *YYCURSOR); + YYDEBUG(293, *YYCURSOR); if (yych <= ')') { if (yych <= '\r') { if (yych <= 0x08) { - if (yych <= 0x00) goto yy239; - goto yy250; + if (yych <= 0x00) goto yy244; + goto yy255; } else { - if (yych <= '\n') goto yy239; - if (yych <= '\f') goto yy250; - goto yy239; + if (yych <= '\n') goto yy244; + if (yych <= '\f') goto yy255; + goto yy244; } } else { if (yych <= '#') { - if (yych <= 0x1F) goto yy250; - if (yych <= '"') goto yy239; - goto yy250; + if (yych <= 0x1F) goto yy255; + if (yych <= '"') goto yy244; + goto yy255; } else { - if (yych <= '$') goto yy255; - if (yych <= '%') goto yy250; - goto yy239; + if (yych <= '$') goto yy260; + if (yych <= '%') goto yy255; + goto yy244; } } } else { if (yych <= '<') { if (yych <= '9') { - if (yych <= '/') goto yy250; - goto yy287; + if (yych <= '/') goto yy255; + goto yy292; } else { - if (yych == ';') goto yy239; - goto yy250; + if (yych == ';') goto yy244; + goto yy255; } } else { if (yych <= '|') { - if (yych <= '=') goto yy239; - if (yych <= '{') goto yy250; - goto yy239; + if (yych <= '=') goto yy244; + if (yych <= '{') goto yy255; + goto yy244; } else { - if (yych == '~') goto yy239; - goto yy250; + if (yych == '~') goto yy244; + goto yy255; } } } -yy289: - YYDEBUG(289, *YYCURSOR); +yy294: + YYDEBUG(294, *YYCURSOR); yyaccept = 3; YYMARKER = ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(290, *YYCURSOR); + YYDEBUG(295, *YYCURSOR); if (yych <= ')') { if (yych <= '\r') { if (yych <= 0x08) { - if (yych <= 0x00) goto yy239; - goto yy250; + if (yych <= 0x00) goto yy244; + goto yy255; } else { - if (yych <= '\n') goto yy239; - if (yych <= '\f') goto yy250; - goto yy239; + if (yych <= '\n') goto yy244; + if (yych <= '\f') goto yy255; + goto yy244; } } else { if (yych <= '#') { - if (yych <= 0x1F) goto yy250; - if (yych <= '"') goto yy239; - goto yy250; + if (yych <= 0x1F) goto yy255; + if (yych <= '"') goto yy244; + goto yy255; } else { - if (yych <= '$') goto yy255; - if (yych <= '%') goto yy250; - goto yy239; + if (yych <= '$') goto yy260; + if (yych <= '%') goto yy255; + goto yy244; } } } else { if (yych <= '<') { if (yych <= '9') { - if (yych <= '/') goto yy250; - goto yy289; + if (yych <= '/') goto yy255; + goto yy294; } else { - if (yych == ';') goto yy239; - goto yy250; + if (yych == ';') goto yy244; + goto yy255; } } else { if (yych <= '|') { - if (yych <= '=') goto yy239; - if (yych <= '{') goto yy250; - goto yy239; + if (yych <= '=') goto yy244; + if (yych <= '{') goto yy255; + goto yy244; } else { - if (yych == '~') goto yy239; - goto yy250; + if (yych == '~') goto yy244; + goto yy255; } } } -yy291: - YYDEBUG(291, *YYCURSOR); +yy296: + YYDEBUG(296, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(292, *YYCURSOR); + YYDEBUG(297, *YYCURSOR); if (yybm[0+yych] & 128) { - goto yy291; + goto yy296; } - YYDEBUG(293, *YYCURSOR); + YYDEBUG(298, *YYCURSOR); ++YYCURSOR; - YYDEBUG(294, *YYCURSOR); + YYDEBUG(299, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 354 "Zend/zend_ini_scanner.l" +#line 365 "Zend/zend_ini_scanner.l" { /* Raw string */ /* Eat leading and trailing single quotes */ if (yytext[0] == '\'' && yytext[yyleng - 1] == '\'') { @@ -4284,66 +4391,66 @@ yy291: } RETURN_TOKEN(TC_RAW, yytext, yyleng); } -#line 4288 "Zend/zend_ini_scanner.c" -yy295: - YYDEBUG(295, *YYCURSOR); +#line 4395 "Zend/zend_ini_scanner.c" +yy300: + YYDEBUG(300, *YYCURSOR); ++YYCURSOR; - YYDEBUG(296, *YYCURSOR); + YYDEBUG(301, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 384 "Zend/zend_ini_scanner.l" +#line 398 "Zend/zend_ini_scanner.l" { /* Variable start */ yy_push_state(ST_VARNAME TSRMLS_CC); return TC_DOLLAR_CURLY; } -#line 4299 "Zend/zend_ini_scanner.c" -yy297: - YYDEBUG(297, *YYCURSOR); +#line 4406 "Zend/zend_ini_scanner.c" +yy302: + YYDEBUG(302, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; -yy298: - YYDEBUG(298, *YYCURSOR); - if (yych == '\t') goto yy297; - if (yych == ' ') goto yy297; - goto yy231; -yy299: - YYDEBUG(299, *YYCURSOR); +yy303: + YYDEBUG(303, *YYCURSOR); + if (yych == '\t') goto yy302; + if (yych == ' ') goto yy302; + goto yy236; +yy304: + YYDEBUG(304, *YYCURSOR); yych = *++YYCURSOR; - goto yy228; -yy300: - YYDEBUG(300, *YYCURSOR); + goto yy233; +yy305: + YYDEBUG(305, *YYCURSOR); yyaccept = 1; YYMARKER = ++YYCURSOR; YYFILL(2); yych = *YYCURSOR; -yy301: - YYDEBUG(301, *YYCURSOR); +yy306: + YYDEBUG(306, *YYCURSOR); if (yych <= 0x1F) { if (yych <= '\n') { - if (yych <= 0x08) goto yy226; - if (yych <= '\t') goto yy300; - goto yy299; + if (yych <= 0x08) goto yy231; + if (yych <= '\t') goto yy305; + goto yy304; } else { - if (yych == '\r') goto yy303; - goto yy226; + if (yych == '\r') goto yy308; + goto yy231; } } else { if (yych <= '"') { - if (yych <= ' ') goto yy300; - if (yych <= '!') goto yy226; + if (yych <= ' ') goto yy305; + if (yych <= '!') goto yy231; } else { - if (yych == ';') goto yy278; - goto yy226; + if (yych == ';') goto yy283; + goto yy231; } } - YYDEBUG(302, *YYCURSOR); + YYDEBUG(307, *YYCURSOR); yych = *++YYCURSOR; - goto yy233; -yy303: - YYDEBUG(303, *YYCURSOR); + goto yy238; +yy308: + YYDEBUG(308, *YYCURSOR); ++YYCURSOR; - if ((yych = *YYCURSOR) == '\n') goto yy299; - goto yy228; + if ((yych = *YYCURSOR) == '\n') goto yy304; + goto yy233; } /* *********************************** */ yyc_ST_VARNAME: @@ -4353,7 +4460,7 @@ yyc_ST_VARNAME: 128, 0, 0, 128, 128, 0, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, - 0, 0, 0, 128, 0, 128, 0, 128, + 128, 0, 0, 128, 0, 128, 0, 128, 0, 0, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 0, 128, 0, 128, 128, @@ -4382,87 +4489,93 @@ yyc_ST_VARNAME: 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, }; - YYDEBUG(304, *YYCURSOR); + YYDEBUG(309, *YYCURSOR); YYFILL(2); yych = *YYCURSOR; if (yych <= '\'') { - if (yych <= 0x1F) { + if (yych <= ' ') { if (yych <= '\n') { - if (yych >= '\t') goto yy308; + if (yych >= '\t') goto yy313; } else { - if (yych == '\r') goto yy308; + if (yych == '\r') goto yy313; } } else { if (yych <= '$') { - if (yych != '#') goto yy308; + if (yych != '#') goto yy313; } else { - if (yych == '&') goto yy308; + if (yych == '&') goto yy313; } } } else { if (yych <= 'Z') { if (yych <= ';') { - if (yych <= ')') goto yy308; - if (yych >= ';') goto yy308; + if (yych <= ')') goto yy313; + if (yych >= ';') goto yy313; } else { - if (yych == '=') goto yy308; + if (yych == '=') goto yy313; } } else { if (yych <= '|') { - if (yych <= '[') goto yy308; - if (yych >= '{') goto yy308; + if (yych <= '[') goto yy313; + if (yych >= '{') goto yy313; } else { - if (yych <= '}') goto yy310; - if (yych <= '~') goto yy308; + if (yych <= '}') goto yy315; + if (yych <= '~') goto yy313; } } } - YYDEBUG(306, *YYCURSOR); + YYDEBUG(311, *YYCURSOR); ++YYCURSOR; yych = *YYCURSOR; - goto yy313; -yy307: - YYDEBUG(307, *YYCURSOR); + goto yy318; +yy312: + YYDEBUG(312, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 389 "Zend/zend_ini_scanner.l" +#line 403 "Zend/zend_ini_scanner.l" { /* Variable name */ + /* Eat leading whitespace */ + EAT_LEADING_WHITESPACE(); + + /* Eat trailing whitespace */ + EAT_TRAILING_WHITESPACE(); + RETURN_TOKEN(TC_VARNAME, yytext, yyleng); } -#line 4432 "Zend/zend_ini_scanner.c" -yy308: - YYDEBUG(308, *YYCURSOR); +#line 4545 "Zend/zend_ini_scanner.c" +yy313: + YYDEBUG(313, *YYCURSOR); ++YYCURSOR; - YYDEBUG(309, *YYCURSOR); + YYDEBUG(314, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 546 "Zend/zend_ini_scanner.l" +#line 572 "Zend/zend_ini_scanner.l" { return 0; } -#line 4442 "Zend/zend_ini_scanner.c" -yy310: - YYDEBUG(310, *YYCURSOR); +#line 4555 "Zend/zend_ini_scanner.c" +yy315: + YYDEBUG(315, *YYCURSOR); ++YYCURSOR; - YYDEBUG(311, *YYCURSOR); + YYDEBUG(316, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 393 "Zend/zend_ini_scanner.l" +#line 413 "Zend/zend_ini_scanner.l" { /* Variable end */ yy_pop_state(TSRMLS_C); return '}'; } -#line 4453 "Zend/zend_ini_scanner.c" -yy312: - YYDEBUG(312, *YYCURSOR); +#line 4566 "Zend/zend_ini_scanner.c" +yy317: + YYDEBUG(317, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; -yy313: - YYDEBUG(313, *YYCURSOR); +yy318: + YYDEBUG(318, *YYCURSOR); if (yybm[0+yych] & 128) { - goto yy312; + goto yy317; } - goto yy307; + goto yy312; } } -#line 550 "Zend/zend_ini_scanner.l" +#line 576 "Zend/zend_ini_scanner.l" } diff --git a/Zend/zend_ini_scanner.h b/Zend/zend_ini_scanner.h index f3109b1c3..07d1102c6 100644 --- a/Zend/zend_ini_scanner.h +++ b/Zend/zend_ini_scanner.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_ini_scanner.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: zend_ini_scanner.h 293155 2010-01-05 20:46:53Z sebastian $ */ #ifndef _ZEND_INI_SCANNER_H #define _ZEND_INI_SCANNER_H diff --git a/Zend/zend_ini_scanner.l b/Zend/zend_ini_scanner.l index e87c6d74e..998665bc2 100644 --- a/Zend/zend_ini_scanner.l +++ b/Zend/zend_ini_scanner.l @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -20,7 +20,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_ini_scanner.l 286913 2009-08-07 15:44:37Z jani $ */ +/* $Id: zend_ini_scanner.l 294698 2010-02-07 12:08:22Z pajoye $ */ #include #include "zend.h" @@ -105,6 +105,17 @@ ZEND_API ts_rsrc_id ini_scanner_globals_id; ZEND_API zend_ini_scanner_globals ini_scanner_globals; #endif +/* Eat leading whitespace */ +#define EAT_LEADING_WHITESPACE() \ + while (yytext[0]) { \ + if (yytext[0] == ' ' || yytext[0] == '\t') { \ + SCNG(yy_text)++; \ + yyleng--; \ + } else { \ + break; \ + } \ + } + /* Eat trailing whitespace + extra char */ #define EAT_TRAILING_WHITESPACE_EX(ch) \ while (yyleng > 0 && ( \ @@ -325,8 +336,8 @@ ANY_CHAR (.|[\n\t]) NEWLINE ("\r"|"\n"|"\r\n") TABS_AND_SPACES [ \t] WHITESPACE [ \t]+ -CONSTANT [a-zA-Z][a-zA-Z0-9_]* -LABEL [^=\n\r\t ;|&$~(){}!"\[]+ +CONSTANT [a-zA-Z_][a-zA-Z0-9_]* +LABEL [^=\n\r\t;|&$~(){}!"\[]+ TOKENS [:,.\[\]"'()|^&+-/*=%$!~<>?@{}] OPERATORS [&|~()!] DOLLAR_CURLY "${" @@ -367,6 +378,9 @@ SECTION_VALUE_CHARS ([^$\n\r;"'\]\\]|("\\"{ANY_CHAR})|{LITERAL_DOLLAR}) } {LABEL}"["{TABS_AND_SPACES}* { /* Start of option with offset */ + /* Eat leading whitespace */ + EAT_LEADING_WHITESPACE(); + /* Eat trailing whitespace and [ */ EAT_TRAILING_WHITESPACE_EX('['); @@ -387,6 +401,12 @@ SECTION_VALUE_CHARS ([^$\n\r;"'\]\\]|("\\"{ANY_CHAR})|{LITERAL_DOLLAR}) } {LABEL} { /* Variable name */ + /* Eat leading whitespace */ + EAT_LEADING_WHITESPACE(); + + /* Eat trailing whitespace */ + EAT_TRAILING_WHITESPACE(); + RETURN_TOKEN(TC_VARNAME, yytext, yyleng); } @@ -404,6 +424,12 @@ SECTION_VALUE_CHARS ([^$\n\r;"'\]\\]|("\\"{ANY_CHAR})|{LITERAL_DOLLAR}) } {LABEL} { /* Get option name */ + /* Eat leading whitespace */ + EAT_LEADING_WHITESPACE(); + + /* Eat trailing whitespace */ + EAT_TRAILING_WHITESPACE(); + RETURN_TOKEN(TC_LABEL, yytext, yyleng); } diff --git a/Zend/zend_ini_scanner_defs.h b/Zend/zend_ini_scanner_defs.h index 280132abd..1956b6225 100644 --- a/Zend/zend_ini_scanner_defs.h +++ b/Zend/zend_ini_scanner_defs.h @@ -1,4 +1,4 @@ -/* Generated by re2c 0.13.5 on Fri Aug 7 18:29:12 2009 */ +/* Generated by re2c 0.13.5 on Sun Feb 7 13:25:37 2010 */ #line 3 "Zend/zend_ini_scanner_defs.h" enum YYCONDTYPE { diff --git a/Zend/zend_interfaces.c b/Zend/zend_interfaces.c index c14c52437..7dc47b138 100755 --- a/Zend/zend_interfaces.c +++ b/Zend/zend_interfaces.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_interfaces.c 277750 2009-03-25 10:39:26Z dmitry $ */ +/* $Id: zend_interfaces.c 294549 2010-02-05 00:37:07Z pajoye $ */ #include "zend.h" #include "zend_API.h" @@ -353,6 +353,10 @@ static int zend_implement_aggregate(zend_class_entry *interface, zend_class_entr if (class_type->num_interfaces) { for (i = 0; i < class_type->num_interfaces; i++) { if (class_type->interfaces[i] == zend_ce_iterator) { + zend_error(E_ERROR, "Class %s cannot implement both %s and %s at the same time", + class_type->name, + interface->name, + zend_ce_iterator->name); return FAILURE; } if (class_type->interfaces[i] == zend_ce_traversable) { @@ -378,8 +382,14 @@ static int zend_implement_iterator(zend_class_entry *interface, zend_class_entry if (class_type->type == ZEND_INTERNAL_CLASS) { /* inheritance ensures the class has the necessary userland methods */ return SUCCESS; - } else if (class_type->get_iterator != zend_user_it_get_new_iterator) { + } else { /* c-level get_iterator cannot be changed */ + if (class_type->get_iterator == zend_user_it_get_new_iterator) { + zend_error(E_ERROR, "Class %s cannot implement both %s and %s at the same time", + class_type->name, + interface->name, + zend_ce_aggregate->name); + } return FAILURE; } } diff --git a/Zend/zend_interfaces.h b/Zend/zend_interfaces.h index 7ff906537..c75e6dde8 100755 --- a/Zend/zend_interfaces.h +++ b/Zend/zend_interfaces.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_interfaces.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: zend_interfaces.h 293155 2010-01-05 20:46:53Z sebastian $ */ #ifndef ZEND_INTERFACES_H #define ZEND_INTERFACES_H diff --git a/Zend/zend_istdiostream.h b/Zend/zend_istdiostream.h index da1cfed87..4b38a8c15 100644 --- a/Zend/zend_istdiostream.h +++ b/Zend/zend_istdiostream.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_istdiostream.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: zend_istdiostream.h 293155 2010-01-05 20:46:53Z sebastian $ */ #ifndef _ZEND_STDIOSTREAM #define _ZEND_STDIOSTREAM diff --git a/Zend/zend_iterators.c b/Zend/zend_iterators.c index 9d9f04595..76588e245 100755 --- a/Zend/zend_iterators.c +++ b/Zend/zend_iterators.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_iterators.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: zend_iterators.c 293155 2010-01-05 20:46:53Z sebastian $ */ #include "zend.h" #include "zend_API.h" diff --git a/Zend/zend_iterators.h b/Zend/zend_iterators.h index 6c90d817b..b10840373 100755 --- a/Zend/zend_iterators.h +++ b/Zend/zend_iterators.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_iterators.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: zend_iterators.h 293155 2010-01-05 20:46:53Z sebastian $ */ /* These iterators were designed to operate within the foreach() * structures provided by the engine, but could be extended for use diff --git a/Zend/zend_language_parser.c b/Zend/zend_language_parser.c index faf71f822..6461dc11e 100644 --- a/Zend/zend_language_parser.c +++ b/Zend/zend_language_parser.c @@ -334,7 +334,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -349,7 +349,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_language_parser.y 277815 2009-03-26 12:37:54Z dmitry $ */ +/* $Id: zend_language_parser.y 293154 2010-01-05 20:40:23Z sebastian $ */ /* * LALR shift/reduce conflicts and how they are resolved: diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y index 5923ff550..2635fdb5d 100644 --- a/Zend/zend_language_parser.y +++ b/Zend/zend_language_parser.y @@ -3,7 +3,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_language_parser.y 277815 2009-03-26 12:37:54Z dmitry $ */ +/* $Id: zend_language_parser.y 293154 2010-01-05 20:40:23Z sebastian $ */ /* * LALR shift/reduce conflicts and how they are resolved: diff --git a/Zend/zend_language_scanner.c b/Zend/zend_language_scanner.c index 1cb027f11..3f5fefa7c 100644 --- a/Zend/zend_language_scanner.c +++ b/Zend/zend_language_scanner.c @@ -1,10 +1,10 @@ -/* Generated by re2c 0.13.5 on Mon May 04 19:38:30 2009 */ +/* Generated by re2c 0.13.5 on Mon Nov 16 23:30:01 2009 */ #line 1 "Zend/zend_language_scanner.l" /* +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -23,7 +23,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_language_scanner.c 279948 2009-05-05 01:44:52Z mattwil $ */ +/* $Id: zend_language_scanner.c 293155 2010-01-05 20:46:53Z sebastian $ */ #if 0 # define YYDEBUG(s, c) printf("state: %d char: %c\n", s, c) @@ -685,12 +685,12 @@ ZEND_API int zend_multibyte_read_script(unsigned char *buf, size_t n TSRMLS_DC) { if (SCNG(script_org)) { efree(SCNG(script_org)); + SCNG(script_org) = NULL; } - SCNG(script_org_size) = n; - SCNG(script_org) = (unsigned char*)erealloc(SCNG(script_org), SCNG(script_org_size)); - memcpy(SCNG(script_org) + SCNG(script_org_size) - n, buf, n); + SCNG(script_org_size) = n; - SCNG(script_org) = (unsigned char*)erealloc(SCNG(script_org), SCNG(script_org_size) + 1); + SCNG(script_org) = (unsigned char*)emalloc(SCNG(script_org_size) + 1); + memcpy(SCNG(script_org), buf, n); *(SCNG(script_org)+SCNG(script_org_size)) = '\0'; return 0; diff --git a/Zend/zend_language_scanner.h b/Zend/zend_language_scanner.h index 5add51c97..f564c03c2 100644 --- a/Zend/zend_language_scanner.h +++ b/Zend/zend_language_scanner.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_language_scanner.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: zend_language_scanner.h 293155 2010-01-05 20:46:53Z sebastian $ */ #ifndef ZEND_SCANNER_H #define ZEND_SCANNER_H diff --git a/Zend/zend_language_scanner.l b/Zend/zend_language_scanner.l index 9d42299dc..250d307d5 100644 --- a/Zend/zend_language_scanner.l +++ b/Zend/zend_language_scanner.l @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -21,7 +21,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_language_scanner.l 279941 2009-05-05 01:35:44Z mattwil $ */ +/* $Id: zend_language_scanner.l 293154 2010-01-05 20:40:23Z sebastian $ */ #if 0 # define YYDEBUG(s, c) printf("state: %d char: %c\n", s, c) @@ -683,12 +683,12 @@ ZEND_API int zend_multibyte_read_script(unsigned char *buf, size_t n TSRMLS_DC) { if (SCNG(script_org)) { efree(SCNG(script_org)); + SCNG(script_org) = NULL; } - SCNG(script_org_size) = n; - SCNG(script_org) = (unsigned char*)erealloc(SCNG(script_org), SCNG(script_org_size)); - memcpy(SCNG(script_org) + SCNG(script_org_size) - n, buf, n); + SCNG(script_org_size) = n; - SCNG(script_org) = (unsigned char*)erealloc(SCNG(script_org), SCNG(script_org_size) + 1); + SCNG(script_org) = (unsigned char*)emalloc(SCNG(script_org_size) + 1); + memcpy(SCNG(script_org), buf, n); *(SCNG(script_org)+SCNG(script_org_size)) = '\0'; return 0; diff --git a/Zend/zend_language_scanner_defs.h b/Zend/zend_language_scanner_defs.h index 48bd8d539..b2bce820f 100644 --- a/Zend/zend_language_scanner_defs.h +++ b/Zend/zend_language_scanner_defs.h @@ -1,4 +1,4 @@ -/* Generated by re2c 0.13.5 on Mon May 04 19:38:30 2009 */ +/* Generated by re2c 0.13.5 on Thu Sep 10 15:34:33 2009 */ #line 3 "Zend/zend_language_scanner_defs.h" enum YYCONDTYPE { diff --git a/Zend/zend_list.c b/Zend/zend_list.c index 2f71ea718..985a1fb33 100644 --- a/Zend/zend_list.c +++ b/Zend/zend_list.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_list.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: zend_list.c 293155 2010-01-05 20:46:53Z sebastian $ */ /* resource lists */ diff --git a/Zend/zend_list.h b/Zend/zend_list.h index a38e057dc..74ee45146 100644 --- a/Zend/zend_list.h +++ b/Zend/zend_list.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_list.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: zend_list.h 293155 2010-01-05 20:46:53Z sebastian $ */ #ifndef ZEND_LIST_H #define ZEND_LIST_H diff --git a/Zend/zend_llist.c b/Zend/zend_llist.c index b48b15072..b23fe1cce 100644 --- a/Zend/zend_llist.c +++ b/Zend/zend_llist.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_llist.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: zend_llist.c 293155 2010-01-05 20:46:53Z sebastian $ */ #include "zend.h" #include "zend_llist.h" diff --git a/Zend/zend_llist.h b/Zend/zend_llist.h index 47ec5a0d0..ab1e643be 100644 --- a/Zend/zend_llist.h +++ b/Zend/zend_llist.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_llist.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: zend_llist.h 293155 2010-01-05 20:46:53Z sebastian $ */ #ifndef ZEND_LLIST_H #define ZEND_LLIST_H diff --git a/Zend/zend_modules.h b/Zend/zend_modules.h index 67736704f..86807eee2 100644 --- a/Zend/zend_modules.h +++ b/Zend/zend_modules.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_modules.h 282827 2009-06-26 15:44:19Z johannes $ */ +/* $Id: zend_modules.h 293155 2010-01-05 20:46:53Z sebastian $ */ #ifndef MODULES_H #define MODULES_H diff --git a/Zend/zend_multibyte.c b/Zend/zend_multibyte.c index 7d270ade9..4b82a67bd 100644 --- a/Zend/zend_multibyte.c +++ b/Zend/zend_multibyte.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_multibyte.c 277438 2009-03-18 17:44:25Z moriyoshi $ */ +/* $Id: zend_multibyte.c 293155 2010-01-05 20:46:53Z sebastian $ */ #include "zend.h" #include "zend_compile.h" diff --git a/Zend/zend_multibyte.h b/Zend/zend_multibyte.h index ee3e2743f..c4c0f1c87 100644 --- a/Zend/zend_multibyte.h +++ b/Zend/zend_multibyte.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_multibyte.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: zend_multibyte.h 293155 2010-01-05 20:46:53Z sebastian $ */ #ifndef ZEND_MULTIBYTE_H #define ZEND_MULTIBYTE_H diff --git a/Zend/zend_multiply.h b/Zend/zend_multiply.h index afac089f9..cb790b722 100644 --- a/Zend/zend_multiply.h +++ b/Zend/zend_multiply.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_multiply.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: zend_multiply.h 293155 2010-01-05 20:46:53Z sebastian $ */ #if defined(__i386__) && defined(__GNUC__) diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 7c081caab..f43ed7f91 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_object_handlers.c 282413 2009-06-19 03:29:47Z scottmac $ */ +/* $Id: zend_object_handlers.c 293155 2010-01-05 20:46:53Z sebastian $ */ #include "zend.h" #include "zend_globals.h" diff --git a/Zend/zend_object_handlers.h b/Zend/zend_object_handlers.h index 88871ef29..721bfed43 100644 --- a/Zend/zend_object_handlers.h +++ b/Zend/zend_object_handlers.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_object_handlers.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: zend_object_handlers.h 293155 2010-01-05 20:46:53Z sebastian $ */ #ifndef ZEND_OBJECT_HANDLERS_H #define ZEND_OBJECT_HANDLERS_H diff --git a/Zend/zend_objects.c b/Zend/zend_objects.c index f69b82d9d..5aa15551b 100644 --- a/Zend/zend_objects.c +++ b/Zend/zend_objects.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_objects.c 289775 2009-10-19 21:43:34Z johannes $ */ +/* $Id: zend_objects.c 293155 2010-01-05 20:46:53Z sebastian $ */ #include "zend.h" #include "zend_globals.h" diff --git a/Zend/zend_objects.h b/Zend/zend_objects.h index 1a87ca3a2..c27de0af6 100644 --- a/Zend/zend_objects.h +++ b/Zend/zend_objects.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_objects.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: zend_objects.h 293155 2010-01-05 20:46:53Z sebastian $ */ #ifndef ZEND_OBJECTS_H #define ZEND_OBJECTS_H diff --git a/Zend/zend_objects_API.c b/Zend/zend_objects_API.c index 020796e95..9f83fd486 100644 --- a/Zend/zend_objects_API.c +++ b/Zend/zend_objects_API.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_objects_API.c 275561 2009-02-11 09:58:23Z tony2001 $ */ +/* $Id: zend_objects_API.c 293155 2010-01-05 20:46:53Z sebastian $ */ #include "zend.h" #include "zend_globals.h" diff --git a/Zend/zend_objects_API.h b/Zend/zend_objects_API.h index 643eaffba..1f1a0ffe9 100644 --- a/Zend/zend_objects_API.h +++ b/Zend/zend_objects_API.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_objects_API.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: zend_objects_API.h 293155 2010-01-05 20:46:53Z sebastian $ */ #ifndef ZEND_OBJECTS_API_H #define ZEND_OBJECTS_API_H diff --git a/Zend/zend_opcode.c b/Zend/zend_opcode.c index a721b0d7b..f31ba2473 100644 --- a/Zend/zend_opcode.c +++ b/Zend/zend_opcode.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_opcode.c 281737 2009-06-05 23:20:59Z shire $ */ +/* $Id: zend_opcode.c 293155 2010-01-05 20:46:53Z sebastian $ */ #include diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c index 6ee0d8e59..fa02c75e0 100644 --- a/Zend/zend_operators.c +++ b/Zend/zend_operators.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_operators.c 281670 2009-06-04 18:20:45Z mattwil $ */ +/* $Id: zend_operators.c 293155 2010-01-05 20:46:53Z sebastian $ */ #include @@ -1227,6 +1227,12 @@ ZEND_API int concat_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /* {{ if (result==op1) { /* special case, perform operations on result */ uint res_len = Z_STRLEN_P(op1) + Z_STRLEN_P(op2); + if (Z_STRLEN_P(result) < 0 || (int) (Z_STRLEN_P(op1) + Z_STRLEN_P(op2)) < 0) { + efree(Z_STRVAL_P(result)); + ZVAL_EMPTY_STRING(result); + zend_error(E_ERROR, "String size overflow"); + } + Z_STRVAL_P(result) = erealloc(Z_STRVAL_P(result), res_len+1); memcpy(Z_STRVAL_P(result)+Z_STRLEN_P(result), Z_STRVAL_P(op2), Z_STRLEN_P(op2)); diff --git a/Zend/zend_operators.h b/Zend/zend_operators.h index 03cd707d4..bc2428479 100644 --- a/Zend/zend_operators.h +++ b/Zend/zend_operators.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_operators.h 281670 2009-06-04 18:20:45Z mattwil $ */ +/* $Id: zend_operators.h 293155 2010-01-05 20:46:53Z sebastian $ */ #ifndef ZEND_OPERATORS_H #define ZEND_OPERATORS_H diff --git a/Zend/zend_ptr_stack.c b/Zend/zend_ptr_stack.c index 5625a349d..d866e6b85 100644 --- a/Zend/zend_ptr_stack.c +++ b/Zend/zend_ptr_stack.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_ptr_stack.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: zend_ptr_stack.c 293155 2010-01-05 20:46:53Z sebastian $ */ #include "zend.h" #include "zend_ptr_stack.h" diff --git a/Zend/zend_ptr_stack.h b/Zend/zend_ptr_stack.h index bd2f8b2d3..490b98262 100644 --- a/Zend/zend_ptr_stack.h +++ b/Zend/zend_ptr_stack.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_ptr_stack.h 281712 2009-06-05 11:21:31Z lbarnaud $ */ +/* $Id: zend_ptr_stack.h 293155 2010-01-05 20:46:53Z sebastian $ */ #ifndef ZEND_PTR_STACK_H #define ZEND_PTR_STACK_H diff --git a/Zend/zend_qsort.c b/Zend/zend_qsort.c index 8b65f964d..b1447428f 100644 --- a/Zend/zend_qsort.c +++ b/Zend/zend_qsort.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_qsort.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: zend_qsort.c 293155 2010-01-05 20:46:53Z sebastian $ */ #include "zend.h" diff --git a/Zend/zend_qsort.h b/Zend/zend_qsort.h index 1044320d9..667df71bd 100644 --- a/Zend/zend_qsort.h +++ b/Zend/zend_qsort.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_qsort.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: zend_qsort.h 293155 2010-01-05 20:46:53Z sebastian $ */ #ifndef ZEND_QSORT_H #define ZEND_QSORT_H diff --git a/Zend/zend_sprintf.c b/Zend/zend_sprintf.c index de1dd208f..4e9eb8ecc 100644 --- a/Zend/zend_sprintf.c +++ b/Zend/zend_sprintf.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_sprintf.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: zend_sprintf.c 293155 2010-01-05 20:46:53Z sebastian $ */ #include diff --git a/Zend/zend_stack.c b/Zend/zend_stack.c index a8da8244c..caa7f3698 100644 --- a/Zend/zend_stack.c +++ b/Zend/zend_stack.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_stack.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: zend_stack.c 293155 2010-01-05 20:46:53Z sebastian $ */ #include "zend.h" #include "zend_stack.h" diff --git a/Zend/zend_stack.h b/Zend/zend_stack.h index 5aed0321b..408c383ec 100644 --- a/Zend/zend_stack.h +++ b/Zend/zend_stack.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_stack.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: zend_stack.h 293155 2010-01-05 20:46:53Z sebastian $ */ #ifndef ZEND_STACK_H #define ZEND_STACK_H diff --git a/Zend/zend_static_allocator.c b/Zend/zend_static_allocator.c index efa299e94..6a985c7a5 100644 --- a/Zend/zend_static_allocator.c +++ b/Zend/zend_static_allocator.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_static_allocator.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: zend_static_allocator.c 293155 2010-01-05 20:46:53Z sebastian $ */ #include "zend_static_allocator.h" diff --git a/Zend/zend_static_allocator.h b/Zend/zend_static_allocator.h index 70cfab744..9921a8789 100644 --- a/Zend/zend_static_allocator.h +++ b/Zend/zend_static_allocator.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_static_allocator.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: zend_static_allocator.h 293155 2010-01-05 20:46:53Z sebastian $ */ #ifndef ZEND_STATIC_ALLOCATOR_H #define ZEND_STATIC_ALLOCATOR_H diff --git a/Zend/zend_stream.c b/Zend/zend_stream.c index 2b99358f0..d3548517a 100644 --- a/Zend/zend_stream.c +++ b/Zend/zend_stream.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -19,7 +19,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_stream.c 277834 2009-03-26 17:28:49Z dmitry $ */ +/* $Id: zend_stream.c 293155 2010-01-05 20:46:53Z sebastian $ */ #include "zend.h" diff --git a/Zend/zend_stream.h b/Zend/zend_stream.h index f9c08eaf8..e40a33b46 100644 --- a/Zend/zend_stream.h +++ b/Zend/zend_stream.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -19,7 +19,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_stream.h 282248 2009-06-16 14:33:33Z felipe $ */ +/* $Id: zend_stream.h 293155 2010-01-05 20:46:53Z sebastian $ */ #ifndef ZEND_STREAM_H #define ZEND_STREAM_H diff --git a/Zend/zend_strtod.h b/Zend/zend_strtod.h index 01eb99375..c112d295c 100644 --- a/Zend/zend_strtod.h +++ b/Zend/zend_strtod.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_strtod.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: zend_strtod.h 293155 2010-01-05 20:46:53Z sebastian $ */ /* This is a header file for the strtod implementation by David M. Gay which * can be found in zend_strtod.c */ diff --git a/Zend/zend_ts_hash.c b/Zend/zend_ts_hash.c index cc27dc9c5..43f719ddc 100644 --- a/Zend/zend_ts_hash.c +++ b/Zend/zend_ts_hash.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_ts_hash.c 273192 2009-01-09 19:16:55Z tony2001 $ */ +/* $Id: zend_ts_hash.c 293155 2010-01-05 20:46:53Z sebastian $ */ #include "zend.h" #include "zend_ts_hash.h" diff --git a/Zend/zend_ts_hash.h b/Zend/zend_ts_hash.h index d6ffb7726..bdc2a8d8d 100644 --- a/Zend/zend_ts_hash.h +++ b/Zend/zend_ts_hash.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_ts_hash.h 273192 2009-01-09 19:16:55Z tony2001 $ */ +/* $Id: zend_ts_hash.h 293155 2010-01-05 20:46:53Z sebastian $ */ #ifndef ZEND_TS_HASH_H #define ZEND_TS_HASH_H diff --git a/Zend/zend_types.h b/Zend/zend_types.h index 100b27927..374f600c2 100644 --- a/Zend/zend_types.h +++ b/Zend/zend_types.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_types.h 281712 2009-06-05 11:21:31Z lbarnaud $ */ +/* $Id: zend_types.h 293155 2010-01-05 20:46:53Z sebastian $ */ #ifndef ZEND_TYPES_H #define ZEND_TYPES_H diff --git a/Zend/zend_variables.c b/Zend/zend_variables.c index 5aad679b0..987351c6e 100644 --- a/Zend/zend_variables.c +++ b/Zend/zend_variables.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_variables.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: zend_variables.c 294427 2010-02-03 18:07:25Z pajoye $ */ #include #include "zend.h" @@ -151,16 +151,19 @@ ZEND_API int zend_print_variable(zval *var) } -#if ZEND_DEBUG -ZEND_API void _zval_copy_ctor_wrapper(zval *zvalue) +ZEND_API void _zval_dtor_wrapper(zval *zvalue) { - zval_copy_ctor(zvalue); + TSRMLS_FETCH(); + + GC_REMOVE_ZVAL_FROM_BUFFER(zvalue); + zval_dtor(zvalue); } -ZEND_API void _zval_dtor_wrapper(zval *zvalue) +#if ZEND_DEBUG +ZEND_API void _zval_copy_ctor_wrapper(zval *zvalue) { - zval_dtor(zvalue); + zval_copy_ctor(zvalue); } diff --git a/Zend/zend_variables.h b/Zend/zend_variables.h index fbc989353..b73602e8b 100644 --- a/Zend/zend_variables.h +++ b/Zend/zend_variables.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_variables.h 279681 2009-05-01 21:46:53Z jani $ */ +/* $Id: zend_variables.h 294427 2010-02-03 18:07:25Z pajoye $ */ #ifndef ZEND_VARIABLES_H #define ZEND_VARIABLES_H @@ -50,26 +50,25 @@ ZEND_API int zend_print_variable(zval *var); ZEND_API void _zval_ptr_dtor(zval **zval_ptr ZEND_FILE_LINE_DC); ZEND_API void _zval_internal_dtor(zval *zvalue ZEND_FILE_LINE_DC); ZEND_API void _zval_internal_ptr_dtor(zval **zvalue ZEND_FILE_LINE_DC); +ZEND_API void _zval_dtor_wrapper(zval *zvalue); #define zval_copy_ctor(zvalue) _zval_copy_ctor((zvalue) ZEND_FILE_LINE_CC) #define zval_dtor(zvalue) _zval_dtor((zvalue) ZEND_FILE_LINE_CC) #define zval_ptr_dtor(zval_ptr) _zval_ptr_dtor((zval_ptr) ZEND_FILE_LINE_CC) #define zval_internal_dtor(zvalue) _zval_internal_dtor((zvalue) ZEND_FILE_LINE_CC) #define zval_internal_ptr_dtor(zvalue) _zval_internal_ptr_dtor((zvalue) ZEND_FILE_LINE_CC) +#define zval_dtor_wrapper _zval_dtor_wrapper #if ZEND_DEBUG ZEND_API void _zval_copy_ctor_wrapper(zval *zvalue); -ZEND_API void _zval_dtor_wrapper(zval *zvalue); ZEND_API void _zval_ptr_dtor_wrapper(zval **zval_ptr); ZEND_API void _zval_internal_dtor_wrapper(zval *zvalue); ZEND_API void _zval_internal_ptr_dtor_wrapper(zval **zvalue); #define zval_copy_ctor_wrapper _zval_copy_ctor_wrapper -#define zval_dtor_wrapper _zval_dtor_wrapper #define zval_ptr_dtor_wrapper _zval_ptr_dtor_wrapper #define zval_internal_dtor_wrapper _zval_internal_dtor_wrapper #define zval_internal_ptr_dtor_wrapper _zval_internal_ptr_dtor_wrapper #else #define zval_copy_ctor_wrapper _zval_copy_ctor_func -#define zval_dtor_wrapper _zval_dtor_func #define zval_ptr_dtor_wrapper _zval_ptr_dtor #define zval_internal_dtor_wrapper _zval_internal_dtor #define zval_internal_ptr_dtor_wrapper _zval_internal_ptr_dtor diff --git a/Zend/zend_vm.h b/Zend/zend_vm.h index a80a4b89b..61390d04e 100644 --- a/Zend/zend_vm.h +++ b/Zend/zend_vm.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_vm.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: zend_vm.h 293155 2010-01-05 20:46:53Z sebastian $ */ #ifndef ZEND_VM_H #define ZEND_VM_H diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 485f2cc17..06040f336 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_vm_def.h 290152 2009-11-02 18:11:33Z pajoye $ */ +/* $Id: zend_vm_def.h 293155 2010-01-05 20:46:53Z sebastian $ */ /* If you change this file, please regenerate the zend_vm_execute.h and * zend_vm_opcodes.h files by running: @@ -1100,7 +1100,7 @@ ZEND_VM_HANDLER(84, ZEND_FETCH_DIM_W, VAR|CV, CONST|TMP|VAR|UNUSED|CV) FREE_OP1_VAR_PTR(); /* We are going to assign the result by reference */ - if (opline->extended_value) { + if (opline->extended_value && EX_T(opline->result.u.var).var.ptr_ptr) { Z_DELREF_PP(EX_T(opline->result.u.var).var.ptr_ptr); SEPARATE_ZVAL_TO_MAKE_IS_REF(EX_T(opline->result.u.var).var.ptr_ptr); Z_ADDREF_PP(EX_T(opline->result.u.var).var.ptr_ptr); @@ -3691,7 +3691,7 @@ ZEND_VM_HANDLER(78, ZEND_FE_FETCH, VAR, ANY) { zend_op *opline = EX(opline); zend_free_op free_op1; - zval *array = GET_OP1_ZVAL_PTR(BP_VAR_R); + zval *array = EX_T(opline->op1.u.var).var.ptr; zval **value; char *str_key; uint str_key_len; @@ -3701,8 +3701,6 @@ ZEND_VM_HANDLER(78, ZEND_FE_FETCH, VAR, ANY) int key_type = 0; zend_bool use_key = (zend_bool)(opline->extended_value & ZEND_FE_FETCH_WITH_KEY); - PZVAL_LOCK(array); - switch (zend_iterator_unwrap(array, &iter TSRMLS_CC)) { default: case ZEND_ITER_INVALID: @@ -3915,7 +3913,7 @@ ZEND_VM_HELPER_EX(zend_isset_isempty_dim_prop_obj_handler, VAR|UNUSED|CV, CONST| zend_free_op free_op2; zval *offset = GET_OP2_ZVAL_PTR(BP_VAR_R); - if (Z_TYPE_PP(container) == IS_ARRAY) { + if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) { HashTable *ht; int isset = 0; diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 9d931107d..826ba57d1 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -1332,6 +1332,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CONST(int type, ZEND if (opline->op2.u.EA.type == ZEND_FETCH_STATIC_MEMBER) { retval = zend_std_get_static_property(EX_T(opline->op2.u.var).class_entry, Z_STRVAL_P(varname), Z_STRLEN_P(varname), 0 TSRMLS_CC); + } else { target_symbol_table = zend_get_target_symbol_table(opline, EX(Ts), type, varname TSRMLS_CC); /* @@ -8850,8 +8851,8 @@ static int ZEND_FASTCALL ZEND_FE_RESET_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG static int ZEND_FASTCALL ZEND_FE_FETCH_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { zend_op *opline = EX(opline); - zend_free_op free_op1; - zval *array = _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC); + + zval *array = EX_T(opline->op1.u.var).var.ptr; zval **value; char *str_key; uint str_key_len; @@ -8861,8 +8862,6 @@ static int ZEND_FASTCALL ZEND_FE_FETCH_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG int key_type = 0; zend_bool use_key = (zend_bool)(opline->extended_value & ZEND_FE_FETCH_WITH_KEY); - PZVAL_LOCK(array); - switch (zend_iterator_unwrap(array, &iter TSRMLS_CC)) { default: case ZEND_ITER_INVALID: @@ -9865,7 +9864,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HA if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; /* We are going to assign the result by reference */ - if (opline->extended_value) { + if (opline->extended_value && EX_T(opline->result.u.var).var.ptr_ptr) { Z_DELREF_PP(EX_T(opline->result.u.var).var.ptr_ptr); SEPARATE_ZVAL_TO_MAKE_IS_REF(EX_T(opline->result.u.var).var.ptr_ptr); Z_ADDREF_PP(EX_T(opline->result.u.var).var.ptr_ptr); @@ -10805,7 +10804,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_CONST( zval *offset = &opline->op2.u.constant; - if (Z_TYPE_PP(container) == IS_ARRAY) { + if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) { HashTable *ht; int isset = 0; @@ -11668,7 +11667,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HAND if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; /* We are going to assign the result by reference */ - if (opline->extended_value) { + if (opline->extended_value && EX_T(opline->result.u.var).var.ptr_ptr) { Z_DELREF_PP(EX_T(opline->result.u.var).var.ptr_ptr); SEPARATE_ZVAL_TO_MAKE_IS_REF(EX_T(opline->result.u.var).var.ptr_ptr); Z_ADDREF_PP(EX_T(opline->result.u.var).var.ptr_ptr); @@ -12554,7 +12553,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_TMP(in zend_free_op free_op2; zval *offset = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC); - if (Z_TYPE_PP(container) == IS_ARRAY) { + if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) { HashTable *ht; int isset = 0; @@ -13417,7 +13416,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HAND if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; /* We are going to assign the result by reference */ - if (opline->extended_value) { + if (opline->extended_value && EX_T(opline->result.u.var).var.ptr_ptr) { Z_DELREF_PP(EX_T(opline->result.u.var).var.ptr_ptr); SEPARATE_ZVAL_TO_MAKE_IS_REF(EX_T(opline->result.u.var).var.ptr_ptr); Z_ADDREF_PP(EX_T(opline->result.u.var).var.ptr_ptr); @@ -14354,7 +14353,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_VAR(in zend_free_op free_op2; zval *offset = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC); - if (Z_TYPE_PP(container) == IS_ARRAY) { + if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) { HashTable *ht; int isset = 0; @@ -14757,7 +14756,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_H if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; /* We are going to assign the result by reference */ - if (opline->extended_value) { + if (opline->extended_value && EX_T(opline->result.u.var).var.ptr_ptr) { Z_DELREF_PP(EX_T(opline->result.u.var).var.ptr_ptr); SEPARATE_ZVAL_TO_MAKE_IS_REF(EX_T(opline->result.u.var).var.ptr_ptr); Z_ADDREF_PP(EX_T(opline->result.u.var).var.ptr_ptr); @@ -15808,7 +15807,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDL if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; /* We are going to assign the result by reference */ - if (opline->extended_value) { + if (opline->extended_value && EX_T(opline->result.u.var).var.ptr_ptr) { Z_DELREF_PP(EX_T(opline->result.u.var).var.ptr_ptr); SEPARATE_ZVAL_TO_MAKE_IS_REF(EX_T(opline->result.u.var).var.ptr_ptr); Z_ADDREF_PP(EX_T(opline->result.u.var).var.ptr_ptr); @@ -16740,7 +16739,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_CV(int zval *offset = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC); - if (Z_TYPE_PP(container) == IS_ARRAY) { + if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) { HashTable *ht; int isset = 0; @@ -17930,7 +17929,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_CON zval *offset = &opline->op2.u.constant; - if (Z_TYPE_PP(container) == IS_ARRAY) { + if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) { HashTable *ht; int isset = 0; @@ -18987,7 +18986,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_TMP zend_free_op free_op2; zval *offset = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC); - if (Z_TYPE_PP(container) == IS_ARRAY) { + if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) { HashTable *ht; int isset = 0; @@ -20044,7 +20043,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_VAR zend_free_op free_op2; zval *offset = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC); - if (Z_TYPE_PP(container) == IS_ARRAY) { + if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) { HashTable *ht; int isset = 0; @@ -21360,7 +21359,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_CV( zval *offset = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC); - if (Z_TYPE_PP(container) == IS_ARRAY) { + if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) { HashTable *ht; int isset = 0; @@ -21712,6 +21711,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CV(int type, ZEND_OP if (opline->op2.u.EA.type == ZEND_FETCH_STATIC_MEMBER) { retval = zend_std_get_static_property(EX_T(opline->op2.u.var).class_entry, Z_STRVAL_P(varname), Z_STRLEN_P(varname), 0 TSRMLS_CC); + } else { target_symbol_table = zend_get_target_symbol_table(opline, EX(Ts), type, varname TSRMLS_CC); /* @@ -23567,7 +23567,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HAN } /* We are going to assign the result by reference */ - if (opline->extended_value) { + if (opline->extended_value && EX_T(opline->result.u.var).var.ptr_ptr) { Z_DELREF_PP(EX_T(opline->result.u.var).var.ptr_ptr); SEPARATE_ZVAL_TO_MAKE_IS_REF(EX_T(opline->result.u.var).var.ptr_ptr); Z_ADDREF_PP(EX_T(opline->result.u.var).var.ptr_ptr); @@ -24345,7 +24345,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_CONST(i zval *offset = &opline->op2.u.constant; - if (Z_TYPE_PP(container) == IS_ARRAY) { + if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) { HashTable *ht; int isset = 0; @@ -25204,7 +25204,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDL } /* We are going to assign the result by reference */ - if (opline->extended_value) { + if (opline->extended_value && EX_T(opline->result.u.var).var.ptr_ptr) { Z_DELREF_PP(EX_T(opline->result.u.var).var.ptr_ptr); SEPARATE_ZVAL_TO_MAKE_IS_REF(EX_T(opline->result.u.var).var.ptr_ptr); Z_ADDREF_PP(EX_T(opline->result.u.var).var.ptr_ptr); @@ -25985,7 +25985,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_TMP(int zend_free_op free_op2; zval *offset = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC); - if (Z_TYPE_PP(container) == IS_ARRAY) { + if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) { HashTable *ht; int isset = 0; @@ -26844,7 +26844,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDL } /* We are going to assign the result by reference */ - if (opline->extended_value) { + if (opline->extended_value && EX_T(opline->result.u.var).var.ptr_ptr) { Z_DELREF_PP(EX_T(opline->result.u.var).var.ptr_ptr); SEPARATE_ZVAL_TO_MAKE_IS_REF(EX_T(opline->result.u.var).var.ptr_ptr); Z_ADDREF_PP(EX_T(opline->result.u.var).var.ptr_ptr); @@ -27675,7 +27675,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_VAR(int zend_free_op free_op2; zval *offset = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC); - if (Z_TYPE_PP(container) == IS_ARRAY) { + if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) { HashTable *ht; int isset = 0; @@ -28074,7 +28074,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HA } /* We are going to assign the result by reference */ - if (opline->extended_value) { + if (opline->extended_value && EX_T(opline->result.u.var).var.ptr_ptr) { Z_DELREF_PP(EX_T(opline->result.u.var).var.ptr_ptr); SEPARATE_ZVAL_TO_MAKE_IS_REF(EX_T(opline->result.u.var).var.ptr_ptr); Z_ADDREF_PP(EX_T(opline->result.u.var).var.ptr_ptr); @@ -29026,7 +29026,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLE } /* We are going to assign the result by reference */ - if (opline->extended_value) { + if (opline->extended_value && EX_T(opline->result.u.var).var.ptr_ptr) { Z_DELREF_PP(EX_T(opline->result.u.var).var.ptr_ptr); SEPARATE_ZVAL_TO_MAKE_IS_REF(EX_T(opline->result.u.var).var.ptr_ptr); Z_ADDREF_PP(EX_T(opline->result.u.var).var.ptr_ptr); @@ -29852,7 +29852,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_CV(int zval *offset = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC); - if (Z_TYPE_PP(container) == IS_ARRAY) { + if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) { HashTable *ht; int isset = 0; diff --git a/Zend/zend_vm_gen.php b/Zend/zend_vm_gen.php index f67296bf0..d7dca6e03 100644 --- a/Zend/zend_vm_gen.php +++ b/Zend/zend_vm_gen.php @@ -3,7 +3,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ | Authors: Dmitry Stogov | +----------------------------------------------------------------------+ - $Id: zend_vm_gen.php 272370 2008-12-31 11:15:49Z sebastian $ + $Id: zend_vm_gen.php 293155 2010-01-05 20:46:53Z sebastian $ */ $header_text = <<< DATA @@ -24,7 +24,7 @@ $header_text = <<< DATA +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | diff --git a/Zend/zend_vm_opcodes.h b/Zend/zend_vm_opcodes.h index 502529bc2..d048a8576 100644 --- a/Zend/zend_vm_opcodes.h +++ b/Zend/zend_vm_opcodes.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | diff --git a/acconfig.h b/acconfig.h index 4c5d4a181..9d6b0f7fb 100644 --- a/acconfig.h +++ b/acconfig.h @@ -3,7 +3,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: acconfig.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: acconfig.h 293155 2010-01-05 20:46:53Z sebastian $ */ #if defined(__GNUC__) && __GNUC__ >= 4 # define ZEND_API __attribute__ ((visibility("default"))) diff --git a/acinclude.m4 b/acinclude.m4 index 46e6eb75c..e54b5e3e9 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -1,5 +1,5 @@ dnl -dnl $Id: acinclude.m4 287126 2009-08-11 23:45:35Z srinatar $ +dnl $Id: acinclude.m4 291414 2009-11-29 06:13:22Z rasmus $ dnl dnl This file contains local autoconf functions. dnl @@ -1688,7 +1688,7 @@ dnl PHP_BROKEN_GLIBC_FOPEN_APPEND dnl AC_DEFUN([PHP_BROKEN_GLIBC_FOPEN_APPEND], [ AC_MSG_CHECKING([for broken libc stdio]) - AC_CACHE_VAL(have_broken_glibc_fopen_append,[ + AC_CACHE_VAL(_cv_have_broken_glibc_fopen_append,[ AC_TRY_RUN([ #include int main(int argc, char *argv[]) @@ -1714,8 +1714,8 @@ int main(int argc, char *argv[]) return 0; } ], -[have_broken_glibc_fopen_append=no], -[have_broken_glibc_fopen_append=yes ], +[_cv_have_broken_glibc_fopen_append=no], +[_cv_have_broken_glibc_fopen_append=yes ], AC_TRY_COMPILE([ #include ],[ @@ -1723,11 +1723,11 @@ AC_TRY_COMPILE([ choke me #endif ], -[have_broken_glibc_fopen_append=yes], -[have_broken_glibc_fopen_append=no ]) +[_cv_have_broken_glibc_fopen_append=yes], +[_cv_have_broken_glibc_fopen_append=no ]) )]) - if test "$have_broken_glibc_fopen_append" = "yes"; then + if test "$_cv_have_broken_glibc_fopen_append" = "yes"; then AC_MSG_RESULT(yes) AC_DEFINE(HAVE_BROKEN_GLIBC_FOPEN_APPEND,1, [Define if your glibc borks on fopen with mode a+]) else diff --git a/aclocal.m4 b/aclocal.m4 index 68a847c40..27db09c62 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -1,5 +1,5 @@ dnl -dnl $Id: acinclude.m4 287126 2009-08-11 23:45:35Z srinatar $ +dnl $Id: acinclude.m4 291414 2009-11-29 06:13:22Z rasmus $ dnl dnl This file contains local autoconf functions. dnl @@ -1688,7 +1688,7 @@ dnl PHP_BROKEN_GLIBC_FOPEN_APPEND dnl AC_DEFUN([PHP_BROKEN_GLIBC_FOPEN_APPEND], [ AC_MSG_CHECKING([for broken libc stdio]) - AC_CACHE_VAL(have_broken_glibc_fopen_append,[ + AC_CACHE_VAL(_cv_have_broken_glibc_fopen_append,[ AC_TRY_RUN([ #include int main(int argc, char *argv[]) @@ -1714,8 +1714,8 @@ int main(int argc, char *argv[]) return 0; } ], -[have_broken_glibc_fopen_append=no], -[have_broken_glibc_fopen_append=yes ], +[_cv_have_broken_glibc_fopen_append=no], +[_cv_have_broken_glibc_fopen_append=yes ], AC_TRY_COMPILE([ #include ],[ @@ -1723,11 +1723,11 @@ AC_TRY_COMPILE([ choke me #endif ], -[have_broken_glibc_fopen_append=yes], -[have_broken_glibc_fopen_append=no ]) +[_cv_have_broken_glibc_fopen_append=yes], +[_cv_have_broken_glibc_fopen_append=no ]) )]) - if test "$have_broken_glibc_fopen_append" = "yes"; then + if test "$_cv_have_broken_glibc_fopen_append" = "yes"; then AC_MSG_RESULT(yes) AC_DEFINE(HAVE_BROKEN_GLIBC_FOPEN_APPEND,1, [Define if your glibc borks on fopen with mode a+]) else @@ -2875,15 +2875,15 @@ main() ]) # libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- -## Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005 -## Free Software Foundation, Inc. +## Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007, +## 2008 Free Software Foundation, Inc. ## Originally by Gordon Matzigkeit , 1996 ## ## 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. -# serial 47 AC_PROG_LIBTOOL +# serial 52 AC_PROG_LIBTOOL ifdef([AC_ACVERSION],[ # autoconf 2.13 compatibility @@ -2920,30 +2920,6 @@ dnl immediately, otherwise, hook it in at the end of AC_PROG_CXX. [AC_LIBTOOL_CXX], [define([AC_PROG_CXX], defn([AC_PROG_CXX])[AC_LIBTOOL_CXX ])]) - -dnl dnl And a similar setup for Fortran 77 support -dnl AC_PROVIDE_IFELSE([AC_PROG_F77], -dnl [AC_LIBTOOL_F77], -dnl [define([AC_PROG_F77], defn([AC_PROG_F77])[AC_LIBTOOL_F77 -dnl ])]) - -dnl dnl Quote A][M_PROG_GCJ so that aclocal doesn't bring it in needlessly. -dnl dnl If either AC_PROG_GCJ or A][M_PROG_GCJ have already been expanded, run -dnl dnl AC_LIBTOOL_GCJ immediately, otherwise, hook it in at the end of both. -dnl AC_PROVIDE_IFELSE([AC_PROG_GCJ], -dnl [AC_LIBTOOL_GCJ], -dnl [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], -dnl [AC_LIBTOOL_GCJ], -dnl [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ], -dnl [AC_LIBTOOL_GCJ], -dnl [ifdef([AC_PROG_GCJ], -dnl [define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[AC_LIBTOOL_GCJ])]) -dnl ifdef([A][M_PROG_GCJ], -dnl [define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[AC_LIBTOOL_GCJ])]) -dnl ifdef([LT_AC_PROG_GCJ], -dnl [define([LT_AC_PROG_GCJ], -dnl defn([LT_AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])])]) -dnl ]) ])# AC_PROG_LIBTOOL @@ -2952,8 +2928,6 @@ dnl ]) AC_DEFUN([_AC_PROG_LIBTOOL], [AC_REQUIRE([AC_LIBTOOL_SETUP])dnl AC_BEFORE([$0],[AC_LIBTOOL_CXX])dnl -dnl AC_BEFORE([$0],[AC_LIBTOOL_F77])dnl -dnl AC_BEFORE([$0],[AC_LIBTOOL_GCJ])dnl # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" @@ -2987,7 +2961,6 @@ AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl 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 @@ -3049,6 +3022,7 @@ test -z "$AR_FLAGS" && AR_FLAGS=cru test -z "$AS" && AS=as test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$DLLTOOL" && DLLTOOL=dlltool test -z "$LD" && LD=ld test -z "$LN_S" && LN_S="ln -s" @@ -3061,17 +3035,17 @@ 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_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' 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="$old_postinstall_cmds~\$RANLIB -t \$oldlib" ;; *) - old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds" + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" @@ -3088,6 +3062,8 @@ file_magic*) ;; esac +_LT_REQUIRED_DARWIN_CHECKS + 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) @@ -3117,6 +3093,9 @@ AC_DEFUN([_LT_AC_SYS_COMPILER], # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + # Allow CC to be a program name with arguments. compiler=$CC ])# _LT_AC_SYS_COMPILER @@ -3143,9 +3122,10 @@ cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` # Check for compiler boilerplate output or warnings with # the simple compiler test code. AC_DEFUN([_LT_COMPILER_BOILERPLATE], -[ac_outfile=conftest.$ac_objext -printf "$lt_simple_compile_test_code" >conftest.$ac_ext -eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d' >conftest.err +[AC_REQUIRE([LT_AC_PROG_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $rm conftest* ])# _LT_COMPILER_BOILERPLATE @@ -3156,11 +3136,12 @@ $rm conftest* # Check for linker boilerplate output or warnings with # the simple link test code. AC_DEFUN([_LT_LINKER_BOILERPLATE], -[ac_outfile=conftest.$ac_objext -printf "$lt_simple_link_test_code" >conftest.$ac_ext -eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d' >conftest.err +[AC_REQUIRE([LT_AC_PROG_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` -$rm conftest* +$rm -r conftest* ])# _LT_LINKER_BOILERPLATE @@ -3176,7 +3157,7 @@ int main() { ; return 0; } EOF if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then - ifelse([$1], , :, [$1 + ifelse([$1], , :, [$1 rm -rf conftest*]) else echo "configure: failed program was:" >&5 @@ -3187,6 +3168,75 @@ ifelse([$2], , , [$2 fi rm -f conftest*]) +# _LT_REQUIRED_DARWIN_CHECKS +# -------------------------- +# Check for some things on darwin +AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS],[ + case $host_os in + rhapsody* | darwin*) + AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) + AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) + + AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], + [lt_cv_apple_cc_single_mod=no + if test -z "${LT_MULTI_MODULE}"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + echo "int foo(void){return 1;}" > conftest.c + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib ${wl}-single_module conftest.c + if test -f libconftest.dylib; then + lt_cv_apple_cc_single_mod=yes + rm -rf libconftest.dylib* + fi + rm conftest.c + fi]) + AC_CACHE_CHECK([for -exported_symbols_list linker flag], + [lt_cv_ld_exported_symbols_list], + [lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + _LT_AC_TRY_LINK([lt_cv_ld_exported_symbols_list=yes],[lt_cv_ld_exported_symbols_list=no]) + LDFLAGS="$save_LDFLAGS" + ]) + case $host_os in + rhapsody* | darwin1.[[0123]]) + _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + darwin*) + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + 10.[[012]]*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test "$lt_cv_apple_cc_single_mod" = "yes"; then + _lt_dar_single_mod='$single_module' + fi + if test "$lt_cv_ld_exported_symbols_list" = "yes"; then + _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' + else + _lt_dar_export_syms="~$NMEDIT -s \$output_objdir/\${libname}-symbols.expsym \${lib}" + fi + if test "$DSYMUTIL" != ":"; then + _lt_dsymutil="~$DSYMUTIL \$lib || :" + else + _lt_dsymutil= + fi + ;; + esac +]) # _LT_AC_SYS_LIBPATH_AIX # ---------------------- @@ -3197,12 +3247,20 @@ rm -f conftest*]) # If we don't find anything, use the default library path according # to the aix ld manual. AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX], -[_LT_AC_TRY_LINK([ -aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'` +[AC_REQUIRE([LT_AC_PROG_SED])dnl +_LT_AC_TRY_LINK([ +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # 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=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +fi],[]) if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi ])# _LT_AC_SYS_LIBPATH_AIX @@ -3433,13 +3491,17 @@ ia64-*-hpux*) rm -rf conftest* ;; -x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) +x86_64-*kfreebsd*-gnu|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-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; @@ -3456,6 +3518,9 @@ x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) ;; *64-bit*) case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; @@ -3489,6 +3554,26 @@ x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) CFLAGS="$SAVE_CFLAGS" fi ;; +sparc*-*solaris*) + # 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 + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) LD="${LD-ld} -m elf64_sparc" ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], [*-*-cygwin* | *-*-mingw* | *-*-pw32*) AC_CHECK_TOOL(DLLTOOL, dlltool, false) @@ -3512,7 +3597,7 @@ AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], 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 + echo "$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. @@ -3531,9 +3616,9 @@ AC_CACHE_CHECK([$1], [$2], 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 other than the usual output. - $echo "X$_lt_compiler_boilerplate" | $Xsed >conftest.exp - $SED '/^$/d' conftest.err >conftest.er2 - if test ! -s conftest.err || diff conftest.exp conftest.er2 >/dev/null; then + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi fi @@ -3553,19 +3638,20 @@ fi # ------------------------------------------------------------ # Check whether the given compiler option works AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], -[AC_CACHE_CHECK([$1], [$2], +[AC_REQUIRE([LT_AC_PROG_SED])dnl +AC_CACHE_CHECK([$1], [$2], [$2=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $3" - printf "$lt_simple_link_test_code" > conftest.$ac_ext + echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker 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 - $echo "X$_lt_linker_boilerplate" | $Xsed > conftest.exp - $SED '/^$/d' conftest.err >conftest.er2 + $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi @@ -3573,7 +3659,7 @@ AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], $2=yes fi fi - $rm conftest* + $rm -r conftest* LDFLAGS="$save_LDFLAGS" ]) @@ -3634,44 +3720,64 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else - lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 - # + # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; *) - # 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. - SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} - while (test "X"`$SHELL [$]0 --fallback-echo "X$teststring" 2>/dev/null` \ + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + while (test "X"`$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` + 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` + fi ;; esac ]) @@ -3684,7 +3790,7 @@ fi # _LT_AC_CHECK_DLFCN -# -------------------- +# ------------------ AC_DEFUN([_LT_AC_CHECK_DLFCN], [AC_CHECK_HEADERS(dlfcn.h)dnl ])# _LT_AC_CHECK_DLFCN @@ -3692,7 +3798,7 @@ AC_DEFUN([_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 : @@ -3758,6 +3864,8 @@ int main () else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; /* dlclose (self); */ } + else + puts (dlerror ()); exit (status); }] @@ -3768,7 +3876,7 @@ EOF case x$lt_status in x$lt_dlno_uscore) $1 ;; x$lt_dlneed_uscore) $2 ;; - x$lt_unknown|x*) $3 ;; + x$lt_dlunknown|x*) $3 ;; esac else : # compilation failed @@ -3780,7 +3888,7 @@ rm -fr conftest* # AC_LIBTOOL_DLOPEN_SELF -# ------------------- +# ---------------------- AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl if test "x$enable_dlopen" != xyes; then @@ -3822,7 +3930,7 @@ else 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"], + [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], [AC_CHECK_FUNC([dlopen], [lt_cv_dlopen="dlopen"], [AC_CHECK_LIB([dl], [dlopen], @@ -3830,7 +3938,7 @@ else [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"]) + [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) ]) ]) ]) @@ -3851,7 +3959,7 @@ else test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" - eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" @@ -3864,7 +3972,7 @@ else ]) if test "x$lt_cv_dlopen_self" = xyes; then - LDFLAGS="$LDFLAGS $link_static_flag" + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], lt_cv_dlopen_self_static, [dnl _LT_AC_TRY_DLOPEN_SELF( @@ -3896,7 +4004,8 @@ fi # --------------------------------- # 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_REQUIRE([LT_AC_PROG_SED])dnl +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 @@ -3904,7 +4013,7 @@ AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], mkdir conftest cd conftest mkdir out - printf "$lt_simple_compile_test_code" > conftest.$ac_ext + echo "$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 @@ -3924,9 +4033,9 @@ AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings - $echo "X$_lt_compiler_boilerplate" | $Xsed > out/conftest.exp - $SED '/^$/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.err || diff out/conftest.exp out/conftest.er2 >/dev/null; then + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes fi fi @@ -4044,6 +4153,7 @@ else darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" + old_striplib="$STRIP -S" AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) @@ -4061,7 +4171,8 @@ fi # ----------------------------- # PORTME Fill in your ld.so characteristics AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER], -[AC_MSG_CHECKING([dynamic linker characteristics]) +[AC_REQUIRE([LT_AC_PROG_SED])dnl +AC_MSG_CHECKING([dynamic linker characteristics]) library_names_spec= libname_spec='lib$name' soname_spec= @@ -4075,20 +4186,58 @@ shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" +ifelse($1,[],[ 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 + case $host_os in + darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; + *) lt_awk_arg="/^libraries:/" ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$lt_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'` + lt_search_path_spec=`echo "$lt_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"` + lt_search_path_spec=`echo "$lt_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary. + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path/$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" + else + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`echo $lt_tmp_lt_search_path_spec | awk ' +BEGIN {RS=" "; FS="/|\n";} { + lt_foo=""; + lt_count=0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo="/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[[lt_foo]]++; } + if (lt_freq[[lt_foo]] == 1) { print lt_foo; } +}'` + sys_lib_search_path_spec=`echo $lt_search_path_spec` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" -fi +fi]) need_lib_prefix=unknown hardcode_into_libs=no @@ -4106,7 +4255,7 @@ aix3*) soname_spec='${libname}${release}${shared_ext}$major' ;; -aix4* | aix5*) +aix[[4-9]]*) version_type=linux need_lib_prefix=no need_version=no @@ -4245,12 +4394,8 @@ darwin* | rhapsody*) 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 + ifelse([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; @@ -4267,18 +4412,6 @@ 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* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. @@ -4311,10 +4444,15 @@ freebsd* | dragonfly*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; - *) # from 3.2 on + freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ + freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; esac ;; @@ -4374,6 +4512,18 @@ hpux9* | hpux10* | hpux11*) postinstall_cmds='chmod 555 $lib' ;; +interix[[3-9]]*) + 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' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; @@ -4417,7 +4567,7 @@ linux*oldld* | linux*aout* | linux*coff*) ;; # This must be Linux ELF. -linux*) +linux* | k*bsd*-gnu) version_type=linux need_lib_prefix=no need_version=no @@ -4431,27 +4581,10 @@ linux*) # 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" + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on @@ -4463,18 +4596,6 @@ linux*) 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 @@ -4512,6 +4633,7 @@ nto-qnx*) openbsd*) version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in @@ -4555,11 +4677,8 @@ osf3* | osf4* | osf5*) 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 +rdos*) + dynamic_linker=no ;; solaris*) @@ -4587,7 +4706,7 @@ sunos4*) need_version=yes ;; -sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) +sysv4 | sysv4.3*) 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' @@ -4620,6 +4739,29 @@ sysv4*MP*) fi ;; +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + shlibpath_overrides_runpath=no + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + shlibpath_overrides_runpath=yes + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' @@ -4633,13 +4775,26 @@ uts4*) esac AC_MSG_RESULT([$dynamic_linker]) test "$dynamic_linker" = no && can_build_shared=no + +AC_CACHE_VAL([lt_cv_sys_lib_search_path_spec], +[lt_cv_sys_lib_search_path_spec="$sys_lib_search_path_spec"]) +sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +AC_CACHE_VAL([lt_cv_sys_lib_dlsearch_path_spec], +[lt_cv_sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec"]) +sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" + +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 ])# AC_LIBTOOL_SYS_DYNAMIC_LINKER # _LT_AC_TAGCONFIG # ---------------- AC_DEFUN([_LT_AC_TAGCONFIG], -[AC_ARG_WITH([tags], +[AC_REQUIRE([LT_AC_PROG_SED])dnl +AC_ARG_WITH([tags], [ --with-tags[=TAGS] include additional configurations [automatic] ], [tagnames="$withval"]) @@ -4657,6 +4812,9 @@ if test -f "$ltmain" && test -n "$tagnames"; then AC_MSG_WARN([using \`LTCC=$LTCC', extracted from \`$ofile']) fi fi + if test -z "$LTCFLAGS"; then + eval "`$SHELL ${ofile} --config | grep '^LTCFLAGS='`" + fi # Extract list of available tagged configurations in $ofile. # Note that this assumes the entire list is on one line. @@ -4692,26 +4850,6 @@ if test -f "$ltmain" && test -n "$tagnames"; then 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]) ;; @@ -4786,7 +4924,7 @@ changequote([, ])dnl # AC_DISABLE_SHARED # ----------------- -#- set the default shared flag to --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) @@ -4885,8 +5023,6 @@ pic_mode=ifelse($#,1,$1,default) # 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. ifdef([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 @@ -4900,7 +5036,7 @@ ifdef([AC_PROG_EGREP], [], [AC_DEFUN([AC_PROG_EGREP], # AC_PATH_TOOL_PREFIX # ------------------- -# find a file program which can recognise shared library +# find a file program which can recognize shared library AC_DEFUN([AC_PATH_TOOL_PREFIX], [AC_REQUIRE([AC_PROG_EGREP])dnl AC_MSG_CHECKING([for $1]) @@ -4963,7 +5099,7 @@ fi # AC_PATH_MAGIC # ------------- -# find a file program which can recognise a shared library +# find a file program which can recognize 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 @@ -5095,7 +5231,7 @@ reload_cmds='$LD$reload_flag -o $output$reload_objs' case $host_os in darwin*) if test "$GCC" = yes; then - reload_cmds='$CC -nostdlib ${wl}-r -o $output$reload_objs' + reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' else reload_cmds='$LD$reload_flag -o $output$reload_objs' fi @@ -5109,7 +5245,7 @@ esac # 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], +[AC_CACHE_CHECK([how to recognize dependent libraries], lt_cv_deplibs_check_method, [lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= @@ -5126,7 +5262,7 @@ lt_cv_deplibs_check_method='unknown' # whether `pass_all' will *always* work, you probably want this one. case $host_os in -aix4* | aix5*) +aix[[4-9]]*) lt_cv_deplibs_check_method=pass_all ;; @@ -5148,16 +5284,22 @@ cygwin*) 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' + # func_win32_libid shell function, so use a weaker test based on 'objdump', + # unless we find 'file', for example because we are cross-compiling. + if ( file / ) >/dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; -freebsd* | kfreebsd*-gnu | dragonfly*) +freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then case $host_cpu in i*86 ) @@ -5195,6 +5337,11 @@ hpux10.20* | hpux11*) esac ;; +interix[[3-9]]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' + ;; + irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; @@ -5206,7 +5353,7 @@ irix5* | irix6* | nonstopux*) ;; # This must be Linux ELF. -linux*) +linux* | k*bsd*-gnu) lt_cv_deplibs_check_method=pass_all ;; @@ -5240,7 +5387,7 @@ osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; -sco3.2v5*) +rdos*) lt_cv_deplibs_check_method=pass_all ;; @@ -5248,7 +5395,7 @@ solaris*) lt_cv_deplibs_check_method=pass_all ;; -sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) +sysv4 | sysv4.3*) 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]]' @@ -5269,10 +5416,13 @@ sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) siemens) lt_cv_deplibs_check_method=pass_all ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; esac ;; -sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7* | sysv4*uw2*) +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; esac @@ -5292,36 +5442,43 @@ AC_DEFUN([AC_PROG_NM], # 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" + lt_nm_to_check="${ac_tool_prefix}nm" + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/$lt_tmp_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 ;; *) - 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 + 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 - esac - fi + fi + done + IFS="$lt_save_ifs" done - IFS="$lt_save_ifs" test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm fi]) NM="$lt_cv_path_NM" @@ -5427,7 +5584,7 @@ _LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}CXX]) ])# _LT_AC_LANG_CXX # _LT_AC_PROG_CXXCPP -# --------------- +# ------------------ AC_DEFUN([_LT_AC_PROG_CXXCPP], [ AC_REQUIRE([AC_PROG_CXX]) @@ -5438,52 +5595,6 @@ if test -n "$CXX" && ( test "X$CXX" != "Xno" && fi ])# _LT_AC_PROG_CXXCPP -# 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 @@ -5503,10 +5614,10 @@ 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" +lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests -lt_simple_link_test_code='int main(){return(0);}\n' +lt_simple_link_test_code='int main(){return(0);}' _LT_AC_SYS_COMPILER @@ -5514,37 +5625,6 @@ _LT_AC_SYS_COMPILER _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE -# -# 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)=]) - - ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly @@ -5557,9 +5637,9 @@ 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_DLOPEN_SELF -# Report which librarie types wil actually be built +# Report which library types will actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) @@ -5577,7 +5657,7 @@ aix3*) fi ;; -aix4* | aix5*) +aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi @@ -5619,6 +5699,7 @@ _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_shlibpath_var, $1)=unsupported _LT_AC_TAGVAR(hardcode_automatic, $1)=no _LT_AC_TAGVAR(module_cmds, $1)= _LT_AC_TAGVAR(module_expsym_cmds, $1)= @@ -5634,6 +5715,7 @@ _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(compiler_lib_search_dirs, $1)= # Source file extension for C++ test sources. ac_ext=cpp @@ -5643,10 +5725,10 @@ 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" +lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests -lt_simple_link_test_code='int main(int, char *[]) { return(0); }\n' +lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_AC_SYS_COMPILER @@ -5743,7 +5825,7 @@ case $host_os in # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; - aix4* | aix5*) + aix[[4-9]]*) 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. @@ -5756,7 +5838,7 @@ case $host_os in # 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*) + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) @@ -5765,6 +5847,7 @@ case $host_os in ;; esac done + ;; esac exp_sym_flag='-bexport' @@ -5791,7 +5874,7 @@ case $host_os in 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 @@ -5802,6 +5885,7 @@ case $host_os in _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= fi + ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then @@ -5833,12 +5917,12 @@ case $host_os in _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" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${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" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_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 @@ -5847,16 +5931,26 @@ case $host_os in # -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(whole_archive_flag_spec, $1)='$convenience' _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its 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' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach 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 + ;; + chorus*) case $cc_basename in *) @@ -5866,7 +5960,6 @@ case $host_os in esac ;; - cygwin* | mingw* | pw32*) # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. @@ -5876,7 +5969,7 @@ case $host_os in _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' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $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 @@ -5885,65 +5978,37 @@ case $host_os in 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' + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; darwin* | rhapsody*) - case $host_os in - rhapsody* | darwin1.[[012]]) - _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress' - ;; - *) # Darwin 1.3 on - if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then - _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' - else - case ${MACOSX_DEPLOYMENT_TARGET} in - 10.[[012]]) - _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' - ;; - 10.*) - _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup' - ;; - esac - fi - ;; - esac _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no _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)='' _LT_AC_TAGVAR(link_all_deplibs, $1)=yes - - if test "$GXX" = yes ; then - lt_int_apple_cc_single_mod=no + _LT_AC_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" + if test "$GXX" = yes ; then output_verbose_link_cmd='echo' - if $CC -dumpspecs 2>&1 | $EGREP 'single_module' >/dev/null ; then - lt_int_apple_cc_single_mod=yes + _LT_AC_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + _LT_AC_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + _LT_AC_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + if test "$lt_cv_apple_cc_single_mod" != "yes"; then + _LT_AC_TAGVAR(archive_cmds, $1)="\$CC -r -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${_lt_dsymutil}" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -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${_lt_dar_export_syms}${_lt_dsymutil}" 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 -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 $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 lds - 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 -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}' else case $cc_basename in xlc*) output_verbose_link_cmd='echo' - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring' _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 lds - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~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}' ;; *) @@ -5977,7 +6042,7 @@ case $host_os in freebsd-elf*) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no ;; - freebsd* | kfreebsd*-gnu | dragonfly*) + freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions _LT_AC_TAGVAR(ld_shlibs, $1)=yes @@ -6022,33 +6087,20 @@ case $host_os in ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + 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' - ;; + hppa*64*|ia64*) ;; *) - _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*) + hppa*64*|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 @@ -6065,10 +6117,13 @@ case $host_os in ;; aCC*) case $host_cpu in - hppa*64*|ia64*) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' + hppa*64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; - *) + ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) _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 @@ -6086,8 +6141,11 @@ case $host_os in 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' + hppa*64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _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' @@ -6101,6 +6159,20 @@ case $host_os in ;; esac ;; + interix[[3-9]]*) + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; irix5* | irix6*) case $cc_basename in CC*) @@ -6127,7 +6199,7 @@ case $host_os in _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: ;; - linux*) + linux* | k*bsd*-gnu) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler @@ -6179,7 +6251,7 @@ case $host_os in _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' ;; - pgCC*) + pgCC* | pgcpp*) # Portland Group C++ compiler _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' @@ -6207,6 +6279,29 @@ case $host_os in # 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' ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='echo' + + # 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' + ;; + esac + ;; esac ;; lynxos*) @@ -6245,16 +6340,20 @@ case $host_os in _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; openbsd*) - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + if test -f /usr/libexec/ld.so; then + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + fi + output_verbose_link_cmd='echo' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no fi - output_verbose_link_cmd='echo' ;; osf3*) case $cc_basename in @@ -6383,19 +6482,6 @@ case $host_os in # 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*) @@ -6418,26 +6504,21 @@ case $host_os in case $cc_basename in CC*) # Sun C++ 4.2, 5.x and Centerline C++ - _LT_AC_TAGVAR(archive_cmds_need_lc,$1)=yes + _LT_AC_TAGVAR(archive_cmds_need_lc,$1)=yes _LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs' - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -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} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + $CC -G${allow_undefined_flag} ${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. We must also pass each convience library through - # to the system linker between allextract/defaultextract. - # The C++ compiler will combine linker options so we - # cannot just pass the convience library names through - # without $wl. + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; esac _LT_AC_TAGVAR(link_all_deplibs, $1)=yes @@ -6484,12 +6565,69 @@ case $host_os in fi _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + ;; + esac fi ;; esac ;; - sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7*) + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + # So that behaviour is only enabled if SCOABSPATH is set to a + # non-empty value in the environment. Most likely only useful for + # creating official distributions of packages. + # This is a hack until libtool officially supports absolute path + # names for shared libraries. + _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac ;; tandem*) case $cc_basename in @@ -6530,8 +6668,6 @@ 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) @@ -6549,12 +6685,13 @@ 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],[ +AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP], +[AC_REQUIRE([LT_AC_PROG_SED])dnl 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 @@ -6679,239 +6816,72 @@ fi $rm -f confest.$objext +_LT_AC_TAGVAR(compiler_lib_search_dirs, $1)= +if test -n "$_LT_AC_TAGVAR(compiler_lib_search_path, $1)"; then + _LT_AC_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_AC_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` +fi + # PORTME: override above test on systems where it is broken ifelse([$1],[CXX], [case $host_os in +interix[[3-9]]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + _LT_AC_TAGVAR(predep_objects,$1)= + _LT_AC_TAGVAR(postdep_objects,$1)= + _LT_AC_TAGVAR(postdeps,$1)= + ;; + +linux*) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + # + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + if test "$solaris_use_stlport4" != yes; then + _LT_AC_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' + fi + ;; + esac + ;; + solaris*) case $cc_basename in CC*) + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. - _LT_AC_TAGVAR(postdeps,$1)='-lCstd -lCrun' + if test "$solaris_use_stlport4" != yes; then + _LT_AC_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' + fi ;; esac + ;; esac ]) - 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_SAVE -#AC_LANG_FORTRAN77 -# -#_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 -# -## save warnings/boilerplate of simple test code -#_LT_COMPILER_BOILERPLATE -#_LT_LINKER_BOILERPLATE -# -## Allow CC to be a program name with arguments. -#lt_save_CC="$CC" -#CC=${F77-"f77"} -#compiler=$CC -#_LT_AC_TAGVAR(compiler, $1)=$CC -#_LT_CC_BASENAME([$compiler]) -# -#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 -# ;; -#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_RESTORE -#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 -# -## save warnings/boilerplate of simple test code -#_LT_COMPILER_BOILERPLATE -#_LT_LINKER_BOILERPLATE -# -## Allow CC to be a program name with arguments. -#lt_save_CC="$CC" -#CC=${GCJ-"gcj"} -#compiler=$CC -#_LT_AC_TAGVAR(compiler, $1)=$CC -#_LT_CC_BASENAME([$compiler]) -# -## GCJ did not exist at the time GCC didn't implicitly link libc in. -#_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no -# -#_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds -# -### CAVEAT EMPTOR: -### There is no encapsulation within the following macros, do not change -### the running order or otherwise move them around unless you know exactly -### what you are doing... -#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 -# -## save warnings/boilerplate of simple test code -#_LT_COMPILER_BOILERPLATE -#_LT_LINKER_BOILERPLATE -# -## 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_CC_BASENAME([$compiler]) -#_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 @@ -6932,7 +6902,7 @@ if test -f "$ltmain"; then # 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 \ + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ SED SHELL STRIP \ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ @@ -6959,6 +6929,7 @@ if test -f "$ltmain"; then _LT_AC_TAGVAR(predeps, $1) \ _LT_AC_TAGVAR(postdeps, $1) \ _LT_AC_TAGVAR(compiler_lib_search_path, $1) \ + _LT_AC_TAGVAR(compiler_lib_search_dirs, $1) \ _LT_AC_TAGVAR(archive_cmds, $1) \ _LT_AC_TAGVAR(archive_expsym_cmds, $1) \ _LT_AC_TAGVAR(postinstall_cmds, $1) \ @@ -6974,6 +6945,7 @@ if test -f "$ltmain"; then _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(fix_srcfile_path, $1) \ _LT_AC_TAGVAR(exclude_expsyms, $1) \ _LT_AC_TAGVAR(include_expsyms, $1); do @@ -7021,7 +6993,7 @@ ifelse([$1], [], # 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 +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 # Free Software Foundation, Inc. # # This file is part of GNU Libtool: @@ -7102,6 +7074,9 @@ AR_FLAGS=$lt_AR_FLAGS # A C compiler. LTCC=$lt_LTCC +# LTCC compiler flags. +LTCFLAGS=$lt_LTCFLAGS + # A language-specific compiler. CC=$lt_[]_LT_AC_TAGVAR(compiler, $1) @@ -7255,6 +7230,10 @@ predeps=$lt_[]_LT_AC_TAGVAR(predeps, $1) # shared library. postdeps=$lt_[]_LT_AC_TAGVAR(postdeps, $1) +# The directories searched by this compiler when creating a shared +# library +compiler_lib_search_dirs=$lt_[]_LT_AC_TAGVAR(compiler_lib_search_dirs, $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) @@ -7343,7 +7322,7 @@ sys_lib_search_path_spec=$lt_sys_lib_search_path_spec 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)" +fix_srcfile_path=$lt_fix_srcfile_path # Set to yes if exported symbols are required. always_export_symbols=$_LT_AC_TAGVAR(always_export_symbols, $1) @@ -7426,6 +7405,7 @@ fi # --------------------------------- AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_REQUIRE([AC_CANONICAL_HOST]) +AC_REQUIRE([LT_AC_PROG_SED]) AC_REQUIRE([AC_PROG_NM]) AC_REQUIRE([AC_OBJEXT]) # Check for command to grab the raw symbol name followed by C symbol from nm. @@ -7462,7 +7442,7 @@ hpux*) # Its linker distinguishes data from code symbols 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'" ;; -linux*) +linux* | k*bsd*-gnu) if test "$host_cpu" = ia64; then symcode='[[ABCDGIRSTW]]' lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" @@ -7475,9 +7455,18 @@ irix* | nonstopux*) osf*) symcode='[[BCDEGQRST]]' ;; -solaris* | sysv5*) +solaris*) symcode='[[BDRT]]' ;; +sco3.2v5*) + symcode='[[DT]]' + ;; +sysv4.2uw2*) + symcode='[[DT]]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[[ABDT]]' + ;; sysv4) symcode='[[DFNSTU]]' ;; @@ -7594,7 +7583,7 @@ EOF echo "$progname: failed program was:" >&5 cat conftest.$ac_ext >&5 fi - rm -f conftest* conftst* + rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then @@ -7643,13 +7632,15 @@ AC_MSG_CHECKING([for $compiler option to produce PIC]) # like `-m68040'. _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; - beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; - mingw* | os2* | pw32*) + mingw* | cygwin* | 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' + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform @@ -7660,6 +7651,10 @@ AC_MSG_CHECKING([for $compiler option to produce PIC]) # DJGPP does not support shared libraries at all _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= ;; + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; sysv4*MP*) if test -d /usr/nec; then _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic @@ -7682,7 +7677,7 @@ AC_MSG_CHECKING([for $compiler option to produce PIC]) esac else case $host_os in - aix4* | aix5*) + aix[[4-9]]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor @@ -7722,21 +7717,21 @@ AC_MSG_CHECKING([for $compiler option to produce PIC]) ;; esac ;; - freebsd* | kfreebsd*-gnu | dragonfly*) + freebsd* | dragonfly*) # 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" + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${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" + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default @@ -7750,6 +7745,10 @@ AC_MSG_CHECKING([for $compiler option to produce PIC]) ;; esac ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) @@ -7761,7 +7760,7 @@ AC_MSG_CHECKING([for $compiler option to produce PIC]) ;; esac ;; - linux*) + linux* | k*bsd*-gnu) case $cc_basename in KCC*) # KAI C++ Compiler @@ -7780,7 +7779,7 @@ AC_MSG_CHECKING([for $compiler option to produce PIC]) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; - pgCC*) + pgCC* | pgcpp*) # Portland Group C++ compiler. _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' @@ -7794,6 +7793,14 @@ AC_MSG_CHECKING([for $compiler option to produce PIC]) _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _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 ' + ;; + esac ;; esac ;; @@ -7835,15 +7842,6 @@ AC_MSG_CHECKING([for $compiler option to produce PIC]) ;; psos*) ;; - sco*) - case $cc_basename in - CC*) - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - *) - ;; - esac - ;; solaris*) case $cc_basename in CC*) @@ -7885,7 +7883,14 @@ AC_MSG_CHECKING([for $compiler option to produce PIC]) ;; esac ;; - unixware*) + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + _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' + ;; + esac ;; vxworks*) ;; @@ -7916,14 +7921,16 @@ AC_MSG_CHECKING([for $compiler option to produce PIC]) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; - beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; - mingw* | pw32* | os2*) + mingw* | cygwin* | 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' + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' ;; darwin* | rhapsody*) @@ -7932,6 +7939,11 @@ AC_MSG_CHECKING([for $compiler option to produce PIC]) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. @@ -7985,10 +7997,10 @@ AC_MSG_CHECKING([for $compiler option to produce PIC]) esac ;; - mingw* | pw32* | os2*) + mingw* | cygwin* | 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' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) @@ -8018,7 +8030,7 @@ AC_MSG_CHECKING([for $compiler option to produce PIC]) _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; - linux*) + linux* | k*bsd*-gnu) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) @@ -8045,6 +8057,22 @@ AC_MSG_CHECKING([for $compiler option to produce PIC]) # All Alpha code is PIC. _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C 5.9 + _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)='-Wl,' + ;; + *Sun\ F*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + _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)='' + ;; + esac + ;; esac ;; @@ -8054,9 +8082,8 @@ AC_MSG_CHECKING([for $compiler option to produce 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' + rdos*) + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; solaris*) @@ -8076,7 +8103,7 @@ AC_MSG_CHECKING([for $compiler option to produce PIC]) _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; - sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + sysv4 | sysv4.2uw2* | sysv4.3*) _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' @@ -8089,6 +8116,12 @@ AC_MSG_CHECKING([for $compiler option to produce PIC]) fi ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + _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' + ;; + unicos*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no @@ -8112,7 +8145,7 @@ AC_MSG_RESULT([$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)]) # 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_cv_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 "" | " "*) ;; @@ -8130,6 +8163,16 @@ case $host_os in _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])" ;; esac + +# +# Check to make sure the static flag actually works. +# +wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_AC_TAGVAR(lt_prog_compiler_static, $1)\" +AC_LIBTOOL_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], + _LT_AC_TAGVAR(lt_cv_prog_compiler_static_works, $1), + $lt_tmp_static_flag, + [], + [_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=]) ]) @@ -8137,11 +8180,12 @@ esac # ------------------------------------ # 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]) +[AC_REQUIRE([LT_AC_PROG_SED])dnl +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*) + aix[[4-9]]*) # 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 @@ -8154,12 +8198,13 @@ ifelse([$1],[CXX],[ _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 '\''/^[[BCDGRS]] /s/.* \([[^ ]]*\)/\1 DATA/;/^.* __nm__/s/^.* __nm__\([[^ ]]*\) [[^ ]]*/\1 DATA/;/^I /d;/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;/^.*[[ ]]__nm__/s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[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 + _LT_AC_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] ],[ runpath_var= _LT_AC_TAGVAR(allow_undefined_flag, $1)= @@ -8190,12 +8235,14 @@ ifelse([$1],[CXX],[ # 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_" + _LT_AC_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] # 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. + # Exclude shared library initialization/finalization symbols. +dnl Note also adjust exclude_expsyms for C++ above. extract_expsyms_cmds= # Just being paranoid about ensuring that cc_basename is set. _LT_CC_BASENAME([$compiler]) @@ -8208,6 +8255,10 @@ ifelse([$1],[CXX],[ with_gnu_ld=no fi ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; openbsd*) with_gnu_ld=no ;; @@ -8217,7 +8268,7 @@ ifelse([$1],[CXX],[ if test "$with_gnu_ld" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' - + # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. @@ -8238,10 +8289,10 @@ ifelse([$1],[CXX],[ *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac - + # See if GNU ld supports shared libraries. case $host_os in - aix3* | aix4* | aix5*) + aix[[3-9]]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then _LT_AC_TAGVAR(ld_shlibs, $1)=no @@ -8289,10 +8340,10 @@ EOF _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 '\''/^[[BCDGRS]] /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 -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/'\'' -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' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $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 @@ -8301,13 +8352,28 @@ EOF 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' + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; - linux*) + interix[[3-9]]*) + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | k*bsd*-gnu) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then tmp_addflag= case $cc_basename,$host_cpu in @@ -8315,7 +8381,7 @@ EOF _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; - pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers + pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 @@ -8325,13 +8391,22 @@ EOF ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; esac - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + *) + tmp_sharedflag='-shared' ;; + esac + _LT_AC_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' 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'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi else _LT_AC_TAGVAR(ld_shlibs, $1)=no @@ -8348,7 +8423,7 @@ EOF fi ;; - solaris* | sysv5*) + solaris*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then _LT_AC_TAGVAR(ld_shlibs, $1)=no cat <&2 @@ -8369,6 +8444,33 @@ EOF fi ;; + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + sunos4*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= @@ -8402,14 +8504,14 @@ EOF # 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 + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported fi ;; - aix4* | aix5*) + aix[[4-9]]*) 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. @@ -8429,13 +8531,14 @@ EOF # 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*) + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) 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' @@ -8462,7 +8565,7 @@ EOF 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 @@ -8473,6 +8576,7 @@ EOF _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= fi + ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then @@ -8485,11 +8589,11 @@ EOF # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else - if test "$aix_use_runtimelinking" = yes; then + if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' - fi + fi fi fi @@ -8503,12 +8607,12 @@ EOF # 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" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${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" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_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 @@ -8517,13 +8621,11 @@ EOF # -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(whole_archive_flag_spec, $1)='$convenience' _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its 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' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; @@ -8556,7 +8658,7 @@ EOF # 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' + _LT_AC_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' _LT_AC_TAGVAR(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`' _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; @@ -8589,19 +8691,18 @@ EOF _LT_AC_TAGVAR(link_all_deplibs, $1)=yes if test "$GCC" = yes ; then 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 lds - _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(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + _LT_AC_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + _LT_AC_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" else case $cc_basename in xlc*) output_verbose_link_cmd='echo' - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring' _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 lds - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~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}' ;; *) @@ -8641,7 +8742,7 @@ EOF ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. - freebsd* | kfreebsd*-gnu | dragonfly*) + freebsd* | dragonfly*) _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 @@ -8664,47 +8765,62 @@ EOF _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; - hpux10* | hpux11*) + hpux10*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + _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 + fi + ;; + + hpux11*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then case $host_cpu in - hppa*64*|ia64*) + hppa*64*) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; + ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -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' + hppa*64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac fi if test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + case $host_cpu in - hppa*64*) - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + hppa*64*|ia64*) _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' @@ -8748,24 +8864,28 @@ EOF ;; 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(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + if test -f /usr/libexec/ld.so; then + _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(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + _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 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 + _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; @@ -8806,14 +8926,6 @@ EOF _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 @@ -8832,17 +8944,16 @@ EOF case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) - # The compiler driver will combine linker options so we - # cannot just pass the convience library names through - # without $wl, iff we do not link with $LD. - # Luckily, gcc supports the same syntax we need for Sun Studio. + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. GCC discards it without `$wl', + # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) - case $wlarc in - '') - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; - *) - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;; - esac ;; + if test "$GCC" = yes; then + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + else + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + fi + ;; esac _LT_AC_TAGVAR(link_all_deplibs, $1)=yes ;; @@ -8899,36 +9010,45 @@ EOF 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 + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - hardcode_runpath_var=yes - runpath_var=LD_RUN_PATH - ;; + 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' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$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' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$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)= + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi ;; uts4*) @@ -8946,11 +9066,6 @@ EOF 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? # @@ -8970,7 +9085,7 @@ x|xyes) # 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 + echo "$lt_simple_compile_test_code" > conftest.$ac_ext if AC_TRY_EVAL(ac_compile) 2>conftest.err; then soname=conftest @@ -8978,6 +9093,7 @@ x|xyes) libobjs=conftest.$ac_objext deplibs= wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) + pic_flag=$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) compiler_flags=-v linker_flags=-v verstring= @@ -9062,16 +9178,6 @@ 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 # diff --git a/build/libtool.m4 b/build/libtool.m4 index 064582c5c..268cad9d3 100644 --- a/build/libtool.m4 +++ b/build/libtool.m4 @@ -1,13 +1,13 @@ # libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- -## Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005 -## Free Software Foundation, Inc. +## Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007, +## 2008 Free Software Foundation, Inc. ## Originally by Gordon Matzigkeit , 1996 ## ## 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. -# serial 47 AC_PROG_LIBTOOL +# serial 52 AC_PROG_LIBTOOL ifdef([AC_ACVERSION],[ # autoconf 2.13 compatibility @@ -44,30 +44,6 @@ dnl immediately, otherwise, hook it in at the end of AC_PROG_CXX. [AC_LIBTOOL_CXX], [define([AC_PROG_CXX], defn([AC_PROG_CXX])[AC_LIBTOOL_CXX ])]) - -dnl dnl And a similar setup for Fortran 77 support -dnl AC_PROVIDE_IFELSE([AC_PROG_F77], -dnl [AC_LIBTOOL_F77], -dnl [define([AC_PROG_F77], defn([AC_PROG_F77])[AC_LIBTOOL_F77 -dnl ])]) - -dnl dnl Quote A][M_PROG_GCJ so that aclocal doesn't bring it in needlessly. -dnl dnl If either AC_PROG_GCJ or A][M_PROG_GCJ have already been expanded, run -dnl dnl AC_LIBTOOL_GCJ immediately, otherwise, hook it in at the end of both. -dnl AC_PROVIDE_IFELSE([AC_PROG_GCJ], -dnl [AC_LIBTOOL_GCJ], -dnl [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], -dnl [AC_LIBTOOL_GCJ], -dnl [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ], -dnl [AC_LIBTOOL_GCJ], -dnl [ifdef([AC_PROG_GCJ], -dnl [define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[AC_LIBTOOL_GCJ])]) -dnl ifdef([A][M_PROG_GCJ], -dnl [define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[AC_LIBTOOL_GCJ])]) -dnl ifdef([LT_AC_PROG_GCJ], -dnl [define([LT_AC_PROG_GCJ], -dnl defn([LT_AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])])]) -dnl ]) ])# AC_PROG_LIBTOOL @@ -76,8 +52,6 @@ dnl ]) AC_DEFUN([_AC_PROG_LIBTOOL], [AC_REQUIRE([AC_LIBTOOL_SETUP])dnl AC_BEFORE([$0],[AC_LIBTOOL_CXX])dnl -dnl AC_BEFORE([$0],[AC_LIBTOOL_F77])dnl -dnl AC_BEFORE([$0],[AC_LIBTOOL_GCJ])dnl # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" @@ -111,7 +85,6 @@ AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl 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 @@ -173,6 +146,7 @@ test -z "$AR_FLAGS" && AR_FLAGS=cru test -z "$AS" && AS=as test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$DLLTOOL" && DLLTOOL=dlltool test -z "$LD" && LD=ld test -z "$LN_S" && LN_S="ln -s" @@ -185,17 +159,17 @@ 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_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' 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="$old_postinstall_cmds~\$RANLIB -t \$oldlib" ;; *) - old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds" + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" @@ -212,6 +186,8 @@ file_magic*) ;; esac +_LT_REQUIRED_DARWIN_CHECKS + 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) @@ -241,6 +217,9 @@ AC_DEFUN([_LT_AC_SYS_COMPILER], # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + # Allow CC to be a program name with arguments. compiler=$CC ])# _LT_AC_SYS_COMPILER @@ -267,9 +246,10 @@ cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` # Check for compiler boilerplate output or warnings with # the simple compiler test code. AC_DEFUN([_LT_COMPILER_BOILERPLATE], -[ac_outfile=conftest.$ac_objext -printf "$lt_simple_compile_test_code" >conftest.$ac_ext -eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d' >conftest.err +[AC_REQUIRE([LT_AC_PROG_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $rm conftest* ])# _LT_COMPILER_BOILERPLATE @@ -280,11 +260,12 @@ $rm conftest* # Check for linker boilerplate output or warnings with # the simple link test code. AC_DEFUN([_LT_LINKER_BOILERPLATE], -[ac_outfile=conftest.$ac_objext -printf "$lt_simple_link_test_code" >conftest.$ac_ext -eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d' >conftest.err +[AC_REQUIRE([LT_AC_PROG_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` -$rm conftest* +$rm -r conftest* ])# _LT_LINKER_BOILERPLATE @@ -300,7 +281,7 @@ int main() { ; return 0; } EOF if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then - ifelse([$1], , :, [$1 + ifelse([$1], , :, [$1 rm -rf conftest*]) else echo "configure: failed program was:" >&5 @@ -311,6 +292,75 @@ ifelse([$2], , , [$2 fi rm -f conftest*]) +# _LT_REQUIRED_DARWIN_CHECKS +# -------------------------- +# Check for some things on darwin +AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS],[ + case $host_os in + rhapsody* | darwin*) + AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) + AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) + + AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], + [lt_cv_apple_cc_single_mod=no + if test -z "${LT_MULTI_MODULE}"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + echo "int foo(void){return 1;}" > conftest.c + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib ${wl}-single_module conftest.c + if test -f libconftest.dylib; then + lt_cv_apple_cc_single_mod=yes + rm -rf libconftest.dylib* + fi + rm conftest.c + fi]) + AC_CACHE_CHECK([for -exported_symbols_list linker flag], + [lt_cv_ld_exported_symbols_list], + [lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + _LT_AC_TRY_LINK([lt_cv_ld_exported_symbols_list=yes],[lt_cv_ld_exported_symbols_list=no]) + LDFLAGS="$save_LDFLAGS" + ]) + case $host_os in + rhapsody* | darwin1.[[0123]]) + _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + darwin*) + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + 10.[[012]]*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test "$lt_cv_apple_cc_single_mod" = "yes"; then + _lt_dar_single_mod='$single_module' + fi + if test "$lt_cv_ld_exported_symbols_list" = "yes"; then + _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' + else + _lt_dar_export_syms="~$NMEDIT -s \$output_objdir/\${libname}-symbols.expsym \${lib}" + fi + if test "$DSYMUTIL" != ":"; then + _lt_dsymutil="~$DSYMUTIL \$lib || :" + else + _lt_dsymutil= + fi + ;; + esac +]) # _LT_AC_SYS_LIBPATH_AIX # ---------------------- @@ -321,12 +371,20 @@ rm -f conftest*]) # If we don't find anything, use the default library path according # to the aix ld manual. AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX], -[_LT_AC_TRY_LINK([ -aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'` +[AC_REQUIRE([LT_AC_PROG_SED])dnl +_LT_AC_TRY_LINK([ +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # 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=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +fi],[]) if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi ])# _LT_AC_SYS_LIBPATH_AIX @@ -557,13 +615,17 @@ ia64-*-hpux*) rm -rf conftest* ;; -x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) +x86_64-*kfreebsd*-gnu|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-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; @@ -580,6 +642,9 @@ x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) ;; *64-bit*) case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; @@ -613,6 +678,26 @@ x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) CFLAGS="$SAVE_CFLAGS" fi ;; +sparc*-*solaris*) + # 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 + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) LD="${LD-ld} -m elf64_sparc" ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], [*-*-cygwin* | *-*-mingw* | *-*-pw32*) AC_CHECK_TOOL(DLLTOOL, dlltool, false) @@ -636,7 +721,7 @@ AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], 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 + echo "$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. @@ -655,9 +740,9 @@ AC_CACHE_CHECK([$1], [$2], 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 other than the usual output. - $echo "X$_lt_compiler_boilerplate" | $Xsed >conftest.exp - $SED '/^$/d' conftest.err >conftest.er2 - if test ! -s conftest.err || diff conftest.exp conftest.er2 >/dev/null; then + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi fi @@ -677,19 +762,20 @@ fi # ------------------------------------------------------------ # Check whether the given compiler option works AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], -[AC_CACHE_CHECK([$1], [$2], +[AC_REQUIRE([LT_AC_PROG_SED])dnl +AC_CACHE_CHECK([$1], [$2], [$2=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $3" - printf "$lt_simple_link_test_code" > conftest.$ac_ext + echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker 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 - $echo "X$_lt_linker_boilerplate" | $Xsed > conftest.exp - $SED '/^$/d' conftest.err >conftest.er2 + $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi @@ -697,7 +783,7 @@ AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], $2=yes fi fi - $rm conftest* + $rm -r conftest* LDFLAGS="$save_LDFLAGS" ]) @@ -758,44 +844,64 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else - lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 - # + # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; *) - # 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. - SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} - while (test "X"`$SHELL [$]0 --fallback-echo "X$teststring" 2>/dev/null` \ + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + while (test "X"`$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` + 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` + fi ;; esac ]) @@ -808,7 +914,7 @@ fi # _LT_AC_CHECK_DLFCN -# -------------------- +# ------------------ AC_DEFUN([_LT_AC_CHECK_DLFCN], [AC_CHECK_HEADERS(dlfcn.h)dnl ])# _LT_AC_CHECK_DLFCN @@ -816,7 +922,7 @@ AC_DEFUN([_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 : @@ -882,6 +988,8 @@ int main () else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; /* dlclose (self); */ } + else + puts (dlerror ()); exit (status); }] @@ -892,7 +1000,7 @@ EOF case x$lt_status in x$lt_dlno_uscore) $1 ;; x$lt_dlneed_uscore) $2 ;; - x$lt_unknown|x*) $3 ;; + x$lt_dlunknown|x*) $3 ;; esac else : # compilation failed @@ -904,7 +1012,7 @@ rm -fr conftest* # AC_LIBTOOL_DLOPEN_SELF -# ------------------- +# ---------------------- AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl if test "x$enable_dlopen" != xyes; then @@ -946,7 +1054,7 @@ else 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"], + [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], [AC_CHECK_FUNC([dlopen], [lt_cv_dlopen="dlopen"], [AC_CHECK_LIB([dl], [dlopen], @@ -954,7 +1062,7 @@ else [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"]) + [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) ]) ]) ]) @@ -975,7 +1083,7 @@ else test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" - eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" @@ -988,7 +1096,7 @@ else ]) if test "x$lt_cv_dlopen_self" = xyes; then - LDFLAGS="$LDFLAGS $link_static_flag" + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], lt_cv_dlopen_self_static, [dnl _LT_AC_TRY_DLOPEN_SELF( @@ -1020,7 +1128,8 @@ fi # --------------------------------- # 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_REQUIRE([LT_AC_PROG_SED])dnl +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 @@ -1028,7 +1137,7 @@ AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], mkdir conftest cd conftest mkdir out - printf "$lt_simple_compile_test_code" > conftest.$ac_ext + echo "$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 @@ -1048,9 +1157,9 @@ AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings - $echo "X$_lt_compiler_boilerplate" | $Xsed > out/conftest.exp - $SED '/^$/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.err || diff out/conftest.exp out/conftest.er2 >/dev/null; then + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes fi fi @@ -1168,6 +1277,7 @@ else darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" + old_striplib="$STRIP -S" AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) @@ -1185,7 +1295,8 @@ fi # ----------------------------- # PORTME Fill in your ld.so characteristics AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER], -[AC_MSG_CHECKING([dynamic linker characteristics]) +[AC_REQUIRE([LT_AC_PROG_SED])dnl +AC_MSG_CHECKING([dynamic linker characteristics]) library_names_spec= libname_spec='lib$name' soname_spec= @@ -1199,20 +1310,58 @@ shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" +ifelse($1,[],[ 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 + case $host_os in + darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; + *) lt_awk_arg="/^libraries:/" ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$lt_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'` + lt_search_path_spec=`echo "$lt_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"` + lt_search_path_spec=`echo "$lt_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary. + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path/$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" + else + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`echo $lt_tmp_lt_search_path_spec | awk ' +BEGIN {RS=" "; FS="/|\n";} { + lt_foo=""; + lt_count=0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo="/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[[lt_foo]]++; } + if (lt_freq[[lt_foo]] == 1) { print lt_foo; } +}'` + sys_lib_search_path_spec=`echo $lt_search_path_spec` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" -fi +fi]) need_lib_prefix=unknown hardcode_into_libs=no @@ -1230,7 +1379,7 @@ aix3*) soname_spec='${libname}${release}${shared_ext}$major' ;; -aix4* | aix5*) +aix[[4-9]]*) version_type=linux need_lib_prefix=no need_version=no @@ -1369,12 +1518,8 @@ darwin* | rhapsody*) 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 + ifelse([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; @@ -1391,18 +1536,6 @@ 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* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. @@ -1435,10 +1568,15 @@ freebsd* | dragonfly*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; - *) # from 3.2 on + freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ + freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; esac ;; @@ -1498,6 +1636,18 @@ hpux9* | hpux10* | hpux11*) postinstall_cmds='chmod 555 $lib' ;; +interix[[3-9]]*) + 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' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; @@ -1541,7 +1691,7 @@ linux*oldld* | linux*aout* | linux*coff*) ;; # This must be Linux ELF. -linux*) +linux* | k*bsd*-gnu) version_type=linux need_lib_prefix=no need_version=no @@ -1555,27 +1705,10 @@ linux*) # 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" + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on @@ -1587,18 +1720,6 @@ linux*) 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 @@ -1636,6 +1757,7 @@ nto-qnx*) openbsd*) version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in @@ -1679,11 +1801,8 @@ osf3* | osf4* | osf5*) 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 +rdos*) + dynamic_linker=no ;; solaris*) @@ -1711,7 +1830,7 @@ sunos4*) need_version=yes ;; -sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) +sysv4 | sysv4.3*) 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' @@ -1744,6 +1863,29 @@ sysv4*MP*) fi ;; +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + shlibpath_overrides_runpath=no + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + shlibpath_overrides_runpath=yes + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' @@ -1757,13 +1899,26 @@ uts4*) esac AC_MSG_RESULT([$dynamic_linker]) test "$dynamic_linker" = no && can_build_shared=no + +AC_CACHE_VAL([lt_cv_sys_lib_search_path_spec], +[lt_cv_sys_lib_search_path_spec="$sys_lib_search_path_spec"]) +sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +AC_CACHE_VAL([lt_cv_sys_lib_dlsearch_path_spec], +[lt_cv_sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec"]) +sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" + +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 ])# AC_LIBTOOL_SYS_DYNAMIC_LINKER # _LT_AC_TAGCONFIG # ---------------- AC_DEFUN([_LT_AC_TAGCONFIG], -[AC_ARG_WITH([tags], +[AC_REQUIRE([LT_AC_PROG_SED])dnl +AC_ARG_WITH([tags], [ --with-tags[=TAGS] include additional configurations [automatic] ], [tagnames="$withval"]) @@ -1781,6 +1936,9 @@ if test -f "$ltmain" && test -n "$tagnames"; then AC_MSG_WARN([using \`LTCC=$LTCC', extracted from \`$ofile']) fi fi + if test -z "$LTCFLAGS"; then + eval "`$SHELL ${ofile} --config | grep '^LTCFLAGS='`" + fi # Extract list of available tagged configurations in $ofile. # Note that this assumes the entire list is on one line. @@ -1816,26 +1974,6 @@ if test -f "$ltmain" && test -n "$tagnames"; then 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]) ;; @@ -1910,7 +2048,7 @@ changequote([, ])dnl # AC_DISABLE_SHARED # ----------------- -#- set the default shared flag to --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) @@ -2009,8 +2147,6 @@ pic_mode=ifelse($#,1,$1,default) # 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. ifdef([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 @@ -2024,7 +2160,7 @@ ifdef([AC_PROG_EGREP], [], [AC_DEFUN([AC_PROG_EGREP], # AC_PATH_TOOL_PREFIX # ------------------- -# find a file program which can recognise shared library +# find a file program which can recognize shared library AC_DEFUN([AC_PATH_TOOL_PREFIX], [AC_REQUIRE([AC_PROG_EGREP])dnl AC_MSG_CHECKING([for $1]) @@ -2087,7 +2223,7 @@ fi # AC_PATH_MAGIC # ------------- -# find a file program which can recognise a shared library +# find a file program which can recognize 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 @@ -2219,7 +2355,7 @@ reload_cmds='$LD$reload_flag -o $output$reload_objs' case $host_os in darwin*) if test "$GCC" = yes; then - reload_cmds='$CC -nostdlib ${wl}-r -o $output$reload_objs' + reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' else reload_cmds='$LD$reload_flag -o $output$reload_objs' fi @@ -2233,7 +2369,7 @@ esac # 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], +[AC_CACHE_CHECK([how to recognize dependent libraries], lt_cv_deplibs_check_method, [lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= @@ -2250,7 +2386,7 @@ lt_cv_deplibs_check_method='unknown' # whether `pass_all' will *always* work, you probably want this one. case $host_os in -aix4* | aix5*) +aix[[4-9]]*) lt_cv_deplibs_check_method=pass_all ;; @@ -2272,16 +2408,22 @@ cygwin*) 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' + # func_win32_libid shell function, so use a weaker test based on 'objdump', + # unless we find 'file', for example because we are cross-compiling. + if ( file / ) >/dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; -freebsd* | kfreebsd*-gnu | dragonfly*) +freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then case $host_cpu in i*86 ) @@ -2319,6 +2461,11 @@ hpux10.20* | hpux11*) esac ;; +interix[[3-9]]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' + ;; + irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; @@ -2330,7 +2477,7 @@ irix5* | irix6* | nonstopux*) ;; # This must be Linux ELF. -linux*) +linux* | k*bsd*-gnu) lt_cv_deplibs_check_method=pass_all ;; @@ -2364,7 +2511,7 @@ osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; -sco3.2v5*) +rdos*) lt_cv_deplibs_check_method=pass_all ;; @@ -2372,7 +2519,7 @@ solaris*) lt_cv_deplibs_check_method=pass_all ;; -sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) +sysv4 | sysv4.3*) 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]]' @@ -2393,10 +2540,13 @@ sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) siemens) lt_cv_deplibs_check_method=pass_all ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; esac ;; -sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7* | sysv4*uw2*) +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; esac @@ -2416,36 +2566,43 @@ AC_DEFUN([AC_PROG_NM], # 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" + lt_nm_to_check="${ac_tool_prefix}nm" + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/$lt_tmp_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 ;; *) - 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 + 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 - esac - fi + fi + done + IFS="$lt_save_ifs" done - IFS="$lt_save_ifs" test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm fi]) NM="$lt_cv_path_NM" @@ -2551,7 +2708,7 @@ _LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}CXX]) ])# _LT_AC_LANG_CXX # _LT_AC_PROG_CXXCPP -# --------------- +# ------------------ AC_DEFUN([_LT_AC_PROG_CXXCPP], [ AC_REQUIRE([AC_PROG_CXX]) @@ -2562,52 +2719,6 @@ if test -n "$CXX" && ( test "X$CXX" != "Xno" && fi ])# _LT_AC_PROG_CXXCPP -# 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 @@ -2627,10 +2738,10 @@ 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" +lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests -lt_simple_link_test_code='int main(){return(0);}\n' +lt_simple_link_test_code='int main(){return(0);}' _LT_AC_SYS_COMPILER @@ -2638,37 +2749,6 @@ _LT_AC_SYS_COMPILER _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE -# -# 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)=]) - - ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly @@ -2681,9 +2761,9 @@ 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_DLOPEN_SELF -# Report which librarie types wil actually be built +# Report which library types will actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) @@ -2701,7 +2781,7 @@ aix3*) fi ;; -aix4* | aix5*) +aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi @@ -2743,6 +2823,7 @@ _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_shlibpath_var, $1)=unsupported _LT_AC_TAGVAR(hardcode_automatic, $1)=no _LT_AC_TAGVAR(module_cmds, $1)= _LT_AC_TAGVAR(module_expsym_cmds, $1)= @@ -2758,6 +2839,7 @@ _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(compiler_lib_search_dirs, $1)= # Source file extension for C++ test sources. ac_ext=cpp @@ -2767,10 +2849,10 @@ 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" +lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests -lt_simple_link_test_code='int main(int, char *[]) { return(0); }\n' +lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_AC_SYS_COMPILER @@ -2867,7 +2949,7 @@ case $host_os in # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; - aix4* | aix5*) + aix[[4-9]]*) 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. @@ -2880,7 +2962,7 @@ case $host_os in # 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*) + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) @@ -2889,6 +2971,7 @@ case $host_os in ;; esac done + ;; esac exp_sym_flag='-bexport' @@ -2915,7 +2998,7 @@ case $host_os in 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 @@ -2926,6 +3009,7 @@ case $host_os in _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= fi + ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then @@ -2957,12 +3041,12 @@ case $host_os in _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" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${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" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_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 @@ -2971,16 +3055,26 @@ case $host_os in # -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(whole_archive_flag_spec, $1)='$convenience' _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its 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' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach 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 + ;; + chorus*) case $cc_basename in *) @@ -2990,7 +3084,6 @@ case $host_os in esac ;; - cygwin* | mingw* | pw32*) # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. @@ -3000,7 +3093,7 @@ case $host_os in _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' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $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 @@ -3009,65 +3102,37 @@ case $host_os in 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' + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; darwin* | rhapsody*) - case $host_os in - rhapsody* | darwin1.[[012]]) - _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress' - ;; - *) # Darwin 1.3 on - if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then - _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' - else - case ${MACOSX_DEPLOYMENT_TARGET} in - 10.[[012]]) - _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' - ;; - 10.*) - _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup' - ;; - esac - fi - ;; - esac _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no _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)='' _LT_AC_TAGVAR(link_all_deplibs, $1)=yes - - if test "$GXX" = yes ; then - lt_int_apple_cc_single_mod=no + _LT_AC_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" + if test "$GXX" = yes ; then output_verbose_link_cmd='echo' - if $CC -dumpspecs 2>&1 | $EGREP 'single_module' >/dev/null ; then - lt_int_apple_cc_single_mod=yes + _LT_AC_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + _LT_AC_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + _LT_AC_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + if test "$lt_cv_apple_cc_single_mod" != "yes"; then + _LT_AC_TAGVAR(archive_cmds, $1)="\$CC -r -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${_lt_dsymutil}" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -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${_lt_dar_export_syms}${_lt_dsymutil}" 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 -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 $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 lds - 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 -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}' else case $cc_basename in xlc*) output_verbose_link_cmd='echo' - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring' _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 lds - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~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}' ;; *) @@ -3101,7 +3166,7 @@ case $host_os in freebsd-elf*) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no ;; - freebsd* | kfreebsd*-gnu | dragonfly*) + freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions _LT_AC_TAGVAR(ld_shlibs, $1)=yes @@ -3146,33 +3211,20 @@ case $host_os in ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + 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' - ;; + hppa*64*|ia64*) ;; *) - _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*) + hppa*64*|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 @@ -3189,8 +3241,11 @@ case $host_os in ;; aCC*) case $host_cpu in - hppa*64*|ia64*) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' + hppa*64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _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' @@ -3210,8 +3265,11 @@ case $host_os in 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' + hppa*64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _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' @@ -3225,6 +3283,20 @@ case $host_os in ;; esac ;; + interix[[3-9]]*) + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; irix5* | irix6*) case $cc_basename in CC*) @@ -3251,7 +3323,7 @@ case $host_os in _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: ;; - linux*) + linux* | k*bsd*-gnu) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler @@ -3303,7 +3375,7 @@ case $host_os in _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' ;; - pgCC*) + pgCC* | pgcpp*) # Portland Group C++ compiler _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' @@ -3331,6 +3403,29 @@ case $host_os in # 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' ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='echo' + + # 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' + ;; + esac + ;; esac ;; lynxos*) @@ -3369,16 +3464,20 @@ case $host_os in _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; openbsd*) - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + if test -f /usr/libexec/ld.so; then + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + fi + output_verbose_link_cmd='echo' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no fi - output_verbose_link_cmd='echo' ;; osf3*) case $cc_basename in @@ -3507,19 +3606,6 @@ case $host_os in # 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*) @@ -3542,26 +3628,21 @@ case $host_os in case $cc_basename in CC*) # Sun C++ 4.2, 5.x and Centerline C++ - _LT_AC_TAGVAR(archive_cmds_need_lc,$1)=yes + _LT_AC_TAGVAR(archive_cmds_need_lc,$1)=yes _LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs' - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -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} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + $CC -G${allow_undefined_flag} ${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. We must also pass each convience library through - # to the system linker between allextract/defaultextract. - # The C++ compiler will combine linker options so we - # cannot just pass the convience library names through - # without $wl. + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; esac _LT_AC_TAGVAR(link_all_deplibs, $1)=yes @@ -3608,12 +3689,69 @@ case $host_os in fi _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + ;; + esac fi ;; esac ;; - sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7*) + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + # So that behaviour is only enabled if SCOABSPATH is set to a + # non-empty value in the environment. Most likely only useful for + # creating official distributions of packages. + # This is a hack until libtool officially supports absolute path + # names for shared libraries. + _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac ;; tandem*) case $cc_basename in @@ -3654,8 +3792,6 @@ 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) @@ -3673,12 +3809,13 @@ 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],[ +AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP], +[AC_REQUIRE([LT_AC_PROG_SED])dnl 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 @@ -3803,239 +3940,72 @@ fi $rm -f confest.$objext +_LT_AC_TAGVAR(compiler_lib_search_dirs, $1)= +if test -n "$_LT_AC_TAGVAR(compiler_lib_search_path, $1)"; then + _LT_AC_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_AC_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` +fi + # PORTME: override above test on systems where it is broken ifelse([$1],[CXX], [case $host_os in +interix[[3-9]]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + _LT_AC_TAGVAR(predep_objects,$1)= + _LT_AC_TAGVAR(postdep_objects,$1)= + _LT_AC_TAGVAR(postdeps,$1)= + ;; + +linux*) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + # + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + if test "$solaris_use_stlport4" != yes; then + _LT_AC_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' + fi + ;; + esac + ;; + solaris*) case $cc_basename in CC*) + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. - _LT_AC_TAGVAR(postdeps,$1)='-lCstd -lCrun' + if test "$solaris_use_stlport4" != yes; then + _LT_AC_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' + fi ;; esac + ;; esac ]) - 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_SAVE -#AC_LANG_FORTRAN77 -# -#_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 -# -## save warnings/boilerplate of simple test code -#_LT_COMPILER_BOILERPLATE -#_LT_LINKER_BOILERPLATE -# -## Allow CC to be a program name with arguments. -#lt_save_CC="$CC" -#CC=${F77-"f77"} -#compiler=$CC -#_LT_AC_TAGVAR(compiler, $1)=$CC -#_LT_CC_BASENAME([$compiler]) -# -#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 -# ;; -#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_RESTORE -#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 -# -## save warnings/boilerplate of simple test code -#_LT_COMPILER_BOILERPLATE -#_LT_LINKER_BOILERPLATE -# -## Allow CC to be a program name with arguments. -#lt_save_CC="$CC" -#CC=${GCJ-"gcj"} -#compiler=$CC -#_LT_AC_TAGVAR(compiler, $1)=$CC -#_LT_CC_BASENAME([$compiler]) -# -## GCJ did not exist at the time GCC didn't implicitly link libc in. -#_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no -# -#_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds -# -### CAVEAT EMPTOR: -### There is no encapsulation within the following macros, do not change -### the running order or otherwise move them around unless you know exactly -### what you are doing... -#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 -# -## save warnings/boilerplate of simple test code -#_LT_COMPILER_BOILERPLATE -#_LT_LINKER_BOILERPLATE -# -## 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_CC_BASENAME([$compiler]) -#_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 @@ -4056,7 +4026,7 @@ if test -f "$ltmain"; then # 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 \ + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ SED SHELL STRIP \ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ @@ -4083,6 +4053,7 @@ if test -f "$ltmain"; then _LT_AC_TAGVAR(predeps, $1) \ _LT_AC_TAGVAR(postdeps, $1) \ _LT_AC_TAGVAR(compiler_lib_search_path, $1) \ + _LT_AC_TAGVAR(compiler_lib_search_dirs, $1) \ _LT_AC_TAGVAR(archive_cmds, $1) \ _LT_AC_TAGVAR(archive_expsym_cmds, $1) \ _LT_AC_TAGVAR(postinstall_cmds, $1) \ @@ -4098,6 +4069,7 @@ if test -f "$ltmain"; then _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(fix_srcfile_path, $1) \ _LT_AC_TAGVAR(exclude_expsyms, $1) \ _LT_AC_TAGVAR(include_expsyms, $1); do @@ -4145,7 +4117,7 @@ ifelse([$1], [], # 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 +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 # Free Software Foundation, Inc. # # This file is part of GNU Libtool: @@ -4226,6 +4198,9 @@ AR_FLAGS=$lt_AR_FLAGS # A C compiler. LTCC=$lt_LTCC +# LTCC compiler flags. +LTCFLAGS=$lt_LTCFLAGS + # A language-specific compiler. CC=$lt_[]_LT_AC_TAGVAR(compiler, $1) @@ -4379,6 +4354,10 @@ predeps=$lt_[]_LT_AC_TAGVAR(predeps, $1) # shared library. postdeps=$lt_[]_LT_AC_TAGVAR(postdeps, $1) +# The directories searched by this compiler when creating a shared +# library +compiler_lib_search_dirs=$lt_[]_LT_AC_TAGVAR(compiler_lib_search_dirs, $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) @@ -4467,7 +4446,7 @@ sys_lib_search_path_spec=$lt_sys_lib_search_path_spec 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)" +fix_srcfile_path=$lt_fix_srcfile_path # Set to yes if exported symbols are required. always_export_symbols=$_LT_AC_TAGVAR(always_export_symbols, $1) @@ -4550,6 +4529,7 @@ fi # --------------------------------- AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_REQUIRE([AC_CANONICAL_HOST]) +AC_REQUIRE([LT_AC_PROG_SED]) AC_REQUIRE([AC_PROG_NM]) AC_REQUIRE([AC_OBJEXT]) # Check for command to grab the raw symbol name followed by C symbol from nm. @@ -4586,7 +4566,7 @@ hpux*) # Its linker distinguishes data from code symbols 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'" ;; -linux*) +linux* | k*bsd*-gnu) if test "$host_cpu" = ia64; then symcode='[[ABCDGIRSTW]]' lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" @@ -4599,9 +4579,18 @@ irix* | nonstopux*) osf*) symcode='[[BCDEGQRST]]' ;; -solaris* | sysv5*) +solaris*) symcode='[[BDRT]]' ;; +sco3.2v5*) + symcode='[[DT]]' + ;; +sysv4.2uw2*) + symcode='[[DT]]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[[ABDT]]' + ;; sysv4) symcode='[[DFNSTU]]' ;; @@ -4718,7 +4707,7 @@ EOF echo "$progname: failed program was:" >&5 cat conftest.$ac_ext >&5 fi - rm -f conftest* conftst* + rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then @@ -4767,13 +4756,15 @@ AC_MSG_CHECKING([for $compiler option to produce PIC]) # like `-m68040'. _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; - beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; - mingw* | os2* | pw32*) + mingw* | cygwin* | 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' + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform @@ -4784,6 +4775,10 @@ AC_MSG_CHECKING([for $compiler option to produce PIC]) # DJGPP does not support shared libraries at all _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= ;; + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; sysv4*MP*) if test -d /usr/nec; then _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic @@ -4806,7 +4801,7 @@ AC_MSG_CHECKING([for $compiler option to produce PIC]) esac else case $host_os in - aix4* | aix5*) + aix[[4-9]]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor @@ -4846,21 +4841,21 @@ AC_MSG_CHECKING([for $compiler option to produce PIC]) ;; esac ;; - freebsd* | kfreebsd*-gnu | dragonfly*) + freebsd* | dragonfly*) # 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" + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${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" + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default @@ -4874,6 +4869,10 @@ AC_MSG_CHECKING([for $compiler option to produce PIC]) ;; esac ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) @@ -4885,7 +4884,7 @@ AC_MSG_CHECKING([for $compiler option to produce PIC]) ;; esac ;; - linux*) + linux* | k*bsd*-gnu) case $cc_basename in KCC*) # KAI C++ Compiler @@ -4904,7 +4903,7 @@ AC_MSG_CHECKING([for $compiler option to produce PIC]) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; - pgCC*) + pgCC* | pgcpp*) # Portland Group C++ compiler. _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' @@ -4918,6 +4917,14 @@ AC_MSG_CHECKING([for $compiler option to produce PIC]) _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _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 ' + ;; + esac ;; esac ;; @@ -4959,15 +4966,6 @@ AC_MSG_CHECKING([for $compiler option to produce PIC]) ;; psos*) ;; - sco*) - case $cc_basename in - CC*) - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - *) - ;; - esac - ;; solaris*) case $cc_basename in CC*) @@ -5009,7 +5007,14 @@ AC_MSG_CHECKING([for $compiler option to produce PIC]) ;; esac ;; - unixware*) + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + _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' + ;; + esac ;; vxworks*) ;; @@ -5040,14 +5045,16 @@ AC_MSG_CHECKING([for $compiler option to produce PIC]) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; - beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; - mingw* | pw32* | os2*) + mingw* | cygwin* | 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' + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' ;; darwin* | rhapsody*) @@ -5056,6 +5063,11 @@ AC_MSG_CHECKING([for $compiler option to produce PIC]) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. @@ -5109,10 +5121,10 @@ AC_MSG_CHECKING([for $compiler option to produce PIC]) esac ;; - mingw* | pw32* | os2*) + mingw* | cygwin* | 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' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) @@ -5142,7 +5154,7 @@ AC_MSG_CHECKING([for $compiler option to produce PIC]) _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; - linux*) + linux* | k*bsd*-gnu) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) @@ -5169,6 +5181,22 @@ AC_MSG_CHECKING([for $compiler option to produce PIC]) # All Alpha code is PIC. _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C 5.9 + _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)='-Wl,' + ;; + *Sun\ F*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + _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)='' + ;; + esac + ;; esac ;; @@ -5178,9 +5206,8 @@ AC_MSG_CHECKING([for $compiler option to produce 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' + rdos*) + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; solaris*) @@ -5200,7 +5227,7 @@ AC_MSG_CHECKING([for $compiler option to produce PIC]) _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; - sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + sysv4 | sysv4.2uw2* | sysv4.3*) _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' @@ -5213,6 +5240,12 @@ AC_MSG_CHECKING([for $compiler option to produce PIC]) fi ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + _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' + ;; + unicos*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no @@ -5236,7 +5269,7 @@ AC_MSG_RESULT([$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)]) # 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_cv_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 "" | " "*) ;; @@ -5254,6 +5287,16 @@ case $host_os in _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])" ;; esac + +# +# Check to make sure the static flag actually works. +# +wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_AC_TAGVAR(lt_prog_compiler_static, $1)\" +AC_LIBTOOL_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], + _LT_AC_TAGVAR(lt_cv_prog_compiler_static_works, $1), + $lt_tmp_static_flag, + [], + [_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=]) ]) @@ -5261,11 +5304,12 @@ esac # ------------------------------------ # 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]) +[AC_REQUIRE([LT_AC_PROG_SED])dnl +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*) + aix[[4-9]]*) # 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 @@ -5278,12 +5322,13 @@ ifelse([$1],[CXX],[ _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 '\''/^[[BCDGRS]] /s/.* \([[^ ]]*\)/\1 DATA/;/^.* __nm__/s/^.* __nm__\([[^ ]]*\) [[^ ]]*/\1 DATA/;/^I /d;/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;/^.*[[ ]]__nm__/s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[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 + _LT_AC_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] ],[ runpath_var= _LT_AC_TAGVAR(allow_undefined_flag, $1)= @@ -5314,12 +5359,14 @@ ifelse([$1],[CXX],[ # 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_" + _LT_AC_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] # 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. + # Exclude shared library initialization/finalization symbols. +dnl Note also adjust exclude_expsyms for C++ above. extract_expsyms_cmds= # Just being paranoid about ensuring that cc_basename is set. _LT_CC_BASENAME([$compiler]) @@ -5332,6 +5379,10 @@ ifelse([$1],[CXX],[ with_gnu_ld=no fi ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; openbsd*) with_gnu_ld=no ;; @@ -5341,7 +5392,7 @@ ifelse([$1],[CXX],[ if test "$with_gnu_ld" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' - + # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. @@ -5362,10 +5413,10 @@ ifelse([$1],[CXX],[ *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac - + # See if GNU ld supports shared libraries. case $host_os in - aix3* | aix4* | aix5*) + aix[[3-9]]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then _LT_AC_TAGVAR(ld_shlibs, $1)=no @@ -5413,10 +5464,10 @@ EOF _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 '\''/^[[BCDGRS]] /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 -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/'\'' -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' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $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 @@ -5425,13 +5476,28 @@ EOF 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' + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; - linux*) + interix[[3-9]]*) + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | k*bsd*-gnu) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then tmp_addflag= case $cc_basename,$host_cpu in @@ -5439,7 +5505,7 @@ EOF _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; - pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers + pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 @@ -5449,13 +5515,22 @@ EOF ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; esac - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + *) + tmp_sharedflag='-shared' ;; + esac + _LT_AC_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' 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'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi else _LT_AC_TAGVAR(ld_shlibs, $1)=no @@ -5472,7 +5547,7 @@ EOF fi ;; - solaris* | sysv5*) + solaris*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then _LT_AC_TAGVAR(ld_shlibs, $1)=no cat <&2 @@ -5493,6 +5568,33 @@ EOF fi ;; + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + sunos4*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= @@ -5526,14 +5628,14 @@ EOF # 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 + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported fi ;; - aix4* | aix5*) + aix[[4-9]]*) 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. @@ -5553,13 +5655,14 @@ EOF # 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*) + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) 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' @@ -5586,7 +5689,7 @@ EOF 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 @@ -5597,6 +5700,7 @@ EOF _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= fi + ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then @@ -5609,11 +5713,11 @@ EOF # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else - if test "$aix_use_runtimelinking" = yes; then + if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' - fi + fi fi fi @@ -5627,12 +5731,12 @@ EOF # 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" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${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" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_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 @@ -5641,13 +5745,11 @@ EOF # -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(whole_archive_flag_spec, $1)='$convenience' _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its 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' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; @@ -5680,7 +5782,7 @@ EOF # 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' + _LT_AC_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' _LT_AC_TAGVAR(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`' _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; @@ -5713,19 +5815,18 @@ EOF _LT_AC_TAGVAR(link_all_deplibs, $1)=yes if test "$GCC" = yes ; then 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 lds - _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(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + _LT_AC_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + _LT_AC_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" else case $cc_basename in xlc*) output_verbose_link_cmd='echo' - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring' _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 lds - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~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}' ;; *) @@ -5765,7 +5866,7 @@ EOF ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. - freebsd* | kfreebsd*-gnu | dragonfly*) + freebsd* | dragonfly*) _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 @@ -5788,47 +5889,62 @@ EOF _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; - hpux10* | hpux11*) + hpux10*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + _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 + fi + ;; + + hpux11*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then case $host_cpu in - hppa*64*|ia64*) + hppa*64*) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; + ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -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' + hppa*64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac fi if test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + case $host_cpu in - hppa*64*) - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + hppa*64*|ia64*) _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' @@ -5872,24 +5988,28 @@ EOF ;; 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(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + if test -f /usr/libexec/ld.so; then + _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(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + _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 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 + _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; @@ -5930,14 +6050,6 @@ EOF _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 @@ -5956,17 +6068,16 @@ EOF case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) - # The compiler driver will combine linker options so we - # cannot just pass the convience library names through - # without $wl, iff we do not link with $LD. - # Luckily, gcc supports the same syntax we need for Sun Studio. + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. GCC discards it without `$wl', + # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) - case $wlarc in - '') - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; - *) - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;; - esac ;; + if test "$GCC" = yes; then + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + else + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + fi + ;; esac _LT_AC_TAGVAR(link_all_deplibs, $1)=yes ;; @@ -6023,36 +6134,45 @@ EOF 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 + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - hardcode_runpath_var=yes - runpath_var=LD_RUN_PATH - ;; + 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' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$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' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$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)= + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi ;; uts4*) @@ -6070,11 +6190,6 @@ EOF 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? # @@ -6094,7 +6209,7 @@ x|xyes) # 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 + echo "$lt_simple_compile_test_code" > conftest.$ac_ext if AC_TRY_EVAL(ac_compile) 2>conftest.err; then soname=conftest @@ -6102,6 +6217,7 @@ x|xyes) libobjs=conftest.$ac_objext deplibs= wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) + pic_flag=$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) compiler_flags=-v linker_flags=-v verstring= @@ -6186,16 +6302,6 @@ 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 # diff --git a/config.guess b/config.guess index ad5281e66..f32079abd 100644 --- a/config.guess +++ b/config.guess @@ -1,9 +1,10 @@ #! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. +# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 +# Free Software Foundation, Inc. -timestamp='2005-08-03' +timestamp='2008-01-23' # 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 @@ -55,8 +56,8 @@ 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, 2005 -Free Software Foundation, Inc. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006, 2007, 2008 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." @@ -106,7 +107,7 @@ 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" ; } || + { tmp=`(umask 077 && mktemp -d "$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 ; } ; @@ -160,6 +161,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; + sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched @@ -206,8 +208,11 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; + *:SolidBSD:*:*) + echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} + exit ;; macppc:MirBSD:*:*) - echo powerppc-unknown-mirbsd${UNAME_RELEASE} + echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} @@ -325,7 +330,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; - i86pc:SunOS:5.*:*) + i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) @@ -527,7 +532,7 @@ EOF echo rs6000-ibm-aix3.2 fi exit ;; - *:AIX:*:[45]) + *:AIX:*:[456]) 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 @@ -764,12 +769,19 @@ EOF echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) - echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + case ${UNAME_MACHINE} in + pc98) + echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + amd64) + echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + *) + echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; - i*:MINGW*:*) + *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:windows32*:*) @@ -779,9 +791,18 @@ EOF i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; - x86:Interix*:[34]*) - echo i586-pc-interix${UNAME_RELEASE}|sed -e 's/\..*//' - exit ;; + *:Interix*:[3456]*) + case ${UNAME_MACHINE} in + x86) + echo i586-pc-interix${UNAME_RELEASE} + exit ;; + EM64T | authenticamd) + echo x86_64-unknown-interix${UNAME_RELEASE} + exit ;; + IA64) + echo ia64-unknown-interix${UNAME_RELEASE} + exit ;; + esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; @@ -815,6 +836,16 @@ EOF echo ${UNAME_MACHINE}-pc-minix exit ;; arm*:Linux:*:*) + eval $set_cc_for_build + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then + echo ${UNAME_MACHINE}-unknown-linux-gnu + else + echo ${UNAME_MACHINE}-unknown-linux-gnueabi + fi + exit ;; + avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; cris:Linux:*:*) @@ -851,7 +882,11 @@ EOF #endif #endif EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` + eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' + /^CPU/{ + s: ::g + p + }'`" test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; mips64:Linux:*:*) @@ -870,7 +905,11 @@ EOF #endif #endif EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` + eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' + /^CPU/{ + s: ::g + p + }'`" test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; or32:Linux:*:*) @@ -919,9 +958,15 @@ EOF sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; + vax:Linux:*:*) + echo ${UNAME_MACHINE}-dec-linux-gnu + exit ;; x86_64:Linux:*:*) echo x86_64-unknown-linux-gnu exit ;; + xtensa*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; 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 @@ -964,7 +1009,7 @@ EOF LIBC=gnulibc1 # endif #else - #ifdef __INTEL_COMPILER + #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC) LIBC=gnu #else LIBC=gnuaout @@ -974,7 +1019,11 @@ EOF LIBC=dietlibc #endif EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` + eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' + /^LIBC/{ + s: ::g + p + }'`" test x"${LIBC}" != x && { echo "${UNAME_MACHINE}-pc-linux-${LIBC}" exit @@ -1176,6 +1225,15 @@ EOF SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; + SX-7:SUPER-UX:*:*) + echo sx7-nec-superux${UNAME_RELEASE} + exit ;; + SX-8:SUPER-UX:*:*) + echo sx8-nec-superux${UNAME_RELEASE} + exit ;; + SX-8R:SUPER-UX:*:*) + echo sx8r-nec-superux${UNAME_RELEASE} + exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; @@ -1185,7 +1243,6 @@ EOF *: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} @@ -1264,6 +1321,9 @@ EOF i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; + i*86:rdos:*:*) + echo ${UNAME_MACHINE}-pc-rdos + exit ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 @@ -1424,9 +1484,9 @@ 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 - http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.guess + http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD and - http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.sub + http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD If the version you run ($0) is already up to date, please send the following data and any information you think might be diff --git a/config.sub b/config.sub index 1c366dfde..6759825a5 100644 --- a/config.sub +++ b/config.sub @@ -1,9 +1,10 @@ #! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. +# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 +# Free Software Foundation, Inc. -timestamp='2005-07-08' +timestamp='2008-01-16' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software @@ -71,8 +72,8 @@ Report bugs and patches to ." version="\ GNU config.sub ($timestamp) -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 -Free Software Foundation, Inc. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006, 2007, 2008 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." @@ -119,8 +120,9 @@ esac # 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*) + nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | 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/'` ;; @@ -171,6 +173,10 @@ case $os in -hiux*) os=-hiuxwe2 ;; + -sco6) + os=-sco5v6 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` @@ -187,6 +193,10 @@ case $os in # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; + -sco5v6*) + # 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/'` @@ -231,15 +241,16 @@ case $basic_machine in | 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 \ + | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ - | fr30 | frv \ + | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ - | m32r | m32rle | m68000 | m68k | m88k | maxq | mcore \ + | m32c | m32r | m32rle | m68000 | m68k | m88k \ + | maxq | mb | microblaze | mcore | mep \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ @@ -257,28 +268,27 @@ case $basic_machine in | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ - | ms1 \ + | mt \ | msp430 \ + | nios | nios2 \ | ns16k | ns32k \ | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | pyramid \ - | sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \ + | score \ + | sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ - | sparc | sparc64 | sparc64b | sparc86x | sparclet | sparclite \ - | sparcv8 | sparcv9 | sparcv9b \ - | strongarm \ + | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ + | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ + | spu | strongarm \ | tahoe | thumb | tic4x | tic80 | tron \ | v850 | v850e \ | we32k \ - | x86 | xscale | xscalee[bl] | xstormy16 | xtensa \ + | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ | z8k) basic_machine=$basic_machine-unknown ;; - m32c) - basic_machine=$basic_machine-unknown - ;; m6811 | m68hc11 | m6812 | m68hc12) # Motorola 68HC11/12. basic_machine=$basic_machine-unknown @@ -286,6 +296,9 @@ case $basic_machine in ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; + ms1) + basic_machine=mt-unknown + ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and @@ -305,18 +318,18 @@ case $basic_machine in | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ - | avr-* \ + | avr-* | avr32-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ - | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \ + | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ - | m32r-* | m32rle-* \ + | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ @@ -336,30 +349,33 @@ case $basic_machine in | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ - | ms1-* \ + | mt-* \ | msp430-* \ + | nios-* | nios2-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | pyramid-* \ | romp-* | rs6000-* \ - | sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | shbe-* \ + | sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ - | sparc-* | sparc64-* | sparc64b-* | sparc86x-* | sparclet-* \ + | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ - | sparcv8-* | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ | tahoe-* | thumb-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tron-* \ | v850-* | v850e-* | vax-* \ | we32k-* \ - | x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \ - | xstormy16-* | xtensa-* \ + | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ + | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-*) ;; - m32c-*) + # Recognize the basic CPU types without company name, with glob match. + xtensa*) + basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. @@ -431,6 +447,14 @@ case $basic_machine in basic_machine=ns32k-sequent os=-dynix ;; + blackfin) + basic_machine=bfin-unknown + os=-linux + ;; + blackfin-*) + basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; c90) basic_machine=c90-cray os=-unicos @@ -463,8 +487,8 @@ case $basic_machine in basic_machine=craynv-cray os=-unicosmp ;; - cr16c) - basic_machine=cr16c-unknown + cr16) + basic_machine=cr16-unknown os=-elf ;; crds | unos) @@ -656,6 +680,14 @@ case $basic_machine in basic_machine=m68k-isi os=-sysv ;; + m68knommu) + basic_machine=m68k-unknown + os=-linux + ;; + m68knommu-*) + basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; m88k-omron*) basic_machine=m88k-omron ;; @@ -671,6 +703,10 @@ case $basic_machine in basic_machine=i386-pc os=-mingw32 ;; + mingw32ce) + basic_machine=arm-unknown + os=-mingw32ce + ;; miniframe) basic_machine=m68000-convergent ;; @@ -696,6 +732,9 @@ case $basic_machine in basic_machine=i386-pc os=-msdos ;; + ms1-*) + basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` + ;; mvs) basic_machine=i370-ibm os=-mvs @@ -794,6 +833,14 @@ case $basic_machine in basic_machine=i860-intel os=-osf ;; + parisc) + basic_machine=hppa-unknown + os=-linux + ;; + parisc-*) + basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; pbd) basic_machine=sparc-tti ;; @@ -803,6 +850,12 @@ case $basic_machine in pc532 | pc532-*) basic_machine=ns32k-pc532 ;; + pc98) + basic_machine=i386-pc + ;; + pc98-*) + basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; @@ -859,6 +912,10 @@ case $basic_machine in basic_machine=i586-unknown os=-pw32 ;; + rdos) + basic_machine=i386-pc + os=-rdos + ;; rom68k) basic_machine=m68k-rom68k os=-coff @@ -885,6 +942,10 @@ case $basic_machine in sb1el) basic_machine=mipsisa64sb1el-unknown ;; + sde) + basic_machine=mipsisa32-sde + os=-elf + ;; sei) basic_machine=mips-sei os=-seiux @@ -896,6 +957,9 @@ case $basic_machine in basic_machine=sh-hitachi os=-hms ;; + sh5el) + basic_machine=sh5le-unknown + ;; sh64) basic_machine=sh64-unknown ;; @@ -985,6 +1049,10 @@ case $basic_machine in basic_machine=tic6x-unknown os=-coff ;; + tile*) + basic_machine=tile-unknown + os=-linux-gnu + ;; tx39) basic_machine=mipstx39-unknown ;; @@ -1101,7 +1169,7 @@ case $basic_machine in sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; - sparc | sparcv8 | sparcv9 | sparcv9b) + sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) @@ -1174,21 +1242,23 @@ case $os in | -aos* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ - | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* | -openbsd* \ + | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ + | -openbsd* | -solidbsd* \ | -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* \ + | -mingw32* | -linux-gnu* | -linux-newlib* | -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* \ - | -skyos* | -haiku*) + | -skyos* | -haiku* | -rdos* | -toppers* | -drops*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) @@ -1340,6 +1410,12 @@ else # system, and we'll never get to this point. case $basic_machine in + score-*) + os=-elf + ;; + spu-*) + os=-elf + ;; *-acorn) os=-riscix1.2 ;; @@ -1349,9 +1425,9 @@ case $basic_machine in arm*-semi) os=-aout ;; - c4x-* | tic4x-*) - os=-coff - ;; + c4x-* | tic4x-*) + os=-coff + ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 @@ -1377,6 +1453,9 @@ case $basic_machine in m68*-cisco) os=-aout ;; + mep-*) + os=-elf + ;; mips*-cisco) os=-elf ;; diff --git a/configure b/configure index 2200efdfe..f6b1013bf 100755 --- a/configure +++ b/configure @@ -255,15 +255,15 @@ # libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- -## Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005 -## Free Software Foundation, Inc. +## Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007, +## 2008 Free Software Foundation, Inc. ## Originally by Gordon Matzigkeit , 1996 ## ## 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. -# serial 47 AC_PROG_LIBTOOL +# serial 52 AC_PROG_LIBTOOL # autoconf 2.13 compatibility @@ -328,6 +328,10 @@ fi +# _LT_REQUIRED_DARWIN_CHECKS +# -------------------------- +# Check for some things on darwin + # _LT_AC_SYS_LIBPATH_AIX # ---------------------- @@ -377,18 +381,18 @@ fi # _LT_AC_CHECK_DLFCN -# -------------------- +# ------------------ # _LT_AC_CHECK_DLFCN # _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) -# ------------------------------------------------------------------ +# --------------------------------------------------------------------- # _LT_AC_TRY_DLOPEN_SELF # AC_LIBTOOL_DLOPEN_SELF -# ------------------- +# ---------------------- # AC_LIBTOOL_DLOPEN_SELF @@ -452,7 +456,7 @@ fi # AC_DISABLE_SHARED # ----------------- -#- set the default shared flag to --disable-shared +# set the default shared flag to --disable-shared # AC_DISABLE_SHARED @@ -491,20 +495,18 @@ fi # 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. # AC_PATH_TOOL_PREFIX # ------------------- -# find a file program which can recognise shared library +# find a file program which can recognize shared library # AC_PATH_TOOL_PREFIX # AC_PATH_MAGIC # ------------- -# find a file program which can recognise a shared library +# find a file program which can recognize a shared library # AC_PATH_MAGIC @@ -585,55 +587,9 @@ fi # _LT_AC_LANG_CXX # _LT_AC_PROG_CXXCPP -# --------------- +# ------------------ # _LT_AC_PROG_CXXCPP -# 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 @@ -652,226 +608,13 @@ fi # 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_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_SAVE -#AC_LANG_FORTRAN77 -# -#_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 -# -## save warnings/boilerplate of simple test code -#_LT_COMPILER_BOILERPLATE -#_LT_LINKER_BOILERPLATE -# -## Allow CC to be a program name with arguments. -#lt_save_CC="$CC" -#CC=${F77-"f77"} -#compiler=$CC -#_LT_AC_TAGVAR(compiler, $1)=$CC -#_LT_CC_BASENAME([$compiler]) -# -#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 -# ;; -#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_RESTORE -#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 -# -## save warnings/boilerplate of simple test code -#_LT_COMPILER_BOILERPLATE -#_LT_LINKER_BOILERPLATE -# -## Allow CC to be a program name with arguments. -#lt_save_CC="$CC" -#CC=${GCJ-"gcj"} -#compiler=$CC -#_LT_AC_TAGVAR(compiler, $1)=$CC -#_LT_CC_BASENAME([$compiler]) -# -## GCJ did not exist at the time GCC didn't implicitly link libc in. -#_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no -# -#_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds -# -### CAVEAT EMPTOR: -### There is no encapsulation within the following macros, do not change -### the running order or otherwise move them around unless you know exactly -### what you are doing... -#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 -# -## save warnings/boilerplate of simple test code -#_LT_COMPILER_BOILERPLATE -#_LT_LINKER_BOILERPLATE -# -## 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_CC_BASENAME([$compiler]) -#_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 @@ -925,16 +668,6 @@ fi # This is just to silence aclocal about the macro not being used -#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 # @@ -1425,9 +1158,10 @@ ac_help="$ac_help ac_help="$ac_help --with-pcre-dir ZIP: pcre install prefix" ac_help="$ac_help - --enable-mysqlnd-threading - EXPERIMENTAL: Enable mysqlnd threaded fetch. - Note: This forces ZTS on!" + --disable-mysqlnd-compression-support + Enable support for the MySQL compressed protocol in mysqlnd" +ac_help="$ac_help + --with-zlib-dir[=DIR] mysqlnd: Set the path to libz install prefix" ac_help="$ac_help PEAR: @@ -2147,12 +1881,12 @@ fi echo $ac_n "checking for Cygwin environment""... $ac_c" 1>&6 -echo "configure:2151: checking for Cygwin environment" >&5 +echo "configure:1885: checking for Cygwin environment" >&5 if eval "test \"`echo '$''{'ac_cv_cygwin'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:1901: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_cygwin=yes else @@ -2180,19 +1914,19 @@ echo "$ac_t""$ac_cv_cygwin" 1>&6 CYGWIN= test "$ac_cv_cygwin" = yes && CYGWIN=yes echo $ac_n "checking for mingw32 environment""... $ac_c" 1>&6 -echo "configure:2184: checking for mingw32 environment" >&5 +echo "configure:1918: checking for mingw32 environment" >&5 if eval "test \"`echo '$''{'ac_cv_mingw32'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:1930: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_mingw32=yes else @@ -2211,7 +1945,7 @@ test "$ac_cv_mingw32" = yes && MINGW32=yes echo $ac_n "checking for egrep""... $ac_c" 1>&6 -echo "configure:2215: checking for egrep" >&5 +echo "configure:1949: checking for egrep" >&5 if eval "test \"`echo '$''{'ac_cv_prog_egrep'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2226,7 +1960,7 @@ echo "$ac_t""$ac_cv_prog_egrep" 1>&6 echo $ac_n "checking for a sed that does not truncate output""... $ac_c" 1>&6 -echo "configure:2230: checking for a sed that does not truncate output" >&5 +echo "configure:1964: checking for a sed that does not truncate output" >&5 if eval "test \"`echo '$''{'lt_cv_path_SED'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2376,7 +2110,7 @@ else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; } fi echo $ac_n "checking host system type""... $ac_c" 1>&6 -echo "configure:2380: checking host system type" >&5 +echo "configure:2114: checking host system type" >&5 host_alias=$host case "$host_alias" in @@ -2397,7 +2131,7 @@ host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` echo "$ac_t""$host" 1>&6 echo $ac_n "checking target system type""... $ac_c" 1>&6 -echo "configure:2401: checking target system type" >&5 +echo "configure:2135: checking target system type" >&5 target_alias=$target case "$target_alias" in @@ -2427,7 +2161,7 @@ echo "$ac_t""$target" 1>&6 PHP_MAJOR_VERSION=5 PHP_MINOR_VERSION=3 -PHP_RELEASE_VERSION=1 +PHP_RELEASE_VERSION=2 PHP_EXTRA_VERSION="" PHP_VERSION="$PHP_MAJOR_VERSION.$PHP_MINOR_VERSION.$PHP_RELEASE_VERSION$PHP_EXTRA_VERSION" PHP_VERSION_ID=`expr $PHP_MAJOR_VERSION \* 10000 + $PHP_MINOR_VERSION \* 100 + $PHP_RELEASE_VERSION` @@ -2505,22 +2239,11 @@ php_abs_top_builddir=$abs_builddir $php_shtool mkdir -p libs rm -f libs/* -php_did_darwin9_cheat=0 -case $host_alias in -*darwin9*) - hasg=`echo $CFLAGS | grep -E '(^-g)|([:space:]-g)'` - if test x"$hasg" = "x"; then - php_did_darwin9_cheat=1 - CFLAGS="$CFLAGS -gstabs" - fi - ;; -esac - # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:2524: checking for $ac_word" >&5 +echo "configure:2247: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2550,7 +2273,7 @@ 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 $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:2554: checking for $ac_word" >&5 +echo "configure:2277: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2601,7 +2324,7 @@ fi # Extract the first word of "cl", so it can be a program name with args. set dummy cl; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:2605: checking for $ac_word" >&5 +echo "configure:2328: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2633,7 +2356,7 @@ fi fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 -echo "configure:2637: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 +echo "configure:2360: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. @@ -2644,12 +2367,12 @@ cross_compiling=$ac_cv_prog_cc_cross cat > conftest.$ac_ext << EOF -#line 2648 "configure" +#line 2371 "configure" #include "confdefs.h" main(){return(0);} EOF -if { (eval echo configure:2653: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:2376: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ac_cv_prog_cc_works=yes # If we can't run a trivial program, we are probably using a cross compiler. if (./conftest; exit) 2>/dev/null; then @@ -2675,12 +2398,12 @@ if test $ac_cv_prog_cc_works = no; then { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 -echo "configure:2679: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 +echo "configure:2402: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 cross_compiling=$ac_cv_prog_cc_cross echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 -echo "configure:2684: checking whether we are using GNU C" >&5 +echo "configure:2407: checking whether we are using GNU C" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2689,7 +2412,7 @@ else yes; #endif EOF -if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:2693: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then +if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:2416: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gcc=yes else ac_cv_prog_gcc=no @@ -2708,7 +2431,7 @@ ac_test_CFLAGS="${CFLAGS+set}" ac_save_CFLAGS="$CFLAGS" CFLAGS= echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 -echo "configure:2712: checking whether ${CC-cc} accepts -g" >&5 +echo "configure:2435: checking whether ${CC-cc} accepts -g" >&5 if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2740,7 +2463,7 @@ else fi echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 -echo "configure:2744: checking how to run the C preprocessor" >&5 +echo "configure:2467: checking how to run the C preprocessor" >&5 # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= @@ -2755,13 +2478,13 @@ else # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:2765: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:2488: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : @@ -2772,13 +2495,13 @@ else rm -rf conftest* CPP="${CC-cc} -E -traditional-cpp" cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:2782: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:2505: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : @@ -2789,13 +2512,13 @@ else rm -rf conftest* CPP="${CC-cc} -nologo -E" cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:2799: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:2522: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : @@ -2822,9 +2545,9 @@ echo "$ac_t""$CPP" 1>&6 ICC="no" echo $ac_n "checking for icc""... $ac_c" 1>&6 -echo "configure:2826: checking for icc" >&5 +echo "configure:2549: checking for icc" >&5 cat > conftest.$ac_ext <&6 -echo "configure:2850: checking for suncc" >&5 +echo "configure:2573: checking for suncc" >&5 cat > conftest.$ac_ext <&6 -echo "configure:2875: checking whether $CC and cc understand -c and -o together" >&5 +echo "configure:2598: checking whether $CC and cc understand -c and -o together" >&5 else echo $ac_n "checking whether cc understands -c and -o together""... $ac_c" 1>&6 -echo "configure:2878: checking whether cc understands -c and -o together" >&5 +echo "configure:2601: checking whether cc understands -c and -o together" >&5 fi set dummy $CC; ac_cc="`echo $2 | sed -e 's/[^a-zA-Z0-9_]/_/g' -e 's/^[0-9]/_/'`" @@ -2886,16 +2609,16 @@ else # We do the test twice because some compilers refuse to overwrite an # existing .o file with -o, though they will create one. ac_try='${CC-cc} -c conftest.c -o conftest.o 1>&5' -if { (eval echo configure:2890: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } && - test -f conftest.o && { (eval echo configure:2891: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; +if { (eval echo configure:2613: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } && + test -f conftest.o && { (eval echo configure:2614: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; then eval ac_cv_prog_cc_${ac_cc}_c_o=yes if test "x$CC" != xcc; then # Test first that cc exists at all. - if { ac_try='cc -c conftest.c 1>&5'; { (eval echo configure:2896: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then + if { ac_try='cc -c conftest.c 1>&5'; { (eval echo configure:2619: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then ac_try='cc -c conftest.c -o conftest.o 1>&5' - if { (eval echo configure:2898: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } && - test -f conftest.o && { (eval echo configure:2899: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; + if { (eval echo configure:2621: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } && + test -f conftest.o && { (eval echo configure:2622: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; then # cc works too. : @@ -2922,7 +2645,7 @@ EOF fi echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 -echo "configure:2926: checking how to run the C preprocessor" >&5 +echo "configure:2649: checking how to run the C preprocessor" >&5 # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= @@ -2937,13 +2660,13 @@ else # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:2947: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:2670: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : @@ -2954,13 +2677,13 @@ else rm -rf conftest* CPP="${CC-cc} -E -traditional-cpp" cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:2964: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:2687: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : @@ -2971,13 +2694,13 @@ else rm -rf conftest* CPP="${CC-cc} -nologo -E" cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:2981: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:2704: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : @@ -3002,9 +2725,9 @@ fi echo "$ac_t""$CPP" 1>&6 echo $ac_n "checking for AIX""... $ac_c" 1>&6 -echo "configure:3006: checking for AIX" >&5 +echo "configure:2729: checking for AIX" >&5 cat > conftest.$ac_ext <&6 -echo "configure:3030: checking whether ln -s works" >&5 +echo "configure:2753: checking whether ln -s works" >&5 if eval "test \"`echo '$''{'ac_cv_prog_LN_S'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -3051,7 +2774,7 @@ fi php_with_libdir=lib echo $ac_n "checking for system library directory""... $ac_c" 1>&6 -echo "configure:3055: checking for system library directory" >&5 +echo "configure:2778: checking for system library directory" >&5 # Check whether --with-libdir or --without-libdir was given. if test "${with_libdir+set}" = set; then withval="$with_libdir" @@ -3077,7 +2800,7 @@ echo "$ac_t""$ext_output" 1>&6 php_enable_rpath=yes echo $ac_n "checking whether to enable runpaths""... $ac_c" 1>&6 -echo "configure:3081: checking whether to enable runpaths" >&5 +echo "configure:2804: checking whether to enable runpaths" >&5 # Check whether --enable-rpath or --disable-rpath was given. if test "${enable_rpath+set}" = set; then enableval="$enable_rpath" @@ -3101,7 +2824,7 @@ echo "$ac_t""$ext_output" 1>&6 echo $ac_n "checking if compiler supports -R""... $ac_c" 1>&6 -echo "configure:3105: checking if compiler supports -R" >&5 +echo "configure:2828: checking if compiler supports -R" >&5 if eval "test \"`echo '$''{'php_cv_cc_dashr'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -3109,14 +2832,14 @@ else SAVE_LIBS=$LIBS LIBS="-R /usr/$PHP_LIBDIR $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:2843: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* php_cv_cc_dashr=yes else @@ -3134,7 +2857,7 @@ if test $php_cv_cc_dashr = "yes"; then ld_runpath_switch=-R else echo $ac_n "checking if compiler supports -Wl,-rpath,""... $ac_c" 1>&6 -echo "configure:3138: checking if compiler supports -Wl,-rpath," >&5 +echo "configure:2861: checking if compiler supports -Wl,-rpath," >&5 if eval "test \"`echo '$''{'php_cv_cc_rpath'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -3142,14 +2865,14 @@ else SAVE_LIBS=$LIBS LIBS="-Wl,-rpath,/usr/$PHP_LIBDIR $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:2876: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* php_cv_cc_rpath=yes else @@ -3180,7 +2903,7 @@ 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 $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:3184: checking for $ac_word" >&5 +echo "configure:2907: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_AWK'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -3221,7 +2944,7 @@ test -n "$AWK" || AWK="bork" ;; *) echo $ac_n "checking if $AWK is broken""... $ac_c" 1>&6 -echo "configure:3225: checking if $AWK is broken" >&5 +echo "configure:2948: checking if $AWK is broken" >&5 if ! $AWK 'function foo() {}' >/dev/null 2>&1 ; then echo "$ac_t""yes" 1>&6 { echo "configure: error: You should install GNU awk" 1>&2; exit 1; } @@ -3240,7 +2963,7 @@ 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 $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:3244: checking for $ac_word" >&5 +echo "configure:2967: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_YACC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -3280,7 +3003,7 @@ test -n "$YACC" || YACC="yacc" bison_version=none if test "$YACC"; then echo $ac_n "checking for bison version""... $ac_c" 1>&6 -echo "configure:3284: checking for bison version" >&5 +echo "configure:3007: checking for bison version" >&5 if eval "test \"`echo '$''{'php_cv_bison_version'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -3318,7 +3041,7 @@ echo "$ac_t""$php_cv_bison_version" 1>&6 # Extract the first word of "re2c", so it can be a program name with args. set dummy re2c; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:3322: checking for $ac_word" >&5 +echo "configure:3045: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_RE2C'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -3346,7 +3069,7 @@ fi if test -n "$RE2C"; then echo $ac_n "checking for re2c version""... $ac_c" 1>&6 -echo "configure:3350: checking for re2c version" >&5 +echo "configure:3073: checking for re2c version" >&5 if eval "test \"`echo '$''{'php_cv_re2c_version'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -3385,7 +3108,7 @@ esac php_enable_re2c_cgoto=no echo $ac_n "checking whether to enable computed goto gcc extension with re2c""... $ac_c" 1>&6 -echo "configure:3389: checking whether to enable computed goto gcc extension with re2c" >&5 +echo "configure:3112: checking whether to enable computed goto gcc extension with re2c" >&5 # Check whether --enable-re2c-cgoto or --disable-re2c-cgoto was given. if test "${enable_re2c_cgoto+set}" = set; then enableval="$enable_re2c_cgoto" @@ -3411,9 +3134,9 @@ if test "$PHP_RE2C_CGOTO" = "no"; then RE2C_FLAGS="" else echo $ac_n "checking whether re2c -g works""... $ac_c" 1>&6 -echo "configure:3415: checking whether re2c -g works" >&5 +echo "configure:3138: checking whether re2c -g works" >&5 cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:3158: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* RE2C_FLAGS="" @@ -3497,7 +3220,7 @@ case $host_alias in gcc_arg_name=ac_cv_gcc_arg_no_cpp_precomp echo $ac_n "checking whether $CC supports -no-cpp-precomp""... $ac_c" 1>&6 -echo "configure:3501: checking whether $CC supports -no-cpp-precomp" >&5 +echo "configure:3224: checking whether $CC supports -no-cpp-precomp" >&5 if eval "test \"`echo '$''{'ac_cv_gcc_arg_no_cpp_precomp'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -3698,7 +3421,7 @@ esac # Disable PIC mode by default where it is known to be safe to do so, # to avoid the performance hit from the lost register echo $ac_n "checking whether to force non-PIC code in shared modules""... $ac_c" 1>&6 -echo "configure:3702: checking whether to force non-PIC code in shared modules" >&5 +echo "configure:3425: checking whether to force non-PIC code in shared modules" >&5 case $host_alias in i?86-*-linux*|i?86-*-freebsd*) if test "${with_pic+set}" != "set" || test "$with_pic" = "no"; then @@ -3728,7 +3451,7 @@ esac echo $ac_n "checking whether /dev/urandom exists""... $ac_c" 1>&6 -echo "configure:3732: checking whether /dev/urandom exists" >&5 +echo "configure:3455: checking whether /dev/urandom exists" >&5 if test -r "/dev/urandom" && test -c "/dev/urandom"; then cat >> confdefs.h <<\EOF #define HAVE_DEV_URANDOM 1 @@ -3789,7 +3512,7 @@ if test "$cross_compiling" = yes; then else cat > conftest.$ac_ext < @@ -3807,7 +3530,7 @@ int main() { return pthread_create(&thd, NULL, thread_routine, &data); } EOF -if { (eval echo configure:3811: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:3534: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then pthreads_working=yes @@ -3827,7 +3550,7 @@ fi CFLAGS=$save_CFLAGS echo $ac_n "checking for pthreads_cflags""... $ac_c" 1>&6 -echo "configure:3831: checking for pthreads_cflags" >&5 +echo "configure:3554: checking for pthreads_cflags" >&5 if eval "test \"`echo '$''{'ac_cv_pthreads_cflags'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -3849,7 +3572,7 @@ if test "$cross_compiling" = yes; then else cat > conftest.$ac_ext < @@ -3867,7 +3590,7 @@ int main() { return pthread_create(&thd, NULL, thread_routine, &data); } EOF -if { (eval echo configure:3871: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:3594: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then pthreads_working=yes @@ -3897,7 +3620,7 @@ fi echo "$ac_t""$ac_cv_pthreads_cflags" 1>&6 echo $ac_n "checking for pthreads_lib""... $ac_c" 1>&6 -echo "configure:3901: checking for pthreads_lib" >&5 +echo "configure:3624: checking for pthreads_lib" >&5 if eval "test \"`echo '$''{'ac_cv_pthreads_lib'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -3919,7 +3642,7 @@ if test "$cross_compiling" = yes; then else cat > conftest.$ac_ext < @@ -3937,7 +3660,7 @@ int main() { return pthread_create(&thd, NULL, thread_routine, &data); } EOF -if { (eval echo configure:3941: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:3664: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then pthreads_working=yes @@ -4071,7 +3794,7 @@ ext_output=$PHP_AOLSERVER echo $ac_n "checking for AOLserver support""... $ac_c" 1>&6 -echo "configure:4075: checking for AOLserver support" >&5 +echo "configure:3798: checking for AOLserver support" >&5 if test "$PHP_AOLSERVER" != "no"; then if test -d "$PHP_AOLSERVER/include"; then @@ -4328,7 +4051,7 @@ ext_output=$PHP_APXS echo $ac_n "checking for Apache 1.x module support via DSO through APXS""... $ac_c" 1>&6 -echo "configure:4332: checking for Apache 1.x module support via DSO through APXS" >&5 +echo "configure:4055: checking for Apache 1.x module support via DSO through APXS" >&5 if test "$PHP_APXS" != "no"; then if test "$PHP_APXS" = "yes"; then @@ -4651,7 +4374,7 @@ ext_output=$PHP_APACHE echo $ac_n "checking for Apache 1.x module support""... $ac_c" 1>&6 -echo "configure:4655: checking for Apache 1.x module support" >&5 +echo "configure:4378: checking for Apache 1.x module support" >&5 if test "$PHP_SAPI" != "apache" && test "$PHP_APACHE" != "no"; then @@ -5484,7 +5207,7 @@ fi php_enable_mod_charset=no echo $ac_n "checking whether to enable Apache charset compatibility option""... $ac_c" 1>&6 -echo "configure:5488: checking whether to enable Apache charset compatibility option" >&5 +echo "configure:5211: checking whether to enable Apache charset compatibility option" >&5 # Check whether --enable-mod-charset or --disable-mod-charset was given. if test "${enable_mod_charset+set}" = set; then enableval="$enable_mod_charset" @@ -5519,7 +5242,7 @@ if test "$APACHE_MODULE" = "yes"; then gcc_arg_name=ac_cv_gcc_arg_rdynamic echo $ac_n "checking whether $CC supports -rdynamic""... $ac_c" 1>&6 -echo "configure:5523: checking whether $CC supports -rdynamic" >&5 +echo "configure:5246: checking whether $CC supports -rdynamic" >&5 if eval "test \"`echo '$''{'ac_cv_gcc_arg_rdynamic'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -5562,7 +5285,7 @@ if test -n "$APACHE_INSTALL"; then echo $ac_n "checking for member fd in BUFF *""... $ac_c" 1>&6 -echo "configure:5566: checking for member fd in BUFF *" >&5 +echo "configure:5289: checking for member fd in BUFF *" >&5 if eval "test \"`echo '$''{'ac_cv_php_fd_in_buff'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -5574,14 +5297,14 @@ else CPPFLAGS="$CPPFLAGS $APACHE_INCLUDE" fi cat > conftest.$ac_ext < int main() { conn_rec *c; int fd = c->client->fd; ; return 0; } EOF -if { (eval echo configure:5585: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:5308: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_php_fd_in_buff=yes @@ -5657,7 +5380,7 @@ ext_output=$PHP_APXS2FILTER echo $ac_n "checking for Apache 2.0 filter-module support via DSO through APXS""... $ac_c" 1>&6 -echo "configure:5661: checking for Apache 2.0 filter-module support via DSO through APXS" >&5 +echo "configure:5384: checking for Apache 2.0 filter-module support via DSO through APXS" >&5 if test "$PHP_APXS2FILTER" != "no"; then if test "$PHP_APXS2FILTER" = "yes"; then @@ -6505,7 +6228,7 @@ ext_output=$PHP_APXS2 echo $ac_n "checking for Apache 2.0 handler-module support via DSO through APXS""... $ac_c" 1>&6 -echo "configure:6509: checking for Apache 2.0 handler-module support via DSO through APXS" >&5 +echo "configure:6232: checking for Apache 2.0 handler-module support via DSO through APXS" >&5 if test "$PHP_APXS2" != "no"; then if test "$PHP_APXS2" = "yes"; then @@ -7354,7 +7077,7 @@ ext_output=$PHP_APACHE_HOOKS echo $ac_n "checking for Apache 1.x (hooks) module support via DSO through APXS""... $ac_c" 1>&6 -echo "configure:7358: checking for Apache 1.x (hooks) module support via DSO through APXS" >&5 +echo "configure:7081: checking for Apache 1.x (hooks) module support via DSO through APXS" >&5 if test "$PHP_APACHE_HOOKS" != "no"; then if test "$PHP_APACHE_HOOKS" = "yes"; then @@ -7677,7 +7400,7 @@ ext_output=$PHP_APACHE_HOOKS_STATIC echo $ac_n "checking for Apache 1.x (hooks) module support""... $ac_c" 1>&6 -echo "configure:7681: checking for Apache 1.x (hooks) module support" >&5 +echo "configure:7404: checking for Apache 1.x (hooks) module support" >&5 if test "$PHP_SAPI" != "apache" && test "$PHP_SAPI" != "apache_hooks" && test "$PHP_APACHE_HOOKS_STATIC" != "no"; then @@ -8510,7 +8233,7 @@ fi php_enable_mod_charset=no echo $ac_n "checking whether to enable Apache charset compatibility option""... $ac_c" 1>&6 -echo "configure:8514: checking whether to enable Apache charset compatibility option" >&5 +echo "configure:8237: checking whether to enable Apache charset compatibility option" >&5 # Check whether --enable-mod-charset or --disable-mod-charset was given. if test "${enable_mod_charset+set}" = set; then enableval="$enable_mod_charset" @@ -8545,7 +8268,7 @@ if test "$APACHE_HOOKS_MODULE" = "yes"; then gcc_arg_name=ac_cv_gcc_arg_rdynamic echo $ac_n "checking whether $CC supports -rdynamic""... $ac_c" 1>&6 -echo "configure:8549: checking whether $CC supports -rdynamic" >&5 +echo "configure:8272: checking whether $CC supports -rdynamic" >&5 if eval "test \"`echo '$''{'ac_cv_gcc_arg_rdynamic'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -8588,7 +8311,7 @@ if test -n "$APACHE_HOOKS_INSTALL"; then echo $ac_n "checking for member fd in BUFF *""... $ac_c" 1>&6 -echo "configure:8592: checking for member fd in BUFF *" >&5 +echo "configure:8315: checking for member fd in BUFF *" >&5 if eval "test \"`echo '$''{'ac_cv_php_fd_in_buff'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -8600,14 +8323,14 @@ else CPPFLAGS="$CPPFLAGS $APACHE_INCLUDE" fi cat > conftest.$ac_ext < int main() { conn_rec *c; int fd = c->client->fd; ; return 0; } EOF -if { (eval echo configure:8611: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:8334: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_php_fd_in_buff=yes @@ -8684,7 +8407,7 @@ ext_output=$PHP_CAUDIUM echo $ac_n "checking for Caudium support""... $ac_c" 1>&6 -echo "configure:8688: checking for Caudium support" >&5 +echo "configure:8411: checking for Caudium support" >&5 if test "$PHP_CAUDIUM" != "no"; then if test "$prefix" = "NONE"; then CPREF=/usr/local/; fi @@ -8754,7 +8477,7 @@ if test "$PHP_CAUDIUM" != "no"; then PIKE_C_INCLUDE=/usr/local/include/`basename $PIKE` fi echo $ac_n "checking for C includes in $PIKE_C_INCLUDE""... $ac_c" 1>&6 -echo "configure:8758: checking for C includes in $PIKE_C_INCLUDE" >&5 +echo "configure:8481: checking for C includes in $PIKE_C_INCLUDE" >&5 if test -f $PIKE_C_INCLUDE/version.h; then PIKE_TEST_VER=`$PIKE -e 'string v; int rel;sscanf(version(), "Pike v%s release %d", v, rel); write(v+"."+rel);'` ###### VERSION MATCH CHECK ####### @@ -9035,7 +8758,7 @@ ext_output=$PHP_CLI echo $ac_n "checking for CLI build""... $ac_c" 1>&6 -echo "configure:9039: checking for CLI build" >&5 +echo "configure:8762: checking for CLI build" >&5 if test "$PHP_CLI" != "no"; then src=$abs_srcdir/sapi/cli/Makefile.frag @@ -9085,7 +8808,7 @@ echo "$ac_t""$PHP_CLI" 1>&6 php_with_continuity=no echo $ac_n "checking for Continuity support""... $ac_c" 1>&6 -echo "configure:9089: checking for Continuity support" >&5 +echo "configure:8812: checking for Continuity support" >&5 # Check whether --with-continuity or --without-continuity was given. if test "${with_continuity+set}" = set; then withval="$with_continuity" @@ -9112,7 +8835,7 @@ if test "$PHP_CONTINUITY" != "no"; then { echo "configure: error: Please specify the path to the root of your Continuity server using --with-continuity=DIR" 1>&2; exit 1; } fi echo $ac_n "checking for Continuity include files""... $ac_c" 1>&6 -echo "configure:9116: checking for Continuity include files" >&5 +echo "configure:8839: checking for Continuity include files" >&5 if test -d $PHP_CONTINUITY/include ; then CAPI_INCLUDE=$PHP_CONTINUITY/include echo "$ac_t""Continuity Binary Distribution" 1>&6 @@ -9362,7 +9085,7 @@ ext_output=$PHP_EMBED echo $ac_n "checking for embedded SAPI library support""... $ac_c" 1>&6 -echo "configure:9366: checking for embedded SAPI library support" >&5 +echo "configure:9089: checking for embedded SAPI library support" >&5 if test "$PHP_EMBED" != "no"; then case "$PHP_EMBED" in @@ -9579,7 +9302,7 @@ fi php_with_isapi=no echo $ac_n "checking for Zeus ISAPI support""... $ac_c" 1>&6 -echo "configure:9583: checking for Zeus ISAPI support" >&5 +echo "configure:9306: checking for Zeus ISAPI support" >&5 # Check whether --with-isapi or --without-isapi was given. if test "${with_isapi+set}" = set; then withval="$with_isapi" @@ -9825,7 +9548,7 @@ fi echo $ac_n "checking for LiteSpeed support""... $ac_c" 1>&6 -echo "configure:9829: checking for LiteSpeed support" >&5 +echo "configure:9552: checking for LiteSpeed support" >&5 php_with_litespeed=no @@ -10079,7 +9802,7 @@ echo "$ac_t""$PHP_LITESPEED" 1>&6 php_with_milter=no echo $ac_n "checking for Milter support""... $ac_c" 1>&6 -echo "configure:10083: checking for Milter support" >&5 +echo "configure:9806: checking for Milter support" >&5 # Check whether --with-milter or --without-milter was given. if test "${with_milter+set}" = set; then withval="$with_milter" @@ -10363,7 +10086,7 @@ fi php_with_nsapi=no echo $ac_n "checking for NSAPI support""... $ac_c" 1>&6 -echo "configure:10367: checking for NSAPI support" >&5 +echo "configure:10090: checking for NSAPI support" >&5 # Check whether --with-nsapi or --without-nsapi was given. if test "${with_nsapi+set}" = set; then withval="$with_nsapi" @@ -10390,7 +10113,7 @@ if test "$PHP_NSAPI" != "no"; then { echo "configure: error: Please specify the path to the root of your Netscape/iPlanet/Sun Webserver using --with-nsapi=DIR" 1>&2; exit 1; } fi echo $ac_n "checking for NSAPI include files""... $ac_c" 1>&6 -echo "configure:10394: checking for NSAPI include files" >&5 +echo "configure:10117: checking for NSAPI include files" >&5 if test -d $PHP_NSAPI/include ; then NSAPI_INC_DIR="$PHP_NSAPI/include" echo "$ac_t""Netscape 3.x / Sun 7.x style" 1>&6 @@ -10398,17 +10121,17 @@ echo "configure:10394: checking for NSAPI include files" >&5 do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:10402: checking for $ac_hdr" >&5 +echo "configure:10125: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:10412: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:10135: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -10443,17 +10166,17 @@ done do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:10447: checking for $ac_hdr" >&5 +echo "configure:10170: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:10457: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:10180: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -10715,7 +10438,7 @@ fi php_with_phttpd=no echo $ac_n "checking for PHTTPD support""... $ac_c" 1>&6 -echo "configure:10719: checking for PHTTPD support" >&5 +echo "configure:10442: checking for PHTTPD support" >&5 # Check whether --with-phttpd or --without-phttpd was given. if test "${with_phttpd+set}" = set; then withval="$with_phttpd" @@ -10961,7 +10684,7 @@ fi php_with_pi3web=no echo $ac_n "checking for Pi3Web support""... $ac_c" 1>&6 -echo "configure:10965: checking for Pi3Web support" >&5 +echo "configure:10688: checking for Pi3Web support" >&5 # Check whether --with-pi3web or --without-pi3web was given. if test "${with_pi3web+set}" = set; then withval="$with_pi3web" @@ -11328,7 +11051,7 @@ ext_output=$PHP_ROXEN php_enable_roxen_zts=no echo $ac_n "checking whether Roxen module is build using ZTS""... $ac_c" 1>&6 -echo "configure:11332: checking whether Roxen module is build using ZTS" >&5 +echo "configure:11055: checking whether Roxen module is build using ZTS" >&5 # Check whether --enable-roxen-zts or --disable-roxen-zts was given. if test "${enable_roxen_zts+set}" = set; then enableval="$enable_roxen_zts" @@ -11352,7 +11075,7 @@ echo "$ac_t""$ext_output" 1>&6 RESULT= echo $ac_n "checking for Roxen/Pike support""... $ac_c" 1>&6 -echo "configure:11356: checking for Roxen/Pike support" >&5 +echo "configure:11079: checking for Roxen/Pike support" >&5 if test "$PHP_ROXEN" != "no"; then if test ! -d $PHP_ROXEN ; then { echo "configure: error: You did not specify a directory" 1>&2; exit 1; } @@ -11630,7 +11353,7 @@ ext_output=$PHP_THTTPD echo $ac_n "checking for thttpd""... $ac_c" 1>&6 -echo "configure:11634: checking for thttpd" >&5 +echo "configure:11357: checking for thttpd" >&5 if test "$PHP_THTTPD" != "no"; then if test ! -d $PHP_THTTPD; then @@ -11663,7 +11386,7 @@ if test "$PHP_THTTPD" != "no"; then gcc_arg_name=ac_cv_gcc_arg_rdynamic echo $ac_n "checking whether $CC supports -rdynamic""... $ac_c" 1>&6 -echo "configure:11667: checking whether $CC supports -rdynamic" >&5 +echo "configure:11390: checking whether $CC supports -rdynamic" >&5 if eval "test \"`echo '$''{'ac_cv_gcc_arg_rdynamic'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -11891,24 +11614,24 @@ ext_output=$PHP_TUX echo $ac_n "checking for TUX""... $ac_c" 1>&6 -echo "configure:11895: checking for TUX" >&5 +echo "configure:11618: checking for TUX" >&5 if test "$PHP_TUX" != "no"; then INSTALL_IT="\$(INSTALL) -m 0755 $SAPI_SHARED $PHP_TUX/php5.tux.so" for ac_hdr in tuxmodule.h do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:11902: checking for $ac_hdr" >&5 +echo "configure:11625: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:11912: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:11635: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -12137,7 +11860,7 @@ ext_output=$PHP_WEBJAMES echo $ac_n "checking for webjames""... $ac_c" 1>&6 -echo "configure:12141: checking for webjames" >&5 +echo "configure:11864: checking for webjames" >&5 if test "$PHP_WEBJAMES" != "no"; then @@ -12389,14 +12112,14 @@ ext_output=$PHP_CGI if test "$PHP_SAPI" = "default"; then echo $ac_n "checking whether to build CGI binary""... $ac_c" 1>&6 -echo "configure:12393: checking whether to build CGI binary" >&5 +echo "configure:12116: checking whether to build CGI binary" >&5 if test "$PHP_CGI" != "no"; then echo "$ac_t""yes" 1>&6 echo $ac_n "checking for socklen_t in sys/socket.h""... $ac_c" 1>&6 -echo "configure:12398: checking for socklen_t in sys/socket.h" >&5 +echo "configure:12121: checking for socklen_t in sys/socket.h" >&5 cat > conftest.$ac_ext < EOF @@ -12416,9 +12139,9 @@ rm -f conftest* echo $ac_n "checking for sun_len in sys/un.h""... $ac_c" 1>&6 -echo "configure:12420: checking for sun_len in sys/un.h" >&5 +echo "configure:12143: checking for sun_len in sys/un.h" >&5 cat > conftest.$ac_ext < EOF @@ -12438,7 +12161,7 @@ rm -f conftest* echo $ac_n "checking whether cross-process locking is required by accept()""... $ac_c" 1>&6 -echo "configure:12442: checking whether cross-process locking is required by accept()" >&5 +echo "configure:12165: checking whether cross-process locking is required by accept()" >&5 case "`uname -sr`" in IRIX\ 5.* | SunOS\ 5.* | UNIX_System_V\ 4.0) echo "$ac_t""yes" 1>&6 @@ -12671,7 +12394,7 @@ fi echo $ac_n "checking for chosen SAPI module""... $ac_c" 1>&6 -echo "configure:12675: checking for chosen SAPI module" >&5 +echo "configure:12398: checking for chosen SAPI module" >&5 echo "$ac_t""$PHP_SAPI" 1>&6 if test "$enable_maintainer_zts" = "yes"; then @@ -12728,7 +12451,7 @@ fi # Extract the first word of "sendmail", so it can be a program name with args. set dummy sendmail; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:12732: checking for $ac_word" >&5 +echo "configure:12455: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_PROG_SENDMAIL'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -12767,7 +12490,7 @@ fi echo $ac_n "checking whether system uses EBCDIC""... $ac_c" 1>&6 -echo "configure:12771: checking whether system uses EBCDIC" >&5 +echo "configure:12494: checking whether system uses EBCDIC" >&5 if eval "test \"`echo '$''{'ac_cv_ebcdic'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -12778,7 +12501,7 @@ else else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:12513: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_ebcdic=yes @@ -12814,7 +12537,7 @@ EOF echo $ac_n "checking whether byte ordering is bigendian""... $ac_c" 1>&6 -echo "configure:12818: checking whether byte ordering is bigendian" >&5 +echo "configure:12541: checking whether byte ordering is bigendian" >&5 if eval "test \"`echo '$''{'ac_cv_c_bigendian_php'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -12824,7 +12547,7 @@ else ac_cv_c_bigendian_php=unknown else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:12567: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_c_bigendian_php=yes else @@ -12866,7 +12589,7 @@ EOF echo $ac_n "checking whether writing to stdout works""... $ac_c" 1>&6 -echo "configure:12870: checking whether writing to stdout works" >&5 +echo "configure:12593: checking whether writing to stdout works" >&5 if eval "test \"`echo '$''{'ac_cv_write_stdout'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -12877,7 +12600,7 @@ else else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:12622: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_write_stdout=yes @@ -12970,12 +12693,12 @@ test -d /usr/ucblib && unset found echo $ac_n "checking for socket""... $ac_c" 1>&6 -echo "configure:12974: checking for socket" >&5 +echo "configure:12697: checking for socket" >&5 if eval "test \"`echo '$''{'ac_cv_func_socket'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:12725: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_socket=yes" else @@ -13016,12 +12739,12 @@ if eval "test \"`echo '$ac_cv_func_'socket`\" = yes"; then else echo "$ac_t""no" 1>&6 echo $ac_n "checking for __socket""... $ac_c" 1>&6 -echo "configure:13020: checking for __socket" >&5 +echo "configure:12743: checking for __socket" >&5 if eval "test \"`echo '$''{'ac_cv_func___socket'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:12771: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func___socket=yes" else @@ -13082,7 +12805,7 @@ EOF unset ac_cv_lib_socket___socket unset found echo $ac_n "checking for socket in -lsocket""... $ac_c" 1>&6 -echo "configure:13086: checking for socket in -lsocket" >&5 +echo "configure:12809: checking for socket in -lsocket" >&5 ac_lib_var=`echo socket'_'socket | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -13090,7 +12813,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lsocket $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:12828: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -13121,7 +12844,7 @@ else echo "$ac_t""no" 1>&6 echo $ac_n "checking for __socket in -lsocket""... $ac_c" 1>&6 -echo "configure:13125: checking for __socket in -lsocket" >&5 +echo "configure:12848: checking for __socket in -lsocket" >&5 ac_lib_var=`echo socket'_'__socket | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -13129,7 +12852,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lsocket $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:12867: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -13172,11 +12895,11 @@ fi found=no else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:12903: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then found=yes else @@ -13227,12 +12950,12 @@ EOF unset found echo $ac_n "checking for socketpair""... $ac_c" 1>&6 -echo "configure:13231: checking for socketpair" >&5 +echo "configure:12954: checking for socketpair" >&5 if eval "test \"`echo '$''{'ac_cv_func_socketpair'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:12982: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_socketpair=yes" else @@ -13273,12 +12996,12 @@ if eval "test \"`echo '$ac_cv_func_'socketpair`\" = yes"; then else echo "$ac_t""no" 1>&6 echo $ac_n "checking for __socketpair""... $ac_c" 1>&6 -echo "configure:13277: checking for __socketpair" >&5 +echo "configure:13000: checking for __socketpair" >&5 if eval "test \"`echo '$''{'ac_cv_func___socketpair'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:13028: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func___socketpair=yes" else @@ -13339,7 +13062,7 @@ EOF unset ac_cv_lib_socket___socketpair unset found echo $ac_n "checking for socketpair in -lsocket""... $ac_c" 1>&6 -echo "configure:13343: checking for socketpair in -lsocket" >&5 +echo "configure:13066: checking for socketpair in -lsocket" >&5 ac_lib_var=`echo socket'_'socketpair | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -13347,7 +13070,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lsocket $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:13085: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -13378,7 +13101,7 @@ else echo "$ac_t""no" 1>&6 echo $ac_n "checking for __socketpair in -lsocket""... $ac_c" 1>&6 -echo "configure:13382: checking for __socketpair in -lsocket" >&5 +echo "configure:13105: checking for __socketpair in -lsocket" >&5 ac_lib_var=`echo socket'_'__socketpair | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -13386,7 +13109,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lsocket $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:13124: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -13429,11 +13152,11 @@ fi found=no else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:13160: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then found=yes else @@ -13484,12 +13207,12 @@ EOF unset found echo $ac_n "checking for htonl""... $ac_c" 1>&6 -echo "configure:13488: checking for htonl" >&5 +echo "configure:13211: checking for htonl" >&5 if eval "test \"`echo '$''{'ac_cv_func_htonl'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:13239: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_htonl=yes" else @@ -13530,12 +13253,12 @@ if eval "test \"`echo '$ac_cv_func_'htonl`\" = yes"; then else echo "$ac_t""no" 1>&6 echo $ac_n "checking for __htonl""... $ac_c" 1>&6 -echo "configure:13534: checking for __htonl" >&5 +echo "configure:13257: checking for __htonl" >&5 if eval "test \"`echo '$''{'ac_cv_func___htonl'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:13285: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func___htonl=yes" else @@ -13596,7 +13319,7 @@ EOF unset ac_cv_lib_socket___htonl unset found echo $ac_n "checking for htonl in -lsocket""... $ac_c" 1>&6 -echo "configure:13600: checking for htonl in -lsocket" >&5 +echo "configure:13323: checking for htonl in -lsocket" >&5 ac_lib_var=`echo socket'_'htonl | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -13604,7 +13327,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lsocket $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:13342: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -13635,7 +13358,7 @@ else echo "$ac_t""no" 1>&6 echo $ac_n "checking for __htonl in -lsocket""... $ac_c" 1>&6 -echo "configure:13639: checking for __htonl in -lsocket" >&5 +echo "configure:13362: checking for __htonl in -lsocket" >&5 ac_lib_var=`echo socket'_'__htonl | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -13643,7 +13366,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lsocket $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:13381: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -13686,11 +13409,11 @@ fi found=no else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:13417: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then found=yes else @@ -13741,12 +13464,12 @@ EOF unset found echo $ac_n "checking for gethostname""... $ac_c" 1>&6 -echo "configure:13745: checking for gethostname" >&5 +echo "configure:13468: checking for gethostname" >&5 if eval "test \"`echo '$''{'ac_cv_func_gethostname'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:13496: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_gethostname=yes" else @@ -13787,12 +13510,12 @@ if eval "test \"`echo '$ac_cv_func_'gethostname`\" = yes"; then else echo "$ac_t""no" 1>&6 echo $ac_n "checking for __gethostname""... $ac_c" 1>&6 -echo "configure:13791: checking for __gethostname" >&5 +echo "configure:13514: checking for __gethostname" >&5 if eval "test \"`echo '$''{'ac_cv_func___gethostname'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:13542: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func___gethostname=yes" else @@ -13853,7 +13576,7 @@ EOF unset ac_cv_lib_nsl___gethostname unset found echo $ac_n "checking for gethostname in -lnsl""... $ac_c" 1>&6 -echo "configure:13857: checking for gethostname in -lnsl" >&5 +echo "configure:13580: checking for gethostname in -lnsl" >&5 ac_lib_var=`echo nsl'_'gethostname | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -13861,7 +13584,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lnsl $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:13599: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -13892,7 +13615,7 @@ else echo "$ac_t""no" 1>&6 echo $ac_n "checking for __gethostname in -lnsl""... $ac_c" 1>&6 -echo "configure:13896: checking for __gethostname in -lnsl" >&5 +echo "configure:13619: checking for __gethostname in -lnsl" >&5 ac_lib_var=`echo nsl'_'__gethostname | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -13900,7 +13623,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lnsl $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:13638: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -13943,11 +13666,11 @@ fi found=no else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:13674: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then found=yes else @@ -13998,12 +13721,12 @@ EOF unset found echo $ac_n "checking for gethostbyaddr""... $ac_c" 1>&6 -echo "configure:14002: checking for gethostbyaddr" >&5 +echo "configure:13725: checking for gethostbyaddr" >&5 if eval "test \"`echo '$''{'ac_cv_func_gethostbyaddr'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:13753: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_gethostbyaddr=yes" else @@ -14044,12 +13767,12 @@ if eval "test \"`echo '$ac_cv_func_'gethostbyaddr`\" = yes"; then else echo "$ac_t""no" 1>&6 echo $ac_n "checking for __gethostbyaddr""... $ac_c" 1>&6 -echo "configure:14048: checking for __gethostbyaddr" >&5 +echo "configure:13771: checking for __gethostbyaddr" >&5 if eval "test \"`echo '$''{'ac_cv_func___gethostbyaddr'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:13799: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func___gethostbyaddr=yes" else @@ -14110,7 +13833,7 @@ EOF unset ac_cv_lib_nsl___gethostbyaddr unset found echo $ac_n "checking for gethostbyaddr in -lnsl""... $ac_c" 1>&6 -echo "configure:14114: checking for gethostbyaddr in -lnsl" >&5 +echo "configure:13837: checking for gethostbyaddr in -lnsl" >&5 ac_lib_var=`echo nsl'_'gethostbyaddr | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -14118,7 +13841,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lnsl $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:13856: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -14149,7 +13872,7 @@ else echo "$ac_t""no" 1>&6 echo $ac_n "checking for __gethostbyaddr in -lnsl""... $ac_c" 1>&6 -echo "configure:14153: checking for __gethostbyaddr in -lnsl" >&5 +echo "configure:13876: checking for __gethostbyaddr in -lnsl" >&5 ac_lib_var=`echo nsl'_'__gethostbyaddr | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -14157,7 +13880,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lnsl $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:13895: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -14200,11 +13923,11 @@ fi found=no else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:13931: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then found=yes else @@ -14255,12 +13978,12 @@ EOF unset found echo $ac_n "checking for yp_get_default_domain""... $ac_c" 1>&6 -echo "configure:14259: checking for yp_get_default_domain" >&5 +echo "configure:13982: checking for yp_get_default_domain" >&5 if eval "test \"`echo '$''{'ac_cv_func_yp_get_default_domain'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:14010: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_yp_get_default_domain=yes" else @@ -14301,12 +14024,12 @@ if eval "test \"`echo '$ac_cv_func_'yp_get_default_domain`\" = yes"; then else echo "$ac_t""no" 1>&6 echo $ac_n "checking for __yp_get_default_domain""... $ac_c" 1>&6 -echo "configure:14305: checking for __yp_get_default_domain" >&5 +echo "configure:14028: checking for __yp_get_default_domain" >&5 if eval "test \"`echo '$''{'ac_cv_func___yp_get_default_domain'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:14056: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func___yp_get_default_domain=yes" else @@ -14367,7 +14090,7 @@ EOF unset ac_cv_lib_nsl___yp_get_default_domain unset found echo $ac_n "checking for yp_get_default_domain in -lnsl""... $ac_c" 1>&6 -echo "configure:14371: checking for yp_get_default_domain in -lnsl" >&5 +echo "configure:14094: checking for yp_get_default_domain in -lnsl" >&5 ac_lib_var=`echo nsl'_'yp_get_default_domain | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -14375,7 +14098,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lnsl $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:14113: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -14406,7 +14129,7 @@ else echo "$ac_t""no" 1>&6 echo $ac_n "checking for __yp_get_default_domain in -lnsl""... $ac_c" 1>&6 -echo "configure:14410: checking for __yp_get_default_domain in -lnsl" >&5 +echo "configure:14133: checking for __yp_get_default_domain in -lnsl" >&5 ac_lib_var=`echo nsl'_'__yp_get_default_domain | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -14414,7 +14137,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lnsl $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:14152: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -14457,11 +14180,11 @@ fi found=no else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:14188: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then found=yes else @@ -14513,12 +14236,12 @@ EOF unset found echo $ac_n "checking for dlopen""... $ac_c" 1>&6 -echo "configure:14517: checking for dlopen" >&5 +echo "configure:14240: checking for dlopen" >&5 if eval "test \"`echo '$''{'ac_cv_func_dlopen'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:14268: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_dlopen=yes" else @@ -14559,12 +14282,12 @@ if eval "test \"`echo '$ac_cv_func_'dlopen`\" = yes"; then else echo "$ac_t""no" 1>&6 echo $ac_n "checking for __dlopen""... $ac_c" 1>&6 -echo "configure:14563: checking for __dlopen" >&5 +echo "configure:14286: checking for __dlopen" >&5 if eval "test \"`echo '$''{'ac_cv_func___dlopen'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:14314: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func___dlopen=yes" else @@ -14625,7 +14348,7 @@ EOF unset ac_cv_lib_dl___dlopen unset found echo $ac_n "checking for dlopen in -ldl""... $ac_c" 1>&6 -echo "configure:14629: checking for dlopen in -ldl" >&5 +echo "configure:14352: checking for dlopen in -ldl" >&5 ac_lib_var=`echo dl'_'dlopen | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -14633,7 +14356,7 @@ else ac_save_LIBS="$LIBS" LIBS="-ldl $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:14371: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -14664,7 +14387,7 @@ else echo "$ac_t""no" 1>&6 echo $ac_n "checking for __dlopen in -ldl""... $ac_c" 1>&6 -echo "configure:14668: checking for __dlopen in -ldl" >&5 +echo "configure:14391: checking for __dlopen in -ldl" >&5 ac_lib_var=`echo dl'_'__dlopen | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -14672,7 +14395,7 @@ else ac_save_LIBS="$LIBS" LIBS="-ldl $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:14410: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -14715,11 +14438,11 @@ fi found=no else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:14446: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then found=yes else @@ -14771,7 +14494,7 @@ EOF fi echo $ac_n "checking for sin in -lm""... $ac_c" 1>&6 -echo "configure:14775: checking for sin in -lm" >&5 +echo "configure:14498: checking for sin in -lm" >&5 ac_lib_var=`echo m'_'sin | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -14779,7 +14502,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lm $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:14517: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -14824,12 +14547,12 @@ fi unset found echo $ac_n "checking for inet_aton""... $ac_c" 1>&6 -echo "configure:14828: checking for inet_aton" >&5 +echo "configure:14551: checking for inet_aton" >&5 if eval "test \"`echo '$''{'ac_cv_func_inet_aton'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:14579: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_inet_aton=yes" else @@ -14870,12 +14593,12 @@ if eval "test \"`echo '$ac_cv_func_'inet_aton`\" = yes"; then else echo "$ac_t""no" 1>&6 echo $ac_n "checking for __inet_aton""... $ac_c" 1>&6 -echo "configure:14874: checking for __inet_aton" >&5 +echo "configure:14597: checking for __inet_aton" >&5 if eval "test \"`echo '$''{'ac_cv_func___inet_aton'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:14625: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func___inet_aton=yes" else @@ -14936,7 +14659,7 @@ EOF unset ac_cv_lib_resolv___inet_aton unset found echo $ac_n "checking for inet_aton in -lresolv""... $ac_c" 1>&6 -echo "configure:14940: checking for inet_aton in -lresolv" >&5 +echo "configure:14663: checking for inet_aton in -lresolv" >&5 ac_lib_var=`echo resolv'_'inet_aton | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -14944,7 +14667,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lresolv $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:14682: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -14975,7 +14698,7 @@ else echo "$ac_t""no" 1>&6 echo $ac_n "checking for __inet_aton in -lresolv""... $ac_c" 1>&6 -echo "configure:14979: checking for __inet_aton in -lresolv" >&5 +echo "configure:14702: checking for __inet_aton in -lresolv" >&5 ac_lib_var=`echo resolv'_'__inet_aton | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -14983,7 +14706,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lresolv $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:14721: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -15026,11 +14749,11 @@ fi found=no else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:14757: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then found=yes else @@ -15072,7 +14795,7 @@ EOF unset ac_cv_lib_bind___inet_aton unset found echo $ac_n "checking for inet_aton in -lbind""... $ac_c" 1>&6 -echo "configure:15076: checking for inet_aton in -lbind" >&5 +echo "configure:14799: checking for inet_aton in -lbind" >&5 ac_lib_var=`echo bind'_'inet_aton | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -15080,7 +14803,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lbind $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:14818: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -15111,7 +14834,7 @@ else echo "$ac_t""no" 1>&6 echo $ac_n "checking for __inet_aton in -lbind""... $ac_c" 1>&6 -echo "configure:15115: checking for __inet_aton in -lbind" >&5 +echo "configure:14838: checking for __inet_aton in -lbind" >&5 ac_lib_var=`echo bind'_'__inet_aton | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -15119,7 +14842,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lbind $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:14857: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -15162,11 +14885,11 @@ fi found=no else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:14893: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then found=yes else @@ -15216,271 +14939,13 @@ EOF - unset ac_cv_func_nanosleep - unset ac_cv_func___nanosleep - unset found - - echo $ac_n "checking for nanosleep""... $ac_c" 1>&6 -echo "configure:15225: checking for nanosleep" >&5 -if eval "test \"`echo '$''{'ac_cv_func_nanosleep'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -/* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char nanosleep(); - -int main() { - -/* 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_nanosleep) || defined (__stub___nanosleep) -choke me -#else -nanosleep(); -#endif - -; return 0; } -EOF -if { (eval echo configure:15253: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_func_nanosleep=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_func_nanosleep=no" -fi -rm -f conftest* -fi - -if eval "test \"`echo '$ac_cv_func_'nanosleep`\" = yes"; then - echo "$ac_t""yes" 1>&6 - found=yes -else - echo "$ac_t""no" 1>&6 - echo $ac_n "checking for __nanosleep""... $ac_c" 1>&6 -echo "configure:15271: checking for __nanosleep" >&5 -if eval "test \"`echo '$''{'ac_cv_func___nanosleep'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -/* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char __nanosleep(); - -int main() { - -/* 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___nanosleep) || defined (__stub_____nanosleep) -choke me -#else -__nanosleep(); -#endif - -; return 0; } -EOF -if { (eval echo configure:15299: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_func___nanosleep=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_func___nanosleep=no" -fi -rm -f conftest* -fi - -if eval "test \"`echo '$ac_cv_func_'__nanosleep`\" = yes"; then - echo "$ac_t""yes" 1>&6 - found=yes -else - echo "$ac_t""no" 1>&6 -found=no -fi - -fi - - - case $found in - yes) - cat >> confdefs.h <<\EOF -#define HAVE_NANOSLEEP 1 -EOF - - ac_cv_func_nanosleep=yes - ;; - - *) - - unset ac_cv_lib_rt_nanosleep - unset ac_cv_lib_rt___nanosleep - unset found - echo $ac_n "checking for nanosleep in -lrt""... $ac_c" 1>&6 -echo "configure:15337: checking for nanosleep in -lrt" >&5 -ac_lib_var=`echo rt'_'nanosleep | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-lrt $LIBS" -cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=no" -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then - echo "$ac_t""yes" 1>&6 - found=yes -else - echo "$ac_t""no" 1>&6 - - echo $ac_n "checking for __nanosleep in -lrt""... $ac_c" 1>&6 -echo "configure:15376: checking for __nanosleep in -lrt" >&5 -ac_lib_var=`echo rt'_'__nanosleep | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-lrt $LIBS" -cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=no" -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then - echo "$ac_t""yes" 1>&6 - found=yes -else - echo "$ac_t""no" 1>&6 -found=no -fi - - -fi - - - if test "$found" = "yes"; then - ac_libs=$LIBS - LIBS="$LIBS -lrt" - if test "$cross_compiling" = yes; then - found=no -else - cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null -then - found=yes -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -fr conftest* - found=no -fi -rm -fr conftest* -fi - - LIBS=$ac_libs - fi - - if test "$found" = "yes"; then - - - case rt in - c|c_r|pthread*) ;; - *) - LIBS="-lrt $LIBS" - ;; - esac - - - cat >> confdefs.h <<\EOF -#define HAVE_NANOSLEEP 1 -EOF - - cat >> confdefs.h <<\EOF -#define HAVE_LIBRT 1 -EOF - - ac_cv_func_nanosleep=yes - else - - : - - fi - - ;; - - esac - - - echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 -echo "configure:15479: checking for ANSI C header files" >&5 +echo "configure:14944: checking for ANSI C header files" >&5 if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include @@ -15488,7 +14953,7 @@ else #include EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:15492: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:14957: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -15505,7 +14970,7 @@ rm -f conftest* if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat > conftest.$ac_ext < EOF @@ -15523,7 +14988,7 @@ 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 < EOF @@ -15544,7 +15009,7 @@ if test "$cross_compiling" = yes; then : else cat > conftest.$ac_ext < #define ISLOWER(c) ('a' <= (c) && (c) <= 'z') @@ -15555,7 +15020,7 @@ if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); exit (0); } EOF -if { (eval echo configure:15559: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:15024: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then : else @@ -15583,12 +15048,12 @@ for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr that defines DIR""... $ac_c" 1>&6 -echo "configure:15587: checking for $ac_hdr that defines DIR" >&5 +echo "configure:15052: checking for $ac_hdr that defines DIR" >&5 if eval "test \"`echo '$''{'ac_cv_header_dirent_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include <$ac_hdr> @@ -15596,7 +15061,7 @@ int main() { DIR *dirp = 0; ; return 0; } EOF -if { (eval echo configure:15600: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:15065: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* eval "ac_cv_header_dirent_$ac_safe=yes" else @@ -15621,7 +15086,7 @@ done # Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. if test $ac_header_dirent = dirent.h; then echo $ac_n "checking for opendir in -ldir""... $ac_c" 1>&6 -echo "configure:15625: checking for opendir in -ldir" >&5 +echo "configure:15090: checking for opendir in -ldir" >&5 ac_lib_var=`echo dir'_'opendir | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -15629,7 +15094,7 @@ else ac_save_LIBS="$LIBS" LIBS="-ldir $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:15109: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -15662,7 +15127,7 @@ fi else echo $ac_n "checking for opendir in -lx""... $ac_c" 1>&6 -echo "configure:15666: checking for opendir in -lx" >&5 +echo "configure:15131: checking for opendir in -lx" >&5 ac_lib_var=`echo x'_'opendir | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -15670,7 +15135,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lx $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:15150: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -15715,7 +15180,6 @@ sys/time.h \ netinet/in.h \ alloca.h \ arpa/inet.h \ -arpa/nameser_compat.h \ arpa/nameser.h \ assert.h \ crypt.h \ @@ -15764,17 +15228,17 @@ assert.h do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:15768: checking for $ac_hdr" >&5 +echo "configure:15232: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:15778: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:15242: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -15803,12 +15267,12 @@ done echo $ac_n "checking for fopencookie""... $ac_c" 1>&6 -echo "configure:15807: checking for fopencookie" >&5 +echo "configure:15271: checking for fopencookie" >&5 if eval "test \"`echo '$''{'ac_cv_func_fopencookie'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:15299: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_fopencookie=yes" else @@ -15853,7 +15317,7 @@ fi if test "$have_glibc_fopencookie" = "yes"; then cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:15331: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* have_cookie_io_functions_t=yes else @@ -15882,7 +15346,7 @@ if test "$cross_compiling" = yes; then else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:15382: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then cookie_io_functions_use_off64_t=yes @@ -15934,7 +15398,7 @@ fi else cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:15412: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* have_IO_cookie_io_functions_t=yes else @@ -15978,7 +15442,7 @@ EOF echo $ac_n "checking for broken getcwd""... $ac_c" 1>&6 -echo "configure:15982: checking for broken getcwd" >&5 +echo "configure:15446: checking for broken getcwd" >&5 os=`uname -sr 2>/dev/null` case $os in SunOS*) @@ -15993,14 +15457,14 @@ EOF echo $ac_n "checking for broken libc stdio""... $ac_c" 1>&6 -echo "configure:15997: checking for broken libc stdio" >&5 - if eval "test \"`echo '$''{'have_broken_glibc_fopen_append'+set}'`\" = set"; then +echo "configure:15461: checking for broken libc stdio" >&5 + if eval "test \"`echo '$''{'_cv_have_broken_glibc_fopen_append'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test "$cross_compiling" = yes; then cat > conftest.$ac_ext < @@ -16013,20 +15477,20 @@ choke me ; return 0; } EOF -if { (eval echo configure:16017: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:15481: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* - have_broken_glibc_fopen_append=yes + _cv_have_broken_glibc_fopen_append=yes else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* - have_broken_glibc_fopen_append=no + _cv_have_broken_glibc_fopen_append=no fi rm -f conftest* else cat > conftest.$ac_ext < @@ -16054,14 +15518,14 @@ int main(int argc, char *argv[]) } EOF -if { (eval echo configure:16058: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:15522: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then - have_broken_glibc_fopen_append=no + _cv_have_broken_glibc_fopen_append=no else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -fr conftest* - have_broken_glibc_fopen_append=yes + _cv_have_broken_glibc_fopen_append=yes fi rm -fr conftest* fi @@ -16069,7 +15533,7 @@ fi fi - if test "$have_broken_glibc_fopen_append" = "yes"; then + if test "$_cv_have_broken_glibc_fopen_append" = "yes"; then echo "$ac_t""yes" 1>&6 cat >> confdefs.h <<\EOF #define HAVE_BROKEN_GLIBC_FOPEN_APPEND 1 @@ -16082,12 +15546,12 @@ EOF echo $ac_n "checking whether struct tm is in sys/time.h or time.h""... $ac_c" 1>&6 -echo "configure:16086: checking whether struct tm is in sys/time.h or time.h" >&5 +echo "configure:15550: checking whether struct tm is in sys/time.h or time.h" >&5 if eval "test \"`echo '$''{'ac_cv_struct_tm'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include @@ -16095,7 +15559,7 @@ int main() { struct tm *tp; tp->tm_sec; ; return 0; } EOF -if { (eval echo configure:16099: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:15563: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_struct_tm=time.h else @@ -16116,12 +15580,12 @@ EOF fi echo $ac_n "checking for tm_zone in struct tm""... $ac_c" 1>&6 -echo "configure:16120: checking for tm_zone in struct tm" >&5 +echo "configure:15584: checking for tm_zone in struct tm" >&5 if eval "test \"`echo '$''{'ac_cv_struct_tm_zone'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include <$ac_cv_struct_tm> @@ -16129,7 +15593,7 @@ int main() { struct tm tm; tm.tm_zone; ; return 0; } EOF -if { (eval echo configure:16133: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:15597: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_struct_tm_zone=yes else @@ -16149,12 +15613,12 @@ EOF else echo $ac_n "checking for tzname""... $ac_c" 1>&6 -echo "configure:16153: checking for tzname" >&5 +echo "configure:15617: checking for tzname" >&5 if eval "test \"`echo '$''{'ac_cv_var_tzname'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #ifndef tzname /* For SGI. */ @@ -16164,7 +15628,7 @@ int main() { atoi(*tzname); ; return 0; } EOF -if { (eval echo configure:16168: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:15632: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_var_tzname=yes else @@ -16188,16 +15652,16 @@ fi echo $ac_n "checking for missing declarations of reentrant functions""... $ac_c" 1>&6 -echo "configure:16192: checking for missing declarations of reentrant functions" >&5 +echo "configure:15656: checking for missing declarations of reentrant functions" >&5 cat > conftest.$ac_ext < int main() { struct tm *(*func)() = localtime_r ; return 0; } EOF -if { (eval echo configure:16201: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:15665: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* : @@ -16215,14 +15679,14 @@ EOF fi rm -f conftest* cat > conftest.$ac_ext < int main() { struct tm *(*func)() = gmtime_r ; return 0; } EOF -if { (eval echo configure:16226: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:15690: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* : @@ -16240,14 +15704,14 @@ EOF fi rm -f conftest* cat > conftest.$ac_ext < int main() { char *(*func)() = asctime_r ; return 0; } EOF -if { (eval echo configure:16251: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:15715: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* : @@ -16265,14 +15729,14 @@ EOF fi rm -f conftest* cat > conftest.$ac_ext < int main() { char *(*func)() = ctime_r ; return 0; } EOF -if { (eval echo configure:16276: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:15740: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* : @@ -16290,14 +15754,14 @@ EOF fi rm -f conftest* cat > conftest.$ac_ext < int main() { char *(*func)() = strtok_r ; return 0; } EOF -if { (eval echo configure:16301: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:15765: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* : @@ -16318,16 +15782,16 @@ rm -f conftest* echo $ac_n "checking for fclose declaration""... $ac_c" 1>&6 -echo "configure:16322: checking for fclose declaration" >&5 +echo "configure:15786: checking for fclose declaration" >&5 cat > conftest.$ac_ext < int main() { int (*func)() = fclose ; return 0; } EOF -if { (eval echo configure:16331: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:15795: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* cat >> confdefs.h <<\EOF @@ -16353,12 +15817,12 @@ rm -f conftest* echo $ac_n "checking for tm_gmtoff in struct tm""... $ac_c" 1>&6 -echo "configure:16357: checking for tm_gmtoff in struct tm" >&5 +echo "configure:15821: checking for tm_gmtoff in struct tm" >&5 if eval "test \"`echo '$''{'ac_cv_struct_tm_gmtoff'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include <$ac_cv_struct_tm> @@ -16366,7 +15830,7 @@ int main() { struct tm tm; tm.tm_gmtoff; ; return 0; } EOF -if { (eval echo configure:16370: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:15834: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_struct_tm_gmtoff=yes else @@ -16389,12 +15853,12 @@ fi echo $ac_n "checking for struct flock""... $ac_c" 1>&6 -echo "configure:16393: checking for struct flock" >&5 +echo "configure:15857: checking for struct flock" >&5 if eval "test \"`echo '$''{'ac_cv_struct_flock'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < @@ -16404,7 +15868,7 @@ int main() { struct flock x; ; return 0; } EOF -if { (eval echo configure:16408: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:15872: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_struct_flock=yes @@ -16431,12 +15895,12 @@ fi echo $ac_n "checking for socklen_t""... $ac_c" 1>&6 -echo "configure:16435: checking for socklen_t" >&5 +echo "configure:15899: checking for socklen_t" >&5 if eval "test \"`echo '$''{'ac_cv_socklen_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < @@ -16448,7 +15912,7 @@ socklen_t x; ; return 0; } EOF -if { (eval echo configure:16452: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:15916: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_socklen_t=yes @@ -16474,7 +15938,7 @@ fi echo $ac_n "checking size of size_t""... $ac_c" 1>&6 -echo "configure:16478: checking size of size_t" >&5 +echo "configure:15942: checking size of size_t" >&5 if eval "test \"`echo '$''{'ac_cv_sizeof_size_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -16482,7 +15946,7 @@ else ac_cv_sizeof_size_t=8 else cat > conftest.$ac_ext < int main() @@ -16493,7 +15957,7 @@ int main() return(0); } EOF -if { (eval echo configure:16497: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:15961: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_sizeof_size_t=`cat conftestval` else @@ -16513,7 +15977,7 @@ EOF echo $ac_n "checking size of long long""... $ac_c" 1>&6 -echo "configure:16517: checking size of long long" >&5 +echo "configure:15981: checking size of long long" >&5 if eval "test \"`echo '$''{'ac_cv_sizeof_long_long'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -16521,7 +15985,7 @@ else ac_cv_sizeof_long_long=8 else cat > conftest.$ac_ext < int main() @@ -16532,7 +15996,7 @@ int main() return(0); } EOF -if { (eval echo configure:16536: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:16000: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_sizeof_long_long=`cat conftestval` else @@ -16552,7 +16016,7 @@ EOF echo $ac_n "checking size of long long int""... $ac_c" 1>&6 -echo "configure:16556: checking size of long long int" >&5 +echo "configure:16020: checking size of long long int" >&5 if eval "test \"`echo '$''{'ac_cv_sizeof_long_long_int'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -16560,7 +16024,7 @@ else ac_cv_sizeof_long_long_int=8 else cat > conftest.$ac_ext < int main() @@ -16571,7 +16035,7 @@ int main() return(0); } EOF -if { (eval echo configure:16575: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:16039: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_sizeof_long_long_int=`cat conftestval` else @@ -16591,7 +16055,7 @@ EOF echo $ac_n "checking size of long""... $ac_c" 1>&6 -echo "configure:16595: checking size of long" >&5 +echo "configure:16059: checking size of long" >&5 if eval "test \"`echo '$''{'ac_cv_sizeof_long'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -16599,7 +16063,7 @@ else ac_cv_sizeof_long=8 else cat > conftest.$ac_ext < int main() @@ -16610,7 +16074,7 @@ int main() return(0); } EOF -if { (eval echo configure:16614: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:16078: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_sizeof_long=`cat conftestval` else @@ -16630,7 +16094,7 @@ EOF echo $ac_n "checking size of int""... $ac_c" 1>&6 -echo "configure:16634: checking size of int" >&5 +echo "configure:16098: checking size of int" >&5 if eval "test \"`echo '$''{'ac_cv_sizeof_int'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -16638,7 +16102,7 @@ else ac_cv_sizeof_int=4 else cat > conftest.$ac_ext < int main() @@ -16649,7 +16113,7 @@ int main() return(0); } EOF -if { (eval echo configure:16653: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:16117: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_sizeof_int=`cat conftestval` else @@ -16671,7 +16135,7 @@ EOF echo $ac_n "checking size of intmax_t""... $ac_c" 1>&6 -echo "configure:16675: checking size of intmax_t" >&5 +echo "configure:16139: checking size of intmax_t" >&5 php_cache_value=php_cv_sizeof_intmax_t if eval "test \"`echo '$''{'php_cv_sizeof_intmax_t'+set}'`\" = set"; then @@ -16688,7 +16152,7 @@ else else cat > conftest.$ac_ext < #if STDC_HEADERS @@ -16712,7 +16176,7 @@ int main() } EOF -if { (eval echo configure:16716: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:16180: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then eval $php_cache_value=`cat conftestval` @@ -16751,7 +16215,7 @@ EOF echo $ac_n "checking size of ssize_t""... $ac_c" 1>&6 -echo "configure:16755: checking size of ssize_t" >&5 +echo "configure:16219: checking size of ssize_t" >&5 php_cache_value=php_cv_sizeof_ssize_t if eval "test \"`echo '$''{'php_cv_sizeof_ssize_t'+set}'`\" = set"; then @@ -16768,7 +16232,7 @@ else else cat > conftest.$ac_ext < #if STDC_HEADERS @@ -16792,7 +16256,7 @@ int main() } EOF -if { (eval echo configure:16796: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:16260: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then eval $php_cache_value=`cat conftestval` @@ -16831,7 +16295,7 @@ EOF echo $ac_n "checking size of ptrdiff_t""... $ac_c" 1>&6 -echo "configure:16835: checking size of ptrdiff_t" >&5 +echo "configure:16299: checking size of ptrdiff_t" >&5 php_cache_value=php_cv_sizeof_ptrdiff_t if eval "test \"`echo '$''{'php_cv_sizeof_ptrdiff_t'+set}'`\" = set"; then @@ -16848,7 +16312,7 @@ else else cat > conftest.$ac_ext < #if STDC_HEADERS @@ -16872,7 +16336,7 @@ int main() } EOF -if { (eval echo configure:16876: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:16340: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then eval $php_cache_value=`cat conftestval` @@ -16911,12 +16375,12 @@ EOF echo $ac_n "checking for st_blksize in struct stat""... $ac_c" 1>&6 -echo "configure:16915: checking for st_blksize in struct stat" >&5 +echo "configure:16379: checking for st_blksize in struct stat" >&5 if eval "test \"`echo '$''{'ac_cv_struct_st_blksize'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include @@ -16924,7 +16388,7 @@ int main() { struct stat s; s.st_blksize; ; return 0; } EOF -if { (eval echo configure:16928: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:16392: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_struct_st_blksize=yes else @@ -16946,12 +16410,12 @@ fi if test "`uname -s 2>/dev/null`" != "QNX"; then echo $ac_n "checking for st_blocks in struct stat""... $ac_c" 1>&6 -echo "configure:16950: checking for st_blocks in struct stat" >&5 +echo "configure:16414: checking for st_blocks in struct stat" >&5 if eval "test \"`echo '$''{'ac_cv_struct_st_blocks'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include @@ -16959,7 +16423,7 @@ int main() { struct stat s; s.st_blocks; ; return 0; } EOF -if { (eval echo configure:16963: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:16427: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_struct_st_blocks=yes else @@ -16986,12 +16450,12 @@ else WARNING_LEVEL=0 fi echo $ac_n "checking for st_rdev in struct stat""... $ac_c" 1>&6 -echo "configure:16990: checking for st_rdev in struct stat" >&5 +echo "configure:16454: checking for st_rdev in struct stat" >&5 if eval "test \"`echo '$''{'ac_cv_struct_st_rdev'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include @@ -16999,7 +16463,7 @@ int main() { struct stat s; s.st_rdev; ; return 0; } EOF -if { (eval echo configure:17003: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:16467: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_struct_st_rdev=yes else @@ -17021,12 +16485,12 @@ fi echo $ac_n "checking for size_t""... $ac_c" 1>&6 -echo "configure:17025: checking for size_t" >&5 +echo "configure:16489: checking for size_t" >&5 if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #if STDC_HEADERS @@ -17054,12 +16518,12 @@ EOF fi echo $ac_n "checking for uid_t in sys/types.h""... $ac_c" 1>&6 -echo "configure:17058: checking for uid_t in sys/types.h" >&5 +echo "configure:16522: checking for uid_t in sys/types.h" >&5 if eval "test \"`echo '$''{'ac_cv_type_uid_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF @@ -17090,12 +16554,12 @@ fi echo $ac_n "checking for struct sockaddr_storage""... $ac_c" 1>&6 -echo "configure:17094: checking for struct sockaddr_storage" >&5 +echo "configure:16558: checking for struct sockaddr_storage" >&5 if eval "test \"`echo '$''{'ac_cv_sockaddr_storage'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include @@ -17103,7 +16567,7 @@ int main() { struct sockaddr_storage s; s ; return 0; } EOF -if { (eval echo configure:17107: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:16571: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_sockaddr_storage=yes else @@ -17124,13 +16588,13 @@ EOF fi echo $ac_n "checking for field sa_len in struct sockaddr""... $ac_c" 1>&6 -echo "configure:17128: checking for field sa_len in struct sockaddr" >&5 +echo "configure:16592: checking for field sa_len in struct sockaddr" >&5 if eval "test \"`echo '$''{'ac_cv_sockaddr_sa_len'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include @@ -17138,7 +16602,7 @@ int main() { static struct sockaddr sa; int n = (int) sa.sa_len; return n; ; return 0; } EOF -if { (eval echo configure:17142: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:16606: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_sockaddr_sa_len=yes else @@ -17161,12 +16625,12 @@ EOF echo $ac_n "checking for IPv6 support""... $ac_c" 1>&6 -echo "configure:17165: checking for IPv6 support" >&5 +echo "configure:16629: checking for IPv6 support" >&5 if eval "test \"`echo '$''{'ac_cv_ipv6_support'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include @@ -17175,7 +16639,7 @@ int main() { struct sockaddr_in6 s; struct in6_addr t=in6addr_any; int i=AF_INET6; s; t.s6_addr[0] = 0; ; return 0; } EOF -if { (eval echo configure:17179: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:16643: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_ipv6_support=yes else @@ -17191,12 +16655,12 @@ echo "$ac_t""$ac_cv_ipv6_support" 1>&6 echo $ac_n "checking for vprintf""... $ac_c" 1>&6 -echo "configure:17195: checking for vprintf" >&5 +echo "configure:16659: checking for vprintf" >&5 if eval "test \"`echo '$''{'ac_cv_func_vprintf'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:16687: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_vprintf=yes" else @@ -17243,12 +16707,12 @@ fi if test "$ac_cv_func_vprintf" != yes; then echo $ac_n "checking for _doprnt""... $ac_c" 1>&6 -echo "configure:17247: checking for _doprnt" >&5 +echo "configure:16711: checking for _doprnt" >&5 if eval "test \"`echo '$''{'ac_cv_func__doprnt'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:16739: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func__doprnt=yes" else @@ -17379,12 +16843,12 @@ asprintf \ do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:17383: checking for $ac_func" >&5 +echo "configure:16847: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:16875: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -17432,26 +16896,177 @@ fi done +echo $ac_n "checking for nanosleep""... $ac_c" 1>&6 +echo "configure:16901: checking for nanosleep" >&5 +if eval "test \"`echo '$''{'ac_cv_func_nanosleep'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + + + unset ac_cv_lib_rt_nanosleep + unset ac_cv_lib_rt___nanosleep + unset found + echo $ac_n "checking for nanosleep in -lrt""... $ac_c" 1>&6 +echo "configure:16911: checking for nanosleep in -lrt" >&5 +ac_lib_var=`echo rt'_'nanosleep | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lrt $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + found=yes +else + echo "$ac_t""no" 1>&6 + + echo $ac_n "checking for __nanosleep in -lrt""... $ac_c" 1>&6 +echo "configure:16950: checking for __nanosleep in -lrt" >&5 +ac_lib_var=`echo rt'_'__nanosleep | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lrt $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + found=yes +else + echo "$ac_t""no" 1>&6 +found=no +fi + + +fi + + + if test "$found" = "yes"; then + ac_libs=$LIBS + LIBS="$LIBS -lrt" + if test "$cross_compiling" = yes; then + found=no +else + cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +then + found=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* + found=no +fi +rm -fr conftest* +fi + + LIBS=$ac_libs + fi + + if test "$found" = "yes"; then + + + case rt in + c|c_r|pthread*) ;; + *) + LIBS="-lrt $LIBS" + ;; + esac + + + cat >> confdefs.h <<\EOF +#define HAVE_NANOSLEEP 1 +EOF + + cat >> confdefs.h <<\EOF +#define HAVE_LIBRT 1 +EOF + + ac_cv_func_nanosleep=yes + else + + : + + fi + + +fi + +echo "$ac_t""$ac_cv_func_nanosleep" 1>&6 + echo $ac_n "checking for getaddrinfo""... $ac_c" 1>&6 -echo "configure:17437: checking for getaddrinfo" >&5 +echo "configure:17052: checking for getaddrinfo" >&5 if eval "test \"`echo '$''{'ac_cv_func_getaddrinfo'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < int main() { struct addrinfo *g,h;g=&h;getaddrinfo("","",g,&g); ; return 0; } EOF -if { (eval echo configure:17449: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:17064: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* if test "$cross_compiling" = yes; then ac_cv_func_getaddrinfo=no else cat > conftest.$ac_ext < @@ -17491,7 +17106,7 @@ int main(void) { } EOF -if { (eval echo configure:17495: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:17110: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_func_getaddrinfo=yes else @@ -17523,12 +17138,12 @@ fi for ac_func in strlcat strlcpy getopt do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:17527: checking for $ac_func" >&5 +echo "configure:17142: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:17170: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -17578,7 +17193,7 @@ done echo $ac_n "checking whether utime accepts a null argument""... $ac_c" 1>&6 -echo "configure:17582: checking whether utime accepts a null argument" >&5 +echo "configure:17197: checking whether utime accepts a null argument" >&5 if eval "test \"`echo '$''{'ac_cv_func_utime_null'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -17588,7 +17203,7 @@ if test "$cross_compiling" = yes; then ac_cv_func_utime_null=no else cat > conftest.$ac_ext < #include @@ -17599,7 +17214,7 @@ exit(!(stat ("conftestdata", &s) == 0 && utime("conftestdata", (long *)0) == 0 && t.st_mtime - s.st_mtime < 120)); } EOF -if { (eval echo configure:17603: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:17218: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_func_utime_null=yes else @@ -17625,19 +17240,19 @@ fi # The Ultrix 4.2 mips builtin alloca declared by alloca.h only works # for constant arguments. Useless! echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6 -echo "configure:17629: checking for working alloca.h" >&5 +echo "configure:17244: checking for working alloca.h" >&5 if eval "test \"`echo '$''{'ac_cv_header_alloca_h'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < int main() { char *p = alloca(2 * sizeof(int)); ; return 0; } EOF -if { (eval echo configure:17641: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:17256: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_header_alloca_h=yes else @@ -17658,12 +17273,12 @@ EOF fi echo $ac_n "checking for alloca""... $ac_c" 1>&6 -echo "configure:17662: checking for alloca" >&5 +echo "configure:17277: checking for alloca" >&5 if eval "test \"`echo '$''{'ac_cv_func_alloca_works'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:17310: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_func_alloca_works=yes else @@ -17723,12 +17338,12 @@ EOF echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6 -echo "configure:17727: checking whether alloca needs Cray hooks" >&5 +echo "configure:17342: checking whether alloca needs Cray hooks" >&5 if eval "test \"`echo '$''{'ac_cv_os_cray'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&6 if test $ac_cv_os_cray = yes; then for ac_func in _getb67 GETB67 getb67; do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:17757: checking for $ac_func" >&5 +echo "configure:17372: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:17400: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -17808,7 +17423,7 @@ done fi echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6 -echo "configure:17812: checking stack direction for C alloca" >&5 +echo "configure:17427: checking stack direction for C alloca" >&5 if eval "test \"`echo '$''{'ac_cv_c_stack_direction'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -17816,7 +17431,7 @@ else ac_cv_c_stack_direction=0 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:17454: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_c_stack_direction=1 else @@ -17858,13 +17473,13 @@ fi echo $ac_n "checking for declared timezone""... $ac_c" 1>&6 -echo "configure:17862: checking for declared timezone" >&5 +echo "configure:17477: checking for declared timezone" >&5 if eval "test \"`echo '$''{'ac_cv_declared_timezone'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < @@ -17879,7 +17494,7 @@ int main() { ; return 0; } EOF -if { (eval echo configure:17883: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:17498: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_declared_timezone=yes @@ -17905,7 +17520,7 @@ EOF echo $ac_n "checking for type of reentrant time-related functions""... $ac_c" 1>&6 -echo "configure:17909: checking for type of reentrant time-related functions" >&5 +echo "configure:17524: checking for type of reentrant time-related functions" >&5 if eval "test \"`echo '$''{'ac_cv_time_r_type'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -17916,7 +17531,7 @@ if test "$cross_compiling" = yes; then else cat > conftest.$ac_ext < @@ -17934,7 +17549,7 @@ return (1); } EOF -if { (eval echo configure:17938: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:17553: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_time_r_type=hpux @@ -17950,7 +17565,7 @@ else else cat > conftest.$ac_ext < @@ -17966,7 +17581,7 @@ main() { } EOF -if { (eval echo configure:17970: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:17585: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_time_r_type=irix @@ -18004,12 +17619,12 @@ EOF echo $ac_n "checking for readdir_r""... $ac_c" 1>&6 -echo "configure:18008: checking for readdir_r" >&5 +echo "configure:17623: checking for readdir_r" >&5 if eval "test \"`echo '$''{'ac_cv_func_readdir_r'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:17651: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_readdir_r=yes" else @@ -18054,7 +17669,7 @@ fi if test "$ac_cv_func_readdir_r" = "yes"; then echo $ac_n "checking for type of readdir_r""... $ac_c" 1>&6 -echo "configure:18058: checking for type of readdir_r" >&5 +echo "configure:17673: checking for type of readdir_r" >&5 if eval "test \"`echo '$''{'ac_cv_what_readdir_r'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -18065,7 +17680,7 @@ else else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:17709: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_what_readdir_r=POSIX @@ -18101,7 +17716,7 @@ else rm -fr conftest* cat > conftest.$ac_ext <&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:17730: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -18153,12 +17768,12 @@ EOF echo $ac_n "checking for in_addr_t""... $ac_c" 1>&6 -echo "configure:18157: checking for in_addr_t" >&5 +echo "configure:17772: checking for in_addr_t" >&5 if eval "test \"`echo '$''{'ac_cv_type_in_addr_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #if STDC_HEADERS @@ -18192,12 +17807,12 @@ fi for ac_func in crypt_r do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:18196: checking for $ac_func" >&5 +echo "configure:17811: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:17839: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -18248,14 +17863,14 @@ done if test "x$php_crypt_r" = "x1"; then echo $ac_n "checking which data struct is used by crypt_r""... $ac_c" 1>&6 -echo "configure:18252: checking which data struct is used by crypt_r" >&5 +echo "configure:17867: checking which data struct is used by crypt_r" >&5 if eval "test \"`echo '$''{'php_cv_crypt_r_style'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else php_cv_crypt_r_style=none cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:17887: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* php_cv_crypt_r_style=cryptd else @@ -18279,7 +17894,7 @@ rm -f conftest* if test "$php_cv_crypt_r_style" = "none"; then cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:17911: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* php_cv_crypt_r_style=struct_crypt_data else @@ -18304,7 +17919,7 @@ rm -f conftest* if test "$php_cv_crypt_r_style" = "none"; then cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:17937: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* php_cv_crypt_r_style=struct_crypt_data_gnu_source else @@ -18377,7 +17992,7 @@ fi php_enable_gcov=no echo $ac_n "checking whether to include gcov symbols""... $ac_c" 1>&6 -echo "configure:18381: checking whether to include gcov symbols" >&5 +echo "configure:17996: checking whether to include gcov symbols" >&5 # Check whether --enable-gcov or --disable-gcov was given. if test "${enable_gcov+set}" = set; then enableval="$enable_gcov" @@ -18419,7 +18034,7 @@ if test "$PHP_GCOV" = "yes"; then # Extract the first word of "lcov", so it can be a program name with args. set dummy lcov; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:18423: checking for $ac_word" >&5 +echo "configure:18038: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_LTP'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -18448,7 +18063,7 @@ fi # Extract the first word of "genhtml", so it can be a program name with args. set dummy genhtml; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:18452: checking for $ac_word" >&5 +echo "configure:18067: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_LTP_GENHTML'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -18483,7 +18098,7 @@ fi if test "$LTP"; then echo $ac_n "checking for ltp version""... $ac_c" 1>&6 -echo "configure:18487: checking for ltp version" >&5 +echo "configure:18102: checking for ltp version" >&5 if eval "test \"`echo '$''{'php_cv_ltp_version'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -18540,7 +18155,7 @@ fi php_enable_debug=no echo $ac_n "checking whether to include debugging symbols""... $ac_c" 1>&6 -echo "configure:18544: checking whether to include debugging symbols" >&5 +echo "configure:18159: checking whether to include debugging symbols" >&5 # Check whether --enable-debug or --disable-debug was given. if test "${enable_debug+set}" = set; then enableval="$enable_debug" @@ -18591,7 +18206,7 @@ fi php_with_layout=PHP echo $ac_n "checking layout of installed files""... $ac_c" 1>&6 -echo "configure:18595: checking layout of installed files" >&5 +echo "configure:18210: checking layout of installed files" >&5 # Check whether --with-layout or --without-layout was given. if test "${with_layout+set}" = set; then withval="$with_layout" @@ -18626,7 +18241,7 @@ esac php_with_config_file_path=DEFAULT echo $ac_n "checking path to configuration file""... $ac_c" 1>&6 -echo "configure:18630: checking path to configuration file" >&5 +echo "configure:18245: checking path to configuration file" >&5 # Check whether --with-config-file-path or --without-config-file-path was given. if test "${with_config_file_path+set}" = set; then withval="$with_config_file_path" @@ -18660,7 +18275,7 @@ if test "$PHP_CONFIG_FILE_PATH" = "DEFAULT"; then fi echo $ac_n "checking where to scan for configuration files""... $ac_c" 1>&6 -echo "configure:18664: checking where to scan for configuration files" >&5 +echo "configure:18279: checking where to scan for configuration files" >&5 php_with_config_file_scan_dir=DEFAULT @@ -18696,7 +18311,7 @@ test -n "$DEBUG_CFLAGS" && CFLAGS="$CFLAGS $DEBUG_CFLAGS" php_enable_safe_mode=no echo $ac_n "checking whether to enable safe mode by default""... $ac_c" 1>&6 -echo "configure:18700: checking whether to enable safe mode by default" >&5 +echo "configure:18315: checking whether to enable safe mode by default" >&5 # Check whether --enable-safe-mode or --disable-safe-mode was given. if test "${enable_safe_mode+set}" = set; then enableval="$enable_safe_mode" @@ -18731,7 +18346,7 @@ EOF fi echo $ac_n "checking for safe mode exec dir""... $ac_c" 1>&6 -echo "configure:18735: checking for safe mode exec dir" >&5 +echo "configure:18350: checking for safe mode exec dir" >&5 php_with_exec_dir=no @@ -18775,7 +18390,7 @@ fi php_enable_sigchild=no echo $ac_n "checking whether to enable PHP's own SIGCHLD handler""... $ac_c" 1>&6 -echo "configure:18779: checking whether to enable PHP's own SIGCHLD handler" >&5 +echo "configure:18394: checking whether to enable PHP's own SIGCHLD handler" >&5 # Check whether --enable-sigchild or --disable-sigchild was given. if test "${enable_sigchild+set}" = set; then enableval="$enable_sigchild" @@ -18813,7 +18428,7 @@ fi php_enable_magic_quotes=no echo $ac_n "checking whether to enable magic quotes by default""... $ac_c" 1>&6 -echo "configure:18817: checking whether to enable magic quotes by default" >&5 +echo "configure:18432: checking whether to enable magic quotes by default" >&5 # Check whether --enable-magic-quotes or --disable-magic-quotes was given. if test "${enable_magic_quotes+set}" = set; then enableval="$enable_magic_quotes" @@ -18851,7 +18466,7 @@ fi php_enable_libgcc=no echo $ac_n "checking whether to explicitly link against libgcc""... $ac_c" 1>&6 -echo "configure:18855: checking whether to explicitly link against libgcc" >&5 +echo "configure:18470: checking whether to explicitly link against libgcc" >&5 # Check whether --enable-libgcc or --disable-libgcc was given. if test "${enable_libgcc+set}" = set; then enableval="$enable_libgcc" @@ -18931,7 +18546,7 @@ fi php_enable_short_tags=yes echo $ac_n "checking whether to enable short tags by default""... $ac_c" 1>&6 -echo "configure:18935: checking whether to enable short tags by default" >&5 +echo "configure:18550: checking whether to enable short tags by default" >&5 # Check whether --enable-short-tags or --disable-short-tags was given. if test "${enable_short_tags+set}" = set; then enableval="$enable_short_tags" @@ -18969,7 +18584,7 @@ fi php_enable_dmalloc=no echo $ac_n "checking whether to enable dmalloc""... $ac_c" 1>&6 -echo "configure:18973: checking whether to enable dmalloc" >&5 +echo "configure:18588: checking whether to enable dmalloc" >&5 # Check whether --enable-dmalloc or --disable-dmalloc was given. if test "${enable_dmalloc+set}" = set; then enableval="$enable_dmalloc" @@ -18993,7 +18608,7 @@ echo "$ac_t""$ext_output" 1>&6 if test "$PHP_DMALLOC" = "yes"; then echo $ac_n "checking for dmalloc_error in -ldmalloc""... $ac_c" 1>&6 -echo "configure:18997: checking for dmalloc_error in -ldmalloc" >&5 +echo "configure:18612: checking for dmalloc_error in -ldmalloc" >&5 ac_lib_var=`echo dmalloc'_'dmalloc_error | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -19001,7 +18616,7 @@ else ac_save_LIBS="$LIBS" LIBS="-ldmalloc $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:18631: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -19057,7 +18672,7 @@ fi php_enable_ipv6=yes echo $ac_n "checking whether to enable IPv6 support""... $ac_c" 1>&6 -echo "configure:19061: checking whether to enable IPv6 support" >&5 +echo "configure:18676: checking whether to enable IPv6 support" >&5 # Check whether --enable-ipv6 or --disable-ipv6 was given. if test "${enable_ipv6+set}" = set; then enableval="$enable_ipv6" @@ -19087,7 +18702,7 @@ EOF fi echo $ac_n "checking how big to make fd sets""... $ac_c" 1>&6 -echo "configure:19091: checking how big to make fd sets" >&5 +echo "configure:18706: checking how big to make fd sets" >&5 php_enable_fd_setsize=no @@ -19158,7 +18773,7 @@ fi echo $ac_n "checking size of long""... $ac_c" 1>&6 -echo "configure:19162: checking size of long" >&5 +echo "configure:18777: checking size of long" >&5 if eval "test \"`echo '$''{'ac_cv_sizeof_long'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -19166,7 +18781,7 @@ else ac_cv_sizeof_long=8 else cat > conftest.$ac_ext < int main() @@ -19177,7 +18792,7 @@ int main() return(0); } EOF -if { (eval echo configure:19181: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:18796: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_sizeof_long=`cat conftestval` else @@ -19197,7 +18812,7 @@ EOF echo $ac_n "checking size of int""... $ac_c" 1>&6 -echo "configure:19201: checking size of int" >&5 +echo "configure:18816: checking size of int" >&5 if eval "test \"`echo '$''{'ac_cv_sizeof_int'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -19205,7 +18820,7 @@ else ac_cv_sizeof_int=4 else cat > conftest.$ac_ext < int main() @@ -19216,7 +18831,7 @@ int main() return(0); } EOF -if { (eval echo configure:19220: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:18835: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_sizeof_int=`cat conftestval` else @@ -19237,13 +18852,13 @@ EOF echo $ac_n "checking for int32_t""... $ac_c" 1>&6 -echo "configure:19241: checking for int32_t" >&5 +echo "configure:18856: checking for int32_t" >&5 if eval "test \"`echo '$''{'ac_cv_int_type_int32_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:18881: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_int_type_int32_t=yes else @@ -19285,13 +18900,13 @@ fi echo $ac_n "checking for uint32_t""... $ac_c" 1>&6 -echo "configure:19289: checking for uint32_t" >&5 +echo "configure:18904: checking for uint32_t" >&5 if eval "test \"`echo '$''{'ac_cv_int_type_uint32_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:18929: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_int_type_uint32_t=yes else @@ -19342,17 +18957,17 @@ stdlib.h do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:19346: checking for $ac_hdr" >&5 +echo "configure:18961: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:19356: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:18971: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -19382,12 +18997,12 @@ done for ac_func in strtoll atoll strftime do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:19386: checking for $ac_func" >&5 +echo "configure:19001: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:19029: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -19875,7 +19490,7 @@ case $PHP_REGEX in esac echo $ac_n "checking which regex library to use""... $ac_c" 1>&6 -echo "configure:19879: checking which regex library to use" >&5 +echo "configure:19494: checking which regex library to use" >&5 echo "$ac_t""$REGEX_TYPE" 1>&6 if test "$REGEX_TYPE" = "php"; then @@ -20252,13 +19867,13 @@ elif test "$REGEX_TYPE" = "system"; then EOF echo $ac_n "checking whether field re_magic exists in struct regex_t""... $ac_c" 1>&6 -echo "configure:20256: checking whether field re_magic exists in struct regex_t" >&5 +echo "configure:19871: checking whether field re_magic exists in struct regex_t" >&5 if eval "test \"`echo '$''{'ac_cv_regex_t_re_magic'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include @@ -20266,7 +19881,7 @@ int main() { regex_t rt; rt.re_magic; ; return 0; } EOF -if { (eval echo configure:20270: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:19885: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_regex_t_re_magic=yes else @@ -20292,7 +19907,7 @@ fi php_enable_libxml=yes echo $ac_n "checking whether to enable LIBXML support""... $ac_c" 1>&6 -echo "configure:20296: checking whether to enable LIBXML support" >&5 +echo "configure:19911: checking whether to enable LIBXML support" >&5 # Check whether --enable-libxml or --disable-libxml was given. if test "${enable_libxml+set}" = set; then enableval="$enable_libxml" @@ -20340,7 +19955,7 @@ if test -z "$PHP_LIBXML_DIR"; then php_with_libxml_dir=no echo $ac_n "checking libxml2 install dir""... $ac_c" 1>&6 -echo "configure:20344: checking libxml2 install dir" >&5 +echo "configure:19959: checking libxml2 install dir" >&5 # Check whether --with-libxml-dir or --without-libxml-dir was given. if test "${with_libxml_dir+set}" = set; then withval="$with_libxml_dir" @@ -20369,7 +19984,7 @@ if test "$PHP_LIBXML" != "no"; then echo $ac_n "checking for xml2-config path""... $ac_c" 1>&6 -echo "configure:20373: checking for xml2-config path" >&5 +echo "configure:19988: checking for xml2-config path" >&5 if eval "test \"`echo '$''{'ac_cv_php_xml2_config_path'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -20527,7 +20142,7 @@ echo "$ac_t""$ac_cv_php_xml2_config_path" 1>&6 echo $ac_n "checking whether libxml build works""... $ac_c" 1>&6 -echo "configure:20531: checking whether libxml build works" >&5 +echo "configure:20146: checking whether libxml build works" >&5 if eval "test \"`echo '$''{'php_cv_libxml_build_works'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -20543,7 +20158,7 @@ else else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:20173: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then LIBS=$old_LIBS @@ -20919,7 +20534,7 @@ fi php_with_openssl=no echo $ac_n "checking for OpenSSL support""... $ac_c" 1>&6 -echo "configure:20923: checking for OpenSSL support" >&5 +echo "configure:20538: checking for OpenSSL support" >&5 # Check whether --with-openssl or --without-openssl was given. if test "${with_openssl+set}" = set; then withval="$with_openssl" @@ -20966,7 +20581,7 @@ echo "$ac_t""$ext_output" 1>&6 php_with_kerberos=no echo $ac_n "checking for Kerberos support""... $ac_c" 1>&6 -echo "configure:20970: checking for Kerberos support" >&5 +echo "configure:20585: checking for Kerberos support" >&5 # Check whether --with-kerberos or --without-kerberos was given. if test "${with_kerberos+set}" = set; then withval="$with_kerberos" @@ -21295,7 +20910,7 @@ EOF # Extract the first word of "krb5-config", so it can be a program name with args. set dummy krb5-config; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:21299: checking for $ac_word" >&5 +echo "configure:20914: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_KRB5_CONFIG'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -21655,7 +21270,7 @@ fi fi echo $ac_n "checking for DSA_get_default_method in -lssl""... $ac_c" 1>&6 -echo "configure:21659: checking for DSA_get_default_method in -lssl" >&5 +echo "configure:21274: checking for DSA_get_default_method in -lssl" >&5 ac_lib_var=`echo ssl'_'DSA_get_default_method | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -21663,7 +21278,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lssl $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:21293: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -21716,7 +21331,7 @@ fi # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:21720: checking for $ac_word" >&5 +echo "configure:21335: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_PKG_CONFIG'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -21921,9 +21536,9 @@ fi old_CPPFLAGS=$CPPFLAGS CPPFLAGS=-I$OPENSSL_INCDIR echo $ac_n "checking for OpenSSL version""... $ac_c" 1>&6 -echo "configure:21925: checking for OpenSSL version" >&5 +echo "configure:21540: checking for OpenSSL version" >&5 cat > conftest.$ac_ext < @@ -22078,7 +21693,7 @@ rm -f conftest* done echo $ac_n "checking for CRYPTO_free in -lcrypto""... $ac_c" 1>&6 -echo "configure:22082: checking for CRYPTO_free in -lcrypto" >&5 +echo "configure:21697: checking for CRYPTO_free in -lcrypto" >&5 ac_lib_var=`echo crypto'_'CRYPTO_free | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -22086,7 +21701,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lcrypto $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:21716: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -22254,7 +21869,7 @@ fi done echo $ac_n "checking for SSL_CTX_set_ssl_version in -lssl""... $ac_c" 1>&6 -echo "configure:22258: checking for SSL_CTX_set_ssl_version in -lssl" >&5 +echo "configure:21873: checking for SSL_CTX_set_ssl_version in -lssl" >&5 ac_lib_var=`echo ssl'_'SSL_CTX_set_ssl_version | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -22262,7 +21877,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lssl $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:21892: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -22418,7 +22033,7 @@ ext_output=$PHP_PCRE_REGEX if test "$PHP_PCRE_REGEX" != "yes" && test "$PHP_PCRE_REGEX" != "no"; then echo $ac_n "checking for PCRE headers location""... $ac_c" 1>&6 -echo "configure:22422: checking for PCRE headers location" >&5 +echo "configure:22037: checking for PCRE headers location" >&5 for i in $PHP_PCRE_REGEX $PHP_PCRE_REGEX/include $PHP_PCRE_REGEX/include/pcre $PHP_PCRE_REGEX/local/include; do test -f $i/pcre.h && PCRE_INCDIR=$i done @@ -22429,7 +22044,7 @@ echo "configure:22422: checking for PCRE headers location" >&5 echo "$ac_t""$PCRE_INCDIR" 1>&6 echo $ac_n "checking for PCRE library location""... $ac_c" 1>&6 -echo "configure:22433: checking for PCRE library location" >&5 +echo "configure:22048: checking for PCRE library location" >&5 for j in $PHP_PCRE_REGEX $PHP_PCRE_REGEX/$PHP_LIBDIR; do test -f $j/libpcre.a || test -f $j/libpcre.$SHLIB_SUFFIX_NAME && PCRE_LIBDIR=$j done @@ -22851,7 +22466,7 @@ EOF else echo $ac_n "checking for PCRE library to use""... $ac_c" 1>&6 -echo "configure:22855: checking for PCRE library to use" >&5 +echo "configure:22470: checking for PCRE library to use" >&5 echo "$ac_t""bundled" 1>&6 pcrelib_sources="pcrelib/pcre_chartables.c pcrelib/pcre_ucd.c \ pcrelib/pcre_compile.c pcrelib/pcre_config.c pcrelib/pcre_exec.c \ @@ -23188,7 +22803,7 @@ EOF php_with_sqlite3=yes echo $ac_n "checking whether to enable the SQLite3 extension""... $ac_c" 1>&6 -echo "configure:23192: checking whether to enable the SQLite3 extension" >&5 +echo "configure:22807: checking whether to enable the SQLite3 extension" >&5 # Check whether --with-sqlite3 or --without-sqlite3 was given. if test "${with_sqlite3+set}" = set; then withval="$with_sqlite3" @@ -23246,7 +22861,7 @@ if test $PHP_SQLITE3 != "no"; then if test $PHP_SQLITE3 != "yes"; then echo $ac_n "checking for sqlite3 files in default path""... $ac_c" 1>&6 -echo "configure:23250: checking for sqlite3 files in default path" >&5 +echo "configure:22865: checking for sqlite3 files in default path" >&5 for i in $PHP_SQLITE3 /usr/local /usr; do if test -r $i/include/sqlite3.h; then SQLITE3_DIR=$i @@ -23261,7 +22876,7 @@ echo "configure:23250: checking for sqlite3 files in default path" >&5 fi echo $ac_n "checking for SQLite 3.3.9+""... $ac_c" 1>&6 -echo "configure:23265: checking for SQLite 3.3.9+" >&5 +echo "configure:22880: checking for SQLite 3.3.9+" >&5 save_old_LDFLAGS=$LDFLAGS ac_stuff=" @@ -23360,7 +22975,7 @@ echo "configure:23265: checking for SQLite 3.3.9+" >&5 done echo $ac_n "checking for sqlite3_prepare_v2 in -lsqlite3""... $ac_c" 1>&6 -echo "configure:23364: checking for sqlite3_prepare_v2 in -lsqlite3" >&5 +echo "configure:22979: checking for sqlite3_prepare_v2 in -lsqlite3" >&5 ac_lib_var=`echo sqlite3'_'sqlite3_prepare_v2 | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -23368,7 +22983,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lsqlite3 $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:22998: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -23639,7 +23254,7 @@ fi done echo $ac_n "checking for sqlite3_key in -lsqlite3""... $ac_c" 1>&6 -echo "configure:23643: checking for sqlite3_key in -lsqlite3" >&5 +echo "configure:23258: checking for sqlite3_key in -lsqlite3" >&5 ac_lib_var=`echo sqlite3'_'sqlite3_key | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -23647,7 +23262,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lsqlite3 $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:23277: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -23790,7 +23405,7 @@ fi done echo $ac_n "checking for sqlite3_load_extension in -lsqlite3""... $ac_c" 1>&6 -echo "configure:23794: checking for sqlite3_load_extension in -lsqlite3" >&5 +echo "configure:23409: checking for sqlite3_load_extension in -lsqlite3" >&5 ac_lib_var=`echo sqlite3'_'sqlite3_load_extension | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -23798,7 +23413,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lsqlite3 $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:23428: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -23846,7 +23461,7 @@ fi else echo $ac_n "checking bundled sqlite3 library""... $ac_c" 1>&6 -echo "configure:23850: checking bundled sqlite3 library" >&5 +echo "configure:23465: checking bundled sqlite3 library" >&5 echo "$ac_t""yes" 1>&6 sqlite3_extra_sources="libsqlite/sqlite3.c" @@ -24184,7 +23799,7 @@ fi php_with_zlib=no echo $ac_n "checking for ZLIB support""... $ac_c" 1>&6 -echo "configure:24188: checking for ZLIB support" >&5 +echo "configure:23803: checking for ZLIB support" >&5 # Check whether --with-zlib or --without-zlib was given. if test "${with_zlib+set}" = set; then withval="$with_zlib" @@ -24231,7 +23846,7 @@ echo "$ac_t""$ext_output" 1>&6 php_with_zlib_dir=no echo $ac_n "checking if the location of ZLIB install directory is defined""... $ac_c" 1>&6 -echo "configure:24235: checking if the location of ZLIB install directory is defined" >&5 +echo "configure:23850: checking if the location of ZLIB install directory is defined" >&5 # Check whether --with-zlib-dir or --without-zlib-dir was given. if test "${with_zlib_dir+set}" = set; then withval="$with_zlib_dir" @@ -24677,7 +24292,7 @@ EOF done echo $ac_n "checking for gzgets in -lz""... $ac_c" 1>&6 -echo "configure:24681: checking for gzgets in -lz" >&5 +echo "configure:24296: checking for gzgets in -lz" >&5 ac_lib_var=`echo z'_'gzgets | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -24685,7 +24300,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lz $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:24315: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -24836,7 +24451,7 @@ fi php_enable_bcmath=no echo $ac_n "checking whether to enable bc style precision math functions""... $ac_c" 1>&6 -echo "configure:24840: checking whether to enable bc style precision math functions" >&5 +echo "configure:24455: checking whether to enable bc style precision math functions" >&5 # Check whether --enable-bcmath or --disable-bcmath was given. if test "${enable_bcmath+set}" = set; then enableval="$enable_bcmath" @@ -25204,7 +24819,7 @@ fi php_with_bz2=no echo $ac_n "checking for BZip2 support""... $ac_c" 1>&6 -echo "configure:25208: checking for BZip2 support" >&5 +echo "configure:24823: checking for BZip2 support" >&5 # Check whether --with-bz2 or --without-bz2 was given. if test "${with_bz2+set}" = set; then withval="$with_bz2" @@ -25252,7 +24867,7 @@ if test "$PHP_BZ2" != "no"; then BZIP_DIR=$PHP_BZ2 else echo $ac_n "checking for BZip2 in default path""... $ac_c" 1>&6 -echo "configure:25256: checking for BZip2 in default path" >&5 +echo "configure:24871: checking for BZip2 in default path" >&5 for i in /usr/local /usr; do if test -r $i/include/bzlib.h; then BZIP_DIR=$i @@ -25365,7 +24980,7 @@ echo "configure:25256: checking for BZip2 in default path" >&5 done echo $ac_n "checking for BZ2_bzerror in -lbz2""... $ac_c" 1>&6 -echo "configure:25369: checking for BZ2_bzerror in -lbz2" >&5 +echo "configure:24984: checking for BZ2_bzerror in -lbz2" >&5 ac_lib_var=`echo bz2'_'BZ2_bzerror | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -25373,7 +24988,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lbz2 $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:25003: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -25852,7 +25467,7 @@ fi php_enable_calendar=no echo $ac_n "checking whether to enable calendar conversion support""... $ac_c" 1>&6 -echo "configure:25856: checking whether to enable calendar conversion support" >&5 +echo "configure:25471: checking whether to enable calendar conversion support" >&5 # Check whether --enable-calendar or --disable-calendar was given. if test "${enable_calendar+set}" = set; then enableval="$enable_calendar" @@ -26199,7 +25814,7 @@ fi php_enable_ctype=yes echo $ac_n "checking whether to enable ctype functions""... $ac_c" 1>&6 -echo "configure:26203: checking whether to enable ctype functions" >&5 +echo "configure:25818: checking whether to enable ctype functions" >&5 # Check whether --enable-ctype or --disable-ctype was given. if test "${enable_ctype+set}" = set; then enableval="$enable_ctype" @@ -26546,7 +26161,7 @@ fi php_with_curl=no echo $ac_n "checking for cURL support""... $ac_c" 1>&6 -echo "configure:26550: checking for cURL support" >&5 +echo "configure:26165: checking for cURL support" >&5 # Check whether --with-curl or --without-curl was given. if test "${with_curl+set}" = set; then withval="$with_curl" @@ -26593,7 +26208,7 @@ echo "$ac_t""$ext_output" 1>&6 php_with_curlwrappers=no echo $ac_n "checking if we should use cURL for url streams""... $ac_c" 1>&6 -echo "configure:26597: checking if we should use cURL for url streams" >&5 +echo "configure:26212: checking if we should use cURL for url streams" >&5 # Check whether --with-curlwrappers or --without-curlwrappers was given. if test "${with_curlwrappers+set}" = set; then withval="$with_curlwrappers" @@ -26620,7 +26235,7 @@ if test "$PHP_CURL" != "no"; then CURL_DIR=$PHP_CURL else echo $ac_n "checking for cURL in default path""... $ac_c" 1>&6 -echo "configure:26624: checking for cURL in default path" >&5 +echo "configure:26239: checking for cURL in default path" >&5 for i in /usr/local /usr; do if test -r $i/include/curl/easy.h; then CURL_DIR=$i @@ -26638,7 +26253,7 @@ echo "configure:26624: checking for cURL in default path" >&5 CURL_CONFIG="curl-config" echo $ac_n "checking for cURL 7.10.5 or greater""... $ac_c" 1>&6 -echo "configure:26642: checking for cURL 7.10.5 or greater" >&5 +echo "configure:26257: checking for cURL 7.10.5 or greater" >&5 if ${CURL_DIR}/bin/curl-config --libs > /dev/null 2>&1; then CURL_CONFIG=${CURL_DIR}/bin/curl-config @@ -26876,7 +26491,7 @@ echo "configure:26642: checking for cURL 7.10.5 or greater" >&5 echo $ac_n "checking for SSL support in libcurl""... $ac_c" 1>&6 -echo "configure:26880: checking for SSL support in libcurl" >&5 +echo "configure:26495: checking for SSL support in libcurl" >&5 CURL_SSL=`$CURL_CONFIG --feature | $EGREP SSL` if test "$CURL_SSL" = "SSL"; then echo "$ac_t""yes" 1>&6 @@ -26889,7 +26504,7 @@ EOF CFLAGS="`$CURL_CONFIG --cflags`" echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 -echo "configure:26893: checking how to run the C preprocessor" >&5 +echo "configure:26508: checking how to run the C preprocessor" >&5 # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= @@ -26904,13 +26519,13 @@ else # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:26914: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:26529: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : @@ -26921,13 +26536,13 @@ else rm -rf conftest* CPP="${CC-cc} -E -traditional-cpp" cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:26931: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:26546: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : @@ -26938,13 +26553,13 @@ else rm -rf conftest* CPP="${CC-cc} -nologo -E" cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:26948: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:26563: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : @@ -26969,14 +26584,14 @@ fi echo "$ac_t""$CPP" 1>&6 echo $ac_n "checking for openssl support in libcurl""... $ac_c" 1>&6 -echo "configure:26973: checking for openssl support in libcurl" >&5 +echo "configure:26588: checking for openssl support in libcurl" >&5 if test "$cross_compiling" = yes; then echo "$ac_t""no" 1>&6 else cat > conftest.$ac_ext < @@ -26995,7 +26610,7 @@ int main(int argc, char *argv[]) } EOF -if { (eval echo configure:26999: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:26614: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then echo "$ac_t""yes" 1>&6 @@ -27003,17 +26618,17 @@ then do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:27007: checking for $ac_hdr" >&5 +echo "configure:26622: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:27017: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:26632: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -27058,14 +26673,14 @@ fi echo $ac_n "checking for gnutls support in libcurl""... $ac_c" 1>&6 -echo "configure:27062: checking for gnutls support in libcurl" >&5 +echo "configure:26677: checking for gnutls support in libcurl" >&5 if test "$cross_compiling" = yes; then echo "$ac_t""no" 1>&6 else cat > conftest.$ac_ext < @@ -27084,23 +26699,23 @@ int main(int argc, char *argv[]) } EOF -if { (eval echo configure:27088: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:26703: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then echo "$ac_t""yes" 1>&6 ac_safe=`echo "gcrypt.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for gcrypt.h""... $ac_c" 1>&6 -echo "configure:27094: checking for gcrypt.h" >&5 +echo "configure:26709: checking for gcrypt.h" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:27104: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:26719: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -27242,7 +26857,7 @@ fi done echo $ac_n "checking for curl_easy_perform in -lcurl""... $ac_c" 1>&6 -echo "configure:27246: checking for curl_easy_perform in -lcurl" >&5 +echo "configure:26861: checking for curl_easy_perform in -lcurl" >&5 ac_lib_var=`echo curl'_'curl_easy_perform | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -27250,7 +26865,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lcurl $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:26880: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -27397,7 +27012,7 @@ fi done echo $ac_n "checking for curl_version_info in -lcurl""... $ac_c" 1>&6 -echo "configure:27401: checking for curl_version_info in -lcurl" >&5 +echo "configure:27016: checking for curl_version_info in -lcurl" >&5 ac_lib_var=`echo curl'_'curl_version_info | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -27405,7 +27020,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lcurl $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:27035: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -27550,7 +27165,7 @@ fi done echo $ac_n "checking for curl_easy_strerror in -lcurl""... $ac_c" 1>&6 -echo "configure:27554: checking for curl_easy_strerror in -lcurl" >&5 +echo "configure:27169: checking for curl_easy_strerror in -lcurl" >&5 ac_lib_var=`echo curl'_'curl_easy_strerror | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -27558,7 +27173,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lcurl $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:27188: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -27703,7 +27318,7 @@ fi done echo $ac_n "checking for curl_multi_strerror in -lcurl""... $ac_c" 1>&6 -echo "configure:27707: checking for curl_multi_strerror in -lcurl" >&5 +echo "configure:27322: checking for curl_multi_strerror in -lcurl" >&5 ac_lib_var=`echo curl'_'curl_multi_strerror | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -27711,7 +27326,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lcurl $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:27341: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -28435,7 +28050,7 @@ if test "$PHP_QDBM" != "no"; then done echo $ac_n "checking for dpopen in -l$LIB""... $ac_c" 1>&6 -echo "configure:28439: checking for dpopen in -l$LIB" >&5 +echo "configure:28054: checking for dpopen in -l$LIB" >&5 ac_lib_var=`echo $LIB'_'dpopen | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -28443,7 +28058,7 @@ else ac_save_LIBS="$LIBS" LIBS="-l$LIB $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:28073: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -28623,7 +28238,7 @@ fi THIS_FULL_NAME="$THIS_NAME" fi echo $ac_n "checking for $THIS_FULL_NAME support""... $ac_c" 1>&6 -echo "configure:28627: checking for $THIS_FULL_NAME support" >&5 +echo "configure:28242: checking for $THIS_FULL_NAME support" >&5 if test -n ""; then { echo "configure: error: " 1>&2; exit 1; } fi @@ -28651,7 +28266,7 @@ if test "$PHP_GDBM" != "no"; then THIS_FULL_NAME="$THIS_NAME" fi echo $ac_n "checking for $THIS_FULL_NAME support""... $ac_c" 1>&6 -echo "configure:28655: checking for $THIS_FULL_NAME support" >&5 +echo "configure:28270: checking for $THIS_FULL_NAME support" >&5 if test -n "You cannot combine --with-gdbm with --with-qdbm"; then { echo "configure: error: You cannot combine --with-gdbm with --with-qdbm" 1>&2; exit 1; } fi @@ -28770,7 +28385,7 @@ echo "configure:28655: checking for $THIS_FULL_NAME support" >&5 done echo $ac_n "checking for gdbm_open in -lgdbm""... $ac_c" 1>&6 -echo "configure:28774: checking for gdbm_open in -lgdbm" >&5 +echo "configure:28389: checking for gdbm_open in -lgdbm" >&5 ac_lib_var=`echo gdbm'_'gdbm_open | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -28778,7 +28393,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lgdbm $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:28408: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -28954,7 +28569,7 @@ fi THIS_FULL_NAME="$THIS_NAME" fi echo $ac_n "checking for $THIS_FULL_NAME support""... $ac_c" 1>&6 -echo "configure:28958: checking for $THIS_FULL_NAME support" >&5 +echo "configure:28573: checking for $THIS_FULL_NAME support" >&5 if test -n ""; then { echo "configure: error: " 1>&2; exit 1; } fi @@ -29083,7 +28698,7 @@ if test "$PHP_NDBM" != "no"; then done echo $ac_n "checking for dbm_open in -l$LIB""... $ac_c" 1>&6 -echo "configure:29087: checking for dbm_open in -l$LIB" >&5 +echo "configure:28702: checking for dbm_open in -l$LIB" >&5 ac_lib_var=`echo $LIB'_'dbm_open | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -29091,7 +28706,7 @@ else ac_save_LIBS="$LIBS" LIBS="-l$LIB $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:28721: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -29271,7 +28886,7 @@ fi THIS_FULL_NAME="$THIS_NAME" fi echo $ac_n "checking for $THIS_FULL_NAME support""... $ac_c" 1>&6 -echo "configure:29275: checking for $THIS_FULL_NAME support" >&5 +echo "configure:28890: checking for $THIS_FULL_NAME support" >&5 if test -n ""; then { echo "configure: error: " 1>&2; exit 1; } fi @@ -29338,7 +28953,7 @@ if test "$PHP_DB4" != "no"; then LIBS="-l$LIB $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:28968: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* cat > conftest.$ac_ext <&6 -echo "configure:29394: checking for db4 major version" >&5 +echo "configure:29009: checking for db4 major version" >&5 { echo "configure: error: Header contains different version" 1>&2; exit 1; } fi if test "4" = "4"; then echo $ac_n "checking for db4 minor version and patch level""... $ac_c" 1>&6 -echo "configure:29399: checking for db4 minor version and patch level" >&5 +echo "configure:29014: checking for db4 minor version and patch level" >&5 cat > conftest.$ac_ext <&6 -echo "configure:29427: checking if dba can be used as shared extension" >&5 +echo "configure:29042: checking if dba can be used as shared extension" >&5 cat > conftest.$ac_ext <&6 -echo "configure:29586: checking for $THIS_FULL_NAME support" >&5 +echo "configure:29201: checking for $THIS_FULL_NAME support" >&5 if test -n ""; then { echo "configure: error: " 1>&2; exit 1; } fi @@ -29610,7 +29225,7 @@ if test "$PHP_DB3" != "no"; then THIS_FULL_NAME="$THIS_NAME" fi echo $ac_n "checking for $THIS_FULL_NAME support""... $ac_c" 1>&6 -echo "configure:29614: checking for $THIS_FULL_NAME support" >&5 +echo "configure:29229: checking for $THIS_FULL_NAME support" >&5 if test -n "You cannot combine --with-db3 with --with-db4"; then { echo "configure: error: You cannot combine --with-db3 with --with-db4" 1>&2; exit 1; } fi @@ -29661,7 +29276,7 @@ echo "configure:29614: checking for $THIS_FULL_NAME support" >&5 LIBS="-l$LIB $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:29291: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* cat > conftest.$ac_ext <&6 -echo "configure:29717: checking for db3 major version" >&5 +echo "configure:29332: checking for db3 major version" >&5 { echo "configure: error: Header contains different version" 1>&2; exit 1; } fi if test "3" = "4"; then echo $ac_n "checking for db4 minor version and patch level""... $ac_c" 1>&6 -echo "configure:29722: checking for db4 minor version and patch level" >&5 +echo "configure:29337: checking for db4 minor version and patch level" >&5 cat > conftest.$ac_ext <&6 -echo "configure:29750: checking if dba can be used as shared extension" >&5 +echo "configure:29365: checking if dba can be used as shared extension" >&5 cat > conftest.$ac_ext <&6 -echo "configure:29909: checking for $THIS_FULL_NAME support" >&5 +echo "configure:29524: checking for $THIS_FULL_NAME support" >&5 if test -n ""; then { echo "configure: error: " 1>&2; exit 1; } fi @@ -29933,7 +29548,7 @@ if test "$PHP_DB2" != "no"; then THIS_FULL_NAME="$THIS_NAME" fi echo $ac_n "checking for $THIS_FULL_NAME support""... $ac_c" 1>&6 -echo "configure:29937: checking for $THIS_FULL_NAME support" >&5 +echo "configure:29552: checking for $THIS_FULL_NAME support" >&5 if test -n "You cannot combine --with-db2 with --with-db3 or --with-db4"; then { echo "configure: error: You cannot combine --with-db2 with --with-db3 or --with-db4" 1>&2; exit 1; } fi @@ -29984,7 +29599,7 @@ echo "configure:29937: checking for $THIS_FULL_NAME support" >&5 LIBS="-l$LIB $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:29614: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* cat > conftest.$ac_ext <&6 -echo "configure:30040: checking for db2 major version" >&5 +echo "configure:29655: checking for db2 major version" >&5 { echo "configure: error: Header contains different version" 1>&2; exit 1; } fi if test "2" = "4"; then echo $ac_n "checking for db4 minor version and patch level""... $ac_c" 1>&6 -echo "configure:30045: checking for db4 minor version and patch level" >&5 +echo "configure:29660: checking for db4 minor version and patch level" >&5 cat > conftest.$ac_ext <&6 -echo "configure:30073: checking if dba can be used as shared extension" >&5 +echo "configure:29688: checking if dba can be used as shared extension" >&5 cat > conftest.$ac_ext <&6 -echo "configure:30232: checking for $THIS_FULL_NAME support" >&5 +echo "configure:29847: checking for $THIS_FULL_NAME support" >&5 if test -n ""; then { echo "configure: error: " 1>&2; exit 1; } fi @@ -30248,7 +29863,7 @@ if test "$PHP_DB1" != "no"; then unset THIS_INCLUDE THIS_LIBS THIS_LFLAGS THIS_PREFIX THIS_RESULT echo $ac_n "checking for DB1 in library""... $ac_c" 1>&6 -echo "configure:30252: checking for DB1 in library" >&5 +echo "configure:29867: checking for DB1 in library" >&5 if test "$HAVE_DB4" = "1"; then THIS_VERSION=4 THIS_LIBS=$DB4_LIBS @@ -30296,7 +29911,7 @@ EOF fi echo "$ac_t""$THIS_LIBS" 1>&6 echo $ac_n "checking for DB1 in header""... $ac_c" 1>&6 -echo "configure:30300: checking for DB1 in header" >&5 +echo "configure:29915: checking for DB1 in header" >&5 echo "$ac_t""$THIS_INCLUDE" 1>&6 if test -n "$THIS_INCLUDE"; then @@ -30306,7 +29921,7 @@ echo "configure:30300: checking for DB1 in header" >&5 LIBS="-l$THIS_LIBS $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:29936: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* cat >> confdefs.h <&6 -echo "configure:30471: checking for $THIS_FULL_NAME support" >&5 +echo "configure:30086: checking for $THIS_FULL_NAME support" >&5 if test -n ""; then { echo "configure: error: " 1>&2; exit 1; } fi @@ -30495,7 +30110,7 @@ if test "$PHP_DBM" != "no"; then THIS_FULL_NAME="$THIS_NAME" fi echo $ac_n "checking for $THIS_FULL_NAME support""... $ac_c" 1>&6 -echo "configure:30499: checking for $THIS_FULL_NAME support" >&5 +echo "configure:30114: checking for $THIS_FULL_NAME support" >&5 if test -n "You cannot combine --with-dbm with --with-qdbm"; then { echo "configure: error: You cannot combine --with-dbm with --with-qdbm" 1>&2; exit 1; } fi @@ -30619,7 +30234,7 @@ echo "configure:30499: checking for $THIS_FULL_NAME support" >&5 done echo $ac_n "checking for dbminit in -l$LIB""... $ac_c" 1>&6 -echo "configure:30623: checking for dbminit in -l$LIB" >&5 +echo "configure:30238: checking for dbminit in -l$LIB" >&5 ac_lib_var=`echo $LIB'_'dbminit | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -30627,7 +30242,7 @@ else ac_save_LIBS="$LIBS" LIBS="-l$LIB $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:30257: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -30658,7 +30273,7 @@ if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then ext_shared=$save_ext_shared echo $ac_n "checking for DBM using GDBM""... $ac_c" 1>&6 -echo "configure:30662: checking for DBM using GDBM" >&5 +echo "configure:30277: checking for DBM using GDBM" >&5 cat >> confdefs.h <&6 -echo "configure:30826: checking for $THIS_FULL_NAME support" >&5 +echo "configure:30441: checking for $THIS_FULL_NAME support" >&5 if test -n ""; then { echo "configure: error: " 1>&2; exit 1; } fi @@ -31043,7 +30658,7 @@ elif test "$PHP_CDB" != "no"; then done echo $ac_n "checking for cdb_read in -l$LIB""... $ac_c" 1>&6 -echo "configure:31047: checking for cdb_read in -l$LIB" >&5 +echo "configure:30662: checking for cdb_read in -l$LIB" >&5 ac_lib_var=`echo $LIB'_'cdb_read | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -31051,7 +30666,7 @@ else ac_save_LIBS="$LIBS" LIBS="-l$LIB $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:30681: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -31231,7 +30846,7 @@ fi THIS_FULL_NAME="$THIS_NAME" fi echo $ac_n "checking for $THIS_FULL_NAME support""... $ac_c" 1>&6 -echo "configure:31235: checking for $THIS_FULL_NAME support" >&5 +echo "configure:30850: checking for $THIS_FULL_NAME support" >&5 if test -n ""; then { echo "configure: error: " 1>&2; exit 1; } fi @@ -31262,7 +30877,7 @@ fi THIS_FULL_NAME="$THIS_NAME" fi echo $ac_n "checking for $THIS_FULL_NAME support""... $ac_c" 1>&6 -echo "configure:31266: checking for $THIS_FULL_NAME support" >&5 +echo "configure:30881: checking for $THIS_FULL_NAME support" >&5 if test -n ""; then { echo "configure: error: " 1>&2; exit 1; } fi @@ -31293,7 +30908,7 @@ fi THIS_FULL_NAME="$THIS_NAME" fi echo $ac_n "checking for $THIS_FULL_NAME support""... $ac_c" 1>&6 -echo "configure:31297: checking for $THIS_FULL_NAME support" >&5 +echo "configure:30912: checking for $THIS_FULL_NAME support" >&5 if test -n ""; then { echo "configure: error: " 1>&2; exit 1; } fi @@ -31308,7 +30923,7 @@ echo "configure:31297: checking for $THIS_FULL_NAME support" >&5 echo $ac_n "checking whether to enable DBA interface""... $ac_c" 1>&6 -echo "configure:31312: checking whether to enable DBA interface" >&5 +echo "configure:30927: checking whether to enable DBA interface" >&5 if test "$HAVE_DBA" = "1"; then if test "$ext_shared" = "yes"; then echo "$ac_t""yes, shared" 1>&6 @@ -31638,7 +31253,7 @@ fi php_enable_dom=yes echo $ac_n "checking whether to enable DOM support""... $ac_c" 1>&6 -echo "configure:31642: checking whether to enable DOM support" >&5 +echo "configure:31257: checking whether to enable DOM support" >&5 # Check whether --enable-dom or --disable-dom was given. if test "${enable_dom+set}" = set; then enableval="$enable_dom" @@ -31686,7 +31301,7 @@ if test -z "$PHP_LIBXML_DIR"; then php_with_libxml_dir=no echo $ac_n "checking libxml2 install dir""... $ac_c" 1>&6 -echo "configure:31690: checking libxml2 install dir" >&5 +echo "configure:31305: checking libxml2 install dir" >&5 # Check whether --with-libxml-dir or --without-libxml-dir was given. if test "${with_libxml_dir+set}" = set; then withval="$with_libxml_dir" @@ -31717,7 +31332,7 @@ if test "$PHP_DOM" != "no"; then echo $ac_n "checking for xml2-config path""... $ac_c" 1>&6 -echo "configure:31721: checking for xml2-config path" >&5 +echo "configure:31336: checking for xml2-config path" >&5 if eval "test \"`echo '$''{'ac_cv_php_xml2_config_path'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -31875,7 +31490,7 @@ echo "$ac_t""$ac_cv_php_xml2_config_path" 1>&6 echo $ac_n "checking whether libxml build works""... $ac_c" 1>&6 -echo "configure:31879: checking whether libxml build works" >&5 +echo "configure:31494: checking whether libxml build works" >&5 if eval "test \"`echo '$''{'php_cv_libxml_build_works'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -31891,7 +31506,7 @@ else else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:31521: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then LIBS=$old_LIBS @@ -32325,7 +31940,7 @@ fi php_with_enchant=no echo $ac_n "checking for ENCHANT support""... $ac_c" 1>&6 -echo "configure:32329: checking for ENCHANT support" >&5 +echo "configure:31944: checking for ENCHANT support" >&5 # Check whether --with-enchant or --without-enchant was given. if test "${with_enchant+set}" = set; then withval="$with_enchant" @@ -32913,7 +32528,7 @@ EOF done echo $ac_n "checking for enchant_broker_set_param in -lenchant""... $ac_c" 1>&6 -echo "configure:32917: checking for enchant_broker_set_param in -lenchant" >&5 +echo "configure:32532: checking for enchant_broker_set_param in -lenchant" >&5 ac_lib_var=`echo enchant'_'enchant_broker_set_param | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -32921,7 +32536,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lenchant $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:32551: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -32979,7 +32594,7 @@ fi php_enable_exif=no echo $ac_n "checking whether to enable EXIF (metadata from images) support""... $ac_c" 1>&6 -echo "configure:32983: checking whether to enable EXIF (metadata from images) support" >&5 +echo "configure:32598: checking whether to enable EXIF (metadata from images) support" >&5 # Check whether --enable-exif or --disable-exif was given. if test "${enable_exif+set}" = set; then enableval="$enable_exif" @@ -33326,7 +32941,7 @@ fi php_enable_fileinfo=yes echo $ac_n "checking for fileinfo support""... $ac_c" 1>&6 -echo "configure:33330: checking for fileinfo support" >&5 +echo "configure:32945: checking for fileinfo support" >&5 # Check whether --enable-fileinfo or --disable-fileinfo was given. if test "${enable_fileinfo+set}" = set; then enableval="$enable_fileinfo" @@ -33679,12 +33294,12 @@ EOF for ac_func in utimes strndup do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:33683: checking for $ac_func" >&5 +echo "configure:33298: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:33326: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -33745,7 +33360,7 @@ fi php_enable_filter=yes echo $ac_n "checking whether to enable input filter support""... $ac_c" 1>&6 -echo "configure:33749: checking whether to enable input filter support" >&5 +echo "configure:33364: checking whether to enable input filter support" >&5 # Check whether --enable-filter or --disable-filter was given. if test "${enable_filter+set}" = set; then enableval="$enable_filter" @@ -33792,7 +33407,7 @@ echo "$ac_t""$ext_output" 1>&6 php_with_pcre_dir=no echo $ac_n "checking pcre install prefix""... $ac_c" 1>&6 -echo "configure:33796: checking pcre install prefix" >&5 +echo "configure:33411: checking pcre install prefix" >&5 # Check whether --with-pcre-dir or --without-pcre-dir was given. if test "${with_pcre_dir+set}" = set; then withval="$with_pcre_dir" @@ -33822,7 +33437,7 @@ if test "$PHP_FILTER" != "no"; then old_CPPFLAGS=$CPPFLAGS CPPFLAGS=$INCLUDES cat > conftest.$ac_ext < @@ -33841,7 +33456,7 @@ else rm -rf conftest* cat > conftest.$ac_ext < @@ -34211,7 +33826,7 @@ fi php_enable_ftp=no echo $ac_n "checking whether to enable FTP support""... $ac_c" 1>&6 -echo "configure:34215: checking whether to enable FTP support" >&5 +echo "configure:33830: checking whether to enable FTP support" >&5 # Check whether --enable-ftp or --disable-ftp was given. if test "${enable_ftp+set}" = set; then enableval="$enable_ftp" @@ -34258,7 +33873,7 @@ echo "$ac_t""$ext_output" 1>&6 php_with_openssl_dir=no echo $ac_n "checking OpenSSL dir for FTP""... $ac_c" 1>&6 -echo "configure:34262: checking OpenSSL dir for FTP" >&5 +echo "configure:33877: checking OpenSSL dir for FTP" >&5 # Check whether --with-openssl-dir or --without-openssl-dir was given. if test "${with_openssl_dir+set}" = set; then withval="$with_openssl_dir" @@ -34599,7 +34214,7 @@ EOF # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:34603: checking for $ac_word" >&5 +echo "configure:34218: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_PKG_CONFIG'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -34804,9 +34419,9 @@ fi old_CPPFLAGS=$CPPFLAGS CPPFLAGS=-I$OPENSSL_INCDIR echo $ac_n "checking for OpenSSL version""... $ac_c" 1>&6 -echo "configure:34808: checking for OpenSSL version" >&5 +echo "configure:34423: checking for OpenSSL version" >&5 cat > conftest.$ac_ext < @@ -34961,7 +34576,7 @@ rm -f conftest* done echo $ac_n "checking for CRYPTO_free in -lcrypto""... $ac_c" 1>&6 -echo "configure:34965: checking for CRYPTO_free in -lcrypto" >&5 +echo "configure:34580: checking for CRYPTO_free in -lcrypto" >&5 ac_lib_var=`echo crypto'_'CRYPTO_free | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -34969,7 +34584,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lcrypto $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:34599: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -35137,7 +34752,7 @@ fi done echo $ac_n "checking for SSL_CTX_set_ssl_version in -lssl""... $ac_c" 1>&6 -echo "configure:35141: checking for SSL_CTX_set_ssl_version in -lssl" >&5 +echo "configure:34756: checking for SSL_CTX_set_ssl_version in -lssl" >&5 ac_lib_var=`echo ssl'_'SSL_CTX_set_ssl_version | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -35145,7 +34760,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lssl $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:34775: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -35275,7 +34890,7 @@ fi php_with_gd=no echo $ac_n "checking for GD support""... $ac_c" 1>&6 -echo "configure:35279: checking for GD support" >&5 +echo "configure:34894: checking for GD support" >&5 # Check whether --with-gd or --without-gd was given. if test "${with_gd+set}" = set; then withval="$with_gd" @@ -35323,7 +34938,7 @@ if test -z "$PHP_JPEG_DIR"; then php_with_jpeg_dir=no echo $ac_n "checking for the location of libjpeg""... $ac_c" 1>&6 -echo "configure:35327: checking for the location of libjpeg" >&5 +echo "configure:34942: checking for the location of libjpeg" >&5 # Check whether --with-jpeg-dir or --without-jpeg-dir was given. if test "${with_jpeg_dir+set}" = set; then withval="$with_jpeg_dir" @@ -35351,7 +34966,7 @@ if test -z "$PHP_PNG_DIR"; then php_with_png_dir=no echo $ac_n "checking for the location of libpng""... $ac_c" 1>&6 -echo "configure:35355: checking for the location of libpng" >&5 +echo "configure:34970: checking for the location of libpng" >&5 # Check whether --with-png-dir or --without-png-dir was given. if test "${with_png_dir+set}" = set; then withval="$with_png_dir" @@ -35379,7 +34994,7 @@ if test -z "$PHP_ZLIB_DIR"; then php_with_zlib_dir=no echo $ac_n "checking for the location of libz""... $ac_c" 1>&6 -echo "configure:35383: checking for the location of libz" >&5 +echo "configure:34998: checking for the location of libz" >&5 # Check whether --with-zlib-dir or --without-zlib-dir was given. if test "${with_zlib_dir+set}" = set; then withval="$with_zlib_dir" @@ -35406,7 +35021,7 @@ fi php_with_xpm_dir=no echo $ac_n "checking for the location of libXpm""... $ac_c" 1>&6 -echo "configure:35410: checking for the location of libXpm" >&5 +echo "configure:35025: checking for the location of libXpm" >&5 # Check whether --with-xpm-dir or --without-xpm-dir was given. if test "${with_xpm_dir+set}" = set; then withval="$with_xpm_dir" @@ -35432,7 +35047,7 @@ echo "$ac_t""$ext_output" 1>&6 php_with_freetype_dir=no echo $ac_n "checking for FreeType 2""... $ac_c" 1>&6 -echo "configure:35436: checking for FreeType 2" >&5 +echo "configure:35051: checking for FreeType 2" >&5 # Check whether --with-freetype-dir or --without-freetype-dir was given. if test "${with_freetype_dir+set}" = set; then withval="$with_freetype_dir" @@ -35458,7 +35073,7 @@ echo "$ac_t""$ext_output" 1>&6 php_with_t1lib=no echo $ac_n "checking for T1lib support""... $ac_c" 1>&6 -echo "configure:35462: checking for T1lib support" >&5 +echo "configure:35077: checking for T1lib support" >&5 # Check whether --with-t1lib or --without-t1lib was given. if test "${with_t1lib+set}" = set; then withval="$with_t1lib" @@ -35484,7 +35099,7 @@ echo "$ac_t""$ext_output" 1>&6 php_enable_gd_native_ttf=no echo $ac_n "checking whether to enable truetype string function in GD""... $ac_c" 1>&6 -echo "configure:35488: checking whether to enable truetype string function in GD" >&5 +echo "configure:35103: checking whether to enable truetype string function in GD" >&5 # Check whether --enable-gd-native-ttf or --disable-gd-native-ttf was given. if test "${enable_gd_native_ttf+set}" = set; then enableval="$enable_gd_native_ttf" @@ -35510,7 +35125,7 @@ echo "$ac_t""$ext_output" 1>&6 php_enable_gd_jis_conv=no echo $ac_n "checking whether to enable JIS-mapped Japanese font support in GD""... $ac_c" 1>&6 -echo "configure:35514: checking whether to enable JIS-mapped Japanese font support in GD" >&5 +echo "configure:35129: checking whether to enable JIS-mapped Japanese font support in GD" >&5 # Check whether --enable-gd-jis-conv or --disable-gd-jis-conv was given. if test "${enable_gd_jis_conv+set}" = set; then enableval="$enable_gd_jis_conv" @@ -35565,12 +35180,12 @@ if test "$PHP_GD" = "yes"; then for ac_func in fabsf floorf do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:35569: checking for $ac_func" >&5 +echo "configure:35184: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:35212: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -35765,7 +35380,7 @@ EOF done echo $ac_n "checking for jpeg_read_header in -ljpeg""... $ac_c" 1>&6 -echo "configure:35769: checking for jpeg_read_header in -ljpeg" >&5 +echo "configure:35384: checking for jpeg_read_header in -ljpeg" >&5 ac_lib_var=`echo jpeg'_'jpeg_read_header | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -35773,7 +35388,7 @@ else ac_save_LIBS="$LIBS" LIBS="-ljpeg $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:35403: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -36066,7 +35681,7 @@ fi done echo $ac_n "checking for png_write_image in -lpng""... $ac_c" 1>&6 -echo "configure:36070: checking for png_write_image in -lpng" >&5 +echo "configure:35685: checking for png_write_image in -lpng" >&5 ac_lib_var=`echo png'_'png_write_image | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -36074,7 +35689,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lpng $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:35704: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -36465,7 +36080,7 @@ fi done echo $ac_n "checking for XpmFreeXpmImage in -lXpm""... $ac_c" 1>&6 -echo "configure:36469: checking for XpmFreeXpmImage in -lXpm" >&5 +echo "configure:36084: checking for XpmFreeXpmImage in -lXpm" >&5 ac_lib_var=`echo Xpm'_'XpmFreeXpmImage | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -36473,7 +36088,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lXpm $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:36103: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -36859,7 +36474,7 @@ fi done echo $ac_n "checking for FT_New_Face in -lfreetype""... $ac_c" 1>&6 -echo "configure:36863: checking for FT_New_Face in -lfreetype" >&5 +echo "configure:36478: checking for FT_New_Face in -lfreetype" >&5 ac_lib_var=`echo freetype'_'FT_New_Face | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -36867,7 +36482,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lfreetype $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:36497: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -37195,7 +36810,7 @@ fi done echo $ac_n "checking for T1_StrError in -lt1""... $ac_c" 1>&6 -echo "configure:37199: checking for T1_StrError in -lt1" >&5 +echo "configure:36814: checking for T1_StrError in -lt1" >&5 ac_lib_var=`echo t1'_'T1_StrError | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -37203,7 +36818,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lt1 $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:36833: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -37657,7 +37272,7 @@ EOF done echo $ac_n "checking for jpeg_read_header in -ljpeg""... $ac_c" 1>&6 -echo "configure:37661: checking for jpeg_read_header in -ljpeg" >&5 +echo "configure:37276: checking for jpeg_read_header in -ljpeg" >&5 ac_lib_var=`echo jpeg'_'jpeg_read_header | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -37665,7 +37280,7 @@ else ac_save_LIBS="$LIBS" LIBS="-ljpeg $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:37295: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -37958,7 +37573,7 @@ fi done echo $ac_n "checking for png_write_image in -lpng""... $ac_c" 1>&6 -echo "configure:37962: checking for png_write_image in -lpng" >&5 +echo "configure:37577: checking for png_write_image in -lpng" >&5 ac_lib_var=`echo png'_'png_write_image | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -37966,7 +37581,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lpng $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:37596: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -38357,7 +37972,7 @@ fi done echo $ac_n "checking for XpmFreeXpmImage in -lXpm""... $ac_c" 1>&6 -echo "configure:38361: checking for XpmFreeXpmImage in -lXpm" >&5 +echo "configure:37976: checking for XpmFreeXpmImage in -lXpm" >&5 ac_lib_var=`echo Xpm'_'XpmFreeXpmImage | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -38365,7 +37980,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lXpm $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:37995: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -38751,7 +38366,7 @@ fi done echo $ac_n "checking for FT_New_Face in -lfreetype""... $ac_c" 1>&6 -echo "configure:38755: checking for FT_New_Face in -lfreetype" >&5 +echo "configure:38370: checking for FT_New_Face in -lfreetype" >&5 ac_lib_var=`echo freetype'_'FT_New_Face | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -38759,7 +38374,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lfreetype $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:38389: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -39087,7 +38702,7 @@ fi done echo $ac_n "checking for T1_StrError in -lt1""... $ac_c" 1>&6 -echo "configure:39091: checking for T1_StrError in -lt1" >&5 +echo "configure:38706: checking for T1_StrError in -lt1" >&5 ac_lib_var=`echo t1'_'T1_StrError | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -39095,7 +38710,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lt1 $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:38725: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -39481,7 +39096,7 @@ EOF done echo $ac_n "checking for gdImageString16 in -lgd""... $ac_c" 1>&6 -echo "configure:39485: checking for gdImageString16 in -lgd" >&5 +echo "configure:39100: checking for gdImageString16 in -lgd" >&5 ac_lib_var=`echo gd'_'gdImageString16 | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -39489,7 +39104,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lgd $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:39119: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -39629,7 +39244,7 @@ fi done echo $ac_n "checking for gdImagePaletteCopy in -lgd""... $ac_c" 1>&6 -echo "configure:39633: checking for gdImagePaletteCopy in -lgd" >&5 +echo "configure:39248: checking for gdImagePaletteCopy in -lgd" >&5 ac_lib_var=`echo gd'_'gdImagePaletteCopy | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -39637,7 +39252,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lgd $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:39267: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -39777,7 +39392,7 @@ fi done echo $ac_n "checking for gdImageCreateFromPng in -lgd""... $ac_c" 1>&6 -echo "configure:39781: checking for gdImageCreateFromPng in -lgd" >&5 +echo "configure:39396: checking for gdImageCreateFromPng in -lgd" >&5 ac_lib_var=`echo gd'_'gdImageCreateFromPng | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -39785,7 +39400,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lgd $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:39415: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -39925,7 +39540,7 @@ fi done echo $ac_n "checking for gdImageCreateFromGif in -lgd""... $ac_c" 1>&6 -echo "configure:39929: checking for gdImageCreateFromGif in -lgd" >&5 +echo "configure:39544: checking for gdImageCreateFromGif in -lgd" >&5 ac_lib_var=`echo gd'_'gdImageCreateFromGif | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -39933,7 +39548,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lgd $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:39563: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -40073,7 +39688,7 @@ fi done echo $ac_n "checking for gdImageGif in -lgd""... $ac_c" 1>&6 -echo "configure:40077: checking for gdImageGif in -lgd" >&5 +echo "configure:39692: checking for gdImageGif in -lgd" >&5 ac_lib_var=`echo gd'_'gdImageGif | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -40081,7 +39696,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lgd $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:39711: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -40221,7 +39836,7 @@ fi done echo $ac_n "checking for gdImageWBMP in -lgd""... $ac_c" 1>&6 -echo "configure:40225: checking for gdImageWBMP in -lgd" >&5 +echo "configure:39840: checking for gdImageWBMP in -lgd" >&5 ac_lib_var=`echo gd'_'gdImageWBMP | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -40229,7 +39844,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lgd $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:39859: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -40369,7 +39984,7 @@ fi done echo $ac_n "checking for gdImageCreateFromJpeg in -lgd""... $ac_c" 1>&6 -echo "configure:40373: checking for gdImageCreateFromJpeg in -lgd" >&5 +echo "configure:39988: checking for gdImageCreateFromJpeg in -lgd" >&5 ac_lib_var=`echo gd'_'gdImageCreateFromJpeg | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -40377,7 +39992,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lgd $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:40007: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -40517,7 +40132,7 @@ fi done echo $ac_n "checking for gdImageCreateFromXpm in -lgd""... $ac_c" 1>&6 -echo "configure:40521: checking for gdImageCreateFromXpm in -lgd" >&5 +echo "configure:40136: checking for gdImageCreateFromXpm in -lgd" >&5 ac_lib_var=`echo gd'_'gdImageCreateFromXpm | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -40525,7 +40140,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lgd $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:40155: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -40665,7 +40280,7 @@ fi done echo $ac_n "checking for gdImageCreateFromGd2 in -lgd""... $ac_c" 1>&6 -echo "configure:40669: checking for gdImageCreateFromGd2 in -lgd" >&5 +echo "configure:40284: checking for gdImageCreateFromGd2 in -lgd" >&5 ac_lib_var=`echo gd'_'gdImageCreateFromGd2 | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -40673,7 +40288,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lgd $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:40303: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -40813,7 +40428,7 @@ fi done echo $ac_n "checking for gdImageCreateTrueColor in -lgd""... $ac_c" 1>&6 -echo "configure:40817: checking for gdImageCreateTrueColor in -lgd" >&5 +echo "configure:40432: checking for gdImageCreateTrueColor in -lgd" >&5 ac_lib_var=`echo gd'_'gdImageCreateTrueColor | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -40821,7 +40436,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lgd $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:40451: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -40961,7 +40576,7 @@ fi done echo $ac_n "checking for gdImageSetTile in -lgd""... $ac_c" 1>&6 -echo "configure:40965: checking for gdImageSetTile in -lgd" >&5 +echo "configure:40580: checking for gdImageSetTile in -lgd" >&5 ac_lib_var=`echo gd'_'gdImageSetTile | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -40969,7 +40584,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lgd $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:40599: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -41109,7 +40724,7 @@ fi done echo $ac_n "checking for gdImageEllipse in -lgd""... $ac_c" 1>&6 -echo "configure:41113: checking for gdImageEllipse in -lgd" >&5 +echo "configure:40728: checking for gdImageEllipse in -lgd" >&5 ac_lib_var=`echo gd'_'gdImageEllipse | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -41117,7 +40732,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lgd $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:40747: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -41257,7 +40872,7 @@ fi done echo $ac_n "checking for gdImageSetBrush in -lgd""... $ac_c" 1>&6 -echo "configure:41261: checking for gdImageSetBrush in -lgd" >&5 +echo "configure:40876: checking for gdImageSetBrush in -lgd" >&5 ac_lib_var=`echo gd'_'gdImageSetBrush | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -41265,7 +40880,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lgd $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:40895: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -41405,7 +41020,7 @@ fi done echo $ac_n "checking for gdImageStringTTF in -lgd""... $ac_c" 1>&6 -echo "configure:41409: checking for gdImageStringTTF in -lgd" >&5 +echo "configure:41024: checking for gdImageStringTTF in -lgd" >&5 ac_lib_var=`echo gd'_'gdImageStringTTF | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -41413,7 +41028,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lgd $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:41043: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -41553,7 +41168,7 @@ fi done echo $ac_n "checking for gdImageStringFT in -lgd""... $ac_c" 1>&6 -echo "configure:41557: checking for gdImageStringFT in -lgd" >&5 +echo "configure:41172: checking for gdImageStringFT in -lgd" >&5 ac_lib_var=`echo gd'_'gdImageStringFT | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -41561,7 +41176,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lgd $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:41191: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -41701,7 +41316,7 @@ fi done echo $ac_n "checking for gdImageStringFTEx in -lgd""... $ac_c" 1>&6 -echo "configure:41705: checking for gdImageStringFTEx in -lgd" >&5 +echo "configure:41320: checking for gdImageStringFTEx in -lgd" >&5 ac_lib_var=`echo gd'_'gdImageStringFTEx | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -41709,7 +41324,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lgd $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:41339: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -41849,7 +41464,7 @@ fi done echo $ac_n "checking for gdImageColorClosestHWB in -lgd""... $ac_c" 1>&6 -echo "configure:41853: checking for gdImageColorClosestHWB in -lgd" >&5 +echo "configure:41468: checking for gdImageColorClosestHWB in -lgd" >&5 ac_lib_var=`echo gd'_'gdImageColorClosestHWB | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -41857,7 +41472,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lgd $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:41487: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -41997,7 +41612,7 @@ fi done echo $ac_n "checking for gdImageColorResolve in -lgd""... $ac_c" 1>&6 -echo "configure:42001: checking for gdImageColorResolve in -lgd" >&5 +echo "configure:41616: checking for gdImageColorResolve in -lgd" >&5 ac_lib_var=`echo gd'_'gdImageColorResolve | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -42005,7 +41620,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lgd $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:41635: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -42145,7 +41760,7 @@ fi done echo $ac_n "checking for gdImageGifCtx in -lgd""... $ac_c" 1>&6 -echo "configure:42149: checking for gdImageGifCtx in -lgd" >&5 +echo "configure:41764: checking for gdImageGifCtx in -lgd" >&5 ac_lib_var=`echo gd'_'gdImageGifCtx | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -42153,7 +41768,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lgd $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:41783: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -42293,7 +41908,7 @@ fi done echo $ac_n "checking for gdCacheCreate in -lgd""... $ac_c" 1>&6 -echo "configure:42297: checking for gdCacheCreate in -lgd" >&5 +echo "configure:41912: checking for gdCacheCreate in -lgd" >&5 ac_lib_var=`echo gd'_'gdCacheCreate | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -42301,7 +41916,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lgd $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:41931: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -42441,7 +42056,7 @@ fi done echo $ac_n "checking for gdFontCacheShutdown in -lgd""... $ac_c" 1>&6 -echo "configure:42445: checking for gdFontCacheShutdown in -lgd" >&5 +echo "configure:42060: checking for gdFontCacheShutdown in -lgd" >&5 ac_lib_var=`echo gd'_'gdFontCacheShutdown | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -42449,7 +42064,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lgd $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:42079: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -42589,7 +42204,7 @@ fi done echo $ac_n "checking for gdFreeFontCache in -lgd""... $ac_c" 1>&6 -echo "configure:42593: checking for gdFreeFontCache in -lgd" >&5 +echo "configure:42208: checking for gdFreeFontCache in -lgd" >&5 ac_lib_var=`echo gd'_'gdFreeFontCache | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -42597,7 +42212,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lgd $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:42227: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -42737,7 +42352,7 @@ fi done echo $ac_n "checking for gdFontCacheMutexSetup in -lgd""... $ac_c" 1>&6 -echo "configure:42741: checking for gdFontCacheMutexSetup in -lgd" >&5 +echo "configure:42356: checking for gdFontCacheMutexSetup in -lgd" >&5 ac_lib_var=`echo gd'_'gdFontCacheMutexSetup | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -42745,7 +42360,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lgd $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:42375: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -42885,7 +42500,7 @@ fi done echo $ac_n "checking for gdNewDynamicCtxEx in -lgd""... $ac_c" 1>&6 -echo "configure:42889: checking for gdNewDynamicCtxEx in -lgd" >&5 +echo "configure:42504: checking for gdNewDynamicCtxEx in -lgd" >&5 ac_lib_var=`echo gd'_'gdNewDynamicCtxEx | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -42893,7 +42508,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lgd $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:42523: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -42959,7 +42574,7 @@ fi old_CPPFLAGS=$CPPFLAGS CPPFLAGS=-I$GD_INCLUDE cat > conftest.$ac_ext < @@ -42973,7 +42588,7 @@ ctx->gd_free = 1; ; return 0; } EOF -if { (eval echo configure:42977: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:42592: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* cat >> confdefs.h <<\EOF @@ -43304,7 +42919,7 @@ EOF else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:42934: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then LIBS=$old_LIBS @@ -43466,7 +43081,7 @@ fi done echo $ac_n "checking for gdImageCreate in -lgd""... $ac_c" 1>&6 -echo "configure:43470: checking for gdImageCreate in -lgd" >&5 +echo "configure:43085: checking for gdImageCreate in -lgd" >&5 ac_lib_var=`echo gd'_'gdImageCreate | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -43474,7 +43089,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lgd $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:43104: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -43550,7 +43165,7 @@ fi php_with_gettext=no echo $ac_n "checking for GNU gettext support""... $ac_c" 1>&6 -echo "configure:43554: checking for GNU gettext support" >&5 +echo "configure:43169: checking for GNU gettext support" >&5 # Check whether --with-gettext or --without-gettext was given. if test "${with_gettext+set}" = set; then withval="$with_gettext" @@ -43608,7 +43223,7 @@ if test "$PHP_GETTEXT" != "no"; then O_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -L$GETTEXT_LIBDIR" echo $ac_n "checking for bindtextdomain in -lintl""... $ac_c" 1>&6 -echo "configure:43612: checking for bindtextdomain in -lintl" >&5 +echo "configure:43227: checking for bindtextdomain in -lintl" >&5 ac_lib_var=`echo intl'_'bindtextdomain | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -43616,7 +43231,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lintl $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:43246: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -43649,7 +43264,7 @@ if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then else echo "$ac_t""no" 1>&6 echo $ac_n "checking for bindtextdomain in -lc""... $ac_c" 1>&6 -echo "configure:43653: checking for bindtextdomain in -lc" >&5 +echo "configure:43268: checking for bindtextdomain in -lc" >&5 ac_lib_var=`echo c'_'bindtextdomain | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -43657,7 +43272,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lc $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:43287: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -44132,7 +43747,7 @@ EOF echo $ac_n "checking for ngettext in -l$GETTEXT_CHECK_IN_LIB""... $ac_c" 1>&6 -echo "configure:44136: checking for ngettext in -l$GETTEXT_CHECK_IN_LIB" >&5 +echo "configure:43751: checking for ngettext in -l$GETTEXT_CHECK_IN_LIB" >&5 ac_lib_var=`echo $GETTEXT_CHECK_IN_LIB'_'ngettext | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -44140,7 +43755,7 @@ else ac_save_LIBS="$LIBS" LIBS="-l$GETTEXT_CHECK_IN_LIB $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:43770: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -44175,7 +43790,7 @@ else fi echo $ac_n "checking for dngettext in -l$GETTEXT_CHECK_IN_LIB""... $ac_c" 1>&6 -echo "configure:44179: checking for dngettext in -l$GETTEXT_CHECK_IN_LIB" >&5 +echo "configure:43794: checking for dngettext in -l$GETTEXT_CHECK_IN_LIB" >&5 ac_lib_var=`echo $GETTEXT_CHECK_IN_LIB'_'dngettext | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -44183,7 +43798,7 @@ else ac_save_LIBS="$LIBS" LIBS="-l$GETTEXT_CHECK_IN_LIB $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:43813: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -44218,7 +43833,7 @@ else fi echo $ac_n "checking for dcngettext in -l$GETTEXT_CHECK_IN_LIB""... $ac_c" 1>&6 -echo "configure:44222: checking for dcngettext in -l$GETTEXT_CHECK_IN_LIB" >&5 +echo "configure:43837: checking for dcngettext in -l$GETTEXT_CHECK_IN_LIB" >&5 ac_lib_var=`echo $GETTEXT_CHECK_IN_LIB'_'dcngettext | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -44226,7 +43841,7 @@ else ac_save_LIBS="$LIBS" LIBS="-l$GETTEXT_CHECK_IN_LIB $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:43856: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -44261,7 +43876,7 @@ else fi echo $ac_n "checking for bind_textdomain_codeset in -l$GETTEXT_CHECK_IN_LIB""... $ac_c" 1>&6 -echo "configure:44265: checking for bind_textdomain_codeset in -l$GETTEXT_CHECK_IN_LIB" >&5 +echo "configure:43880: checking for bind_textdomain_codeset in -l$GETTEXT_CHECK_IN_LIB" >&5 ac_lib_var=`echo $GETTEXT_CHECK_IN_LIB'_'bind_textdomain_codeset | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -44269,7 +43884,7 @@ else ac_save_LIBS="$LIBS" LIBS="-l$GETTEXT_CHECK_IN_LIB $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:43899: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -44311,7 +43926,7 @@ fi php_with_gmp=no echo $ac_n "checking for GNU MP support""... $ac_c" 1>&6 -echo "configure:44315: checking for GNU MP support" >&5 +echo "configure:43930: checking for GNU MP support" >&5 # Check whether --with-gmp or --without-gmp was given. if test "${with_gmp+set}" = set; then withval="$with_gmp" @@ -44462,7 +44077,7 @@ if test "$PHP_GMP" != "no"; then done echo $ac_n "checking for __gmp_randinit_lc_2exp_size in -lgmp""... $ac_c" 1>&6 -echo "configure:44466: checking for __gmp_randinit_lc_2exp_size in -lgmp" >&5 +echo "configure:44081: checking for __gmp_randinit_lc_2exp_size in -lgmp" >&5 ac_lib_var=`echo gmp'_'__gmp_randinit_lc_2exp_size | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -44470,7 +44085,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lgmp $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:44100: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -44606,7 +44221,7 @@ else done echo $ac_n "checking for gmp_randinit_lc_2exp_size in -lgmp""... $ac_c" 1>&6 -echo "configure:44610: checking for gmp_randinit_lc_2exp_size in -lgmp" >&5 +echo "configure:44225: checking for gmp_randinit_lc_2exp_size in -lgmp" >&5 ac_lib_var=`echo gmp'_'gmp_randinit_lc_2exp_size | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -44614,7 +44229,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lgmp $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:44244: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -45097,7 +44712,7 @@ fi php_with_mhash=no echo $ac_n "checking for mhash support""... $ac_c" 1>&6 -echo "configure:45101: checking for mhash support" >&5 +echo "configure:44716: checking for mhash support" >&5 # Check whether --with-mhash or --without-mhash was given. if test "${with_mhash+set}" = set; then withval="$with_mhash" @@ -45144,7 +44759,7 @@ echo "$ac_t""$ext_output" 1>&6 php_enable_hash=yes echo $ac_n "checking whether to enable hash support""... $ac_c" 1>&6 -echo "configure:45148: checking whether to enable hash support" >&5 +echo "configure:44763: checking whether to enable hash support" >&5 # Check whether --enable-hash or --disable-hash was given. if test "${enable_hash+set}" = set; then enableval="$enable_hash" @@ -45205,7 +44820,7 @@ EOF echo $ac_n "checking whether byte ordering is bigendian""... $ac_c" 1>&6 -echo "configure:45209: checking whether byte ordering is bigendian" >&5 +echo "configure:44824: checking whether byte ordering is bigendian" >&5 if eval "test \"`echo '$''{'ac_cv_c_bigendian_php'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -45215,7 +44830,7 @@ else ac_cv_c_bigendian_php=unknown else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:44850: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_c_bigendian_php=yes else @@ -45256,7 +44871,7 @@ EOF echo $ac_n "checking size of short""... $ac_c" 1>&6 -echo "configure:45260: checking size of short" >&5 +echo "configure:44875: checking size of short" >&5 if eval "test \"`echo '$''{'ac_cv_sizeof_short'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -45264,7 +44879,7 @@ else ac_cv_sizeof_short=2 else cat > conftest.$ac_ext < int main() @@ -45275,7 +44890,7 @@ int main() return(0); } EOF -if { (eval echo configure:45279: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:44894: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_sizeof_short=`cat conftestval` else @@ -45295,7 +44910,7 @@ EOF echo $ac_n "checking size of int""... $ac_c" 1>&6 -echo "configure:45299: checking size of int" >&5 +echo "configure:44914: checking size of int" >&5 if eval "test \"`echo '$''{'ac_cv_sizeof_int'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -45303,7 +44918,7 @@ else ac_cv_sizeof_int=4 else cat > conftest.$ac_ext < int main() @@ -45314,7 +44929,7 @@ int main() return(0); } EOF -if { (eval echo configure:45318: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:44933: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_sizeof_int=`cat conftestval` else @@ -45334,7 +44949,7 @@ EOF echo $ac_n "checking size of long""... $ac_c" 1>&6 -echo "configure:45338: checking size of long" >&5 +echo "configure:44953: checking size of long" >&5 if eval "test \"`echo '$''{'ac_cv_sizeof_long'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -45342,7 +44957,7 @@ else ac_cv_sizeof_long=4 else cat > conftest.$ac_ext < int main() @@ -45353,7 +44968,7 @@ int main() return(0); } EOF -if { (eval echo configure:45357: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:44972: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_sizeof_long=`cat conftestval` else @@ -45373,7 +44988,7 @@ EOF echo $ac_n "checking size of long long""... $ac_c" 1>&6 -echo "configure:45377: checking size of long long" >&5 +echo "configure:44992: checking size of long long" >&5 if eval "test \"`echo '$''{'ac_cv_sizeof_long_long'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -45381,7 +44996,7 @@ else ac_cv_sizeof_long_long=8 else cat > conftest.$ac_ext < int main() @@ -45392,7 +45007,7 @@ int main() return(0); } EOF -if { (eval echo configure:45396: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:45011: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_sizeof_long_long=`cat conftestval` else @@ -45741,7 +45356,7 @@ fi php_with_iconv=yes echo $ac_n "checking for iconv support""... $ac_c" 1>&6 -echo "configure:45745: checking for iconv support" >&5 +echo "configure:45360: checking for iconv support" >&5 # Check whether --with-iconv or --without-iconv was given. if test "${with_iconv+set}" = set; then withval="$with_iconv" @@ -45804,12 +45419,12 @@ if test "$PHP_ICONV" != "no"; then if test "$PHP_ICONV" = "yes"; then echo $ac_n "checking for iconv""... $ac_c" 1>&6 -echo "configure:45808: checking for iconv" >&5 +echo "configure:45423: checking for iconv" >&5 if eval "test \"`echo '$''{'ac_cv_func_iconv'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:45451: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_iconv=yes" else @@ -45853,12 +45468,12 @@ else echo "$ac_t""no" 1>&6 echo $ac_n "checking for libiconv""... $ac_c" 1>&6 -echo "configure:45857: checking for libiconv" >&5 +echo "configure:45472: checking for libiconv" >&5 if eval "test \"`echo '$''{'ac_cv_func_libiconv'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:45500: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_libiconv=yes" else @@ -46037,7 +45652,7 @@ EOF done echo $ac_n "checking for libiconv in -l$iconv_lib_name""... $ac_c" 1>&6 -echo "configure:46041: checking for libiconv in -l$iconv_lib_name" >&5 +echo "configure:45656: checking for libiconv in -l$iconv_lib_name" >&5 ac_lib_var=`echo $iconv_lib_name'_'libiconv | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -46045,7 +45660,7 @@ else ac_save_LIBS="$LIBS" LIBS="-l$iconv_lib_name $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:45675: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -46190,7 +45805,7 @@ else done echo $ac_n "checking for iconv in -l$iconv_lib_name""... $ac_c" 1>&6 -echo "configure:46194: checking for iconv in -l$iconv_lib_name" >&5 +echo "configure:45809: checking for iconv in -l$iconv_lib_name" >&5 ac_lib_var=`echo $iconv_lib_name'_'iconv | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -46198,7 +45813,7 @@ else ac_save_LIBS="$LIBS" LIBS="-l$iconv_lib_name $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:45828: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -46420,16 +46035,16 @@ else fi echo $ac_n "checking if iconv is glibc's""... $ac_c" 1>&6 -echo "configure:46424: checking if iconv is glibc's" >&5 +echo "configure:46039: checking if iconv is glibc's" >&5 cat > conftest.$ac_ext < int main() { gnu_get_libc_version(); ; return 0; } EOF -if { (eval echo configure:46433: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:46048: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* echo "$ac_t""yes" 1>&6 @@ -46447,7 +46062,7 @@ rm -f conftest* if test -z "$iconv_impl_name"; then echo $ac_n "checking if using GNU libiconv""... $ac_c" 1>&6 -echo "configure:46451: checking if using GNU libiconv" >&5 +echo "configure:46066: checking if using GNU libiconv" >&5 php_iconv_old_ld="$LDFLAGS" LDFLAGS="-liconv $LDFLAGS" if test "$cross_compiling" = yes; then @@ -46457,7 +46072,7 @@ echo "configure:46451: checking if using GNU libiconv" >&5 else cat > conftest.$ac_ext < @@ -46467,7 +46082,7 @@ int main() { } EOF -if { (eval echo configure:46471: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:46086: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then echo "$ac_t""yes" 1>&6 @@ -46489,16 +46104,16 @@ fi if test -z "$iconv_impl_name"; then echo $ac_n "checking if iconv is Konstantin Chuguev's""... $ac_c" 1>&6 -echo "configure:46493: checking if iconv is Konstantin Chuguev's" >&5 +echo "configure:46108: checking if iconv is Konstantin Chuguev's" >&5 cat > conftest.$ac_ext < int main() { iconv_ccs_init(NULL, NULL); ; return 0; } EOF -if { (eval echo configure:46502: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:46117: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* echo "$ac_t""yes" 1>&6 @@ -46517,18 +46132,18 @@ rm -f conftest* if test -z "$iconv_impl_name"; then echo $ac_n "checking if using IBM iconv""... $ac_c" 1>&6 -echo "configure:46521: checking if using IBM iconv" >&5 +echo "configure:46136: checking if using IBM iconv" >&5 php_iconv_old_ld="$LDFLAGS" LDFLAGS="-liconv $LDFLAGS" cat > conftest.$ac_ext < int main() { cstoccsid(""); ; return 0; } EOF -if { (eval echo configure:46532: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:46147: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* echo "$ac_t""yes" 1>&6 @@ -46714,7 +46329,7 @@ EOF esac echo $ac_n "checking if iconv supports errno""... $ac_c" 1>&6 -echo "configure:46718: checking if iconv supports errno" >&5 +echo "configure:46333: checking if iconv supports errno" >&5 if test "$cross_compiling" = yes; then echo "$ac_t""no" 1>&6 @@ -46728,7 +46343,7 @@ EOF else cat > conftest.$ac_ext < @@ -46749,7 +46364,7 @@ int main() { } EOF -if { (eval echo configure:46753: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:46368: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then echo "$ac_t""yes" 1>&6 @@ -46781,9 +46396,9 @@ fi echo $ac_n "checking if your cpp allows macro usage in include lines""... $ac_c" 1>&6 -echo "configure:46785: checking if your cpp allows macro usage in include lines" >&5 +echo "configure:46400: checking if your cpp allows macro usage in include lines" >&5 cat > conftest.$ac_ext < @@ -46793,7 +46408,7 @@ int main() { ; return 0; } EOF -if { (eval echo configure:46797: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:46412: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* echo "$ac_t""yes" 1>&6 @@ -47149,7 +46764,7 @@ fi php_with_imap=no echo $ac_n "checking for IMAP support""... $ac_c" 1>&6 -echo "configure:47153: checking for IMAP support" >&5 +echo "configure:46768: checking for IMAP support" >&5 # Check whether --with-imap or --without-imap was given. if test "${with_imap+set}" = set; then withval="$with_imap" @@ -47196,7 +46811,7 @@ echo "$ac_t""$ext_output" 1>&6 php_with_kerberos=no echo $ac_n "checking for IMAP Kerberos support""... $ac_c" 1>&6 -echo "configure:47200: checking for IMAP Kerberos support" >&5 +echo "configure:46815: checking for IMAP Kerberos support" >&5 # Check whether --with-kerberos or --without-kerberos was given. if test "${with_kerberos+set}" = set; then withval="$with_kerberos" @@ -47222,7 +46837,7 @@ echo "$ac_t""$ext_output" 1>&6 php_with_imap_ssl=no echo $ac_n "checking for IMAP SSL support""... $ac_c" 1>&6 -echo "configure:47226: checking for IMAP SSL support" >&5 +echo "configure:46841: checking for IMAP SSL support" >&5 # Check whether --with-imap-ssl or --without-imap-ssl was given. if test "${with_imap_ssl+set}" = set; then withval="$with_imap_ssl" @@ -47629,7 +47244,7 @@ EOF done cat > conftest.$ac_ext < EOF @@ -47649,12 +47264,12 @@ rm -f conftest* old_CFLAGS=$CFLAGS CFLAGS="-I$IMAP_INC_DIR" echo $ac_n "checking for utf8_mime2text signature""... $ac_c" 1>&6 -echo "configure:47653: checking for utf8_mime2text signature" >&5 +echo "configure:47268: checking for utf8_mime2text signature" >&5 if eval "test \"`echo '$''{'ac_cv_utf8_mime2text'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < @@ -47667,7 +47282,7 @@ int main() { ; return 0; } EOF -if { (eval echo configure:47671: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:47286: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_utf8_mime2text=old @@ -47695,13 +47310,13 @@ EOF old_CFLAGS=$CFLAGS CFLAGS="-I$IMAP_INC_DIR" - echo $ac_n "checking for U8T_CANONICAL""... $ac_c" 1>&6 -echo "configure:47700: checking for U8T_CANONICAL" >&5 + echo $ac_n "checking for U8T_DECOMPOSE""... $ac_c" 1>&6 +echo "configure:47315: checking for U8T_DECOMPOSE" >&5 if eval "test \"`echo '$''{'ac_cv_u8t_canonical'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < @@ -47712,17 +47327,17 @@ int main() { ; return 0; } EOF -if { (eval echo configure:47716: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:47331: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* - ac_cv_u8t_canonical=yes + ac_cv_u8t_decompose=yes else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* - ac_cv_u8t_canonical=no + ac_cv_u8t_decompose=no fi rm -f conftest* @@ -47732,17 +47347,17 @@ fi echo "$ac_t""$ac_cv_u8t_canonical" 1>&6 CFLAGS=$old_CFLAGS - if test "$ac_cv_u8t_canonical" = "no" && test "$ac_cv_utf8_mime2text" = "new"; then + if test "$ac_cv_u8t_decompose" = "no" && test "$ac_cv_utf8_mime2text" = "new"; then { echo "configure: error: utf8_mime2text() has new signature, but U8T_CANONICAL is missing. This should not happen. Check config.log for additional information." 1>&2; exit 1; } fi - if test "$ac_cv_u8t_canonical" = "yes" && test "$ac_cv_utf8_mime2text" = "old"; then + if test "$ac_cv_u8t_decompose" = "yes" && test "$ac_cv_utf8_mime2text" = "old"; then { echo "configure: error: utf8_mime2text() has old signature, but U8T_CANONICAL is present. This should not happen. Check config.log for additional information." 1>&2; exit 1; } fi old_CPPFLAGS=$CPPFLAGS CPPFLAGS=-I$IMAP_INC_DIR cat > conftest.$ac_ext <&6 -echo "configure:47865: checking for pam_start in -lpam" >&5 +echo "configure:47480: checking for pam_start in -lpam" >&5 ac_lib_var=`echo pam'_'pam_start | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -47869,7 +47484,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lpam $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:47499: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -48035,7 +47650,7 @@ fi done echo $ac_n "checking for crypt in -lcrypt""... $ac_c" 1>&6 -echo "configure:48039: checking for crypt in -lcrypt" >&5 +echo "configure:47654: checking for crypt in -lcrypt" >&5 ac_lib_var=`echo crypt'_'crypt | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -48043,7 +47658,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lcrypt $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:47673: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -48258,7 +47873,7 @@ fi # Extract the first word of "krb5-config", so it can be a program name with args. set dummy krb5-config; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:48262: checking for $ac_word" >&5 +echo "configure:47877: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_KRB5_CONFIG'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -48627,7 +48242,7 @@ else else cat > conftest.$ac_ext < EOF @@ -48668,7 +48283,7 @@ rm -f conftest* # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:48672: checking for $ac_word" >&5 +echo "configure:48287: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_PKG_CONFIG'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -48873,9 +48488,9 @@ fi old_CPPFLAGS=$CPPFLAGS CPPFLAGS=-I$OPENSSL_INCDIR echo $ac_n "checking for OpenSSL version""... $ac_c" 1>&6 -echo "configure:48877: checking for OpenSSL version" >&5 +echo "configure:48492: checking for OpenSSL version" >&5 cat > conftest.$ac_ext < @@ -49030,7 +48645,7 @@ rm -f conftest* done echo $ac_n "checking for CRYPTO_free in -lcrypto""... $ac_c" 1>&6 -echo "configure:49034: checking for CRYPTO_free in -lcrypto" >&5 +echo "configure:48649: checking for CRYPTO_free in -lcrypto" >&5 ac_lib_var=`echo crypto'_'CRYPTO_free | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -49038,7 +48653,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lcrypto $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:48668: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -49206,7 +48821,7 @@ fi done echo $ac_n "checking for SSL_CTX_set_ssl_version in -lssl""... $ac_c" 1>&6 -echo "configure:49210: checking for SSL_CTX_set_ssl_version in -lssl" >&5 +echo "configure:48825: checking for SSL_CTX_set_ssl_version in -lssl" >&5 ac_lib_var=`echo ssl'_'SSL_CTX_set_ssl_version | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -49214,7 +48829,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lssl $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:48844: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -49344,7 +48959,7 @@ else elif test -f "$IMAP_INC_DIR/linkage.c"; then cat > conftest.$ac_ext < EOF @@ -49375,7 +48990,7 @@ rm -f conftest* else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:49027: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then LIBS=$old_LIBS @@ -49444,7 +49059,7 @@ fi else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:49096: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then LIBS=$old_LIBS @@ -49504,7 +49119,7 @@ fi echo $ac_n "checking whether rfc822_output_address_list function present""... $ac_c" 1>&6 -echo "configure:49508: checking whether rfc822_output_address_list function present" >&5 +echo "configure:49123: checking whether rfc822_output_address_list function present" >&5 old_LIBS=$LIBS LIBS=" @@ -49516,7 +49131,7 @@ echo "configure:49508: checking whether rfc822_output_address_list function pres else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:49171: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then LIBS=$old_LIBS @@ -49581,7 +49196,7 @@ fi echo $ac_n "checking whether build with IMAP works""... $ac_c" 1>&6 -echo "configure:49585: checking whether build with IMAP works" >&5 +echo "configure:49200: checking whether build with IMAP works" >&5 old_LIBS=$LIBS @@ -49592,7 +49207,7 @@ echo "configure:49585: checking whether build with IMAP works" >&5 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:49244: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then LIBS=$old_LIBS @@ -49657,7 +49272,7 @@ fi php_with_interbase=no echo $ac_n "checking for InterBase support""... $ac_c" 1>&6 -echo "configure:49661: checking for InterBase support" >&5 +echo "configure:49276: checking for InterBase support" >&5 # Check whether --with-interbase or --without-interbase was given. if test "${with_interbase+set}" = set; then withval="$with_interbase" @@ -49807,7 +49422,7 @@ if test "$PHP_INTERBASE" != "no"; then done echo $ac_n "checking for isc_detach_database in -lfbclient""... $ac_c" 1>&6 -echo "configure:49811: checking for isc_detach_database in -lfbclient" >&5 +echo "configure:49426: checking for isc_detach_database in -lfbclient" >&5 ac_lib_var=`echo fbclient'_'isc_detach_database | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -49815,7 +49430,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lfbclient $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:49445: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -49953,7 +49568,7 @@ else done echo $ac_n "checking for isc_detach_database in -lgds""... $ac_c" 1>&6 -echo "configure:49957: checking for isc_detach_database in -lgds" >&5 +echo "configure:49572: checking for isc_detach_database in -lgds" >&5 ac_lib_var=`echo gds'_'isc_detach_database | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -49961,7 +49576,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lgds $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:49591: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -50099,7 +49714,7 @@ else done echo $ac_n "checking for isc_detach_database in -lib_util""... $ac_c" 1>&6 -echo "configure:50103: checking for isc_detach_database in -lib_util" >&5 +echo "configure:49718: checking for isc_detach_database in -lib_util" >&5 ac_lib_var=`echo ib_util'_'isc_detach_database | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -50107,7 +49722,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lib_util $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:49737: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -50595,7 +50210,7 @@ fi php_enable_intl=no echo $ac_n "checking whether to enable internationalization support""... $ac_c" 1>&6 -echo "configure:50599: checking whether to enable internationalization support" >&5 +echo "configure:50214: checking whether to enable internationalization support" >&5 # Check whether --enable-intl or --disable-intl was given. if test "${enable_intl+set}" = set; then enableval="$enable_intl" @@ -50673,7 +50288,7 @@ ext_output=$PHP_ICU_DIR # Extract the first word of "icu-config", so it can be a program name with args. set dummy icu-config; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:50677: checking for $ac_word" >&5 +echo "configure:50292: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_ICU_CONFIG'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -50711,7 +50326,7 @@ fi fi echo $ac_n "checking for location of ICU headers and libraries""... $ac_c" 1>&6 -echo "configure:50715: checking for location of ICU headers and libraries" >&5 +echo "configure:50330: checking for location of ICU headers and libraries" >&5 icu_install_prefix=`$ICU_CONFIG --prefix 2> /dev/null` if test "$?" != "0" || test -z "$icu_install_prefix"; then @@ -50721,7 +50336,7 @@ echo "configure:50715: checking for location of ICU headers and libraries" >&5 echo "$ac_t""$icu_install_prefix" 1>&6 echo $ac_n "checking for ICU 3.4 or greater""... $ac_c" 1>&6 -echo "configure:50725: checking for ICU 3.4 or greater" >&5 +echo "configure:50340: checking for ICU 3.4 or greater" >&5 icu_version_full=`$ICU_CONFIG --version` ac_IFS=$IFS IFS="." @@ -50877,7 +50492,7 @@ 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 $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:50881: checking for $ac_word" >&5 +echo "configure:50496: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CXX'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -50909,7 +50524,7 @@ test -n "$CXX" || CXX="gcc" echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works""... $ac_c" 1>&6 -echo "configure:50913: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works" >&5 +echo "configure:50528: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works" >&5 ac_ext=C # CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. @@ -50920,12 +50535,12 @@ cross_compiling=$ac_cv_prog_cxx_cross cat > conftest.$ac_ext << EOF -#line 50924 "configure" +#line 50539 "configure" #include "confdefs.h" int main(){return(0);} EOF -if { (eval echo configure:50929: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:50544: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ac_cv_prog_cxx_works=yes # If we can't run a trivial program, we are probably using a cross compiler. if (./conftest; exit) 2>/dev/null; then @@ -50951,12 +50566,12 @@ if test $ac_cv_prog_cxx_works = no; then { echo "configure: error: installation or configuration problem: C++ compiler cannot create executables." 1>&2; exit 1; } fi echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 -echo "configure:50955: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler" >&5 +echo "configure:50570: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler" >&5 echo "$ac_t""$ac_cv_prog_cxx_cross" 1>&6 cross_compiling=$ac_cv_prog_cxx_cross echo $ac_n "checking whether we are using GNU C++""... $ac_c" 1>&6 -echo "configure:50960: checking whether we are using GNU C++" >&5 +echo "configure:50575: checking whether we are using GNU C++" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gxx'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -50965,7 +50580,7 @@ else yes; #endif EOF -if { ac_try='${CXX-g++} -E conftest.C'; { (eval echo configure:50969: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then +if { ac_try='${CXX-g++} -E conftest.C'; { (eval echo configure:50584: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gxx=yes else ac_cv_prog_gxx=no @@ -50984,7 +50599,7 @@ ac_test_CXXFLAGS="${CXXFLAGS+set}" ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS= echo $ac_n "checking whether ${CXX-g++} accepts -g""... $ac_c" 1>&6 -echo "configure:50988: checking whether ${CXX-g++} accepts -g" >&5 +echo "configure:50603: checking whether ${CXX-g++} accepts -g" >&5 if eval "test \"`echo '$''{'ac_cv_prog_cxx_g'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -51025,7 +50640,7 @@ for ac_declaration in \ 'void exit (int);' do cat > conftest.$ac_ext < $ac_declaration @@ -51033,7 +50648,7 @@ int main() { exit (42); ; return 0; } EOF -if { (eval echo configure:51037: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:50652: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then : else echo "configure: failed program was:" >&5 @@ -51043,14 +50658,14 @@ else fi rm -f conftest* cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:50669: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* break else @@ -51067,7 +50682,7 @@ fi echo $ac_n "checking how to run the C++ preprocessor""... $ac_c" 1>&6 -echo "configure:51071: checking how to run the C++ preprocessor" >&5 +echo "configure:50686: checking how to run the C++ preprocessor" >&5 if test -z "$CXXCPP"; then if eval "test \"`echo '$''{'ac_cv_prog_CXXCPP'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -51080,12 +50695,12 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes cross_compiling=$ac_cv_prog_cxx_cross CXXCPP="${CXX-g++} -E" cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:51089: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:50704: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : @@ -51183,6 +50798,9 @@ echo "$ac_t""$CXXCPP" 1>&6 msgformat/msgformat_parse.c \ grapheme/grapheme_string.c \ grapheme/grapheme_util.c \ + resourcebundle/resourcebundle.c \ + resourcebundle/resourcebundle_class.c \ + resourcebundle/resourcebundle_iterator.c \ idn/idn.c; do IFS=. @@ -51274,6 +50892,9 @@ EOF msgformat/msgformat_parse.c \ grapheme/grapheme_string.c \ grapheme/grapheme_util.c \ + resourcebundle/resourcebundle.c \ + resourcebundle/resourcebundle_class.c \ + resourcebundle/resourcebundle_iterator.c \ idn/idn.c; do IFS=. @@ -51445,6 +51066,9 @@ EOF msgformat/msgformat_parse.c \ grapheme/grapheme_string.c \ grapheme/grapheme_util.c \ + resourcebundle/resourcebundle.c \ + resourcebundle/resourcebundle_class.c \ + resourcebundle/resourcebundle_iterator.c \ idn/idn.c; do IFS=. @@ -51533,6 +51157,9 @@ EOF msgformat/msgformat_parse.c \ grapheme/grapheme_string.c \ grapheme/grapheme_util.c \ + resourcebundle/resourcebundle.c \ + resourcebundle/resourcebundle_class.c \ + resourcebundle/resourcebundle_iterator.c \ idn/idn.c; do IFS=. @@ -51616,6 +51243,11 @@ EOF + BUILD_DIR="$BUILD_DIR $ext_builddir/resourcebundle" + + + + BUILD_DIR="$BUILD_DIR $ext_builddir/idn" @@ -51626,7 +51258,7 @@ fi php_enable_json=yes echo $ac_n "checking whether to enable JavaScript Object Serialization support""... $ac_c" 1>&6 -echo "configure:51630: checking whether to enable JavaScript Object Serialization support" >&5 +echo "configure:51262: checking whether to enable JavaScript Object Serialization support" >&5 # Check whether --enable-json or --disable-json was given. if test "${enable_json+set}" = set; then enableval="$enable_json" @@ -51675,12 +51307,12 @@ if test "$PHP_JSON" != "no"; then EOF echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 -echo "configure:51679: checking for ANSI C header files" >&5 +echo "configure:51311: checking for ANSI C header files" >&5 if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include @@ -51688,7 +51320,7 @@ else #include EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:51692: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:51324: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -51705,7 +51337,7 @@ rm -f conftest* if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat > conftest.$ac_ext < EOF @@ -51723,7 +51355,7 @@ 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 < EOF @@ -51744,7 +51376,7 @@ if test "$cross_compiling" = yes; then : else cat > conftest.$ac_ext < #define ISLOWER(c) ('a' <= (c) && (c) <= 'z') @@ -51755,7 +51387,7 @@ if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); exit (0); } EOF -if { (eval echo configure:51759: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:51391: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then : else @@ -52105,7 +51737,7 @@ fi php_with_ldap=no echo $ac_n "checking for LDAP support""... $ac_c" 1>&6 -echo "configure:52109: checking for LDAP support" >&5 +echo "configure:51741: checking for LDAP support" >&5 # Check whether --with-ldap or --without-ldap was given. if test "${with_ldap+set}" = set; then withval="$with_ldap" @@ -52152,7 +51784,7 @@ echo "$ac_t""$ext_output" 1>&6 php_with_ldap_sasl=no echo $ac_n "checking for LDAP Cyrus SASL support""... $ac_c" 1>&6 -echo "configure:52156: checking for LDAP Cyrus SASL support" >&5 +echo "configure:51788: checking for LDAP Cyrus SASL support" >&5 # Check whether --with-ldap-sasl or --without-ldap-sasl was given. if test "${with_ldap_sasl+set}" = set; then withval="$with_ldap_sasl" @@ -54497,19 +54129,19 @@ EOF LIBS="$LIBS $LDAP_SHARED_LIBADD" echo $ac_n "checking for 3 arg ldap_set_rebind_proc""... $ac_c" 1>&6 -echo "configure:54501: checking for 3 arg ldap_set_rebind_proc" >&5 +echo "configure:54133: checking for 3 arg ldap_set_rebind_proc" >&5 if eval "test \"`echo '$''{'ac_cv_3arg_setrebindproc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < int main() { ldap_set_rebind_proc(0,0,0) ; return 0; } EOF -if { (eval echo configure:54513: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:54145: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_3arg_setrebindproc=yes else @@ -54532,12 +54164,12 @@ EOF for ac_func in ldap_parse_result ldap_parse_reference ldap_start_tls_s do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:54536: checking for $ac_func" >&5 +echo "configure:54168: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:54196: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -54722,7 +54354,7 @@ EOF done echo $ac_n "checking for sasl_version in -lldap""... $ac_c" 1>&6 -echo "configure:54726: checking for sasl_version in -lldap" >&5 +echo "configure:54358: checking for sasl_version in -lldap" >&5 ac_lib_var=`echo ldap'_'sasl_version | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -54730,7 +54362,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lldap $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:54377: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -54910,12 +54542,12 @@ fi fi echo $ac_n "checking for ldap_bind_s""... $ac_c" 1>&6 -echo "configure:54914: checking for ldap_bind_s" >&5 +echo "configure:54546: checking for ldap_bind_s" >&5 if eval "test \"`echo '$''{'ac_cv_func_ldap_bind_s'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:54574: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_ldap_bind_s=yes" else @@ -54991,7 +54623,7 @@ fi php_enable_mbstring=no echo $ac_n "checking whether to enable multibyte string support""... $ac_c" 1>&6 -echo "configure:54995: checking whether to enable multibyte string support" >&5 +echo "configure:54627: checking whether to enable multibyte string support" >&5 # Check whether --enable-mbstring or --disable-mbstring was given. if test "${enable_mbstring+set}" = set; then enableval="$enable_mbstring" @@ -55038,7 +54670,7 @@ echo "$ac_t""$ext_output" 1>&6 php_enable_mbregex=yes echo $ac_n "checking whether to enable multibyte regex support""... $ac_c" 1>&6 -echo "configure:55042: checking whether to enable multibyte regex support" >&5 +echo "configure:54674: checking whether to enable multibyte regex support" >&5 # Check whether --enable-mbregex or --disable-mbregex was given. if test "${enable_mbregex+set}" = set; then enableval="$enable_mbregex" @@ -55064,7 +54696,7 @@ echo "$ac_t""$ext_output" 1>&6 php_enable_mbregex_backtrack=yes echo $ac_n "checking whether to check multibyte regex backtrack""... $ac_c" 1>&6 -echo "configure:55068: checking whether to check multibyte regex backtrack" >&5 +echo "configure:54700: checking whether to check multibyte regex backtrack" >&5 # Check whether --enable-mbregex_backtrack or --disable-mbregex_backtrack was given. if test "${enable_mbregex_backtrack+set}" = set; then enableval="$enable_mbregex_backtrack" @@ -55090,7 +54722,7 @@ echo "$ac_t""$ext_output" 1>&6 php_with_libmbfl=no echo $ac_n "checking for external libmbfl""... $ac_c" 1>&6 -echo "configure:55094: checking for external libmbfl" >&5 +echo "configure:54726: checking for external libmbfl" >&5 # Check whether --with-libmbfl or --without-libmbfl was given. if test "${with_libmbfl+set}" = set; then withval="$with_libmbfl" @@ -55116,7 +54748,7 @@ echo "$ac_t""$ext_output" 1>&6 php_with_onig=no echo $ac_n "checking for external oniguruma""... $ac_c" 1>&6 -echo "configure:55120: checking for external oniguruma" >&5 +echo "configure:54752: checking for external oniguruma" >&5 # Check whether --with-onig or --without-onig was given. if test "${with_onig+set}" = set; then withval="$with_onig" @@ -55160,8 +54792,8 @@ EOF fi echo $ac_n "checking for variable length prototypes and stdarg.h""... $ac_c" 1>&6 -echo "configure:55164: checking for variable length prototypes and stdarg.h" >&5 -if eval "test \"`echo '$''{'cv_php_mbstring_stdarg'+set}'`\" = set"; then +echo "configure:54796: checking for variable length prototypes and stdarg.h" >&5 +if eval "test \"`echo '$''{'php_cv_mbstring_stdarg'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -55169,16 +54801,16 @@ else case $host_alias in *netware*) - cv_php_mbstring_stdarg=yes + php_cv_mbstring_stdarg=yes ;; *) - cv_php_mbstring_stdarg=no + php_cv_mbstring_stdarg=no ;; esac else cat > conftest.$ac_ext < @@ -55193,14 +54825,14 @@ int foo(int x, ...) { int main() { return foo(10, "", 3.14); } EOF -if { (eval echo configure:55197: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:54829: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then - cv_php_mbstring_stdarg=yes + php_cv_mbstring_stdarg=yes else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -fr conftest* - cv_php_mbstring_stdarg=no + php_cv_mbstring_stdarg=no fi rm -fr conftest* fi @@ -55208,23 +54840,23 @@ fi fi -echo "$ac_t""$cv_php_mbstring_stdarg" 1>&6 +echo "$ac_t""$php_cv_mbstring_stdarg" 1>&6 for ac_hdr in stdlib.h string.h strings.h unistd.h sys/time.h sys/times.h stdarg.h do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:55218: checking for $ac_hdr" >&5 +echo "configure:54850: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:55228: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:54860: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -55251,7 +54883,7 @@ fi done echo $ac_n "checking size of int""... $ac_c" 1>&6 -echo "configure:55255: checking size of int" >&5 +echo "configure:54887: checking size of int" >&5 if eval "test \"`echo '$''{'ac_cv_sizeof_int'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -55259,7 +54891,7 @@ else ac_cv_sizeof_int=4 else cat > conftest.$ac_ext < int main() @@ -55270,7 +54902,7 @@ int main() return(0); } EOF -if { (eval echo configure:55274: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:54906: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_sizeof_int=`cat conftestval` else @@ -55290,7 +54922,7 @@ EOF echo $ac_n "checking size of short""... $ac_c" 1>&6 -echo "configure:55294: checking size of short" >&5 +echo "configure:54926: checking size of short" >&5 if eval "test \"`echo '$''{'ac_cv_sizeof_short'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -55298,7 +54930,7 @@ else ac_cv_sizeof_short=2 else cat > conftest.$ac_ext < int main() @@ -55309,7 +54941,7 @@ int main() return(0); } EOF -if { (eval echo configure:55313: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:54945: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_sizeof_short=`cat conftestval` else @@ -55329,7 +54961,7 @@ EOF echo $ac_n "checking size of long""... $ac_c" 1>&6 -echo "configure:55333: checking size of long" >&5 +echo "configure:54965: checking size of long" >&5 if eval "test \"`echo '$''{'ac_cv_sizeof_long'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -55337,7 +54969,7 @@ else ac_cv_sizeof_long=4 else cat > conftest.$ac_ext < int main() @@ -55348,7 +54980,7 @@ int main() return(0); } EOF -if { (eval echo configure:55352: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:54984: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_sizeof_long=`cat conftestval` else @@ -55368,12 +55000,12 @@ EOF echo $ac_n "checking for working const""... $ac_c" 1>&6 -echo "configure:55372: checking for working const" >&5 +echo "configure:55004: checking for working const" >&5 if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:55058: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_c_const=yes else @@ -55443,12 +55075,12 @@ EOF fi echo $ac_n "checking whether time.h and sys/time.h may both be included""... $ac_c" 1>&6 -echo "configure:55447: checking whether time.h and sys/time.h may both be included" >&5 +echo "configure:55079: checking whether time.h and sys/time.h may both be included" >&5 if eval "test \"`echo '$''{'ac_cv_header_time'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include @@ -55457,7 +55089,7 @@ int main() { struct tm *tp; ; return 0; } EOF -if { (eval echo configure:55461: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:55093: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_header_time=yes else @@ -55480,19 +55112,19 @@ fi # The Ultrix 4.2 mips builtin alloca declared by alloca.h only works # for constant arguments. Useless! echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6 -echo "configure:55484: checking for working alloca.h" >&5 +echo "configure:55116: checking for working alloca.h" >&5 if eval "test \"`echo '$''{'ac_cv_header_alloca_h'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < int main() { char *p = alloca(2 * sizeof(int)); ; return 0; } EOF -if { (eval echo configure:55496: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:55128: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_header_alloca_h=yes else @@ -55513,12 +55145,12 @@ EOF fi echo $ac_n "checking for alloca""... $ac_c" 1>&6 -echo "configure:55517: checking for alloca" >&5 +echo "configure:55149: checking for alloca" >&5 if eval "test \"`echo '$''{'ac_cv_func_alloca_works'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:55182: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_func_alloca_works=yes else @@ -55578,12 +55210,12 @@ EOF echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6 -echo "configure:55582: checking whether alloca needs Cray hooks" >&5 +echo "configure:55214: checking whether alloca needs Cray hooks" >&5 if eval "test \"`echo '$''{'ac_cv_os_cray'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&6 if test $ac_cv_os_cray = yes; then for ac_func in _getb67 GETB67 getb67; do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:55612: checking for $ac_func" >&5 +echo "configure:55244: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:55272: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -55663,7 +55295,7 @@ done fi echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6 -echo "configure:55667: checking stack direction for C alloca" >&5 +echo "configure:55299: checking stack direction for C alloca" >&5 if eval "test \"`echo '$''{'ac_cv_c_stack_direction'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -55671,7 +55303,7 @@ else ac_cv_c_stack_direction=0 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:55326: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_c_stack_direction=1 else @@ -55712,7 +55344,7 @@ EOF fi echo $ac_n "checking for 8-bit clean memcmp""... $ac_c" 1>&6 -echo "configure:55716: checking for 8-bit clean memcmp" >&5 +echo "configure:55348: checking for 8-bit clean memcmp" >&5 if eval "test \"`echo '$''{'ac_cv_func_memcmp_clean'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -55720,7 +55352,7 @@ else ac_cv_func_memcmp_clean=no else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:55366: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_func_memcmp_clean=yes else @@ -55749,17 +55381,17 @@ test $ac_cv_func_memcmp_clean = no && LIBOBJS="$LIBOBJS memcmp.${ac_objext}" ac_safe=`echo "stdarg.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for stdarg.h""... $ac_c" 1>&6 -echo "configure:55753: checking for stdarg.h" >&5 +echo "configure:55385: checking for stdarg.h" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:55763: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:55395: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -55989,7 +55621,7 @@ EOF done echo $ac_n "checking for onig_init in -lonig""... $ac_c" 1>&6 -echo "configure:55993: checking for onig_init in -lonig" >&5 +echo "configure:55625: checking for onig_init in -lonig" >&5 ac_lib_var=`echo onig'_'onig_init | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -55997,7 +55629,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lonig $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:55644: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -56234,9 +55866,9 @@ fi done echo $ac_n "checking if oniguruma has an invalid entry for KOI8 encoding""... $ac_c" 1>&6 -echo "configure:56238: checking if oniguruma has an invalid entry for KOI8 encoding" >&5 +echo "configure:55870: checking if oniguruma has an invalid entry for KOI8 encoding" >&5 cat > conftest.$ac_ext < @@ -56247,7 +55879,7 @@ return (int)(ONIG_ENCODING_KOI8 + 1); ; return 0; } EOF -if { (eval echo configure:56251: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:55883: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* echo "$ac_t""no" 1>&6 @@ -56542,7 +56174,7 @@ EOF done echo $ac_n "checking for mbfl_buffer_converter_new in -lmbfl""... $ac_c" 1>&6 -echo "configure:56546: checking for mbfl_buffer_converter_new in -lmbfl" >&5 +echo "configure:56178: checking for mbfl_buffer_converter_new in -lmbfl" >&5 ac_lib_var=`echo mbfl'_'mbfl_buffer_converter_new | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -56550,7 +56182,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lmbfl $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:56197: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -57198,7 +56830,7 @@ fi php_with_mcrypt=no echo $ac_n "checking for mcrypt support""... $ac_c" 1>&6 -echo "configure:57202: checking for mcrypt support" >&5 +echo "configure:56834: checking for mcrypt support" >&5 # Check whether --with-mcrypt or --without-mcrypt was given. if test "${with_mcrypt+set}" = set; then withval="$with_mcrypt" @@ -57254,9 +56886,9 @@ if test "$PHP_MCRYPT" != "no"; then old_CPPFLAGS=$CPPFLAGS CPPFLAGS=-I$MCRYPT_DIR/include echo $ac_n "checking for libmcrypt version""... $ac_c" 1>&6 -echo "configure:57258: checking for libmcrypt version" >&5 +echo "configure:56890: checking for libmcrypt version" >&5 cat > conftest.$ac_ext < @@ -57380,7 +57012,7 @@ rm -f conftest* done echo $ac_n "checking for mcrypt_module_open in -lmcrypt""... $ac_c" 1>&6 -echo "configure:57384: checking for mcrypt_module_open in -lmcrypt" >&5 +echo "configure:57016: checking for mcrypt_module_open in -lmcrypt" >&5 ac_lib_var=`echo mcrypt'_'mcrypt_module_open | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -57388,7 +57020,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lmcrypt $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:57035: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -57552,7 +57184,7 @@ else done echo $ac_n "checking for mcrypt_module_open in -lmcrypt""... $ac_c" 1>&6 -echo "configure:57556: checking for mcrypt_module_open in -lmcrypt" >&5 +echo "configure:57188: checking for mcrypt_module_open in -lmcrypt" >&5 ac_lib_var=`echo mcrypt'_'mcrypt_module_open | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -57560,7 +57192,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lmcrypt $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:57207: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -58044,7 +57676,7 @@ fi php_with_mssql=no echo $ac_n "checking for MSSQL support via FreeTDS""... $ac_c" 1>&6 -echo "configure:58048: checking for MSSQL support via FreeTDS" >&5 +echo "configure:57680: checking for MSSQL support via FreeTDS" >&5 # Check whether --with-mssql or --without-mssql was given. if test "${with_mssql+set}" = set; then withval="$with_mssql" @@ -58545,7 +58177,7 @@ EOF fi echo $ac_n "checking for dnet_addr in -ldnet_stub""... $ac_c" 1>&6 -echo "configure:58549: checking for dnet_addr in -ldnet_stub" >&5 +echo "configure:58181: checking for dnet_addr in -ldnet_stub" >&5 ac_lib_var=`echo dnet_stub'_'dnet_addr | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -58553,7 +58185,7 @@ else ac_save_LIBS="$LIBS" LIBS="-ldnet_stub $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:58200: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -58708,7 +58340,7 @@ fi php_with_mysql=no echo $ac_n "checking for MySQL support""... $ac_c" 1>&6 -echo "configure:58712: checking for MySQL support" >&5 +echo "configure:58344: checking for MySQL support" >&5 # Check whether --with-mysql or --without-mysql was given. if test "${with_mysql+set}" = set; then withval="$with_mysql" @@ -58755,7 +58387,7 @@ echo "$ac_t""$ext_output" 1>&6 php_with_mysql_sock=no echo $ac_n "checking for specified location of the MySQL UNIX socket""... $ac_c" 1>&6 -echo "configure:58759: checking for specified location of the MySQL UNIX socket" >&5 +echo "configure:58391: checking for specified location of the MySQL UNIX socket" >&5 # Check whether --with-mysql-sock or --without-mysql-sock was given. if test "${with_mysql_sock+set}" = set; then withval="$with_mysql_sock" @@ -58782,7 +58414,7 @@ if test -z "$PHP_ZLIB_DIR"; then php_with_zlib_dir=no echo $ac_n "checking for the location of libz""... $ac_c" 1>&6 -echo "configure:58786: checking for the location of libz" >&5 +echo "configure:58418: checking for the location of libz" >&5 # Check whether --with-zlib-dir or --without-zlib-dir was given. if test "${with_zlib_dir+set}" = set; then withval="$with_zlib_dir" @@ -58809,49 +58441,6 @@ if test "$PHP_MYSQL" = "mysqlnd"; then PHP_MYSQLND_ENABLED=yes elif test "$PHP_MYSQL" != "no"; then - - echo $ac_n "checking for MySQL UNIX socket location""... $ac_c" 1>&6 -echo "configure:58815: checking for MySQL UNIX socket location" >&5 - if test "$PHP_MYSQL_SOCK" != "no" && test "$PHP_MYSQL_SOCK" != "yes"; then - MYSQL_SOCK=$PHP_MYSQL_SOCK - cat >> confdefs.h <&6 - elif test "$PHP_MYSQL" = "yes" || test "$PHP_MYSQL_SOCK" = "yes"; then - - for i in \ - /var/run/mysqld/mysqld.sock \ - /var/tmp/mysql.sock \ - /var/run/mysql/mysql.sock \ - /var/lib/mysql/mysql.sock \ - /var/mysql/mysql.sock \ - /usr/local/mysql/var/mysql.sock \ - /Private/tmp/mysql.sock \ - /private/tmp/mysql.sock \ - /tmp/mysql.sock \ - ; do - if test -r $i; then - MYSQL_SOCK=$i - break 2 - fi - done - - if test -n "$MYSQL_SOCK"; then - cat >> confdefs.h <&6 - else - echo "$ac_t""no" 1>&6 - fi - - else - echo "$ac_t""no" 1>&6 - fi - MYSQL_DIR= MYSQL_INC_DIR= @@ -59002,7 +58591,7 @@ Note that the MySQL client library is not bundled anymore!" 1>&2; exit 1; } done echo $ac_n "checking for mysql_close in -l$MYSQL_LIBNAME""... $ac_c" 1>&6 -echo "configure:59006: checking for mysql_close in -l$MYSQL_LIBNAME" >&5 +echo "configure:58595: checking for mysql_close in -l$MYSQL_LIBNAME" >&5 ac_lib_var=`echo $MYSQL_LIBNAME'_'mysql_close | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -59010,7 +58599,7 @@ else ac_save_LIBS="$LIBS" LIBS="-l$MYSQL_LIBNAME $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:58614: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -59244,7 +58833,7 @@ else done echo $ac_n "checking for mysql_error in -l$MYSQL_LIBNAME""... $ac_c" 1>&6 -echo "configure:59248: checking for mysql_error in -l$MYSQL_LIBNAME" >&5 +echo "configure:58837: checking for mysql_error in -l$MYSQL_LIBNAME" >&5 ac_lib_var=`echo $MYSQL_LIBNAME'_'mysql_error | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -59252,7 +58841,7 @@ else ac_save_LIBS="$LIBS" LIBS="-l$MYSQL_LIBNAME $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:58856: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -59418,7 +59007,7 @@ fi done echo $ac_n "checking for mysql_errno in -l$MYSQL_LIBNAME""... $ac_c" 1>&6 -echo "configure:59422: checking for mysql_errno in -l$MYSQL_LIBNAME" >&5 +echo "configure:59011: checking for mysql_errno in -l$MYSQL_LIBNAME" >&5 ac_lib_var=`echo $MYSQL_LIBNAME'_'mysql_errno | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -59426,7 +59015,7 @@ else ac_save_LIBS="$LIBS" LIBS="-l$MYSQL_LIBNAME $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:59030: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -59630,6 +59219,48 @@ fi fi if test "$PHP_MYSQL" != "no"; then + echo $ac_n "checking for MySQL UNIX socket location""... $ac_c" 1>&6 +echo "configure:59224: checking for MySQL UNIX socket location" >&5 + if test "$PHP_MYSQL_SOCK" != "no" && test "$PHP_MYSQL_SOCK" != "yes"; then + MYSQL_SOCK=$PHP_MYSQL_SOCK + cat >> confdefs.h <&6 + elif test "$PHP_MYSQL" = "yes" || test "$PHP_MYSQL_SOCK" = "yes"; then + + for i in \ + /var/run/mysqld/mysqld.sock \ + /var/tmp/mysql.sock \ + /var/run/mysql/mysql.sock \ + /var/lib/mysql/mysql.sock \ + /var/mysql/mysql.sock \ + /usr/local/mysql/var/mysql.sock \ + /Private/tmp/mysql.sock \ + /private/tmp/mysql.sock \ + /tmp/mysql.sock \ + ; do + if test -r $i; then + MYSQL_SOCK=$i + break 2 + fi + done + + if test -n "$MYSQL_SOCK"; then + cat >> confdefs.h <&6 + else + echo "$ac_t""no" 1>&6 + fi + + else + echo "$ac_t""no" 1>&6 + fi + cat >> confdefs.h <<\EOF #define HAVE_MYSQL 1 EOF @@ -59962,7 +59593,7 @@ fi php_with_mysqli=no echo $ac_n "checking for MySQLi support""... $ac_c" 1>&6 -echo "configure:59966: checking for MySQLi support" >&5 +echo "configure:59597: checking for MySQLi support" >&5 # Check whether --with-mysqli or --without-mysqli was given. if test "${with_mysqli+set}" = set; then withval="$with_mysqli" @@ -60009,7 +59640,7 @@ echo "$ac_t""$ext_output" 1>&6 php_enable_embedded_mysqli=no echo $ac_n "checking whether to enable embedded MySQLi support""... $ac_c" 1>&6 -echo "configure:60013: checking whether to enable embedded MySQLi support" >&5 +echo "configure:59644: checking whether to enable embedded MySQLi support" >&5 # Check whether --enable-embedded_mysqli or --disable-embedded_mysqli was given. if test "${enable_embedded_mysqli+set}" = set; then enableval="$enable_embedded_mysqli" @@ -60163,7 +59794,7 @@ EOF done echo $ac_n "checking for mysql_set_server_option in -l$MYSQL_LIB_NAME""... $ac_c" 1>&6 -echo "configure:60167: checking for mysql_set_server_option in -l$MYSQL_LIB_NAME" >&5 +echo "configure:59798: checking for mysql_set_server_option in -l$MYSQL_LIB_NAME" >&5 ac_lib_var=`echo $MYSQL_LIB_NAME'_'mysql_set_server_option | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -60171,7 +59802,7 @@ else ac_save_LIBS="$LIBS" LIBS="-l$MYSQL_LIB_NAME $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:59817: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -60430,7 +60061,7 @@ EOF done echo $ac_n "checking for mysql_set_character_set in -l$MYSQL_LIB_NAME""... $ac_c" 1>&6 -echo "configure:60434: checking for mysql_set_character_set in -l$MYSQL_LIB_NAME" >&5 +echo "configure:60065: checking for mysql_set_character_set in -l$MYSQL_LIB_NAME" >&5 ac_lib_var=`echo $MYSQL_LIB_NAME'_'mysql_set_character_set | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -60438,7 +60069,7 @@ else ac_save_LIBS="$LIBS" LIBS="-l$MYSQL_LIB_NAME $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:60084: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -60593,7 +60224,7 @@ fi done echo $ac_n "checking for mysql_stmt_next_result in -l$MYSQL_LIB_NAME""... $ac_c" 1>&6 -echo "configure:60597: checking for mysql_stmt_next_result in -l$MYSQL_LIB_NAME" >&5 +echo "configure:60228: checking for mysql_stmt_next_result in -l$MYSQL_LIB_NAME" >&5 ac_lib_var=`echo $MYSQL_LIB_NAME'_'mysql_stmt_next_result | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -60601,7 +60232,7 @@ else ac_save_LIBS="$LIBS" LIBS="-l$MYSQL_LIB_NAME $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:60247: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -60998,7 +60629,7 @@ fi php_with_oci8=no echo $ac_n "checking for Oracle (OCI8) support""... $ac_c" 1>&6 -echo "configure:61002: checking for Oracle (OCI8) support" >&5 +echo "configure:60633: checking for Oracle (OCI8) support" >&5 # Check whether --with-oci8 or --without-oci8 was given. if test "${with_oci8+set}" = set; then withval="$with_oci8" @@ -61049,7 +60680,7 @@ if test "$PHP_OCI8" != "no"; then echo $ac_n "checking PHP version""... $ac_c" 1>&6 -echo "configure:61053: checking PHP version" >&5 +echo "configure:60684: checking PHP version" >&5 tmp_version=$PHP_VERSION if test -z "$tmp_version"; then @@ -61081,7 +60712,7 @@ echo "configure:61053: checking PHP version" >&5 echo $ac_n "checking size of long int""... $ac_c" 1>&6 -echo "configure:61085: checking size of long int" >&5 +echo "configure:60716: checking size of long int" >&5 if eval "test \"`echo '$''{'ac_cv_sizeof_long_int'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -61089,7 +60720,7 @@ else ac_cv_sizeof_long_int=4 else cat > conftest.$ac_ext < int main() @@ -61100,7 +60731,7 @@ int main() return(0); } EOF -if { (eval echo configure:61104: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:60735: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_sizeof_long_int=`cat conftestval` else @@ -61120,7 +60751,7 @@ EOF echo $ac_n "checking checking if we're on a 64-bit platform""... $ac_c" 1>&6 -echo "configure:61124: checking checking if we're on a 64-bit platform" >&5 +echo "configure:60755: checking checking if we're on a 64-bit platform" >&5 if test "$ac_cv_sizeof_long_int" = "4"; then echo "$ac_t""no" 1>&6 PHP_OCI8_OH_LIBDIR=lib32 @@ -61164,7 +60795,7 @@ echo "configure:61124: checking checking if we're on a 64-bit platform" >&5 if test "$PHP_OCI8_INSTANT_CLIENT" = "no"; then echo $ac_n "checking Oracle ORACLE_HOME install directory""... $ac_c" 1>&6 -echo "configure:61168: checking Oracle ORACLE_HOME install directory" >&5 +echo "configure:60799: checking Oracle ORACLE_HOME install directory" >&5 if test "$PHP_OCI8" = "yes"; then OCI8_DIR=$ORACLE_HOME @@ -61175,7 +60806,7 @@ echo "configure:61168: checking Oracle ORACLE_HOME install directory" >&5 echo $ac_n "checking ORACLE_HOME library validity""... $ac_c" 1>&6 -echo "configure:61179: checking ORACLE_HOME library validity" >&5 +echo "configure:60810: checking ORACLE_HOME library validity" >&5 if test ! -d "$OCI8_DIR"; then { echo "configure: error: ${OCI8_DIR} is not a directory" 1>&2; exit 1; } fi @@ -61516,7 +61147,7 @@ echo "configure:61179: checking ORACLE_HOME library validity" >&5 echo $ac_n "checking Oracle version""... $ac_c" 1>&6 -echo "configure:61520: checking Oracle version" >&5 +echo "configure:61151: checking Oracle version" >&5 if test -s "$OCI8_DIR/orainst/unix.rgs"; then OCI8_ORACLE_VERSION=`grep '"ocommon"' $OCI8_DIR/orainst/unix.rgs | $PHP_OCI8_SED 's/ */:/g' | cut -d: -f 6 | cut -c 2-4` test -z "$OCI8_ORACLE_VERSION" && OCI8_ORACLE_VERSION=7.3 @@ -61646,7 +61277,7 @@ echo "configure:61520: checking Oracle version" >&5 done echo $ac_n "checking for OCIEnvNlsCreate in -lclntsh""... $ac_c" 1>&6 -echo "configure:61650: checking for OCIEnvNlsCreate in -lclntsh" >&5 +echo "configure:61281: checking for OCIEnvNlsCreate in -lclntsh" >&5 ac_lib_var=`echo clntsh'_'OCIEnvNlsCreate | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -61654,7 +61285,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lclntsh $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:61300: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -62102,7 +61733,7 @@ EOF else echo $ac_n "checking Oracle Instant Client directory""... $ac_c" 1>&6 -echo "configure:62106: checking Oracle Instant Client directory" >&5 +echo "configure:61737: checking Oracle Instant Client directory" >&5 if test "$PHP_OCI8_INSTANT_CLIENT" = "yes"; then PHP_OCI8_INSTANT_CLIENT=`ls -d /usr/lib/oracle/*/client${PHP_OCI8_IC_LIBDIR_SUFFIX}/lib/libclntsh.* 2> /dev/null | tail -1 | $PHP_OCI8_SED -e 's#/libclntsh[^/]*##'` @@ -62115,7 +61746,7 @@ echo "configure:62106: checking Oracle Instant Client directory" >&5 OCI8_DIR=$PHP_OCI8_INSTANT_CLIENT echo $ac_n "checking Oracle Instant Client SDK header directory""... $ac_c" 1>&6 -echo "configure:62119: checking Oracle Instant Client SDK header directory" >&5 +echo "configure:61750: checking Oracle Instant Client SDK header directory" >&5 OCISDKRPMINC=`echo "$PHP_OCI8_INSTANT_CLIENT" | $PHP_OCI8_SED -e 's!^/usr/lib/oracle/\(.*\)/client\('${PHP_OCI8_IC_LIBDIR_SUFFIX}'\)*/lib/*$!/usr/include/oracle/\1/client\2!'` @@ -62324,7 +61955,7 @@ echo "configure:62119: checking Oracle Instant Client SDK header directory" >&5 echo $ac_n "checking Oracle Instant Client version""... $ac_c" 1>&6 -echo "configure:62328: checking Oracle Instant Client version" >&5 +echo "configure:61959: checking Oracle Instant Client version" >&5 if test -f $PHP_OCI8_INSTANT_CLIENT/libnnz11.$SHLIB_SUFFIX_NAME; then if test -f $PHP_OCI8_INSTANT_CLIENT/libclntsh.$SHLIB_SUFFIX_NAME.11.1; then if test ! -f $PHP_OCI8_INSTANT_CLIENT/libclntsh.$SHLIB_SUFFIX_NAME; then @@ -62806,7 +62437,7 @@ esac if test "$PHP_ADABAS" != "no"; then echo $ac_n "checking for Adabas support""... $ac_c" 1>&6 -echo "configure:62810: checking for Adabas support" >&5 +echo "configure:62441: checking for Adabas support" >&5 if test "$PHP_ADABAS" = "yes"; then PHP_ADABAS=/usr/local fi @@ -63012,7 +62643,7 @@ esac if test "$PHP_SAPDB" != "no"; then echo $ac_n "checking for SAP DB support""... $ac_c" 1>&6 -echo "configure:63016: checking for SAP DB support" >&5 +echo "configure:62647: checking for SAP DB support" >&5 if test "$PHP_SAPDB" = "yes"; then PHP_SAPDB=/usr/local fi @@ -63148,7 +62779,7 @@ esac if test "$PHP_SOLID" != "no"; then echo $ac_n "checking for Solid support""... $ac_c" 1>&6 -echo "configure:63152: checking for Solid support" >&5 +echo "configure:62783: checking for Solid support" >&5 if test "$PHP_SOLID" = "yes"; then PHP_SOLID=/usr/local/solid fi @@ -63175,7 +62806,7 @@ EOF echo "$ac_t""$ext_output" 1>&6 echo $ac_n "checking Solid library file""... $ac_c" 1>&6 -echo "configure:63179: checking Solid library file" >&5 +echo "configure:62810: checking Solid library file" >&5 ac_solid_uname_r=`uname -r 2>/dev/null` ac_solid_uname_s=`uname -s 2>/dev/null` case $ac_solid_uname_s in @@ -63299,7 +62930,7 @@ esac if test "$PHP_IBM_DB2" != "no"; then echo $ac_n "checking for IBM DB2 support""... $ac_c" 1>&6 -echo "configure:63303: checking for IBM DB2 support" >&5 +echo "configure:62934: checking for IBM DB2 support" >&5 if test "$PHP_IBM_DB2" = "yes"; then ODBC_INCDIR=/home/db2inst1/sqllib/include ODBC_LIBDIR=/home/db2inst1/sqllib/lib @@ -63330,7 +62961,7 @@ fi else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:62976: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then LIBS=$old_LIBS @@ -63425,7 +63056,7 @@ esac if test "$PHP_ODBCROUTER" != "no"; then echo $ac_n "checking for ODBCRouter.com support""... $ac_c" 1>&6 -echo "configure:63429: checking for ODBCRouter.com support" >&5 +echo "configure:63060: checking for ODBCRouter.com support" >&5 if test "$PHP_ODBCROUTER" = "yes"; then PHP_ODBCROUTER=/usr fi @@ -63492,7 +63123,7 @@ esac if test "$PHP_EMPRESS" != "no"; then echo $ac_n "checking for Empress support""... $ac_c" 1>&6 -echo "configure:63496: checking for Empress support" >&5 +echo "configure:63127: checking for Empress support" >&5 if test "$PHP_EMPRESS" = "yes"; then ODBC_INCDIR=$EMPRESSPATH/include/odbc ODBC_LIBDIR=$EMPRESSPATH/shlib @@ -63510,7 +63141,7 @@ EOF echo "$ac_t""$ext_output" 1>&6 echo $ac_n "checking Empress library file""... $ac_c" 1>&6 -echo "configure:63514: checking Empress library file" >&5 +echo "configure:63145: checking Empress library file" >&5 ODBC_LIBS=`echo $ODBC_LIBDIR/libempodbccl.so | cut -d' ' -f1` if test ! -f $ODBC_LIBS; then ODBC_LIBS=`echo $ODBC_LIBDIR/libempodbccl.so | cut -d' ' -f1` @@ -63569,7 +63200,7 @@ esac if test "$PHP_EMPRESS_BCS" != "no"; then echo $ac_n "checking for Empress local access support""... $ac_c" 1>&6 -echo "configure:63573: checking for Empress local access support" >&5 +echo "configure:63204: checking for Empress local access support" >&5 if test "$PHP_EMPRESS_BCS" = "yes"; then ODBC_INCDIR=$EMPRESSPATH/include/odbc ODBC_LIBDIR=$EMPRESSPATH/shlib @@ -63603,7 +63234,7 @@ EOF echo "$ac_t""$ext_output" 1>&6 echo $ac_n "checking Empress local access library file""... $ac_c" 1>&6 -echo "configure:63607: checking Empress local access library file" >&5 +echo "configure:63238: checking Empress local access library file" >&5 ODBCBCS_LIBS=`echo $ODBC_LIBDIR/libempodbcbcs.a | cut -d' ' -f1` if test ! -f $ODBCBCS_LIBS; then ODBCBCS_LIBS=`echo $ODBC_LIBDIR/libempodbcbcs.a | cut -d' ' -f1` @@ -63662,7 +63293,7 @@ esac if test "$PHP_BIRDSTEP" != "no"; then echo $ac_n "checking for Birdstep support""... $ac_c" 1>&6 -echo "configure:63666: checking for Birdstep support" >&5 +echo "configure:63297: checking for Birdstep support" >&5 if test "$PHP_BIRDSTEP" = "yes"; then ODBC_INCDIR=/usr/local/birdstep/include ODBC_LIBDIR=/usr/local/birdstep/lib @@ -63777,7 +63408,7 @@ esac if test "$PHP_CUSTOM_ODBC" != "no"; then echo $ac_n "checking for a custom ODBC support""... $ac_c" 1>&6 -echo "configure:63781: checking for a custom ODBC support" >&5 +echo "configure:63412: checking for a custom ODBC support" >&5 if test "$PHP_CUSTOM_ODBC" = "yes"; then PHP_CUSTOM_ODBC=/usr/local fi @@ -63844,7 +63475,7 @@ esac if test "$PHP_IODBC" != "no"; then echo $ac_n "checking for iODBC support""... $ac_c" 1>&6 -echo "configure:63848: checking for iODBC support" >&5 +echo "configure:63479: checking for iODBC support" >&5 if test "$PHP_IODBC" = "yes"; then PHP_IODBC=/usr/local fi @@ -63993,7 +63624,7 @@ esac if test "$PHP_ESOOB" != "no"; then echo $ac_n "checking for Easysoft ODBC-ODBC Bridge support""... $ac_c" 1>&6 -echo "configure:63997: checking for Easysoft ODBC-ODBC Bridge support" >&5 +echo "configure:63628: checking for Easysoft ODBC-ODBC Bridge support" >&5 if test "$PHP_ESOOB" = "yes"; then PHP_ESOOB=/usr/local/easysoft/oob/client fi @@ -64060,7 +63691,7 @@ esac if test "$PHP_UNIXODBC" != "no"; then echo $ac_n "checking for unixODBC support""... $ac_c" 1>&6 -echo "configure:64064: checking for unixODBC support" >&5 +echo "configure:63695: checking for unixODBC support" >&5 if test "$PHP_UNIXODBC" = "yes"; then PHP_UNIXODBC=/usr/local fi @@ -64132,7 +63763,7 @@ esac if test "$PHP_DBMAKER" != "no"; then echo $ac_n "checking for DBMaker support""... $ac_c" 1>&6 -echo "configure:64136: checking for DBMaker support" >&5 +echo "configure:63767: checking for DBMaker support" >&5 if test "$PHP_DBMAKER" = "yes"; then # find dbmaker's home directory DBMAKER_HOME=`grep "^dbmaker:" /etc/passwd | $AWK -F: '{print $6}'` @@ -64694,7 +64325,7 @@ fi php_enable_pcntl=no echo $ac_n "checking whether to enable pcntl support""... $ac_c" 1>&6 -echo "configure:64698: checking whether to enable pcntl support" >&5 +echo "configure:64329: checking whether to enable pcntl support" >&5 # Check whether --enable-pcntl or --disable-pcntl was given. if test "${enable_pcntl+set}" = set; then enableval="$enable_pcntl" @@ -64741,12 +64372,12 @@ if test "$PHP_PCNTL" != "no"; then for ac_func in fork do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:64745: checking for $ac_func" >&5 +echo "configure:64376: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:64404: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -64800,12 +64431,12 @@ done for ac_func in waitpid do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:64804: checking for $ac_func" >&5 +echo "configure:64435: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:64463: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -64859,12 +64490,12 @@ done for ac_func in sigaction do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:64863: checking for $ac_func" >&5 +echo "configure:64494: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:64522: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -64918,12 +64549,12 @@ done for ac_func in getpriority setpriority wait3 sigprocmask sigwaitinfo sigtimedwait do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:64922: checking for $ac_func" >&5 +echo "configure:64553: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:64581: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -65271,7 +64902,7 @@ fi php_enable_pdo=yes echo $ac_n "checking whether to enable PDO support""... $ac_c" 1>&6 -echo "configure:65275: checking whether to enable PDO support" >&5 +echo "configure:64906: checking whether to enable PDO support" >&5 # Check whether --enable-pdo or --disable-pdo was given. if test "${enable_pdo+set}" = set; then enableval="$enable_pdo" @@ -65708,7 +65339,7 @@ fi php_with_pdo_dblib=no echo $ac_n "checking for PDO_DBLIB support via FreeTDS""... $ac_c" 1>&6 -echo "configure:65712: checking for PDO_DBLIB support via FreeTDS" >&5 +echo "configure:65343: checking for PDO_DBLIB support via FreeTDS" >&5 # Check whether --with-pdo-dblib or --without-pdo-dblib was given. if test "${with_pdo_dblib+set}" = set; then withval="$with_pdo_dblib" @@ -65928,13 +65559,13 @@ if test "$PHP_PDO_DBLIB" != "no"; then echo $ac_n "checking for PDO includes""... $ac_c" 1>&6 -echo "configure:65932: checking for PDO includes" >&5 +echo "configure:65563: checking for PDO includes" >&5 if eval "test \"`echo '$''{'pdo_inc_path'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else echo $ac_n "checking for PDO includes""... $ac_c" 1>&6 -echo "configure:65938: checking for PDO includes" >&5 +echo "configure:65569: checking for PDO includes" >&5 if test -f $abs_srcdir/include/php/ext/pdo/php_pdo_driver.h; then pdo_inc_path=$abs_srcdir/ext elif test -f $abs_srcdir/ext/pdo/php_pdo_driver.h; then @@ -66248,7 +65879,7 @@ EOF fi echo $ac_n "checking for dnet_addr in -ldnet_stub""... $ac_c" 1>&6 -echo "configure:66252: checking for dnet_addr in -ldnet_stub" >&5 +echo "configure:65883: checking for dnet_addr in -ldnet_stub" >&5 ac_lib_var=`echo dnet_stub'_'dnet_addr | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -66256,7 +65887,7 @@ else ac_save_LIBS="$LIBS" LIBS="-ldnet_stub $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:65902: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -66428,7 +66059,7 @@ fi php_with_pdo_firebird=no echo $ac_n "checking for Firebird support for PDO""... $ac_c" 1>&6 -echo "configure:66432: checking for Firebird support for PDO" >&5 +echo "configure:66063: checking for Firebird support for PDO" >&5 # Check whether --with-pdo-firebird or --without-pdo-firebird was given. if test "${with_pdo_firebird+set}" = set; then withval="$with_pdo_firebird" @@ -66585,7 +66216,7 @@ if test "$PHP_PDO_FIREBIRD" != "no"; then done echo $ac_n "checking for isc_detach_database in -lfbclient""... $ac_c" 1>&6 -echo "configure:66589: checking for isc_detach_database in -lfbclient" >&5 +echo "configure:66220: checking for isc_detach_database in -lfbclient" >&5 ac_lib_var=`echo fbclient'_'isc_detach_database | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -66593,7 +66224,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lfbclient $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:66239: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -66731,7 +66362,7 @@ else done echo $ac_n "checking for isc_detach_database in -lgds""... $ac_c" 1>&6 -echo "configure:66735: checking for isc_detach_database in -lgds" >&5 +echo "configure:66366: checking for isc_detach_database in -lgds" >&5 ac_lib_var=`echo gds'_'isc_detach_database | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -66739,7 +66370,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lgds $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:66385: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -66877,7 +66508,7 @@ else done echo $ac_n "checking for isc_detach_database in -lib_util""... $ac_c" 1>&6 -echo "configure:66881: checking for isc_detach_database in -lib_util" >&5 +echo "configure:66512: checking for isc_detach_database in -lib_util" >&5 ac_lib_var=`echo ib_util'_'isc_detach_database | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -66885,7 +66516,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lib_util $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:66531: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -66941,13 +66572,13 @@ fi echo $ac_n "checking for PDO includes""... $ac_c" 1>&6 -echo "configure:66945: checking for PDO includes" >&5 +echo "configure:66576: checking for PDO includes" >&5 if eval "test \"`echo '$''{'pdo_inc_path'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else echo $ac_n "checking for PDO includes""... $ac_c" 1>&6 -echo "configure:66951: checking for PDO includes" >&5 +echo "configure:66582: checking for PDO includes" >&5 if test -f $abs_srcdir/include/php/ext/pdo/php_pdo_driver.h; then pdo_inc_path=$abs_srcdir/ext elif test -f $abs_srcdir/ext/pdo/php_pdo_driver.h; then @@ -67419,7 +67050,7 @@ fi php_with_pdo_mysql=no echo $ac_n "checking for MySQL support for PDO""... $ac_c" 1>&6 -echo "configure:67423: checking for MySQL support for PDO" >&5 +echo "configure:67054: checking for MySQL support for PDO" >&5 # Check whether --with-pdo-mysql or --without-pdo-mysql was given. if test "${with_pdo_mysql+set}" = set; then withval="$with_pdo_mysql" @@ -67467,7 +67098,7 @@ if test -z "$PHP_ZLIB_DIR"; then php_with_zlib_dir=no echo $ac_n "checking for the location of libz""... $ac_c" 1>&6 -echo "configure:67471: checking for the location of libz" >&5 +echo "configure:67102: checking for the location of libz" >&5 # Check whether --with-zlib-dir or --without-zlib-dir was given. if test "${with_zlib_dir+set}" = set; then withval="$with_zlib_dir" @@ -67498,6 +67129,29 @@ if test "$PHP_PDO_MYSQL" != "no"; then + if test -f $PHP_PDO_MYSQL && test -x $PHP_PDO_MYSQL ; then + PDO_MYSQL_CONFIG=$PHP_PDO_MYSQL + elif test "$PHP_PDO_MYSQL" != "yes"; then + if test -d "$PHP_PDO_MYSQL" ; then + if test -x "$PHP_PDO_MYSQL/bin/mysql_config" ; then + PDO_MYSQL_CONFIG="$PHP_PDO_MYSQL/bin/mysql_config" + else + PDO_MYSQL_DIR="$PHP_PDO_MYSQL" + fi + fi + else + for i in /usr/local /usr ; do + if test -x "$i/bin/mysql_config" ; then + PDO_MYSQL_CONFIG="$i/bin/mysql_config" + break; + fi + if test -r $i/include/mysql/mysql.h || test -r $i/include/mysql.h ; then + PDO_MYSQL_DIR="$i" + break; + fi + done + fi + if test "$PHP_PDO_MYSQL" = "mysqlnd"; then PHP_MYSQLND_ENABLED=yes cat >> confdefs.h <<\EOF @@ -67509,42 +67163,16 @@ EOF #define HAVE_MYSQL 1 EOF - echo $ac_n "checking for mysql_config""... $ac_c" 1>&6 -echo "configure:67514: checking for mysql_config" >&5 - - if test -f $PHP_PDO_MYSQL && test -x $PHP_PDO_MYSQL ; then - PDO_MYSQL_CONFIG=$PHP_PDO_MYSQL - elif test "$PHP_PDO_MYSQL" != "yes"; then - if test -d "$PHP_PDO_MYSQL" ; then - if test -x "$PHP_PDO_MYSQL/bin/mysql_config" ; then - PDO_MYSQL_CONFIG="$PHP_PDO_MYSQL/bin/mysql_config" - else - PDO_MYSQL_DIR="$PHP_PDO_MYSQL" - fi - else - echo "$ac_t""$PHP_PDO_MYSQL is not a directory" 1>&6 - { echo "configure: error: can not find mysql under the "$PHP_PDO_MYSQL" that you specified" 1>&2; exit 1; } - fi - else - for i in /usr/local /usr ; do - if test -x "$i/bin/mysql_config" ; then - PDO_MYSQL_CONFIG="$i/bin/mysql_config" - break; - fi - if test -r $i/include/mysql/mysql.h || test -r $i/include/mysql.h ; then - PDO_MYSQL_DIR="$i" - break; - fi - done - fi - if test -n "$PDO_MYSQL_CONFIG" && test -x "$PDO_MYSQL_CONFIG" ; then + echo $ac_n "checking for mysql_config""... $ac_c" 1>&6 +echo "configure:67169: checking for mysql_config" >&5 + if test -n "$PDO_MYSQL_CONFIG"; then echo "$ac_t""$PDO_MYSQL_CONFIG" 1>&6 if test "x$SED" = "x"; then # Extract the first word of "sed", so it can be a program name with args. set dummy sed; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:67548: checking for $ac_word" >&5 +echo "configure:67176: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_SED'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -67577,7 +67205,6 @@ else fi fi - if test "$enable_maintainer_zts" = "yes"; then PDO_MYSQL_LIBNAME=mysqlclient_r PDO_MYSQL_LIBS=`$PDO_MYSQL_CONFIG --libs_r | $SED -e "s/'//g"` @@ -67586,14 +67213,10 @@ fi PDO_MYSQL_LIBS=`$PDO_MYSQL_CONFIG --libs | $SED -e "s/'//g"` fi PDO_MYSQL_INCLUDE=`$PDO_MYSQL_CONFIG --cflags | $SED -e "s/'//g"` - PDO_MYSQL_SOCKET=`$PDO_MYSQL_CONFIG --socket` - elif test -z "$PDO_MYSQL_DIR"; then - echo "$ac_t""not found" 1>&6 - { echo "configure: error: Cannot find MySQL header files under $PDO_MYSQL_DIR" 1>&2; exit 1; } - else + elif test -n "$PDO_MYSQL_DIR"; then echo "$ac_t""not found" 1>&6 echo $ac_n "checking for mysql install under $PDO_MYSQL_DIR""... $ac_c" 1>&6 -echo "configure:67597: checking for mysql install under $PDO_MYSQL_DIR" >&5 +echo "configure:67220: checking for mysql install under $PDO_MYSQL_DIR" >&5 if test -r $PDO_MYSQL_DIR/include/mysql; then PDO_MYSQL_INC_DIR=$PDO_MYSQL_DIR/include/mysql else @@ -67644,13 +67267,11 @@ echo "configure:67597: checking for mysql install under $PDO_MYSQL_DIR" >&5 fi PDO_MYSQL_INCLUDE=-I$PDO_MYSQL_INC_DIR + else + echo "$ac_t""not found" 1>&6 + { echo "configure: error: Unable to find your mysql installation" 1>&2; exit 1; } fi - cat >> confdefs.h <&6 -echo "configure:67753: checking for mysql_query in -l$PDO_MYSQL_LIBNAME" >&5 +echo "configure:67374: checking for mysql_query in -l$PDO_MYSQL_LIBNAME" >&5 ac_lib_var=`echo $PDO_MYSQL_LIBNAME'_'mysql_query | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -67757,7 +67378,7 @@ else ac_save_LIBS="$LIBS" LIBS="-l$PDO_MYSQL_LIBNAME $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:67393: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -68121,7 +67742,7 @@ else done echo $ac_n "checking for mysql_query in -l$PDO_MYSQL_LIBNAME""... $ac_c" 1>&6 -echo "configure:68125: checking for mysql_query in -l$PDO_MYSQL_LIBNAME" >&5 +echo "configure:67746: checking for mysql_query in -l$PDO_MYSQL_LIBNAME" >&5 ac_lib_var=`echo $PDO_MYSQL_LIBNAME'_'mysql_query | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -68129,7 +67750,7 @@ else ac_save_LIBS="$LIBS" LIBS="-l$PDO_MYSQL_LIBNAME $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:67765: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -68295,7 +67916,7 @@ fi done echo $ac_n "checking for mysql_query in -l$PDO_MYSQL_LIBNAME""... $ac_c" 1>&6 -echo "configure:68299: checking for mysql_query in -l$PDO_MYSQL_LIBNAME" >&5 +echo "configure:67920: checking for mysql_query in -l$PDO_MYSQL_LIBNAME" >&5 ac_lib_var=`echo $PDO_MYSQL_LIBNAME'_'mysql_query | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -68303,7 +67924,7 @@ else ac_save_LIBS="$LIBS" LIBS="-l$PDO_MYSQL_LIBNAME $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:67939: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -68488,12 +68109,12 @@ fi for ac_func in mysql_commit mysql_stmt_prepare mysql_next_result mysql_sqlstate do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:68492: checking for $ac_func" >&5 +echo "configure:68113: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:68141: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -68546,13 +68167,13 @@ done echo $ac_n "checking for PDO includes""... $ac_c" 1>&6 -echo "configure:68550: checking for PDO includes" >&5 +echo "configure:68171: checking for PDO includes" >&5 if eval "test \"`echo '$''{'pdo_inc_path'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else echo $ac_n "checking for PDO includes""... $ac_c" 1>&6 -echo "configure:68556: checking for PDO includes" >&5 +echo "configure:68177: checking for PDO includes" >&5 if test -f $abs_srcdir/include/php/ext/pdo/php_pdo_driver.h; then pdo_inc_path=$abs_srcdir/ext elif test -f $abs_srcdir/ext/pdo/php_pdo_driver.h; then @@ -68572,6 +68193,13 @@ echo "$ac_t""$pdo_inc_path" 1>&6 + if test -n "$PDO_MYSQL_CONFIG"; then + PDO_MYSQL_SOCKET=`$PDO_MYSQL_CONFIG --socket` + cat >> confdefs.h <&6 -echo "configure:68934: checking Oracle OCI support for PDO" >&5 +echo "configure:68562: checking Oracle OCI support for PDO" >&5 # Check whether --with-pdo-oci or --without-pdo-oci was given. if test "${with_pdo_oci+set}" = set; then withval="$with_pdo_oci" @@ -68980,7 +68608,7 @@ if test "$PHP_PDO_OCI" != "no"; then fi echo $ac_n "checking Oracle Install-Dir""... $ac_c" 1>&6 -echo "configure:68984: checking Oracle Install-Dir" >&5 +echo "configure:68612: checking Oracle Install-Dir" >&5 if test "$PHP_PDO_OCI" = "yes" || test -z "$PHP_PDO_OCI"; then PDO_OCI_DIR=$ORACLE_HOME else @@ -68989,7 +68617,7 @@ echo "configure:68984: checking Oracle Install-Dir" >&5 echo "$ac_t""$PHP_PDO_OCI" 1>&6 echo $ac_n "checking if that is sane""... $ac_c" 1>&6 -echo "configure:68993: checking if that is sane" >&5 +echo "configure:68621: checking if that is sane" >&5 if test -z "$PDO_OCI_DIR"; then { echo "configure: error: You need to tell me where to find your Oracle Instant Client SDK, or set ORACLE_HOME. @@ -69002,7 +68630,7 @@ You need to tell me where to find your Oracle Instant Client SDK, or set ORACLE_ PDO_OCI_IC_PREFIX="`echo $PDO_OCI_DIR | cut -d, -f2`" PDO_OCI_IC_VERS="`echo $PDO_OCI_DIR | cut -d, -f3`" echo $ac_n "checking for oci.h""... $ac_c" 1>&6 -echo "configure:69006: checking for oci.h" >&5 +echo "configure:68634: checking for oci.h" >&5 if test -f $PDO_OCI_IC_PREFIX/include/oracle/$PDO_OCI_IC_VERS/client/oci.h ; then if test "$PDO_OCI_IC_PREFIX/include/oracle/$PDO_OCI_IC_VERS/client" != "/usr/include"; then @@ -69151,7 +68779,7 @@ echo "configure:69006: checking for oci.h" >&5 else echo $ac_n "checking size of long int""... $ac_c" 1>&6 -echo "configure:69155: checking size of long int" >&5 +echo "configure:68783: checking size of long int" >&5 if eval "test \"`echo '$''{'ac_cv_sizeof_long_int'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -69159,7 +68787,7 @@ else ac_cv_sizeof_long_int=4 else cat > conftest.$ac_ext < int main() @@ -69170,7 +68798,7 @@ int main() return(0); } EOF -if { (eval echo configure:69174: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:68802: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_sizeof_long_int=`cat conftestval` else @@ -69190,7 +68818,7 @@ EOF echo $ac_n "checking if we're on a 64-bit platform""... $ac_c" 1>&6 -echo "configure:69194: checking if we're on a 64-bit platform" >&5 +echo "configure:68822: checking if we're on a 64-bit platform" >&5 if test "$ac_cv_sizeof_long_int" = "4" ; then echo "$ac_t""no" 1>&6 TMP_PDO_OCI_LIB_DIR="$PDO_OCI_DIR/lib32" @@ -69200,7 +68828,7 @@ echo "configure:69194: checking if we're on a 64-bit platform" >&5 fi echo $ac_n "checking OCI8 libraries dir""... $ac_c" 1>&6 -echo "configure:69204: checking OCI8 libraries dir" >&5 +echo "configure:68832: checking OCI8 libraries dir" >&5 if test -d "$PDO_OCI_DIR/lib" && test ! -d "$PDO_OCI_DIR/lib32"; then PDO_OCI_LIB_DIR="$PDO_OCI_DIR/lib" elif test ! -d "$PDO_OCI_DIR/lib" && test -d "$PDO_OCI_DIR/lib32"; then @@ -69567,7 +69195,7 @@ echo "configure:69204: checking OCI8 libraries dir" >&5 fi echo $ac_n "checking Oracle version""... $ac_c" 1>&6 -echo "configure:69571: checking Oracle version" >&5 +echo "configure:69199: checking Oracle version" >&5 for OCI_VER in $SUPPORTED_LIB_VERS; do if test -f $PDO_OCI_DIR/lib/libclntsh.$SHLIB_SUFFIX_NAME.$OCI_VER; then PDO_OCI_VERSION="$OCI_VER" @@ -69581,7 +69209,7 @@ echo "configure:69571: checking Oracle version" >&5 fi case $PDO_OCI_VERSION in - 9.0|10.1|10.2|11.1) + 9.0|10.1|10.2|11.1|11.2) case clntsh in @@ -69749,7 +69377,7 @@ echo "configure:69571: checking Oracle version" >&5 done echo $ac_n "checking for OCIEnvCreate in -lclntsh""... $ac_c" 1>&6 -echo "configure:69753: checking for OCIEnvCreate in -lclntsh" >&5 +echo "configure:69381: checking for OCIEnvCreate in -lclntsh" >&5 ac_lib_var=`echo clntsh'_'OCIEnvCreate | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -69757,7 +69385,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lclntsh $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:69400: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -69902,7 +69530,7 @@ fi done echo $ac_n "checking for OCIEnvNlsCreate in -lclntsh""... $ac_c" 1>&6 -echo "configure:69906: checking for OCIEnvNlsCreate in -lclntsh" >&5 +echo "configure:69534: checking for OCIEnvNlsCreate in -lclntsh" >&5 ac_lib_var=`echo clntsh'_'OCIEnvNlsCreate | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -69910,7 +69538,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lclntsh $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:69553: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -70055,7 +69683,7 @@ fi done echo $ac_n "checking for OCILobIsTemporary in -lclntsh""... $ac_c" 1>&6 -echo "configure:70059: checking for OCILobIsTemporary in -lclntsh" >&5 +echo "configure:69687: checking for OCILobIsTemporary in -lclntsh" >&5 ac_lib_var=`echo clntsh'_'OCILobIsTemporary | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -70063,7 +69691,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lclntsh $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:69706: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -70204,7 +69832,7 @@ else done echo $ac_n "checking for OCILobIsTemporary in -locijdbc8""... $ac_c" 1>&6 -echo "configure:70208: checking for OCILobIsTemporary in -locijdbc8" >&5 +echo "configure:69836: checking for OCILobIsTemporary in -locijdbc8" >&5 ac_lib_var=`echo ocijdbc8'_'OCILobIsTemporary | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -70212,7 +69840,7 @@ else ac_save_LIBS="$LIBS" LIBS="-locijdbc8 $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:69855: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -70384,7 +70012,7 @@ fi done echo $ac_n "checking for OCICollAssign in -lclntsh""... $ac_c" 1>&6 -echo "configure:70388: checking for OCICollAssign in -lclntsh" >&5 +echo "configure:70016: checking for OCICollAssign in -lclntsh" >&5 ac_lib_var=`echo clntsh'_'OCICollAssign | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -70392,7 +70020,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lclntsh $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:70035: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -70537,7 +70165,7 @@ fi done echo $ac_n "checking for OCIStmtFetch2 in -lclntsh""... $ac_c" 1>&6 -echo "configure:70541: checking for OCIStmtFetch2 in -lclntsh" >&5 +echo "configure:70169: checking for OCIStmtFetch2 in -lclntsh" >&5 ac_lib_var=`echo clntsh'_'OCIStmtFetch2 | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -70545,7 +70173,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lclntsh $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:70188: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -70595,13 +70223,13 @@ fi echo $ac_n "checking for PDO includes""... $ac_c" 1>&6 -echo "configure:70599: checking for PDO includes" >&5 +echo "configure:70227: checking for PDO includes" >&5 if eval "test \"`echo '$''{'pdo_inc_path'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else echo $ac_n "checking for PDO includes""... $ac_c" 1>&6 -echo "configure:70605: checking for PDO includes" >&5 +echo "configure:70233: checking for PDO includes" >&5 if test -f $abs_srcdir/include/php/ext/pdo/php_pdo_driver.h; then pdo_inc_path=$abs_srcdir/ext elif test -f $abs_srcdir/ext/pdo/php_pdo_driver.h; then @@ -70969,7 +70597,7 @@ fi php_with_pdo_odbc=no echo $ac_n "checking for ODBC v3 support for PDO""... $ac_c" 1>&6 -echo "configure:70973: checking for ODBC v3 support for PDO" >&5 +echo "configure:70601: checking for ODBC v3 support for PDO" >&5 # Check whether --with-pdo-odbc or --without-pdo-odbc was given. if test "${with_pdo_odbc+set}" = set; then withval="$with_pdo_odbc" @@ -71024,13 +70652,13 @@ if test "$PHP_PDO_ODBC" != "no"; then echo $ac_n "checking for PDO includes""... $ac_c" 1>&6 -echo "configure:71028: checking for PDO includes" >&5 +echo "configure:70656: checking for PDO includes" >&5 if eval "test \"`echo '$''{'pdo_inc_path'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else echo $ac_n "checking for PDO includes""... $ac_c" 1>&6 -echo "configure:71034: checking for PDO includes" >&5 +echo "configure:70662: checking for PDO includes" >&5 if test -f $abs_srcdir/include/php/ext/pdo/php_pdo_driver.h; then pdo_inc_path=$abs_srcdir/ext elif test -f $abs_srcdir/ext/pdo/php_pdo_driver.h; then @@ -71051,7 +70679,7 @@ echo "$ac_t""$pdo_inc_path" 1>&6 echo $ac_n "checking for selected PDO ODBC flavour""... $ac_c" 1>&6 -echo "configure:71055: checking for selected PDO ODBC flavour" >&5 +echo "configure:70683: checking for selected PDO ODBC flavour" >&5 pdo_odbc_flavour="`echo $PHP_PDO_ODBC | cut -d, -f1`" pdo_odbc_dir="`echo $PHP_PDO_ODBC | cut -d, -f2`" @@ -71130,7 +70758,7 @@ echo "configure:71055: checking for selected PDO ODBC flavour" >&5 echo $ac_n "checking for odbc.h in $PDO_ODBC_INCDIR""... $ac_c" 1>&6 -echo "configure:71134: checking for odbc.h in $PDO_ODBC_INCDIR" >&5 +echo "configure:70762: checking for odbc.h in $PDO_ODBC_INCDIR" >&5 if test -f "$PDO_ODBC_INCDIR/odbc.h"; then php_pdo_have_header=yes cat >> confdefs.h <<\EOF @@ -71144,7 +70772,7 @@ EOF echo $ac_n "checking for odbcsdk.h in $PDO_ODBC_INCDIR""... $ac_c" 1>&6 -echo "configure:71148: checking for odbcsdk.h in $PDO_ODBC_INCDIR" >&5 +echo "configure:70776: checking for odbcsdk.h in $PDO_ODBC_INCDIR" >&5 if test -f "$PDO_ODBC_INCDIR/odbcsdk.h"; then php_pdo_have_header=yes cat >> confdefs.h <<\EOF @@ -71158,7 +70786,7 @@ EOF echo $ac_n "checking for iodbc.h in $PDO_ODBC_INCDIR""... $ac_c" 1>&6 -echo "configure:71162: checking for iodbc.h in $PDO_ODBC_INCDIR" >&5 +echo "configure:70790: checking for iodbc.h in $PDO_ODBC_INCDIR" >&5 if test -f "$PDO_ODBC_INCDIR/iodbc.h"; then php_pdo_have_header=yes cat >> confdefs.h <<\EOF @@ -71172,7 +70800,7 @@ EOF echo $ac_n "checking for sqlunix.h in $PDO_ODBC_INCDIR""... $ac_c" 1>&6 -echo "configure:71176: checking for sqlunix.h in $PDO_ODBC_INCDIR" >&5 +echo "configure:70804: checking for sqlunix.h in $PDO_ODBC_INCDIR" >&5 if test -f "$PDO_ODBC_INCDIR/sqlunix.h"; then php_pdo_have_header=yes cat >> confdefs.h <<\EOF @@ -71186,7 +70814,7 @@ EOF echo $ac_n "checking for sqltypes.h in $PDO_ODBC_INCDIR""... $ac_c" 1>&6 -echo "configure:71190: checking for sqltypes.h in $PDO_ODBC_INCDIR" >&5 +echo "configure:70818: checking for sqltypes.h in $PDO_ODBC_INCDIR" >&5 if test -f "$PDO_ODBC_INCDIR/sqltypes.h"; then php_pdo_have_header=yes cat >> confdefs.h <<\EOF @@ -71200,7 +70828,7 @@ EOF echo $ac_n "checking for sqlucode.h in $PDO_ODBC_INCDIR""... $ac_c" 1>&6 -echo "configure:71204: checking for sqlucode.h in $PDO_ODBC_INCDIR" >&5 +echo "configure:70832: checking for sqlucode.h in $PDO_ODBC_INCDIR" >&5 if test -f "$PDO_ODBC_INCDIR/sqlucode.h"; then php_pdo_have_header=yes cat >> confdefs.h <<\EOF @@ -71214,7 +70842,7 @@ EOF echo $ac_n "checking for sql.h in $PDO_ODBC_INCDIR""... $ac_c" 1>&6 -echo "configure:71218: checking for sql.h in $PDO_ODBC_INCDIR" >&5 +echo "configure:70846: checking for sql.h in $PDO_ODBC_INCDIR" >&5 if test -f "$PDO_ODBC_INCDIR/sql.h"; then php_pdo_have_header=yes cat >> confdefs.h <<\EOF @@ -71228,7 +70856,7 @@ EOF echo $ac_n "checking for isql.h in $PDO_ODBC_INCDIR""... $ac_c" 1>&6 -echo "configure:71232: checking for isql.h in $PDO_ODBC_INCDIR" >&5 +echo "configure:70860: checking for isql.h in $PDO_ODBC_INCDIR" >&5 if test -f "$PDO_ODBC_INCDIR/isql.h"; then php_pdo_have_header=yes cat >> confdefs.h <<\EOF @@ -71242,7 +70870,7 @@ EOF echo $ac_n "checking for sqlext.h in $PDO_ODBC_INCDIR""... $ac_c" 1>&6 -echo "configure:71246: checking for sqlext.h in $PDO_ODBC_INCDIR" >&5 +echo "configure:70874: checking for sqlext.h in $PDO_ODBC_INCDIR" >&5 if test -f "$PDO_ODBC_INCDIR/sqlext.h"; then php_pdo_have_header=yes cat >> confdefs.h <<\EOF @@ -71256,7 +70884,7 @@ EOF echo $ac_n "checking for isqlext.h in $PDO_ODBC_INCDIR""... $ac_c" 1>&6 -echo "configure:71260: checking for isqlext.h in $PDO_ODBC_INCDIR" >&5 +echo "configure:70888: checking for isqlext.h in $PDO_ODBC_INCDIR" >&5 if test -f "$PDO_ODBC_INCDIR/isqlext.h"; then php_pdo_have_header=yes cat >> confdefs.h <<\EOF @@ -71270,7 +70898,7 @@ EOF echo $ac_n "checking for udbcext.h in $PDO_ODBC_INCDIR""... $ac_c" 1>&6 -echo "configure:71274: checking for udbcext.h in $PDO_ODBC_INCDIR" >&5 +echo "configure:70902: checking for udbcext.h in $PDO_ODBC_INCDIR" >&5 if test -f "$PDO_ODBC_INCDIR/udbcext.h"; then php_pdo_have_header=yes cat >> confdefs.h <<\EOF @@ -71284,7 +70912,7 @@ EOF echo $ac_n "checking for sqlcli1.h in $PDO_ODBC_INCDIR""... $ac_c" 1>&6 -echo "configure:71288: checking for sqlcli1.h in $PDO_ODBC_INCDIR" >&5 +echo "configure:70916: checking for sqlcli1.h in $PDO_ODBC_INCDIR" >&5 if test -f "$PDO_ODBC_INCDIR/sqlcli1.h"; then php_pdo_have_header=yes cat >> confdefs.h <<\EOF @@ -71298,7 +70926,7 @@ EOF echo $ac_n "checking for LibraryManager.h in $PDO_ODBC_INCDIR""... $ac_c" 1>&6 -echo "configure:71302: checking for LibraryManager.h in $PDO_ODBC_INCDIR" >&5 +echo "configure:70930: checking for LibraryManager.h in $PDO_ODBC_INCDIR" >&5 if test -f "$PDO_ODBC_INCDIR/LibraryManager.h"; then php_pdo_have_header=yes cat >> confdefs.h <<\EOF @@ -71312,7 +70940,7 @@ EOF echo $ac_n "checking for cli0core.h in $PDO_ODBC_INCDIR""... $ac_c" 1>&6 -echo "configure:71316: checking for cli0core.h in $PDO_ODBC_INCDIR" >&5 +echo "configure:70944: checking for cli0core.h in $PDO_ODBC_INCDIR" >&5 if test -f "$PDO_ODBC_INCDIR/cli0core.h"; then php_pdo_have_header=yes cat >> confdefs.h <<\EOF @@ -71326,7 +70954,7 @@ EOF echo $ac_n "checking for cli0ext.h in $PDO_ODBC_INCDIR""... $ac_c" 1>&6 -echo "configure:71330: checking for cli0ext.h in $PDO_ODBC_INCDIR" >&5 +echo "configure:70958: checking for cli0ext.h in $PDO_ODBC_INCDIR" >&5 if test -f "$PDO_ODBC_INCDIR/cli0ext.h"; then php_pdo_have_header=yes cat >> confdefs.h <<\EOF @@ -71340,7 +70968,7 @@ EOF echo $ac_n "checking for cli0cli.h in $PDO_ODBC_INCDIR""... $ac_c" 1>&6 -echo "configure:71344: checking for cli0cli.h in $PDO_ODBC_INCDIR" >&5 +echo "configure:70972: checking for cli0cli.h in $PDO_ODBC_INCDIR" >&5 if test -f "$PDO_ODBC_INCDIR/cli0cli.h"; then php_pdo_have_header=yes cat >> confdefs.h <<\EOF @@ -71354,7 +70982,7 @@ EOF echo $ac_n "checking for cli0defs.h in $PDO_ODBC_INCDIR""... $ac_c" 1>&6 -echo "configure:71358: checking for cli0defs.h in $PDO_ODBC_INCDIR" >&5 +echo "configure:70986: checking for cli0defs.h in $PDO_ODBC_INCDIR" >&5 if test -f "$PDO_ODBC_INCDIR/cli0defs.h"; then php_pdo_have_header=yes cat >> confdefs.h <<\EOF @@ -71368,7 +70996,7 @@ EOF echo $ac_n "checking for cli0env.h in $PDO_ODBC_INCDIR""... $ac_c" 1>&6 -echo "configure:71372: checking for cli0env.h in $PDO_ODBC_INCDIR" >&5 +echo "configure:71000: checking for cli0env.h in $PDO_ODBC_INCDIR" >&5 if test -f "$PDO_ODBC_INCDIR/cli0env.h"; then php_pdo_have_header=yes cat >> confdefs.h <<\EOF @@ -71574,7 +71202,7 @@ EOF done echo $ac_n "checking for SQLBindCol in -l$pdo_odbc_def_lib""... $ac_c" 1>&6 -echo "configure:71578: checking for SQLBindCol in -l$pdo_odbc_def_lib" >&5 +echo "configure:71206: checking for SQLBindCol in -l$pdo_odbc_def_lib" >&5 ac_lib_var=`echo $pdo_odbc_def_lib'_'SQLBindCol | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -71582,7 +71210,7 @@ else ac_save_LIBS="$LIBS" LIBS="-l$pdo_odbc_def_lib $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:71225: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -71708,7 +71336,7 @@ if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then done echo $ac_n "checking for SQLAllocHandle in -l$pdo_odbc_def_lib""... $ac_c" 1>&6 -echo "configure:71712: checking for SQLAllocHandle in -l$pdo_odbc_def_lib" >&5 +echo "configure:71340: checking for SQLAllocHandle in -l$pdo_odbc_def_lib" >&5 ac_lib_var=`echo $pdo_odbc_def_lib'_'SQLAllocHandle | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -71716,7 +71344,7 @@ else ac_save_LIBS="$LIBS" LIBS="-l$pdo_odbc_def_lib $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:71359: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -72101,7 +71729,7 @@ fi php_with_pdo_pgsql=no echo $ac_n "checking for PostgreSQL support for PDO""... $ac_c" 1>&6 -echo "configure:72105: checking for PostgreSQL support for PDO" >&5 +echo "configure:71733: checking for PostgreSQL support for PDO" >&5 # Check whether --with-pdo-pgsql or --without-pdo-pgsql was given. if test "${with_pdo_pgsql+set}" = set; then withval="$with_pdo_pgsql" @@ -72163,7 +71791,7 @@ if test "$PHP_PDO_PGSQL" != "no"; then echo $ac_n "checking for pg_config""... $ac_c" 1>&6 -echo "configure:72167: checking for pg_config" >&5 +echo "configure:71795: checking for pg_config" >&5 for i in $PHP_PDO_PGSQL $PHP_PDO_PGSQL/bin /usr/local/pgsql/bin /usr/local/bin /usr/bin ""; do if test -x $i/pg_config; then PG_CONFIG="$i/pg_config" @@ -72227,13 +71855,13 @@ EOF echo $ac_n "checking for openssl dependencies""... $ac_c" 1>&6 -echo "configure:72231: checking for openssl dependencies" >&5 +echo "configure:71859: checking for openssl dependencies" >&5 if grep -q openssl $PGSQL_INCLUDE/libpq-fe.h ; then echo "$ac_t""yes" 1>&6 # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:72237: checking for $ac_word" >&5 +echo "configure:71865: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_PKG_CONFIG'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -72277,7 +71905,7 @@ fi old_LDFLAGS=$LDFLAGS LDFLAGS="-L$PGSQL_LIBDIR $LDFLAGS" echo $ac_n "checking for PQparameterStatus in -lpq""... $ac_c" 1>&6 -echo "configure:72281: checking for PQparameterStatus in -lpq" >&5 +echo "configure:71909: checking for PQparameterStatus in -lpq" >&5 ac_lib_var=`echo pq'_'PQparameterStatus | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -72285,7 +71913,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lpq $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:71928: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -72325,7 +71953,7 @@ fi echo $ac_n "checking for PQprepare in -lpq""... $ac_c" 1>&6 -echo "configure:72329: checking for PQprepare in -lpq" >&5 +echo "configure:71957: checking for PQprepare in -lpq" >&5 ac_lib_var=`echo pq'_'PQprepare | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -72333,7 +71961,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lpq $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:71976: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -72368,7 +71996,7 @@ else fi echo $ac_n "checking for PQescapeStringConn in -lpq""... $ac_c" 1>&6 -echo "configure:72372: checking for PQescapeStringConn in -lpq" >&5 +echo "configure:72000: checking for PQescapeStringConn in -lpq" >&5 ac_lib_var=`echo pq'_'PQescapeStringConn | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -72376,7 +72004,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lpq $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:72019: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -72411,7 +72039,7 @@ else fi echo $ac_n "checking for PQescapeByteaConn in -lpq""... $ac_c" 1>&6 -echo "configure:72415: checking for PQescapeByteaConn in -lpq" >&5 +echo "configure:72043: checking for PQescapeByteaConn in -lpq" >&5 ac_lib_var=`echo pq'_'PQescapeByteaConn | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -72419,7 +72047,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lpq $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:72062: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -72455,7 +72083,7 @@ fi echo $ac_n "checking for pg_encoding_to_char in -lpq""... $ac_c" 1>&6 -echo "configure:72459: checking for pg_encoding_to_char in -lpq" >&5 +echo "configure:72087: checking for pg_encoding_to_char in -lpq" >&5 ac_lib_var=`echo pq'_'pg_encoding_to_char | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -72463,7 +72091,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lpq $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:72106: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -72638,13 +72266,13 @@ fi echo $ac_n "checking for PDO includes""... $ac_c" 1>&6 -echo "configure:72642: checking for PDO includes" >&5 +echo "configure:72270: checking for PDO includes" >&5 if eval "test \"`echo '$''{'pdo_inc_path'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else echo $ac_n "checking for PDO includes""... $ac_c" 1>&6 -echo "configure:72648: checking for PDO includes" >&5 +echo "configure:72276: checking for PDO includes" >&5 if test -f $abs_srcdir/include/php/ext/pdo/php_pdo_driver.h; then pdo_inc_path=$abs_srcdir/ext elif test -f $abs_srcdir/ext/pdo/php_pdo_driver.h; then @@ -72984,7 +72612,7 @@ fi php_with_pdo_sqlite=$PHP_PDO echo $ac_n "checking for sqlite 3 support for PDO""... $ac_c" 1>&6 -echo "configure:72988: checking for sqlite 3 support for PDO" >&5 +echo "configure:72616: checking for sqlite 3 support for PDO" >&5 # Check whether --with-pdo-sqlite or --without-pdo-sqlite was given. if test "${with_pdo_sqlite+set}" = set; then withval="$with_pdo_sqlite" @@ -73036,13 +72664,13 @@ if test "$PHP_PDO_SQLITE" != "no"; then echo $ac_n "checking for PDO includes""... $ac_c" 1>&6 -echo "configure:73040: checking for PDO includes" >&5 +echo "configure:72668: checking for PDO includes" >&5 if eval "test \"`echo '$''{'pdo_inc_path'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else echo $ac_n "checking for PDO includes""... $ac_c" 1>&6 -echo "configure:73046: checking for PDO includes" >&5 +echo "configure:72674: checking for PDO includes" >&5 if test -f $abs_srcdir/include/php/ext/pdo/php_pdo_driver.h; then pdo_inc_path=$abs_srcdir/ext elif test -f $abs_srcdir/ext/pdo/php_pdo_driver.h; then @@ -73071,7 +72699,7 @@ echo "$ac_t""$pdo_inc_path" 1>&6 PDO_SQLITE_DIR=$PHP_PDO_SQLITE else # search default path list echo $ac_n "checking for sqlite3 files in default path""... $ac_c" 1>&6 -echo "configure:73075: checking for sqlite3 files in default path" >&5 +echo "configure:72703: checking for sqlite3 files in default path" >&5 for i in $SEARCH_PATH ; do if test -r $i/$SEARCH_FOR; then PDO_SQLITE_DIR=$i @@ -73217,7 +72845,7 @@ echo "configure:73075: checking for sqlite3 files in default path" >&5 done echo $ac_n "checking for $LIBSYMBOL in -l$LIBNAME""... $ac_c" 1>&6 -echo "configure:73221: checking for $LIBSYMBOL in -l$LIBNAME" >&5 +echo "configure:72849: checking for $LIBSYMBOL in -l$LIBNAME" >&5 ac_lib_var=`echo $LIBNAME'_'$LIBSYMBOL | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -73225,7 +72853,7 @@ else ac_save_LIBS="$LIBS" LIBS="-l$LIBNAME $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:72868: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -73466,7 +73094,7 @@ fi done echo $ac_n "checking for sqlite3_key in -lsqlite3""... $ac_c" 1>&6 -echo "configure:73470: checking for sqlite3_key in -lsqlite3" >&5 +echo "configure:73098: checking for sqlite3_key in -lsqlite3" >&5 ac_lib_var=`echo sqlite3'_'sqlite3_key | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -73474,7 +73102,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lsqlite3 $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:73117: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -74226,12 +73854,12 @@ but you've either not enabled sqlite3, or have disabled it. for ac_func in usleep nanosleep do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:74230: checking for $ac_func" >&5 +echo "configure:73858: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:73886: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -74282,17 +73910,17 @@ done do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:74286: checking for $ac_hdr" >&5 +echo "configure:73914: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:74296: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:73924: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -74416,7 +74044,7 @@ done done echo $ac_n "checking for fdatasync in -lrt""... $ac_c" 1>&6 -echo "configure:74420: checking for fdatasync in -lrt" >&5 +echo "configure:74048: checking for fdatasync in -lrt" >&5 ac_lib_var=`echo rt'_'fdatasync | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -74424,7 +74052,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lrt $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:74067: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -74516,7 +74144,7 @@ fi php_with_pgsql=no echo $ac_n "checking for PostgreSQL support""... $ac_c" 1>&6 -echo "configure:74520: checking for PostgreSQL support" >&5 +echo "configure:74148: checking for PostgreSQL support" >&5 # Check whether --with-pgsql or --without-pgsql was given. if test "${with_pgsql+set}" = set; then withval="$with_pgsql" @@ -74573,7 +74201,7 @@ if test "$PHP_PGSQL" != "no"; then echo $ac_n "checking for pg_config""... $ac_c" 1>&6 -echo "configure:74577: checking for pg_config" >&5 +echo "configure:74205: checking for pg_config" >&5 for i in $PHP_PGSQL $PHP_PGSQL/bin /usr/local/pgsql/bin /usr/local/bin /usr/bin ""; do if test -x $i/pg_config; then PG_CONFIG="$i/pg_config" @@ -74641,7 +74269,7 @@ EOF old_LDFLAGS=$LDFLAGS LDFLAGS="-L$PGSQL_LIBDIR $LDFLAGS" echo $ac_n "checking for PQescapeString in -lpq""... $ac_c" 1>&6 -echo "configure:74645: checking for PQescapeString in -lpq" >&5 +echo "configure:74273: checking for PQescapeString in -lpq" >&5 ac_lib_var=`echo pq'_'PQescapeString | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -74649,7 +74277,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lpq $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:74292: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -74684,7 +74312,7 @@ else fi echo $ac_n "checking for PQunescapeBytea in -lpq""... $ac_c" 1>&6 -echo "configure:74688: checking for PQunescapeBytea in -lpq" >&5 +echo "configure:74316: checking for PQunescapeBytea in -lpq" >&5 ac_lib_var=`echo pq'_'PQunescapeBytea | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -74692,7 +74320,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lpq $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:74335: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -74727,7 +74355,7 @@ else fi echo $ac_n "checking for PQsetnonblocking in -lpq""... $ac_c" 1>&6 -echo "configure:74731: checking for PQsetnonblocking in -lpq" >&5 +echo "configure:74359: checking for PQsetnonblocking in -lpq" >&5 ac_lib_var=`echo pq'_'PQsetnonblocking | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -74735,7 +74363,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lpq $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:74378: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -74770,7 +74398,7 @@ else fi echo $ac_n "checking for PQcmdTuples in -lpq""... $ac_c" 1>&6 -echo "configure:74774: checking for PQcmdTuples in -lpq" >&5 +echo "configure:74402: checking for PQcmdTuples in -lpq" >&5 ac_lib_var=`echo pq'_'PQcmdTuples | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -74778,7 +74406,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lpq $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:74421: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -74813,7 +74441,7 @@ else fi echo $ac_n "checking for PQoidValue in -lpq""... $ac_c" 1>&6 -echo "configure:74817: checking for PQoidValue in -lpq" >&5 +echo "configure:74445: checking for PQoidValue in -lpq" >&5 ac_lib_var=`echo pq'_'PQoidValue | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -74821,7 +74449,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lpq $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:74464: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -74856,7 +74484,7 @@ else fi echo $ac_n "checking for PQclientEncoding in -lpq""... $ac_c" 1>&6 -echo "configure:74860: checking for PQclientEncoding in -lpq" >&5 +echo "configure:74488: checking for PQclientEncoding in -lpq" >&5 ac_lib_var=`echo pq'_'PQclientEncoding | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -74864,7 +74492,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lpq $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:74507: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -74899,7 +74527,7 @@ else fi echo $ac_n "checking for PQparameterStatus in -lpq""... $ac_c" 1>&6 -echo "configure:74903: checking for PQparameterStatus in -lpq" >&5 +echo "configure:74531: checking for PQparameterStatus in -lpq" >&5 ac_lib_var=`echo pq'_'PQparameterStatus | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -74907,7 +74535,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lpq $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:74550: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -74942,7 +74570,7 @@ else fi echo $ac_n "checking for PQprotocolVersion in -lpq""... $ac_c" 1>&6 -echo "configure:74946: checking for PQprotocolVersion in -lpq" >&5 +echo "configure:74574: checking for PQprotocolVersion in -lpq" >&5 ac_lib_var=`echo pq'_'PQprotocolVersion | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -74950,7 +74578,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lpq $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:74593: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -74985,7 +74613,7 @@ else fi echo $ac_n "checking for PQtransactionStatus in -lpq""... $ac_c" 1>&6 -echo "configure:74989: checking for PQtransactionStatus in -lpq" >&5 +echo "configure:74617: checking for PQtransactionStatus in -lpq" >&5 ac_lib_var=`echo pq'_'PQtransactionStatus | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -74993,7 +74621,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lpq $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:74636: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -75028,7 +74656,7 @@ else fi echo $ac_n "checking for PQexecParams in -lpq""... $ac_c" 1>&6 -echo "configure:75032: checking for PQexecParams in -lpq" >&5 +echo "configure:74660: checking for PQexecParams in -lpq" >&5 ac_lib_var=`echo pq'_'PQexecParams | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -75036,7 +74664,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lpq $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:74679: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -75071,7 +74699,7 @@ else fi echo $ac_n "checking for PQprepare in -lpq""... $ac_c" 1>&6 -echo "configure:75075: checking for PQprepare in -lpq" >&5 +echo "configure:74703: checking for PQprepare in -lpq" >&5 ac_lib_var=`echo pq'_'PQprepare | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -75079,7 +74707,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lpq $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:74722: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -75114,7 +74742,7 @@ else fi echo $ac_n "checking for PQexecPrepared in -lpq""... $ac_c" 1>&6 -echo "configure:75118: checking for PQexecPrepared in -lpq" >&5 +echo "configure:74746: checking for PQexecPrepared in -lpq" >&5 ac_lib_var=`echo pq'_'PQexecPrepared | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -75122,7 +74750,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lpq $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:74765: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -75157,7 +74785,7 @@ else fi echo $ac_n "checking for PQresultErrorField in -lpq""... $ac_c" 1>&6 -echo "configure:75161: checking for PQresultErrorField in -lpq" >&5 +echo "configure:74789: checking for PQresultErrorField in -lpq" >&5 ac_lib_var=`echo pq'_'PQresultErrorField | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -75165,7 +74793,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lpq $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:74808: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -75200,7 +74828,7 @@ else fi echo $ac_n "checking for PQsendQueryParams in -lpq""... $ac_c" 1>&6 -echo "configure:75204: checking for PQsendQueryParams in -lpq" >&5 +echo "configure:74832: checking for PQsendQueryParams in -lpq" >&5 ac_lib_var=`echo pq'_'PQsendQueryParams | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -75208,7 +74836,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lpq $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:74851: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -75243,7 +74871,7 @@ else fi echo $ac_n "checking for PQsendPrepare in -lpq""... $ac_c" 1>&6 -echo "configure:75247: checking for PQsendPrepare in -lpq" >&5 +echo "configure:74875: checking for PQsendPrepare in -lpq" >&5 ac_lib_var=`echo pq'_'PQsendPrepare | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -75251,7 +74879,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lpq $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:74894: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -75286,7 +74914,7 @@ else fi echo $ac_n "checking for PQsendQueryPrepared in -lpq""... $ac_c" 1>&6 -echo "configure:75290: checking for PQsendQueryPrepared in -lpq" >&5 +echo "configure:74918: checking for PQsendQueryPrepared in -lpq" >&5 ac_lib_var=`echo pq'_'PQsendQueryPrepared | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -75294,7 +74922,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lpq $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:74937: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -75329,7 +74957,7 @@ else fi echo $ac_n "checking for PQputCopyData in -lpq""... $ac_c" 1>&6 -echo "configure:75333: checking for PQputCopyData in -lpq" >&5 +echo "configure:74961: checking for PQputCopyData in -lpq" >&5 ac_lib_var=`echo pq'_'PQputCopyData | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -75337,7 +74965,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lpq $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:74980: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -75372,7 +75000,7 @@ else fi echo $ac_n "checking for PQputCopyEnd in -lpq""... $ac_c" 1>&6 -echo "configure:75376: checking for PQputCopyEnd in -lpq" >&5 +echo "configure:75004: checking for PQputCopyEnd in -lpq" >&5 ac_lib_var=`echo pq'_'PQputCopyEnd | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -75380,7 +75008,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lpq $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:75023: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -75415,7 +75043,7 @@ else fi echo $ac_n "checking for PQgetCopyData in -lpq""... $ac_c" 1>&6 -echo "configure:75419: checking for PQgetCopyData in -lpq" >&5 +echo "configure:75047: checking for PQgetCopyData in -lpq" >&5 ac_lib_var=`echo pq'_'PQgetCopyData | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -75423,7 +75051,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lpq $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:75066: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -75458,7 +75086,7 @@ else fi echo $ac_n "checking for PQfreemem in -lpq""... $ac_c" 1>&6 -echo "configure:75462: checking for PQfreemem in -lpq" >&5 +echo "configure:75090: checking for PQfreemem in -lpq" >&5 ac_lib_var=`echo pq'_'PQfreemem | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -75466,7 +75094,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lpq $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:75109: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -75501,7 +75129,7 @@ else fi echo $ac_n "checking for PQsetErrorVerbosity in -lpq""... $ac_c" 1>&6 -echo "configure:75505: checking for PQsetErrorVerbosity in -lpq" >&5 +echo "configure:75133: checking for PQsetErrorVerbosity in -lpq" >&5 ac_lib_var=`echo pq'_'PQsetErrorVerbosity | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -75509,7 +75137,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lpq $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:75152: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -75544,7 +75172,7 @@ else fi echo $ac_n "checking for PQftable in -lpq""... $ac_c" 1>&6 -echo "configure:75548: checking for PQftable in -lpq" >&5 +echo "configure:75176: checking for PQftable in -lpq" >&5 ac_lib_var=`echo pq'_'PQftable | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -75552,7 +75180,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lpq $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:75195: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -75587,7 +75215,7 @@ else fi echo $ac_n "checking for PQescapeStringConn in -lpq""... $ac_c" 1>&6 -echo "configure:75591: checking for PQescapeStringConn in -lpq" >&5 +echo "configure:75219: checking for PQescapeStringConn in -lpq" >&5 ac_lib_var=`echo pq'_'PQescapeStringConn | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -75595,7 +75223,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lpq $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:75238: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -75630,7 +75258,7 @@ else fi echo $ac_n "checking for PQescapeByteaConn in -lpq""... $ac_c" 1>&6 -echo "configure:75634: checking for PQescapeByteaConn in -lpq" >&5 +echo "configure:75262: checking for PQescapeByteaConn in -lpq" >&5 ac_lib_var=`echo pq'_'PQescapeByteaConn | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -75638,7 +75266,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lpq $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:75281: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -75673,7 +75301,7 @@ else fi echo $ac_n "checking for pg_encoding_to_char in -lpq""... $ac_c" 1>&6 -echo "configure:75677: checking for pg_encoding_to_char in -lpq" >&5 +echo "configure:75305: checking for pg_encoding_to_char in -lpq" >&5 ac_lib_var=`echo pq'_'pg_encoding_to_char | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -75681,7 +75309,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lpq $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:75324: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -75716,7 +75344,7 @@ else fi echo $ac_n "checking for lo_create in -lpq""... $ac_c" 1>&6 -echo "configure:75720: checking for lo_create in -lpq" >&5 +echo "configure:75348: checking for lo_create in -lpq" >&5 ac_lib_var=`echo pq'_'lo_create | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -75724,7 +75352,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lpq $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:75367: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -75759,7 +75387,7 @@ else fi echo $ac_n "checking for lo_import_with_oid in -lpq""... $ac_c" 1>&6 -echo "configure:75763: checking for lo_import_with_oid in -lpq" >&5 +echo "configure:75391: checking for lo_import_with_oid in -lpq" >&5 ac_lib_var=`echo pq'_'lo_import_with_oid | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -75767,7 +75395,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lpq $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:75410: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -76238,7 +75866,7 @@ fi php_enable_phar=yes echo $ac_n "checking for phar archive support""... $ac_c" 1>&6 -echo "configure:76242: checking for phar archive support" >&5 +echo "configure:75870: checking for phar archive support" >&5 # Check whether --enable-phar or --disable-phar was given. if test "${enable_phar+set}" = set; then enableval="$enable_phar" @@ -76575,7 +76203,7 @@ EOF fi echo $ac_n "checking for phar openssl support""... $ac_c" 1>&6 -echo "configure:76579: checking for phar openssl support" >&5 +echo "configure:76207: checking for phar openssl support" >&5 if test "$PHP_HASH_SHARED" != "yes"; then if test "$PHP_HASH" != "no"; then cat >> confdefs.h <<\EOF @@ -76650,7 +76278,7 @@ fi php_enable_posix=yes echo $ac_n "checking whether to enable POSIX-like functions""... $ac_c" 1>&6 -echo "configure:76654: checking whether to enable POSIX-like functions" >&5 +echo "configure:76282: checking whether to enable POSIX-like functions" >&5 # Check whether --enable-posix or --disable-posix was given. if test "${enable_posix+set}" = set; then enableval="$enable_posix" @@ -76995,17 +76623,17 @@ EOF do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:76999: checking for $ac_hdr" >&5 +echo "configure:76627: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:77009: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:76637: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -77035,12 +76663,12 @@ done for ac_func in seteuid setegid setsid getsid setpgid getpgid ctermid mkfifo mknod getrlimit getlogin getgroups makedev initgroups getpwuid_r getgrgid_r do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:77039: checking for $ac_func" >&5 +echo "configure:76667: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:76695: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -77089,14 +76717,14 @@ done echo $ac_n "checking for working ttyname_r() implementation""... $ac_c" 1>&6 -echo "configure:77093: checking for working ttyname_r() implementation" >&5 +echo "configure:76721: checking for working ttyname_r() implementation" >&5 if test "$cross_compiling" = yes; then echo "$ac_t""no, cannot detect working ttyname_r() when cross compiling. posix_ttyname() will be thread-unsafe" 1>&6 else cat > conftest.$ac_ext < @@ -77109,7 +76737,7 @@ int main(int argc, char *argv[]) } EOF -if { (eval echo configure:77113: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:76741: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then echo "$ac_t""yes" 1>&6 @@ -77131,13 +76759,13 @@ fi echo $ac_n "checking for utsname.domainname""... $ac_c" 1>&6 -echo "configure:77135: checking for utsname.domainname" >&5 +echo "configure:76763: checking for utsname.domainname" >&5 if eval "test \"`echo '$''{'ac_cv_have_utsname_domainname'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:76781: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_have_utsname_domainname=yes @@ -77180,7 +76808,7 @@ fi php_with_pspell=no echo $ac_n "checking for PSPELL support""... $ac_c" 1>&6 -echo "configure:77184: checking for PSPELL support" >&5 +echo "configure:76812: checking for PSPELL support" >&5 # Check whether --with-pspell or --without-pspell was given. if test "${with_pspell+set}" = set; then withval="$with_pspell" @@ -77733,7 +77361,7 @@ EOF done echo $ac_n "checking for new_aspell_config in -laspell""... $ac_c" 1>&6 -echo "configure:77737: checking for new_aspell_config in -laspell" >&5 +echo "configure:77365: checking for new_aspell_config in -laspell" >&5 ac_lib_var=`echo aspell'_'new_aspell_config | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -77741,7 +77369,7 @@ else ac_save_LIBS="$LIBS" LIBS="-laspell $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:77384: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -77926,7 +77554,7 @@ fi php_with_libedit=no echo $ac_n "checking for libedit readline replacement""... $ac_c" 1>&6 -echo "configure:77930: checking for libedit readline replacement" >&5 +echo "configure:77558: checking for libedit readline replacement" >&5 # Check whether --with-libedit or --without-libedit was given. if test "${with_libedit+set}" = set; then withval="$with_libedit" @@ -77974,7 +77602,7 @@ if test "$PHP_LIBEDIT" = "no"; then php_with_readline=no echo $ac_n "checking for readline support""... $ac_c" 1>&6 -echo "configure:77978: checking for readline support" >&5 +echo "configure:77606: checking for readline support" >&5 # Check whether --with-readline or --without-readline was given. if test "${with_readline+set}" = set; then withval="$with_readline" @@ -78063,7 +77691,7 @@ if test "$PHP_READLINE" && test "$PHP_READLINE" != "no"; then PHP_READLINE_LIBS="" echo $ac_n "checking for tgetent in -lncurses""... $ac_c" 1>&6 -echo "configure:78067: checking for tgetent in -lncurses" >&5 +echo "configure:77695: checking for tgetent in -lncurses" >&5 ac_lib_var=`echo ncurses'_'tgetent | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -78071,7 +77699,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lncurses $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:77714: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -78127,7 +77755,7 @@ else echo "$ac_t""no" 1>&6 echo $ac_n "checking for tgetent in -ltermcap""... $ac_c" 1>&6 -echo "configure:78131: checking for tgetent in -ltermcap" >&5 +echo "configure:77759: checking for tgetent in -ltermcap" >&5 ac_lib_var=`echo termcap'_'tgetent | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -78135,7 +77763,7 @@ else ac_save_LIBS="$LIBS" LIBS="-ltermcap $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:77778: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -78293,7 +77921,7 @@ fi done echo $ac_n "checking for readline in -lreadline""... $ac_c" 1>&6 -echo "configure:78297: checking for readline in -lreadline" >&5 +echo "configure:77925: checking for readline in -lreadline" >&5 ac_lib_var=`echo readline'_'readline | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -78301,7 +77929,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lreadline $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:77944: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -78541,7 +78169,7 @@ fi done echo $ac_n "checking for rl_pending_input in -lreadline""... $ac_c" 1>&6 -echo "configure:78545: checking for rl_pending_input in -lreadline" >&5 +echo "configure:78173: checking for rl_pending_input in -lreadline" >&5 ac_lib_var=`echo readline'_'rl_pending_input | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -78549,7 +78177,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lreadline $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:78192: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -78691,7 +78319,7 @@ fi done echo $ac_n "checking for rl_callback_read_char in -lreadline""... $ac_c" 1>&6 -echo "configure:78695: checking for rl_callback_read_char in -lreadline" >&5 +echo "configure:78323: checking for rl_callback_read_char in -lreadline" >&5 ac_lib_var=`echo readline'_'rl_callback_read_char | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -78699,7 +78327,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lreadline $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:78342: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -78754,7 +78382,7 @@ EOF elif test "$PHP_LIBEDIT" != "no"; then for i in $PHP_LIBEDIT /usr/local /usr; do - test -f $i/include/readline/readline.h && LIBEDIT_DIR=$i && break + test -f $i/include/editline/readline.h && LIBEDIT_DIR=$i && break done if test -z "$LIBEDIT_DIR"; then @@ -78794,7 +78422,7 @@ elif test "$PHP_LIBEDIT" != "no"; then echo $ac_n "checking for tgetent in -lncurses""... $ac_c" 1>&6 -echo "configure:78798: checking for tgetent in -lncurses" >&5 +echo "configure:78426: checking for tgetent in -lncurses" >&5 ac_lib_var=`echo ncurses'_'tgetent | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -78802,7 +78430,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lncurses $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:78445: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -78857,7 +78485,7 @@ else echo "$ac_t""no" 1>&6 echo $ac_n "checking for tgetent in -ltermcap""... $ac_c" 1>&6 -echo "configure:78861: checking for tgetent in -ltermcap" >&5 +echo "configure:78489: checking for tgetent in -ltermcap" >&5 ac_lib_var=`echo termcap'_'tgetent | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -78865,7 +78493,7 @@ else ac_save_LIBS="$LIBS" LIBS="-ltermcap $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:78508: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -79022,7 +78650,7 @@ fi done echo $ac_n "checking for readline in -ledit""... $ac_c" 1>&6 -echo "configure:79026: checking for readline in -ledit" >&5 +echo "configure:78654: checking for readline in -ledit" >&5 ac_lib_var=`echo edit'_'readline | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -79030,7 +78658,7 @@ else ac_save_LIBS="$LIBS" LIBS="-ledit $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:78673: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -79182,12 +78810,12 @@ if test "$PHP_READLINE" != "no" || test "$PHP_LIBEDIT" != "no"; then for ac_func in rl_completion_matches do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:79186: checking for $ac_func" >&5 +echo "configure:78814: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:78842: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -79536,7 +79164,7 @@ fi php_with_recode=no echo $ac_n "checking for recode support""... $ac_c" 1>&6 -echo "configure:79540: checking for recode support" >&5 +echo "configure:79168: checking for recode support" >&5 # Check whether --with-recode or --without-recode was given. if test "${with_recode+set}" = set; then withval="$with_recode" @@ -79703,7 +79331,7 @@ if test "$PHP_RECODE" != "no"; then done echo $ac_n "checking for recode_format_table in -lrecode""... $ac_c" 1>&6 -echo "configure:79707: checking for recode_format_table in -lrecode" >&5 +echo "configure:79335: checking for recode_format_table in -lrecode" >&5 ac_lib_var=`echo recode'_'recode_format_table | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -79711,7 +79339,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lrecode $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:79354: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -79852,7 +79480,7 @@ else LDFLAGS="$LDFLAGS -L$RECODE_DIR/$RECODE_LIB" LIBS="$LIBS -lrecode" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:79495: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* @@ -80026,17 +79654,17 @@ EOF do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:80030: checking for $ac_hdr" >&5 +echo "configure:79658: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:80040: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:79668: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -80659,7 +80287,7 @@ EOF php_enable_session=yes echo $ac_n "checking whether to enable PHP sessions""... $ac_c" 1>&6 -echo "configure:80663: checking whether to enable PHP sessions" >&5 +echo "configure:80291: checking whether to enable PHP sessions" >&5 # Check whether --enable-session or --disable-session was given. if test "${enable_session+set}" = set; then enableval="$enable_session" @@ -80706,7 +80334,7 @@ echo "$ac_t""$ext_output" 1>&6 php_with_mm=no echo $ac_n "checking for mm support""... $ac_c" 1>&6 -echo "configure:80710: checking for mm support" >&5 +echo "configure:80338: checking for mm support" >&5 # Check whether --with-mm or --without-mm was given. if test "${with_mm+set}" = set; then withval="$with_mm" @@ -80731,7 +80359,7 @@ echo "$ac_t""$ext_output" 1>&6 if test "$PHP_SESSION" != "no"; then echo $ac_n "checking whether pwrite works""... $ac_c" 1>&6 -echo "configure:80735: checking whether pwrite works" >&5 +echo "configure:80363: checking whether pwrite works" >&5 if eval "test \"`echo '$''{'ac_cv_pwrite'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -80743,7 +80371,7 @@ else else cat > conftest.$ac_ext < @@ -80764,7 +80392,7 @@ else EOF -if { (eval echo configure:80768: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:80396: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_pwrite=yes @@ -80789,7 +80417,7 @@ fi else cat > conftest.$ac_ext < @@ -80810,7 +80438,7 @@ ssize_t pwrite(int, void *, size_t, off64_t); EOF -if { (eval echo configure:80814: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:80442: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_pwrite=yes @@ -80851,7 +80479,7 @@ EOF echo $ac_n "checking whether pread works""... $ac_c" 1>&6 -echo "configure:80855: checking whether pread works" >&5 +echo "configure:80483: checking whether pread works" >&5 if eval "test \"`echo '$''{'ac_cv_pread'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -80864,7 +80492,7 @@ else else cat > conftest.$ac_ext < @@ -80884,7 +80512,7 @@ else } EOF -if { (eval echo configure:80888: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:80516: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_pread=yes @@ -80911,7 +80539,7 @@ fi else cat > conftest.$ac_ext < @@ -80931,7 +80559,7 @@ ssize_t pread(int, void *, size_t, off64_t); } EOF -if { (eval echo configure:80935: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:80563: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_pread=yes @@ -81476,7 +81104,7 @@ fi php_enable_shmop=no echo $ac_n "checking whether to enable shmop support""... $ac_c" 1>&6 -echo "configure:81480: checking whether to enable shmop support" >&5 +echo "configure:81108: checking whether to enable shmop support" >&5 # Check whether --enable-shmop or --disable-shmop was given. if test "${enable_shmop+set}" = set; then enableval="$enable_shmop" @@ -81823,7 +81451,7 @@ fi php_enable_simplexml=yes echo $ac_n "checking whether to enable SimpleXML support""... $ac_c" 1>&6 -echo "configure:81827: checking whether to enable SimpleXML support" >&5 +echo "configure:81455: checking whether to enable SimpleXML support" >&5 # Check whether --enable-simplexml or --disable-simplexml was given. if test "${enable_simplexml+set}" = set; then enableval="$enable_simplexml" @@ -81871,7 +81499,7 @@ if test -z "$PHP_LIBXML_DIR"; then php_with_libxml_dir=no echo $ac_n "checking libxml2 install dir""... $ac_c" 1>&6 -echo "configure:81875: checking libxml2 install dir" >&5 +echo "configure:81503: checking libxml2 install dir" >&5 # Check whether --with-libxml-dir or --without-libxml-dir was given. if test "${with_libxml_dir+set}" = set; then withval="$with_libxml_dir" @@ -81902,7 +81530,7 @@ if test "$PHP_SIMPLEXML" != "no"; then echo $ac_n "checking for xml2-config path""... $ac_c" 1>&6 -echo "configure:81906: checking for xml2-config path" >&5 +echo "configure:81534: checking for xml2-config path" >&5 if eval "test \"`echo '$''{'ac_cv_php_xml2_config_path'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -82060,7 +81688,7 @@ echo "$ac_t""$ac_cv_php_xml2_config_path" 1>&6 echo $ac_n "checking whether libxml build works""... $ac_c" 1>&6 -echo "configure:82064: checking whether libxml build works" >&5 +echo "configure:81692: checking whether libxml build works" >&5 if eval "test \"`echo '$''{'php_cv_libxml_build_works'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -82076,7 +81704,7 @@ else else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:81719: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then LIBS=$old_LIBS @@ -82475,7 +82103,7 @@ fi php_with_snmp=no echo $ac_n "checking for SNMP support""... $ac_c" 1>&6 -echo "configure:82479: checking for SNMP support" >&5 +echo "configure:82107: checking for SNMP support" >&5 # Check whether --with-snmp or --without-snmp was given. if test "${with_snmp+set}" = set; then withval="$with_snmp" @@ -82522,7 +82150,7 @@ echo "$ac_t""$ext_output" 1>&6 php_with_openssl_dir=no echo $ac_n "checking OpenSSL dir for SNMP""... $ac_c" 1>&6 -echo "configure:82526: checking OpenSSL dir for SNMP" >&5 +echo "configure:82154: checking OpenSSL dir for SNMP" >&5 # Check whether --with-openssl-dir or --without-openssl-dir was given. if test "${with_openssl_dir+set}" = set; then withval="$with_openssl_dir" @@ -82548,7 +82176,7 @@ echo "$ac_t""$ext_output" 1>&6 php_enable_ucd_snmp_hack=no echo $ac_n "checking whether to enable UCD SNMP hack""... $ac_c" 1>&6 -echo "configure:82552: checking whether to enable UCD SNMP hack" >&5 +echo "configure:82180: checking whether to enable UCD SNMP hack" >&5 # Check whether --enable-ucd-snmp-hack or --disable-ucd-snmp-hack was given. if test "${enable_ucd_snmp_hack+set}" = set; then enableval="$enable_ucd_snmp_hack" @@ -82576,7 +82204,7 @@ if test "$PHP_SNMP" != "no"; then # Extract the first word of "net-snmp-config", so it can be a program name with args. set dummy net-snmp-config; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:82580: checking for $ac_word" >&5 +echo "configure:82208: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_SNMP_CONFIG'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -82777,17 +82405,17 @@ EOF do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:82781: checking for $ac_hdr" >&5 +echo "configure:82409: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:82791: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:82419: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -82815,9 +82443,9 @@ done if test "$ac_cv_header_default_store_h" = "yes"; then echo $ac_n "checking for OpenSSL support in SNMP libraries""... $ac_c" 1>&6 -echo "configure:82819: checking for OpenSSL support in SNMP libraries" >&5 +echo "configure:82447: checking for OpenSSL support in SNMP libraries" >&5 cat > conftest.$ac_ext < @@ -82872,7 +82500,7 @@ rm -f conftest* # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:82876: checking for $ac_word" >&5 +echo "configure:82504: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_PKG_CONFIG'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -83077,9 +82705,9 @@ fi old_CPPFLAGS=$CPPFLAGS CPPFLAGS=-I$OPENSSL_INCDIR echo $ac_n "checking for OpenSSL version""... $ac_c" 1>&6 -echo "configure:83081: checking for OpenSSL version" >&5 +echo "configure:82709: checking for OpenSSL version" >&5 cat > conftest.$ac_ext < @@ -83234,7 +82862,7 @@ rm -f conftest* done echo $ac_n "checking for CRYPTO_free in -lcrypto""... $ac_c" 1>&6 -echo "configure:83238: checking for CRYPTO_free in -lcrypto" >&5 +echo "configure:82866: checking for CRYPTO_free in -lcrypto" >&5 ac_lib_var=`echo crypto'_'CRYPTO_free | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -83242,7 +82870,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lcrypto $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:82885: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -83410,7 +83038,7 @@ fi done echo $ac_n "checking for SSL_CTX_set_ssl_version in -lssl""... $ac_c" 1>&6 -echo "configure:83414: checking for SSL_CTX_set_ssl_version in -lssl" >&5 +echo "configure:83042: checking for SSL_CTX_set_ssl_version in -lssl" >&5 ac_lib_var=`echo ssl'_'SSL_CTX_set_ssl_version | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -83418,7 +83046,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lssl $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:83061: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -83542,7 +83170,7 @@ else fi echo $ac_n "checking for kstat_read in -lkstat""... $ac_c" 1>&6 -echo "configure:83546: checking for kstat_read in -lkstat" >&5 +echo "configure:83174: checking for kstat_read in -lkstat" >&5 ac_lib_var=`echo kstat'_'kstat_read | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -83550,7 +83178,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lkstat $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:83193: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -83832,7 +83460,7 @@ fi done echo $ac_n "checking for snmp_parse_oid in -l$SNMP_LIBNAME""... $ac_c" 1>&6 -echo "configure:83836: checking for snmp_parse_oid in -l$SNMP_LIBNAME" >&5 +echo "configure:83464: checking for snmp_parse_oid in -l$SNMP_LIBNAME" >&5 ac_lib_var=`echo $SNMP_LIBNAME'_'snmp_parse_oid | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -83840,7 +83468,7 @@ else ac_save_LIBS="$LIBS" LIBS="-l$SNMP_LIBNAME $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:83483: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -83985,7 +83613,7 @@ fi done echo $ac_n "checking for init_snmp in -l$SNMP_LIBNAME""... $ac_c" 1>&6 -echo "configure:83989: checking for init_snmp in -l$SNMP_LIBNAME" >&5 +echo "configure:83617: checking for init_snmp in -l$SNMP_LIBNAME" >&5 ac_lib_var=`echo $SNMP_LIBNAME'_'init_snmp | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -83993,7 +83621,7 @@ else ac_save_LIBS="$LIBS" LIBS="-l$SNMP_LIBNAME $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:83636: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -84351,7 +83979,7 @@ fi php_enable_soap=no echo $ac_n "checking whether to enable SOAP support""... $ac_c" 1>&6 -echo "configure:84355: checking whether to enable SOAP support" >&5 +echo "configure:83983: checking whether to enable SOAP support" >&5 # Check whether --enable-soap or --disable-soap was given. if test "${enable_soap+set}" = set; then enableval="$enable_soap" @@ -84399,7 +84027,7 @@ if test -z "$PHP_LIBXML_DIR"; then php_with_libxml_dir=no echo $ac_n "checking libxml2 install dir""... $ac_c" 1>&6 -echo "configure:84403: checking libxml2 install dir" >&5 +echo "configure:84031: checking libxml2 install dir" >&5 # Check whether --with-libxml-dir or --without-libxml-dir was given. if test "${with_libxml_dir+set}" = set; then withval="$with_libxml_dir" @@ -84430,7 +84058,7 @@ if test "$PHP_SOAP" != "no"; then echo $ac_n "checking for xml2-config path""... $ac_c" 1>&6 -echo "configure:84434: checking for xml2-config path" >&5 +echo "configure:84062: checking for xml2-config path" >&5 if eval "test \"`echo '$''{'ac_cv_php_xml2_config_path'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -84588,7 +84216,7 @@ echo "$ac_t""$ac_cv_php_xml2_config_path" 1>&6 echo $ac_n "checking whether libxml build works""... $ac_c" 1>&6 -echo "configure:84592: checking whether libxml build works" >&5 +echo "configure:84220: checking whether libxml build works" >&5 if eval "test \"`echo '$''{'php_cv_libxml_build_works'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -84604,7 +84232,7 @@ else else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:84247: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then LIBS=$old_LIBS @@ -84965,7 +84593,7 @@ fi php_enable_sockets=no echo $ac_n "checking whether to enable sockets support""... $ac_c" 1>&6 -echo "configure:84969: checking whether to enable sockets support" >&5 +echo "configure:84597: checking whether to enable sockets support" >&5 # Check whether --enable-sockets or --disable-sockets was given. if test "${enable_sockets+set}" = set; then enableval="$enable_sockets" @@ -85010,13 +84638,13 @@ echo "$ac_t""$ext_output" 1>&6 if test "$PHP_SOCKETS" != "no"; then echo $ac_n "checking for struct cmsghdr""... $ac_c" 1>&6 -echo "configure:85014: checking for struct cmsghdr" >&5 +echo "configure:84642: checking for struct cmsghdr" >&5 if eval "test \"`echo '$''{'ac_cv_cmsghdr'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < @@ -85025,7 +84653,7 @@ int main() { struct cmsghdr s; s ; return 0; } EOF -if { (eval echo configure:85029: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:84657: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_cmsghdr=yes else @@ -85050,12 +84678,12 @@ EOF for ac_func in hstrerror socketpair do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:85054: checking for $ac_func" >&5 +echo "configure:84682: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:84710: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -85106,17 +84734,17 @@ done do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:85110: checking for $ac_hdr" >&5 +echo "configure:84738: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:85120: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:84748: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -85143,7 +84771,7 @@ fi done cat > conftest.$ac_ext < @@ -85153,7 +84781,7 @@ int main() { static struct msghdr tp; int n = (int) tp.msg_flags; return n ; return 0; } EOF -if { (eval echo configure:85157: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:84785: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then : else echo "configure: failed program was:" >&5 @@ -85463,11 +85091,31 @@ EOF fi + + + header_path=ext/sockets/ + for header_file in php_sockets.h; do + hp_hf="$header_path/$header_file" + + + unique=`echo $hp_hf|$SED 's/[^a-zA-Z0-9]/_/g'` + + cmd="echo $ac_n \"\$INSTALLHEADERS$unique$ac_c\"" + if test -n "$unique" && test "`eval $cmd`" = "" ; then + eval "INSTALLHEADERS$unique=set" + + INSTALL_HEADERS="$INSTALL_HEADERS $hp_hf" + + fi + + done + + fi echo $ac_n "checking whether zend_object_value is packed""... $ac_c" 1>&6 -echo "configure:85471: checking whether zend_object_value is packed" >&5 +echo "configure:85119: checking whether zend_object_value is packed" >&5 old_CPPFLAGS=$CPPFLAGS CPPFLAGS="$INCLUDES -I$abs_srcdir $CPPFLAGS" if test "$cross_compiling" = yes; then @@ -85477,7 +85125,7 @@ echo "configure:85471: checking whether zend_object_value is packed" >&5 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:85138: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_result=1 @@ -85850,7 +85498,7 @@ but you've either not enabled pcre, or have disabled it. php_with_sqlite=yes echo $ac_n "checking for sqlite support""... $ac_c" 1>&6 -echo "configure:85854: checking for sqlite support" >&5 +echo "configure:85502: checking for sqlite support" >&5 # Check whether --with-sqlite or --without-sqlite was given. if test "${with_sqlite+set}" = set; then withval="$with_sqlite" @@ -85897,7 +85545,7 @@ echo "$ac_t""$ext_output" 1>&6 php_enable_sqlite_utf8=no echo $ac_n "checking whether to enable UTF-8 support in sqlite (default: ISO-8859-1)""... $ac_c" 1>&6 -echo "configure:85901: checking whether to enable UTF-8 support in sqlite (default: ISO-8859-1)" >&5 +echo "configure:85549: checking whether to enable UTF-8 support in sqlite (default: ISO-8859-1)" >&5 # Check whether --enable-sqlite-utf8 or --disable-sqlite-utf8 was given. if test "${enable_sqlite_utf8+set}" = set; then enableval="$enable_sqlite_utf8" @@ -85928,13 +85576,13 @@ if test "$PHP_SQLITE" != "no"; then if test "$PHP_PDO" != "no"; then echo $ac_n "checking for PDO includes""... $ac_c" 1>&6 -echo "configure:85932: checking for PDO includes" >&5 +echo "configure:85580: checking for PDO includes" >&5 if eval "test \"`echo '$''{'pdo_inc_path'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else echo $ac_n "checking for PDO includes""... $ac_c" 1>&6 -echo "configure:85938: checking for PDO includes" >&5 +echo "configure:85586: checking for PDO includes" >&5 if test -f $abs_srcdir/include/php/ext/pdo/php_pdo_driver.h; then pdo_inc_path=$abs_srcdir/ext elif test -f $abs_srcdir/ext/pdo/php_pdo_driver.h; then @@ -85968,7 +85616,7 @@ EOF SQLITE_DIR=$PHP_SQLITE else # search default path list echo $ac_n "checking for sqlite files in default path""... $ac_c" 1>&6 -echo "configure:85972: checking for sqlite files in default path" >&5 +echo "configure:85620: checking for sqlite files in default path" >&5 for i in $SEARCH_PATH ; do if test -r $i/$SEARCH_FOR; then SQLITE_DIR=$i @@ -86080,7 +85728,7 @@ echo "configure:85972: checking for sqlite files in default path" >&5 done echo $ac_n "checking for sqlite_open in -lsqlite""... $ac_c" 1>&6 -echo "configure:86084: checking for sqlite_open in -lsqlite" >&5 +echo "configure:85732: checking for sqlite_open in -lsqlite" >&5 ac_lib_var=`echo sqlite'_'sqlite_open | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -86088,7 +85736,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lsqlite $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:85751: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -86272,7 +85920,7 @@ fi # Extract the first word of "lemon", so it can be a program name with args. set dummy lemon; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:86276: checking for $ac_word" >&5 +echo "configure:85924: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_LEMON'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -86300,7 +85948,7 @@ fi if test "$LEMON"; then echo $ac_n "checking for lemon version""... $ac_c" 1>&6 -echo "configure:86304: checking for lemon version" >&5 +echo "configure:85952: checking for lemon version" >&5 if eval "test \"`echo '$''{'php_cv_lemon_version'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -86713,7 +86361,7 @@ but you've either not enabled pdo, or have disabled it. echo $ac_n "checking size of char *""... $ac_c" 1>&6 -echo "configure:86717: checking size of char *" >&5 +echo "configure:86365: checking size of char *" >&5 if eval "test \"`echo '$''{'ac_cv_sizeof_char_p'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -86721,7 +86369,7 @@ else ac_cv_sizeof_char_p=4 else cat > conftest.$ac_ext < int main() @@ -86732,7 +86380,7 @@ int main() return(0); } EOF -if { (eval echo configure:86736: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:86384: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_sizeof_char_p=`cat conftestval` else @@ -86794,12 +86442,12 @@ EOF for ac_func in usleep nanosleep do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:86798: checking for $ac_func" >&5 +echo "configure:86446: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:86474: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -86850,17 +86498,17 @@ done do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:86854: checking for $ac_hdr" >&5 +echo "configure:86502: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:86864: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:86512: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -86891,7 +86539,7 @@ fi echo $ac_n "checking whether flush should be called explicitly after a buffered io""... $ac_c" 1>&6 -echo "configure:86895: checking whether flush should be called explicitly after a buffered io" >&5 +echo "configure:86543: checking whether flush should be called explicitly after a buffered io" >&5 if eval "test \"`echo '$''{'ac_cv_flush_io'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -86902,7 +86550,7 @@ if test "$cross_compiling" = yes; then else cat > conftest.$ac_ext < @@ -86940,7 +86588,7 @@ int main(int argc, char **argv) } EOF -if { (eval echo configure:86944: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:86592: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_flush_io=no @@ -86968,7 +86616,7 @@ fi if test "$ac_cv_func_crypt" = "no"; then echo $ac_n "checking for crypt in -lcrypt""... $ac_c" 1>&6 -echo "configure:86972: checking for crypt in -lcrypt" >&5 +echo "configure:86620: checking for crypt in -lcrypt" >&5 ac_lib_var=`echo crypt'_'crypt | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -86976,7 +86624,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lcrypt $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:86639: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -87016,7 +86664,7 @@ fi fi echo $ac_n "checking for standard DES crypt""... $ac_c" 1>&6 -echo "configure:87020: checking for standard DES crypt" >&5 +echo "configure:86668: checking for standard DES crypt" >&5 if eval "test \"`echo '$''{'ac_cv_crypt_des'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -87027,7 +86675,7 @@ else else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:86698: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_crypt_des=yes @@ -87067,7 +86715,7 @@ fi echo "$ac_t""$ac_cv_crypt_des" 1>&6 echo $ac_n "checking for extended DES crypt""... $ac_c" 1>&6 -echo "configure:87071: checking for extended DES crypt" >&5 +echo "configure:86719: checking for extended DES crypt" >&5 if eval "test \"`echo '$''{'ac_cv_crypt_ext_des'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -87078,7 +86726,7 @@ else else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:86749: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_crypt_ext_des=yes @@ -87118,7 +86766,7 @@ fi echo "$ac_t""$ac_cv_crypt_ext_des" 1>&6 echo $ac_n "checking for MD5 crypt""... $ac_c" 1>&6 -echo "configure:87122: checking for MD5 crypt" >&5 +echo "configure:86770: checking for MD5 crypt" >&5 if eval "test \"`echo '$''{'ac_cv_crypt_md5'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -87129,7 +86777,7 @@ if test "$cross_compiling" = yes; then else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:86809: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_crypt_md5=yes @@ -87178,7 +86826,7 @@ fi echo "$ac_t""$ac_cv_crypt_md5" 1>&6 echo $ac_n "checking for Blowfish crypt""... $ac_c" 1>&6 -echo "configure:87182: checking for Blowfish crypt" >&5 +echo "configure:86830: checking for Blowfish crypt" >&5 if eval "test \"`echo '$''{'ac_cv_crypt_blowfish'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -87189,7 +86837,7 @@ if test "$cross_compiling" = yes; then else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:86866: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_crypt_blowfish=yes @@ -87234,7 +86882,204 @@ fi echo "$ac_t""$ac_cv_crypt_blowfish" 1>&6 +echo $ac_n "checking for SHA512 crypt""... $ac_c" 1>&6 +echo "configure:86887: checking for SHA512 crypt" >&5 +if eval "test \"`echo '$''{'ac_cv_crypt_SHA512'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + +if test "$cross_compiling" = yes; then + + ac_cv_crypt_SHA512=no + +else + cat > conftest.$ac_ext < +#endif + +#if HAVE_CRYPT_H +#include +#endif + +main() { +#if HAVE_CRYPT + char salt[30], answer[80]; + + salt[0]='$'; salt[1]='6'; salt[2]='$'; salt[3]='$'; salt[4]='b'; salt[5]='a'; salt[6]='r'; salt[7]='\0'; + strcpy(answer, salt); + strcpy(&answer[29],"$6$$QMXjqd7rHQZPQ1yHsXkQqC1FBzDiVfTHXL.LaeDAeVV.IzMaV9VU4MQ8kPuZa2SOP1A0RPm772EaFYjpEJtdu."); + exit (strcmp((char *)crypt("foo",salt),answer)); +#else + exit(0); +#endif +} +EOF +if { (eval echo configure:86922: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +then + + ac_cv_crypt_SHA512=yes + +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* + + ac_cv_crypt_SHA512=no + +fi +rm -fr conftest* +fi + +fi + +echo "$ac_t""$ac_cv_crypt_SHA512" 1>&6 + +echo $ac_n "checking for SHA256 crypt""... $ac_c" 1>&6 +echo "configure:86943: checking for SHA256 crypt" >&5 +if eval "test \"`echo '$''{'ac_cv_crypt_SHA256'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + +if test "$cross_compiling" = yes; then + + ac_cv_crypt_SHA256=no + +else + cat > conftest.$ac_ext < +#endif + +#if HAVE_CRYPT_H +#include +#endif + +main() { +#if HAVE_CRYPT + char salt[30], answer[80]; + salt[0]='$'; salt[1]='5'; salt[2]='$'; salt[3]='$'; salt[4]='s'; salt[5]='a'; salt[6]='l'; salt[7]='t'; salt[8]='s'; salt[9]='t'; salt[10]='r'; salt[11]='i'; salt[12]='n'; salt[13]='g'; salt[14]='\0'; + strcat(salt,""); + strcpy(answer, salt); + strcpy(&answer[29], "$5$saltstring$5B8vYYiY.CVt1RlTTf8KbXBH3hsxY/GNooZaBBGWEc5"); + exit (strcmp((char *)crypt("foo",salt),answer)); +#else + exit(0); +#endif +} +EOF +if { (eval echo configure:86978: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +then + + ac_cv_crypt_SHA256=yes + +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* + + ac_cv_crypt_SHA256=no + +fi +rm -fr conftest* +fi + +fi + +echo "$ac_t""$ac_cv_crypt_SHA256" 1>&6 + + if test "$ac_cv_crypt_blowfish" = "no" || test "$ac_cv_crypt_des" = "no" || test "$ac_cv_crypt_ext_des" = "no" || test "x$php_crypt_r" = "x0"; then + + echo $ac_n "checking whether the compiler supports __alignof__""... $ac_c" 1>&6 +echo "configure:87002: checking whether the compiler supports __alignof__" >&5 +if eval "test \"`echo '$''{'ac_cv_alignof_exists'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + + cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + + ac_cv_alignof_exists=yes + +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + + ac_cv_alignof_exists=no + +fi +rm -f conftest* +fi + +echo "$ac_t""$ac_cv_alignof_exists" 1>&6 + if test "$ac_cv_alignof_exists" = "yes"; then + cat >> confdefs.h <<\EOF +#define HAVE_ALIGNOF 1 +EOF + + fi + + echo $ac_n "checking whether the compiler supports aligned attribute""... $ac_c" 1>&6 +echo "configure:87043: checking whether the compiler supports aligned attribute" >&5 +if eval "test \"`echo '$''{'ac_cv_attribute_aligned'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + + cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + + ac_cv_attribute_aligned=yes + +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + + ac_cv_attribute_aligned=no + +fi +rm -f conftest* +fi + +echo "$ac_t""$ac_cv_attribute_aligned" 1>&6 + if test "$ac_cv_attribute_aligned" = "yes"; then + cat >> confdefs.h <<\EOF +#define HAVE_ATTRIBUTE_ALIGNED 1 +EOF + + fi + + cat >> confdefs.h <> confdefs.h <> confdefs.h <> confdefs.h <&6 -echo "configure:87349: checking for $ac_func" >&5 -if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -/* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func(); - -int main() { -/* 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_$ac_func) || defined (__stub___$ac_func) -choke me -#else -$ac_func(); -#endif - -; return 0; } -EOF -if { (eval echo configure:87377: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_func_$ac_func=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_func_$ac_func=no" -fi -rm -f conftest* -fi - -if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` + if test "$ac_cv_crypt_sha256" = "yes"; then + ac_result=1 + ac_crypt_sha256=1 + else + ac_result=0 + ac_crypt_sha256=0 + fi cat >> confdefs.h <&6 -fi -done -echo $ac_n "checking for working fnmatch""... $ac_c" 1>&6 -echo "configure:87402: checking for working fnmatch" >&5 -if eval "test \"`echo '$''{'ac_cv_func_fnmatch_works'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - # Some versions of Solaris or SCO have a broken fnmatch function. -# So we run a test program. If we are cross-compiling, take no chance. -# Thanks to John Oleynick and Franc,ois Pinard for this test. -if test "$cross_compiling" = yes; then - ac_cv_func_fnmatch_works=no -else - cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null -then - ac_cv_func_fnmatch_works=yes -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -fr conftest* - ac_cv_func_fnmatch_works=no -fi -rm -fr conftest* -fi - -fi -echo "$ac_t""$ac_cv_func_fnmatch_works" 1>&6 -if test $ac_cv_func_fnmatch_works = yes; then - cat >> confdefs.h <<\EOF -#define HAVE_FNMATCH 1 + cat >> confdefs.h <&6 -else - -for ac_func in fork CreateProcess +for ac_func in getcwd getwd asinh acosh atanh log1p hypot glob strfmon nice fpclass isinf isnan mempcpy strpncpy do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:87448: checking for $ac_func" >&5 +echo "configure:87226: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:87254: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_$ac_func=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_$ac_func=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` + cat >> confdefs.h <&6 +fi +done + +echo $ac_n "checking for working fnmatch""... $ac_c" 1>&6 +echo "configure:87279: checking for working fnmatch" >&5 +if eval "test \"`echo '$''{'ac_cv_func_fnmatch_works'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + # Some versions of Solaris or SCO have a broken fnmatch function. +# So we run a test program. If we are cross-compiling, take no chance. +# Thanks to John Oleynick and Franc,ois Pinard for this test. +if test "$cross_compiling" = yes; then + ac_cv_func_fnmatch_works=no +else + cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +then + ac_cv_func_fnmatch_works=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* + ac_cv_func_fnmatch_works=no +fi +rm -fr conftest* +fi + +fi + +echo "$ac_t""$ac_cv_func_fnmatch_works" 1>&6 +if test $ac_cv_func_fnmatch_works = yes; then + cat >> confdefs.h <<\EOF +#define HAVE_FNMATCH 1 +EOF + +fi + + + +for ac_func in fork CreateProcess +do +echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 +echo "configure:87321: checking for $ac_func" >&5 +if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func(); + +int main() { + +/* 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_$ac_func) || defined (__stub___$ac_func) +choke me +#else +$ac_func(); +#endif + +; return 0; } +EOF +if { (eval echo configure:87349: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -87501,10 +87374,8 @@ php_can_support_proc_open=no fi done -fi - echo $ac_n "checking if your OS can spawn processes with inherited handles""... $ac_c" 1>&6 -echo "configure:87508: checking if your OS can spawn processes with inherited handles" >&5 +echo "configure:87379: checking if your OS can spawn processes with inherited handles" >&5 if test "$php_can_support_proc_open" = "yes"; then echo "$ac_t""yes" 1>&6 cat >> confdefs.h <<\EOF @@ -87528,12 +87399,12 @@ fi unset found echo $ac_n "checking for res_nsearch""... $ac_c" 1>&6 -echo "configure:87532: checking for res_nsearch" >&5 +echo "configure:87403: checking for res_nsearch" >&5 if eval "test \"`echo '$''{'ac_cv_func_res_nsearch'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:87431: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_res_nsearch=yes" else @@ -87574,12 +87445,12 @@ if eval "test \"`echo '$ac_cv_func_'res_nsearch`\" = yes"; then else echo "$ac_t""no" 1>&6 echo $ac_n "checking for __res_nsearch""... $ac_c" 1>&6 -echo "configure:87578: checking for __res_nsearch" >&5 +echo "configure:87449: checking for __res_nsearch" >&5 if eval "test \"`echo '$''{'ac_cv_func___res_nsearch'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:87477: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func___res_nsearch=yes" else @@ -87640,7 +87511,7 @@ EOF unset ac_cv_lib_resolv___res_nsearch unset found echo $ac_n "checking for res_nsearch in -lresolv""... $ac_c" 1>&6 -echo "configure:87644: checking for res_nsearch in -lresolv" >&5 +echo "configure:87515: checking for res_nsearch in -lresolv" >&5 ac_lib_var=`echo resolv'_'res_nsearch | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -87648,7 +87519,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lresolv $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:87534: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -87679,7 +87550,7 @@ else echo "$ac_t""no" 1>&6 echo $ac_n "checking for __res_nsearch in -lresolv""... $ac_c" 1>&6 -echo "configure:87683: checking for __res_nsearch in -lresolv" >&5 +echo "configure:87554: checking for __res_nsearch in -lresolv" >&5 ac_lib_var=`echo resolv'_'__res_nsearch | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -87687,7 +87558,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lresolv $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:87573: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -87730,11 +87601,11 @@ fi found=no else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:87609: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then found=yes else @@ -87776,7 +87647,7 @@ EOF unset ac_cv_lib_bind___res_nsearch unset found echo $ac_n "checking for res_nsearch in -lbind""... $ac_c" 1>&6 -echo "configure:87780: checking for res_nsearch in -lbind" >&5 +echo "configure:87651: checking for res_nsearch in -lbind" >&5 ac_lib_var=`echo bind'_'res_nsearch | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -87784,7 +87655,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lbind $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:87670: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -87815,7 +87686,7 @@ else echo "$ac_t""no" 1>&6 echo $ac_n "checking for __res_nsearch in -lbind""... $ac_c" 1>&6 -echo "configure:87819: checking for __res_nsearch in -lbind" >&5 +echo "configure:87690: checking for __res_nsearch in -lbind" >&5 ac_lib_var=`echo bind'_'__res_nsearch | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -87823,7 +87694,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lbind $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:87709: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -87866,11 +87737,11 @@ fi found=no else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:87745: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then found=yes else @@ -87912,7 +87783,7 @@ EOF unset ac_cv_lib_socket___res_nsearch unset found echo $ac_n "checking for res_nsearch in -lsocket""... $ac_c" 1>&6 -echo "configure:87916: checking for res_nsearch in -lsocket" >&5 +echo "configure:87787: checking for res_nsearch in -lsocket" >&5 ac_lib_var=`echo socket'_'res_nsearch | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -87920,7 +87791,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lsocket $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:87806: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -87951,7 +87822,7 @@ else echo "$ac_t""no" 1>&6 echo $ac_n "checking for __res_nsearch in -lsocket""... $ac_c" 1>&6 -echo "configure:87955: checking for __res_nsearch in -lsocket" >&5 +echo "configure:87826: checking for __res_nsearch in -lsocket" >&5 ac_lib_var=`echo socket'_'__res_nsearch | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -87959,7 +87830,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lsocket $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:87845: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -88002,11 +87873,11 @@ fi found=no else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:87881: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then found=yes else @@ -88063,12 +87934,12 @@ EOF unset found echo $ac_n "checking for dns_search""... $ac_c" 1>&6 -echo "configure:88067: checking for dns_search" >&5 +echo "configure:87938: checking for dns_search" >&5 if eval "test \"`echo '$''{'ac_cv_func_dns_search'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:87966: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_dns_search=yes" else @@ -88109,12 +87980,12 @@ if eval "test \"`echo '$ac_cv_func_'dns_search`\" = yes"; then else echo "$ac_t""no" 1>&6 echo $ac_n "checking for __dns_search""... $ac_c" 1>&6 -echo "configure:88113: checking for __dns_search" >&5 +echo "configure:87984: checking for __dns_search" >&5 if eval "test \"`echo '$''{'ac_cv_func___dns_search'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:88012: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func___dns_search=yes" else @@ -88175,7 +88046,7 @@ EOF unset ac_cv_lib_resolv___dns_search unset found echo $ac_n "checking for dns_search in -lresolv""... $ac_c" 1>&6 -echo "configure:88179: checking for dns_search in -lresolv" >&5 +echo "configure:88050: checking for dns_search in -lresolv" >&5 ac_lib_var=`echo resolv'_'dns_search | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -88183,7 +88054,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lresolv $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:88069: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -88214,7 +88085,7 @@ else echo "$ac_t""no" 1>&6 echo $ac_n "checking for __dns_search in -lresolv""... $ac_c" 1>&6 -echo "configure:88218: checking for __dns_search in -lresolv" >&5 +echo "configure:88089: checking for __dns_search in -lresolv" >&5 ac_lib_var=`echo resolv'_'__dns_search | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -88222,7 +88093,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lresolv $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:88108: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -88265,11 +88136,11 @@ fi found=no else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:88144: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then found=yes else @@ -88311,7 +88182,7 @@ EOF unset ac_cv_lib_bind___dns_search unset found echo $ac_n "checking for dns_search in -lbind""... $ac_c" 1>&6 -echo "configure:88315: checking for dns_search in -lbind" >&5 +echo "configure:88186: checking for dns_search in -lbind" >&5 ac_lib_var=`echo bind'_'dns_search | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -88319,7 +88190,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lbind $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:88205: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -88350,7 +88221,7 @@ else echo "$ac_t""no" 1>&6 echo $ac_n "checking for __dns_search in -lbind""... $ac_c" 1>&6 -echo "configure:88354: checking for __dns_search in -lbind" >&5 +echo "configure:88225: checking for __dns_search in -lbind" >&5 ac_lib_var=`echo bind'_'__dns_search | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -88358,7 +88229,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lbind $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:88244: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -88401,11 +88272,11 @@ fi found=no else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:88280: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then found=yes else @@ -88447,7 +88318,7 @@ EOF unset ac_cv_lib_socket___dns_search unset found echo $ac_n "checking for dns_search in -lsocket""... $ac_c" 1>&6 -echo "configure:88451: checking for dns_search in -lsocket" >&5 +echo "configure:88322: checking for dns_search in -lsocket" >&5 ac_lib_var=`echo socket'_'dns_search | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -88455,7 +88326,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lsocket $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:88341: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -88486,7 +88357,7 @@ else echo "$ac_t""no" 1>&6 echo $ac_n "checking for __dns_search in -lsocket""... $ac_c" 1>&6 -echo "configure:88490: checking for __dns_search in -lsocket" >&5 +echo "configure:88361: checking for __dns_search in -lsocket" >&5 ac_lib_var=`echo socket'_'__dns_search | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -88494,7 +88365,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lsocket $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:88380: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -88537,11 +88408,11 @@ fi found=no else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:88416: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then found=yes else @@ -88598,12 +88469,12 @@ EOF unset found echo $ac_n "checking for dn_expand""... $ac_c" 1>&6 -echo "configure:88602: checking for dn_expand" >&5 +echo "configure:88473: checking for dn_expand" >&5 if eval "test \"`echo '$''{'ac_cv_func_dn_expand'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:88501: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_dn_expand=yes" else @@ -88644,12 +88515,12 @@ if eval "test \"`echo '$ac_cv_func_'dn_expand`\" = yes"; then else echo "$ac_t""no" 1>&6 echo $ac_n "checking for __dn_expand""... $ac_c" 1>&6 -echo "configure:88648: checking for __dn_expand" >&5 +echo "configure:88519: checking for __dn_expand" >&5 if eval "test \"`echo '$''{'ac_cv_func___dn_expand'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:88547: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func___dn_expand=yes" else @@ -88710,7 +88581,7 @@ EOF unset ac_cv_lib_resolv___dn_expand unset found echo $ac_n "checking for dn_expand in -lresolv""... $ac_c" 1>&6 -echo "configure:88714: checking for dn_expand in -lresolv" >&5 +echo "configure:88585: checking for dn_expand in -lresolv" >&5 ac_lib_var=`echo resolv'_'dn_expand | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -88718,7 +88589,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lresolv $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:88604: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -88749,7 +88620,7 @@ else echo "$ac_t""no" 1>&6 echo $ac_n "checking for __dn_expand in -lresolv""... $ac_c" 1>&6 -echo "configure:88753: checking for __dn_expand in -lresolv" >&5 +echo "configure:88624: checking for __dn_expand in -lresolv" >&5 ac_lib_var=`echo resolv'_'__dn_expand | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -88757,7 +88628,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lresolv $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:88643: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -88800,11 +88671,11 @@ fi found=no else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:88679: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then found=yes else @@ -88846,7 +88717,7 @@ EOF unset ac_cv_lib_bind___dn_expand unset found echo $ac_n "checking for dn_expand in -lbind""... $ac_c" 1>&6 -echo "configure:88850: checking for dn_expand in -lbind" >&5 +echo "configure:88721: checking for dn_expand in -lbind" >&5 ac_lib_var=`echo bind'_'dn_expand | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -88854,7 +88725,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lbind $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:88740: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -88885,7 +88756,7 @@ else echo "$ac_t""no" 1>&6 echo $ac_n "checking for __dn_expand in -lbind""... $ac_c" 1>&6 -echo "configure:88889: checking for __dn_expand in -lbind" >&5 +echo "configure:88760: checking for __dn_expand in -lbind" >&5 ac_lib_var=`echo bind'_'__dn_expand | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -88893,7 +88764,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lbind $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:88779: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -88936,11 +88807,11 @@ fi found=no else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:88815: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then found=yes else @@ -88982,7 +88853,7 @@ EOF unset ac_cv_lib_socket___dn_expand unset found echo $ac_n "checking for dn_expand in -lsocket""... $ac_c" 1>&6 -echo "configure:88986: checking for dn_expand in -lsocket" >&5 +echo "configure:88857: checking for dn_expand in -lsocket" >&5 ac_lib_var=`echo socket'_'dn_expand | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -88990,7 +88861,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lsocket $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:88876: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -89021,7 +88892,7 @@ else echo "$ac_t""no" 1>&6 echo $ac_n "checking for __dn_expand in -lsocket""... $ac_c" 1>&6 -echo "configure:89025: checking for __dn_expand in -lsocket" >&5 +echo "configure:88896: checking for __dn_expand in -lsocket" >&5 ac_lib_var=`echo socket'_'__dn_expand | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -89029,7 +88900,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lsocket $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:88915: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -89072,11 +88943,11 @@ fi found=no else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:88951: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then found=yes else @@ -89133,12 +89004,12 @@ EOF unset found echo $ac_n "checking for dn_skipname""... $ac_c" 1>&6 -echo "configure:89137: checking for dn_skipname" >&5 +echo "configure:89008: checking for dn_skipname" >&5 if eval "test \"`echo '$''{'ac_cv_func_dn_skipname'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:89036: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_dn_skipname=yes" else @@ -89179,12 +89050,12 @@ if eval "test \"`echo '$ac_cv_func_'dn_skipname`\" = yes"; then else echo "$ac_t""no" 1>&6 echo $ac_n "checking for __dn_skipname""... $ac_c" 1>&6 -echo "configure:89183: checking for __dn_skipname" >&5 +echo "configure:89054: checking for __dn_skipname" >&5 if eval "test \"`echo '$''{'ac_cv_func___dn_skipname'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:89082: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func___dn_skipname=yes" else @@ -89245,7 +89116,7 @@ EOF unset ac_cv_lib_resolv___dn_skipname unset found echo $ac_n "checking for dn_skipname in -lresolv""... $ac_c" 1>&6 -echo "configure:89249: checking for dn_skipname in -lresolv" >&5 +echo "configure:89120: checking for dn_skipname in -lresolv" >&5 ac_lib_var=`echo resolv'_'dn_skipname | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -89253,7 +89124,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lresolv $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:89139: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -89284,7 +89155,7 @@ else echo "$ac_t""no" 1>&6 echo $ac_n "checking for __dn_skipname in -lresolv""... $ac_c" 1>&6 -echo "configure:89288: checking for __dn_skipname in -lresolv" >&5 +echo "configure:89159: checking for __dn_skipname in -lresolv" >&5 ac_lib_var=`echo resolv'_'__dn_skipname | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -89292,7 +89163,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lresolv $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:89178: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -89335,11 +89206,11 @@ fi found=no else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:89214: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then found=yes else @@ -89381,7 +89252,7 @@ EOF unset ac_cv_lib_bind___dn_skipname unset found echo $ac_n "checking for dn_skipname in -lbind""... $ac_c" 1>&6 -echo "configure:89385: checking for dn_skipname in -lbind" >&5 +echo "configure:89256: checking for dn_skipname in -lbind" >&5 ac_lib_var=`echo bind'_'dn_skipname | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -89389,7 +89260,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lbind $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:89275: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -89420,7 +89291,7 @@ else echo "$ac_t""no" 1>&6 echo $ac_n "checking for __dn_skipname in -lbind""... $ac_c" 1>&6 -echo "configure:89424: checking for __dn_skipname in -lbind" >&5 +echo "configure:89295: checking for __dn_skipname in -lbind" >&5 ac_lib_var=`echo bind'_'__dn_skipname | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -89428,7 +89299,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lbind $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:89314: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -89471,11 +89342,11 @@ fi found=no else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:89350: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then found=yes else @@ -89517,7 +89388,7 @@ EOF unset ac_cv_lib_socket___dn_skipname unset found echo $ac_n "checking for dn_skipname in -lsocket""... $ac_c" 1>&6 -echo "configure:89521: checking for dn_skipname in -lsocket" >&5 +echo "configure:89392: checking for dn_skipname in -lsocket" >&5 ac_lib_var=`echo socket'_'dn_skipname | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -89525,7 +89396,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lsocket $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:89411: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -89556,7 +89427,7 @@ else echo "$ac_t""no" 1>&6 echo $ac_n "checking for __dn_skipname in -lsocket""... $ac_c" 1>&6 -echo "configure:89560: checking for __dn_skipname in -lsocket" >&5 +echo "configure:89431: checking for __dn_skipname in -lsocket" >&5 ac_lib_var=`echo socket'_'__dn_skipname | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -89564,7 +89435,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lsocket $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:89450: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -89607,11 +89478,11 @@ fi found=no else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:89486: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then found=yes else @@ -89670,12 +89541,12 @@ EOF unset found echo $ac_n "checking for res_search""... $ac_c" 1>&6 -echo "configure:89674: checking for res_search" >&5 +echo "configure:89545: checking for res_search" >&5 if eval "test \"`echo '$''{'ac_cv_func_res_search'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:89573: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_res_search=yes" else @@ -89716,12 +89587,12 @@ if eval "test \"`echo '$ac_cv_func_'res_search`\" = yes"; then else echo "$ac_t""no" 1>&6 echo $ac_n "checking for __res_search""... $ac_c" 1>&6 -echo "configure:89720: checking for __res_search" >&5 +echo "configure:89591: checking for __res_search" >&5 if eval "test \"`echo '$''{'ac_cv_func___res_search'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:89619: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func___res_search=yes" else @@ -89782,7 +89653,7 @@ EOF unset ac_cv_lib_resolv___res_search unset found echo $ac_n "checking for res_search in -lresolv""... $ac_c" 1>&6 -echo "configure:89786: checking for res_search in -lresolv" >&5 +echo "configure:89657: checking for res_search in -lresolv" >&5 ac_lib_var=`echo resolv'_'res_search | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -89790,7 +89661,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lresolv $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:89676: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -89821,7 +89692,7 @@ else echo "$ac_t""no" 1>&6 echo $ac_n "checking for __res_search in -lresolv""... $ac_c" 1>&6 -echo "configure:89825: checking for __res_search in -lresolv" >&5 +echo "configure:89696: checking for __res_search in -lresolv" >&5 ac_lib_var=`echo resolv'_'__res_search | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -89829,7 +89700,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lresolv $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:89715: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -89872,11 +89743,11 @@ fi found=no else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:89751: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then found=yes else @@ -89918,7 +89789,7 @@ EOF unset ac_cv_lib_bind___res_search unset found echo $ac_n "checking for res_search in -lbind""... $ac_c" 1>&6 -echo "configure:89922: checking for res_search in -lbind" >&5 +echo "configure:89793: checking for res_search in -lbind" >&5 ac_lib_var=`echo bind'_'res_search | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -89926,7 +89797,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lbind $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:89812: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -89957,7 +89828,7 @@ else echo "$ac_t""no" 1>&6 echo $ac_n "checking for __res_search in -lbind""... $ac_c" 1>&6 -echo "configure:89961: checking for __res_search in -lbind" >&5 +echo "configure:89832: checking for __res_search in -lbind" >&5 ac_lib_var=`echo bind'_'__res_search | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -89965,7 +89836,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lbind $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:89851: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -90008,11 +89879,11 @@ fi found=no else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:89887: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then found=yes else @@ -90054,7 +89925,7 @@ EOF unset ac_cv_lib_socket___res_search unset found echo $ac_n "checking for res_search in -lsocket""... $ac_c" 1>&6 -echo "configure:90058: checking for res_search in -lsocket" >&5 +echo "configure:89929: checking for res_search in -lsocket" >&5 ac_lib_var=`echo socket'_'res_search | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -90062,7 +89933,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lsocket $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:89948: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -90093,7 +89964,7 @@ else echo "$ac_t""no" 1>&6 echo $ac_n "checking for __res_search in -lsocket""... $ac_c" 1>&6 -echo "configure:90097: checking for __res_search in -lsocket" >&5 +echo "configure:89968: checking for __res_search in -lsocket" >&5 ac_lib_var=`echo socket'_'__res_search | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -90101,7 +89972,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lsocket $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:89987: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -90144,11 +90015,11 @@ fi found=no else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:90023: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then found=yes else @@ -90201,7 +90072,7 @@ EOF echo $ac_n "checking whether atof() accepts NAN""... $ac_c" 1>&6 -echo "configure:90205: checking whether atof() accepts NAN" >&5 +echo "configure:90076: checking whether atof() accepts NAN" >&5 if eval "test \"`echo '$''{'ac_cv_atof_accept_nan'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -90212,7 +90083,7 @@ if test "$cross_compiling" = yes; then else cat > conftest.$ac_ext < @@ -90232,7 +90103,7 @@ int main(int argc, char** argv) } EOF -if { (eval echo configure:90236: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:90107: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_atof_accept_nan=yes @@ -90259,7 +90130,7 @@ EOF fi echo $ac_n "checking whether atof() accepts INF""... $ac_c" 1>&6 -echo "configure:90263: checking whether atof() accepts INF" >&5 +echo "configure:90134: checking whether atof() accepts INF" >&5 if eval "test \"`echo '$''{'ac_cv_atof_accept_inf'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -90270,7 +90141,7 @@ if test "$cross_compiling" = yes; then else cat > conftest.$ac_ext < @@ -90293,7 +90164,7 @@ int main(int argc, char** argv) } EOF -if { (eval echo configure:90297: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:90168: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_atof_accept_inf=yes @@ -90320,7 +90191,7 @@ EOF fi echo $ac_n "checking whether HUGE_VAL == INF""... $ac_c" 1>&6 -echo "configure:90324: checking whether HUGE_VAL == INF" >&5 +echo "configure:90195: checking whether HUGE_VAL == INF" >&5 if eval "test \"`echo '$''{'ac_cv_huge_val_inf'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -90331,7 +90202,7 @@ if test "$cross_compiling" = yes; then else cat > conftest.$ac_ext < @@ -90354,7 +90225,7 @@ int main(int argc, char** argv) } EOF -if { (eval echo configure:90358: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:90229: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_huge_val_inf=yes @@ -90381,7 +90252,7 @@ EOF fi echo $ac_n "checking whether HUGE_VAL + -HUGEVAL == NAN""... $ac_c" 1>&6 -echo "configure:90385: checking whether HUGE_VAL + -HUGEVAL == NAN" >&5 +echo "configure:90256: checking whether HUGE_VAL + -HUGEVAL == NAN" >&5 if eval "test \"`echo '$''{'ac_cv_huge_val_nan'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -90392,7 +90263,7 @@ if test "$cross_compiling" = yes; then else cat > conftest.$ac_ext < @@ -90417,7 +90288,7 @@ int main(int argc, char** argv) } EOF -if { (eval echo configure:90421: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:90292: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_huge_val_nan=yes @@ -90444,13 +90315,13 @@ EOF fi echo $ac_n "checking whether strptime() declaration fails""... $ac_c" 1>&6 -echo "configure:90448: checking whether strptime() declaration fails" >&5 +echo "configure:90319: checking whether strptime() declaration fails" >&5 if eval "test \"`echo '$''{'ac_cv_strptime_decl_fails'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < @@ -90466,7 +90337,7 @@ int strptime(const char *s, const char *format, struct tm *tm); ; return 0; } EOF -if { (eval echo configure:90470: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:90341: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_strptime_decl_fails=no @@ -90494,17 +90365,17 @@ for ac_hdr in wchar.h do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:90498: checking for $ac_hdr" >&5 +echo "configure:90369: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:90508: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:90379: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -90533,12 +90404,12 @@ done for ac_func in mblen do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:90537: checking for $ac_func" >&5 +echo "configure:90408: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:90436: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -90588,12 +90459,12 @@ done for ac_func in mbrlen mbsinit do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:90592: checking for $ac_func" >&5 +echo "configure:90463: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:90491: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -90641,13 +90512,13 @@ fi done echo $ac_n "checking for mbstate_t""... $ac_c" 1>&6 -echo "configure:90645: checking for mbstate_t" >&5 +echo "configure:90516: checking for mbstate_t" >&5 if eval "test \"`echo '$''{'ac_cv_type_mbstate_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:90535: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_type_mbstate_t=yes @@ -91047,7 +90918,7 @@ EOF php_with_sybase_ct=no echo $ac_n "checking for Sybase-CT support""... $ac_c" 1>&6 -echo "configure:91051: checking for Sybase-CT support" >&5 +echo "configure:90922: checking for Sybase-CT support" >&5 # Check whether --with-sybase-ct or --without-sybase-ct was given. if test "${with_sybase_ct+set}" = set; then withval="$with_sybase_ct" @@ -91697,7 +91568,7 @@ EOF done echo $ac_n "checking for netg_errstr in -ltcl""... $ac_c" 1>&6 -echo "configure:91701: checking for netg_errstr in -ltcl" >&5 +echo "configure:91572: checking for netg_errstr in -ltcl" >&5 ac_lib_var=`echo tcl'_'netg_errstr | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -91705,7 +91576,7 @@ else ac_save_LIBS="$LIBS" LIBS="-ltcl $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:91591: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -91891,7 +91762,7 @@ fi done echo $ac_n "checking for insck__getVdate in -linsck""... $ac_c" 1>&6 -echo "configure:91895: checking for insck__getVdate in -linsck" >&5 +echo "configure:91766: checking for insck__getVdate in -linsck" >&5 ac_lib_var=`echo insck'_'insck__getVdate | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -91899,7 +91770,7 @@ else ac_save_LIBS="$LIBS" LIBS="-linsck $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:91785: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -92058,7 +91929,7 @@ fi done echo $ac_n "checking for bsd_tcp in -linsck""... $ac_c" 1>&6 -echo "configure:92062: checking for bsd_tcp in -linsck" >&5 +echo "configure:91933: checking for bsd_tcp in -linsck" >&5 ac_lib_var=`echo insck'_'bsd_tcp | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -92066,7 +91937,7 @@ else ac_save_LIBS="$LIBS" LIBS="-linsck $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:91952: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -92137,7 +92008,7 @@ fi php_enable_sysvmsg=no echo $ac_n "checking whether to enable System V IPC support""... $ac_c" 1>&6 -echo "configure:92141: checking whether to enable System V IPC support" >&5 +echo "configure:92012: checking whether to enable System V IPC support" >&5 # Check whether --enable-sysvmsg or --disable-sysvmsg was given. if test "${enable_sysvmsg+set}" = set; then enableval="$enable_sysvmsg" @@ -92183,17 +92054,17 @@ echo "$ac_t""$ext_output" 1>&6 if test "$PHP_SYSVMSG" != "no"; then ac_safe=`echo "sys/msg.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for sys/msg.h""... $ac_c" 1>&6 -echo "configure:92187: checking for sys/msg.h" >&5 +echo "configure:92058: checking for sys/msg.h" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:92197: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:92068: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -92520,7 +92391,7 @@ fi php_enable_sysvsem=no echo $ac_n "checking whether to enable System V semaphore support""... $ac_c" 1>&6 -echo "configure:92524: checking whether to enable System V semaphore support" >&5 +echo "configure:92395: checking whether to enable System V semaphore support" >&5 # Check whether --enable-sysvsem or --disable-sysvsem was given. if test "${enable_sysvsem+set}" = set; then enableval="$enable_sysvsem" @@ -92861,12 +92732,12 @@ EOF EOF echo $ac_n "checking for union semun""... $ac_c" 1>&6 -echo "configure:92865: checking for union semun" >&5 +echo "configure:92736: checking for union semun" >&5 if eval "test \"`echo '$''{'php_cv_semun'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < @@ -92877,7 +92748,7 @@ int main() { union semun x; ; return 0; } EOF -if { (eval echo configure:92881: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:92752: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* php_cv_semun=yes @@ -92913,7 +92784,7 @@ fi php_enable_sysvshm=no echo $ac_n "checking whether to enable System V shared memory support""... $ac_c" 1>&6 -echo "configure:92917: checking whether to enable System V shared memory support" >&5 +echo "configure:92788: checking whether to enable System V shared memory support" >&5 # Check whether --enable-sysvshm or --disable-sysvshm was given. if test "${enable_sysvshm+set}" = set; then enableval="$enable_sysvshm" @@ -93260,7 +93131,7 @@ fi php_with_tidy=no echo $ac_n "checking for TIDY support""... $ac_c" 1>&6 -echo "configure:93264: checking for TIDY support" >&5 +echo "configure:93135: checking for TIDY support" >&5 # Check whether --with-tidy or --without-tidy was given. if test "${with_tidy+set}" = set; then withval="$with_tidy" @@ -93552,7 +93423,7 @@ if test "$PHP_TIDY" != "no"; then done echo $ac_n "checking for tidyOptGetDoc in -ltidy""... $ac_c" 1>&6 -echo "configure:93556: checking for tidyOptGetDoc in -ltidy" >&5 +echo "configure:93427: checking for tidyOptGetDoc in -ltidy" >&5 ac_lib_var=`echo tidy'_'tidyOptGetDoc | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -93560,7 +93431,7 @@ else ac_save_LIBS="$LIBS" LIBS="-ltidy $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:93446: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -93915,7 +93786,7 @@ fi php_enable_tokenizer=yes echo $ac_n "checking whether to enable tokenizer support""... $ac_c" 1>&6 -echo "configure:93919: checking whether to enable tokenizer support" >&5 +echo "configure:93790: checking whether to enable tokenizer support" >&5 # Check whether --enable-tokenizer or --disable-tokenizer was given. if test "${enable_tokenizer+set}" = set; then enableval="$enable_tokenizer" @@ -94264,7 +94135,7 @@ fi php_enable_wddx=no echo $ac_n "checking whether to enable WDDX support""... $ac_c" 1>&6 -echo "configure:94268: checking whether to enable WDDX support" >&5 +echo "configure:94139: checking whether to enable WDDX support" >&5 # Check whether --enable-wddx or --disable-wddx was given. if test "${enable_wddx+set}" = set; then enableval="$enable_wddx" @@ -94312,7 +94183,7 @@ if test -z "$PHP_LIBXML_DIR"; then php_with_libxml_dir=no echo $ac_n "checking libxml2 install dir""... $ac_c" 1>&6 -echo "configure:94316: checking libxml2 install dir" >&5 +echo "configure:94187: checking libxml2 install dir" >&5 # Check whether --with-libxml-dir or --without-libxml-dir was given. if test "${with_libxml_dir+set}" = set; then withval="$with_libxml_dir" @@ -94339,7 +94210,7 @@ fi php_with_libexpat_dir=no echo $ac_n "checking libexpat dir for WDDX""... $ac_c" 1>&6 -echo "configure:94343: checking libexpat dir for WDDX" >&5 +echo "configure:94214: checking libexpat dir for WDDX" >&5 # Check whether --with-libexpat-dir or --without-libexpat-dir was given. if test "${with_libexpat_dir+set}" = set; then withval="$with_libexpat_dir" @@ -94370,7 +94241,7 @@ if test "$PHP_WDDX" != "no"; then echo $ac_n "checking for xml2-config path""... $ac_c" 1>&6 -echo "configure:94374: checking for xml2-config path" >&5 +echo "configure:94245: checking for xml2-config path" >&5 if eval "test \"`echo '$''{'ac_cv_php_xml2_config_path'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -94528,7 +94399,7 @@ echo "$ac_t""$ac_cv_php_xml2_config_path" 1>&6 echo $ac_n "checking whether libxml build works""... $ac_c" 1>&6 -echo "configure:94532: checking whether libxml build works" >&5 +echo "configure:94403: checking whether libxml build works" >&5 if eval "test \"`echo '$''{'php_cv_libxml_build_works'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -94544,7 +94415,7 @@ else else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:94430: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then LIBS=$old_LIBS @@ -95122,7 +94993,7 @@ fi php_enable_xml=yes echo $ac_n "checking whether to enable XML support""... $ac_c" 1>&6 -echo "configure:95126: checking whether to enable XML support" >&5 +echo "configure:94997: checking whether to enable XML support" >&5 # Check whether --enable-xml or --disable-xml was given. if test "${enable_xml+set}" = set; then enableval="$enable_xml" @@ -95170,7 +95041,7 @@ if test -z "$PHP_LIBXML_DIR"; then php_with_libxml_dir=no echo $ac_n "checking libxml2 install dir""... $ac_c" 1>&6 -echo "configure:95174: checking libxml2 install dir" >&5 +echo "configure:95045: checking libxml2 install dir" >&5 # Check whether --with-libxml-dir or --without-libxml-dir was given. if test "${with_libxml_dir+set}" = set; then withval="$with_libxml_dir" @@ -95197,7 +95068,7 @@ fi php_with_libexpat_dir=no echo $ac_n "checking libexpat install dir""... $ac_c" 1>&6 -echo "configure:95201: checking libexpat install dir" >&5 +echo "configure:95072: checking libexpat install dir" >&5 # Check whether --with-libexpat-dir or --without-libexpat-dir was given. if test "${with_libexpat_dir+set}" = set; then withval="$with_libexpat_dir" @@ -95229,7 +95100,7 @@ if test "$PHP_XML" != "no"; then echo $ac_n "checking for xml2-config path""... $ac_c" 1>&6 -echo "configure:95233: checking for xml2-config path" >&5 +echo "configure:95104: checking for xml2-config path" >&5 if eval "test \"`echo '$''{'ac_cv_php_xml2_config_path'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -95387,7 +95258,7 @@ echo "$ac_t""$ac_cv_php_xml2_config_path" 1>&6 echo $ac_n "checking whether libxml build works""... $ac_c" 1>&6 -echo "configure:95391: checking whether libxml build works" >&5 +echo "configure:95262: checking whether libxml build works" >&5 if eval "test \"`echo '$''{'php_cv_libxml_build_works'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -95403,7 +95274,7 @@ else else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:95289: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then LIBS=$old_LIBS @@ -95950,7 +95821,7 @@ fi php_enable_xmlreader=yes echo $ac_n "checking whether to enable XMLReader support""... $ac_c" 1>&6 -echo "configure:95954: checking whether to enable XMLReader support" >&5 +echo "configure:95825: checking whether to enable XMLReader support" >&5 # Check whether --enable-xmlreader or --disable-xmlreader was given. if test "${enable_xmlreader+set}" = set; then enableval="$enable_xmlreader" @@ -95998,7 +95869,7 @@ if test -z "$PHP_LIBXML_DIR"; then php_with_libxml_dir=no echo $ac_n "checking libxml2 install dir""... $ac_c" 1>&6 -echo "configure:96002: checking libxml2 install dir" >&5 +echo "configure:95873: checking libxml2 install dir" >&5 # Check whether --with-libxml-dir or --without-libxml-dir was given. if test "${with_libxml_dir+set}" = set; then withval="$with_libxml_dir" @@ -96029,7 +95900,7 @@ if test "$PHP_XMLREADER" != "no"; then echo $ac_n "checking for xml2-config path""... $ac_c" 1>&6 -echo "configure:96033: checking for xml2-config path" >&5 +echo "configure:95904: checking for xml2-config path" >&5 if eval "test \"`echo '$''{'ac_cv_php_xml2_config_path'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -96187,7 +96058,7 @@ echo "$ac_t""$ac_cv_php_xml2_config_path" 1>&6 echo $ac_n "checking whether libxml build works""... $ac_c" 1>&6 -echo "configure:96191: checking whether libxml build works" >&5 +echo "configure:96062: checking whether libxml build works" >&5 if eval "test \"`echo '$''{'php_cv_libxml_build_works'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -96203,7 +96074,7 @@ else else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:96089: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then LIBS=$old_LIBS @@ -96596,7 +96467,7 @@ fi php_with_xmlrpc=no echo $ac_n "checking for XMLRPC-EPI support""... $ac_c" 1>&6 -echo "configure:96600: checking for XMLRPC-EPI support" >&5 +echo "configure:96471: checking for XMLRPC-EPI support" >&5 # Check whether --with-xmlrpc or --without-xmlrpc was given. if test "${with_xmlrpc+set}" = set; then withval="$with_xmlrpc" @@ -96644,7 +96515,7 @@ if test -z "$PHP_LIBXML_DIR"; then php_with_libxml_dir=no echo $ac_n "checking libxml2 install dir""... $ac_c" 1>&6 -echo "configure:96648: checking libxml2 install dir" >&5 +echo "configure:96519: checking libxml2 install dir" >&5 # Check whether --with-libxml-dir or --without-libxml-dir was given. if test "${with_libxml_dir+set}" = set; then withval="$with_libxml_dir" @@ -96671,7 +96542,7 @@ fi php_with_libexpat_dir=no echo $ac_n "checking libexpat dir for XMLRPC-EPI""... $ac_c" 1>&6 -echo "configure:96675: checking libexpat dir for XMLRPC-EPI" >&5 +echo "configure:96546: checking libexpat dir for XMLRPC-EPI" >&5 # Check whether --with-libexpat-dir or --without-libexpat-dir was given. if test "${with_libexpat_dir+set}" = set; then withval="$with_libexpat_dir" @@ -96697,7 +96568,7 @@ echo "$ac_t""$ext_output" 1>&6 php_with_iconv_dir=no echo $ac_n "checking iconv dir for XMLRPC-EPI""... $ac_c" 1>&6 -echo "configure:96701: checking iconv dir for XMLRPC-EPI" >&5 +echo "configure:96572: checking iconv dir for XMLRPC-EPI" >&5 # Check whether --with-iconv-dir or --without-iconv-dir was given. if test "${with_iconv_dir+set}" = set; then withval="$with_iconv_dir" @@ -96756,7 +96627,7 @@ EOF echo $ac_n "checking for xml2-config path""... $ac_c" 1>&6 -echo "configure:96760: checking for xml2-config path" >&5 +echo "configure:96631: checking for xml2-config path" >&5 if eval "test \"`echo '$''{'ac_cv_php_xml2_config_path'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -96914,7 +96785,7 @@ echo "$ac_t""$ac_cv_php_xml2_config_path" 1>&6 echo $ac_n "checking whether libxml build works""... $ac_c" 1>&6 -echo "configure:96918: checking whether libxml build works" >&5 +echo "configure:96789: checking whether libxml build works" >&5 if eval "test \"`echo '$''{'php_cv_libxml_build_works'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -96930,7 +96801,7 @@ else else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:96816: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then LIBS=$old_LIBS @@ -97209,12 +97080,12 @@ EOF if test "$PHP_ICONV" = "yes"; then echo $ac_n "checking for iconv""... $ac_c" 1>&6 -echo "configure:97213: checking for iconv" >&5 +echo "configure:97084: checking for iconv" >&5 if eval "test \"`echo '$''{'ac_cv_func_iconv'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:97112: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_iconv=yes" else @@ -97258,12 +97129,12 @@ else echo "$ac_t""no" 1>&6 echo $ac_n "checking for libiconv""... $ac_c" 1>&6 -echo "configure:97262: checking for libiconv" >&5 +echo "configure:97133: checking for libiconv" >&5 if eval "test \"`echo '$''{'ac_cv_func_libiconv'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:97161: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_libiconv=yes" else @@ -97442,7 +97313,7 @@ EOF done echo $ac_n "checking for libiconv in -l$iconv_lib_name""... $ac_c" 1>&6 -echo "configure:97446: checking for libiconv in -l$iconv_lib_name" >&5 +echo "configure:97317: checking for libiconv in -l$iconv_lib_name" >&5 ac_lib_var=`echo $iconv_lib_name'_'libiconv | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -97450,7 +97321,7 @@ else ac_save_LIBS="$LIBS" LIBS="-l$iconv_lib_name $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:97336: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -97595,7 +97466,7 @@ else done echo $ac_n "checking for iconv in -l$iconv_lib_name""... $ac_c" 1>&6 -echo "configure:97599: checking for iconv in -l$iconv_lib_name" >&5 +echo "configure:97470: checking for iconv in -l$iconv_lib_name" >&5 ac_lib_var=`echo $iconv_lib_name'_'iconv | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -97603,7 +97474,7 @@ else ac_save_LIBS="$LIBS" LIBS="-l$iconv_lib_name $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:97489: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -97804,7 +97675,7 @@ if test "$PHP_XMLRPC" = "yes"; then # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:97808: checking for $ac_word" >&5 +echo "configure:97679: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -97832,21 +97703,21 @@ else fi echo $ac_n "checking for inline""... $ac_c" 1>&6 -echo "configure:97836: checking for inline" >&5 +echo "configure:97707: checking for inline" >&5 if eval "test \"`echo '$''{'ac_cv_c_inline'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_cv_c_inline=no for ac_kw in inline __inline__ __inline; do cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:97721: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_c_inline=$ac_kw; break else @@ -97884,12 +97755,12 @@ EOF echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 -echo "configure:97888: checking for ANSI C header files" >&5 +echo "configure:97759: checking for ANSI C header files" >&5 if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include @@ -97897,7 +97768,7 @@ else #include EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:97901: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:97772: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -97914,7 +97785,7 @@ rm -f conftest* if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat > conftest.$ac_ext < EOF @@ -97932,7 +97803,7 @@ 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 < EOF @@ -97953,7 +97824,7 @@ if test "$cross_compiling" = yes; then : else cat > conftest.$ac_ext < #define ISLOWER(c) ('a' <= (c) && (c) <= 'z') @@ -97964,7 +97835,7 @@ if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); exit (0); } EOF -if { (eval echo configure:97968: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:97839: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then : else @@ -97991,17 +97862,17 @@ for ac_hdr in xmlparse.h xmltok.h stdlib.h strings.h string.h do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:97995: checking for $ac_hdr" >&5 +echo "configure:97866: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:98005: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:97876: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -98033,7 +97904,7 @@ done echo $ac_n "checking size of char""... $ac_c" 1>&6 -echo "configure:98037: checking size of char" >&5 +echo "configure:97908: checking size of char" >&5 if eval "test \"`echo '$''{'ac_cv_sizeof_char'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -98041,7 +97912,7 @@ else ac_cv_sizeof_char=1 else cat > conftest.$ac_ext < int main() @@ -98052,7 +97923,7 @@ int main() return(0); } EOF -if { (eval echo configure:98056: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:97927: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_sizeof_char=`cat conftestval` else @@ -98073,7 +97944,7 @@ EOF echo $ac_n "checking size of int""... $ac_c" 1>&6 -echo "configure:98077: checking size of int" >&5 +echo "configure:97948: checking size of int" >&5 if eval "test \"`echo '$''{'ac_cv_sizeof_int'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -98081,7 +97952,7 @@ else ac_cv_sizeof_int=4 else cat > conftest.$ac_ext < int main() @@ -98092,7 +97963,7 @@ int main() return(0); } EOF -if { (eval echo configure:98096: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:97967: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_sizeof_int=`cat conftestval` else @@ -98112,7 +97983,7 @@ EOF echo $ac_n "checking size of long""... $ac_c" 1>&6 -echo "configure:98116: checking size of long" >&5 +echo "configure:97987: checking size of long" >&5 if eval "test \"`echo '$''{'ac_cv_sizeof_long'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -98120,7 +97991,7 @@ else ac_cv_sizeof_long=4 else cat > conftest.$ac_ext < int main() @@ -98131,7 +98002,7 @@ int main() return(0); } EOF -if { (eval echo configure:98135: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:98006: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_sizeof_long=`cat conftestval` else @@ -98151,7 +98022,7 @@ EOF echo $ac_n "checking size of long long""... $ac_c" 1>&6 -echo "configure:98155: checking size of long long" >&5 +echo "configure:98026: checking size of long long" >&5 if eval "test \"`echo '$''{'ac_cv_sizeof_long_long'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -98159,7 +98030,7 @@ else ac_cv_sizeof_long_long=8 else cat > conftest.$ac_ext < int main() @@ -98170,7 +98041,7 @@ int main() return(0); } EOF -if { (eval echo configure:98174: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:98045: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_sizeof_long_long=`cat conftestval` else @@ -98190,12 +98061,12 @@ EOF echo $ac_n "checking for size_t""... $ac_c" 1>&6 -echo "configure:98194: checking for size_t" >&5 +echo "configure:98065: checking for size_t" >&5 if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #if STDC_HEADERS @@ -98223,12 +98094,12 @@ EOF fi echo $ac_n "checking whether time.h and sys/time.h may both be included""... $ac_c" 1>&6 -echo "configure:98227: checking whether time.h and sys/time.h may both be included" >&5 +echo "configure:98098: checking whether time.h and sys/time.h may both be included" >&5 if eval "test \"`echo '$''{'ac_cv_header_time'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include @@ -98237,7 +98108,7 @@ int main() { struct tm *tp; ; return 0; } EOF -if { (eval echo configure:98241: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:98112: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_header_time=yes else @@ -98258,12 +98129,12 @@ EOF fi echo $ac_n "checking for uid_t in sys/types.h""... $ac_c" 1>&6 -echo "configure:98262: checking for uid_t in sys/types.h" >&5 +echo "configure:98133: checking for uid_t in sys/types.h" >&5 if eval "test \"`echo '$''{'ac_cv_type_uid_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF @@ -98303,12 +98174,12 @@ for ac_func in \ memcpy memmove do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:98307: checking for $ac_func" >&5 +echo "configure:98178: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:98206: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -98685,7 +98556,7 @@ elif test "$PHP_XMLRPC" != "no"; then XMLRPC_DIR=$PHP_XMLRPC/include/xmlrpc-epi else echo $ac_n "checking for XMLRPC-EPI in default path""... $ac_c" 1>&6 -echo "configure:98689: checking for XMLRPC-EPI in default path" >&5 +echo "configure:98560: checking for XMLRPC-EPI in default path" >&5 for i in /usr/local /usr; do if test -r $i/include/xmlrpc.h; then XMLRPC_DIR=$i/include @@ -99128,7 +98999,7 @@ fi php_enable_xmlwriter=yes echo $ac_n "checking whether to enable XMLWriter support""... $ac_c" 1>&6 -echo "configure:99132: checking whether to enable XMLWriter support" >&5 +echo "configure:99003: checking whether to enable XMLWriter support" >&5 # Check whether --enable-xmlwriter or --disable-xmlwriter was given. if test "${enable_xmlwriter+set}" = set; then enableval="$enable_xmlwriter" @@ -99176,7 +99047,7 @@ if test -z "$PHP_LIBXML_DIR"; then php_with_libxml_dir=no echo $ac_n "checking libxml2 install dir""... $ac_c" 1>&6 -echo "configure:99180: checking libxml2 install dir" >&5 +echo "configure:99051: checking libxml2 install dir" >&5 # Check whether --with-libxml-dir or --without-libxml-dir was given. if test "${with_libxml_dir+set}" = set; then withval="$with_libxml_dir" @@ -99207,7 +99078,7 @@ if test "$PHP_XMLWRITER" != "no"; then echo $ac_n "checking for xml2-config path""... $ac_c" 1>&6 -echo "configure:99211: checking for xml2-config path" >&5 +echo "configure:99082: checking for xml2-config path" >&5 if eval "test \"`echo '$''{'ac_cv_php_xml2_config_path'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -99365,7 +99236,7 @@ echo "$ac_t""$ac_cv_php_xml2_config_path" 1>&6 echo $ac_n "checking whether libxml build works""... $ac_c" 1>&6 -echo "configure:99369: checking whether libxml build works" >&5 +echo "configure:99240: checking whether libxml build works" >&5 if eval "test \"`echo '$''{'php_cv_libxml_build_works'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -99381,7 +99252,7 @@ else else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:99267: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then LIBS=$old_LIBS @@ -99742,7 +99613,7 @@ fi php_with_xsl=no echo $ac_n "checking for XSL support""... $ac_c" 1>&6 -echo "configure:99746: checking for XSL support" >&5 +echo "configure:99617: checking for XSL support" >&5 # Check whether --with-xsl or --without-xsl was given. if test "${with_xsl+set}" = set; then withval="$with_xsl" @@ -99945,7 +99816,7 @@ if test "$PHP_XSL" != "no"; then echo $ac_n "checking for EXSLT support""... $ac_c" 1>&6 -echo "configure:99949: checking for EXSLT support" >&5 +echo "configure:99820: checking for EXSLT support" >&5 for i in $PHP_XSL /usr/local /usr; do if test -r "$i/include/libexslt/exslt.h"; then PHP_XSL_EXSL_DIR=$i @@ -100421,7 +100292,7 @@ fi php_enable_zip=no echo $ac_n "checking for zip archive read/writesupport""... $ac_c" 1>&6 -echo "configure:100425: checking for zip archive read/writesupport" >&5 +echo "configure:100296: checking for zip archive read/writesupport" >&5 # Check whether --enable-zip or --disable-zip was given. if test "${enable_zip+set}" = set; then enableval="$enable_zip" @@ -100469,7 +100340,7 @@ if test -z "$PHP_ZLIB_DIR"; then php_with_zlib_dir=no echo $ac_n "checking for the location of libz""... $ac_c" 1>&6 -echo "configure:100473: checking for the location of libz" >&5 +echo "configure:100344: checking for the location of libz" >&5 # Check whether --with-zlib-dir or --without-zlib-dir was given. if test "${with_zlib_dir+set}" = set; then withval="$with_zlib_dir" @@ -100496,7 +100367,7 @@ fi php_with_pcre_dir=no echo $ac_n "checking pcre install prefix""... $ac_c" 1>&6 -echo "configure:100500: checking pcre install prefix" >&5 +echo "configure:100371: checking pcre install prefix" >&5 # Check whether --with-pcre-dir or --without-pcre-dir was given. if test "${with_pcre_dir+set}" = set; then withval="$with_pcre_dir" @@ -100543,7 +100414,7 @@ if test "$PHP_ZIP" != "no"; then fi echo $ac_n "checking for the location of zlib""... $ac_c" 1>&6 -echo "configure:100547: checking for the location of zlib" >&5 +echo "configure:100418: checking for the location of zlib" >&5 if test "$PHP_ZLIB_DIR" = "no"; then { echo "configure: error: zip support requires ZLIB. Use --with-zlib-dir= to specify prefix where ZLIB include and library are located" 1>&2; exit 1; } else @@ -100681,7 +100552,7 @@ echo "configure:100547: checking for the location of zlib" >&5 old_CPPFLAGS=$CPPFLAGS CPPFLAGS=$INCLUDES cat > conftest.$ac_ext < @@ -100700,7 +100571,7 @@ else rm -rf conftest* cat > conftest.$ac_ext < @@ -101064,35 +100935,85 @@ fi -php_enable_mysqlnd_threading=no -echo $ac_n "checking whether to enable threaded fetch in mysqlnd""... $ac_c" 1>&6 -echo "configure:101071: checking whether to enable threaded fetch in mysqlnd" >&5 -# Check whether --enable-mysqlnd_threading or --disable-mysqlnd_threading was given. -if test "${enable_mysqlnd_threading+set}" = set; then - enableval="$enable_mysqlnd_threading" - PHP_MYSQLND_THREADING=$enableval +php_enable_disable_mysqlnd_compression_support=yes + +echo $ac_n "checking whether to disable compressed protocol support in mysqlnd""... $ac_c" 1>&6 +echo "configure:100943: checking whether to disable compressed protocol support in mysqlnd" >&5 +# Check whether --enable-disable_mysqlnd_compression_support or --disable-disable_mysqlnd_compression_support was given. +if test "${enable_disable_mysqlnd_compression_support+set}" = set; then + enableval="$enable_disable_mysqlnd_compression_support" + PHP_DISABLE_MYSQLND_COMPRESSION_SUPPORT=$enableval else - PHP_MYSQLND_THREADING=no + PHP_DISABLE_MYSQLND_COMPRESSION_SUPPORT=yes + + if test "$PHP_ENABLE_ALL" && test "yes" = "yes"; then + PHP_DISABLE_MYSQLND_COMPRESSION_SUPPORT=$PHP_ENABLE_ALL + fi + +fi + + + +ext_output="yes, shared" +ext_shared=yes +case $PHP_DISABLE_MYSQLND_COMPRESSION_SUPPORT in +shared,*) + PHP_DISABLE_MYSQLND_COMPRESSION_SUPPORT=`echo "$PHP_DISABLE_MYSQLND_COMPRESSION_SUPPORT"|$SED 's/^shared,//'` + ;; +shared) + PHP_DISABLE_MYSQLND_COMPRESSION_SUPPORT=yes + ;; +no) + ext_output=no + ext_shared=no + ;; +*) + ext_output=yes + ext_shared=no + ;; +esac + + + +echo "$ac_t""$ext_output" 1>&6 + + + + +if test -z "$PHP_ZLIB_DIR"; then + +php_with_zlib_dir=no + +echo $ac_n "checking for the location of libz""... $ac_c" 1>&6 +echo "configure:100991: checking for the location of libz" >&5 +# Check whether --with-zlib-dir or --without-zlib-dir was given. +if test "${with_zlib_dir+set}" = set; then + withval="$with_zlib_dir" + PHP_ZLIB_DIR=$withval +else + + PHP_ZLIB_DIR=no if test "$PHP_ENABLE_ALL" && test "no" = "yes"; then - PHP_MYSQLND_THREADING=$PHP_ENABLE_ALL + PHP_ZLIB_DIR=$PHP_ENABLE_ALL fi fi -ext_output=$PHP_MYSQLND_THREADING +ext_output=$PHP_ZLIB_DIR echo "$ac_t""$ext_output" 1>&6 +fi if test "$PHP_MYSQLND_ENABLED" = "yes"; then mysqlnd_sources="mysqlnd.c mysqlnd_charset.c mysqlnd_wireprotocol.c \ - mysqlnd_ps.c mysqlnd_loaddata.c mysqlnd_palloc.c \ - mysqlnd_ps_codec.c mysqlnd_statistics.c mysqlnd_qcache.c\ + mysqlnd_ps.c mysqlnd_loaddata.c mysqlnd_net.c \ + mysqlnd_ps_codec.c mysqlnd_statistics.c \ mysqlnd_result.c mysqlnd_result_meta.c mysqlnd_debug.c\ mysqlnd_block_alloc.c php_mysqlnd.c" @@ -101393,18 +101314,156 @@ EOF $php_shtool mkdir -p ext/mysqlnd - - if test "$PHP_MYSQLND_THREADING" = "yes"; then + + + for header_file in ext/mysqlnd/; do + + + unique=`echo $header_file|$SED 's/[^a-zA-Z0-9]/_/g'` + + cmd="echo $ac_n \"\$INSTALLHEADERS$unique$ac_c\"" + if test -n "$unique" && test "`eval $cmd`" = "" ; then + eval "INSTALLHEADERS$unique=set" - enable_maintainer_zts=yes - if test "$pthreads_working" != "yes"; then - { echo "configure: error: ZTS currently requires working POSIX threads. We were unable to verify that your system supports Pthreads." 1>&2; exit 1; } + INSTALL_HEADERS="$INSTALL_HEADERS $header_file" + fi + done + + + + + if test "$PHP_MYSQLND_COMPRESSION_SUPPORT" != "no"; then cat >> confdefs.h <<\EOF -#define MYSQLND_THREADED 1 +#define MYSQLND_COMPRESSION_ENABLED 1 EOF + if test "$PHP_ZLIB_DIR" != "no"; then + + + if test "$ext_shared" = "yes"; then + MYSQLND_SHARED_LIBADD="-lz $MYSQLND_SHARED_LIBADD" + if test -n "$PHP_ZLIB_DIR"; then + + if test "$PHP_ZLIB_DIR" != "/usr/$PHP_LIBDIR" && test "$PHP_ZLIB_DIR" != "/usr/lib"; then + + if test -z "$PHP_ZLIB_DIR" || echo "$PHP_ZLIB_DIR" | grep '^/' >/dev/null ; then + ai_p=$PHP_ZLIB_DIR + else + + ep_dir="`echo $PHP_ZLIB_DIR|$SED 's%/*[^/][^/]*/*$%%'`" + + ep_realdir="`(cd \"$ep_dir\" && pwd)`" + ai_p="$ep_realdir/`basename \"$PHP_ZLIB_DIR\"`" + fi + + + if test "$ext_shared" = "yes"; then + MYSQLND_SHARED_LIBADD="-L$ai_p $MYSQLND_SHARED_LIBADD" + test -n "$ld_runpath_switch" && MYSQLND_SHARED_LIBADD="$ld_runpath_switch$ai_p $MYSQLND_SHARED_LIBADD" + else + + + + unique=`echo $ai_p|$SED 's/[^a-zA-Z0-9]/_/g'` + + cmd="echo $ac_n \"\$LIBPATH$unique$ac_c\"" + if test -n "$unique" && test "`eval $cmd`" = "" ; then + eval "LIBPATH$unique=set" + + test -n "$ld_runpath_switch" && LDFLAGS="$LDFLAGS $ld_runpath_switch$ai_p" + LDFLAGS="$LDFLAGS -L$ai_p" + PHP_RPATHS="$PHP_RPATHS $ai_p" + + fi + + + fi + + fi + + fi + else + + + if test -n "$PHP_ZLIB_DIR"; then + + if test "$PHP_ZLIB_DIR" != "/usr/$PHP_LIBDIR" && test "$PHP_ZLIB_DIR" != "/usr/lib"; then + + if test -z "$PHP_ZLIB_DIR" || echo "$PHP_ZLIB_DIR" | grep '^/' >/dev/null ; then + ai_p=$PHP_ZLIB_DIR + else + + ep_dir="`echo $PHP_ZLIB_DIR|$SED 's%/*[^/][^/]*/*$%%'`" + + ep_realdir="`(cd \"$ep_dir\" && pwd)`" + ai_p="$ep_realdir/`basename \"$PHP_ZLIB_DIR\"`" + fi + + + + + + unique=`echo $ai_p|$SED 's/[^a-zA-Z0-9]/_/g'` + + cmd="echo $ac_n \"\$LIBPATH$unique$ac_c\"" + if test -n "$unique" && test "`eval $cmd`" = "" ; then + eval "LIBPATH$unique=set" + + test -n "$ld_runpath_switch" && LDFLAGS="$LDFLAGS $ld_runpath_switch$ai_p" + LDFLAGS="$LDFLAGS -L$ai_p" + PHP_RPATHS="$PHP_RPATHS $ai_p" + + fi + + + + fi + + fi + + + case z in + c|c_r|pthread*) ;; + *) + LIBS="-lz $LIBS" + ;; + esac + + + + + fi + + + MYSQLND_LIBS="$MYSQLND_LIBS -L$PHP_ZLIB_DIR/$PHP_LIBDIR -lz" + else + + + case z in + c|c_r|pthread*) ;; + *) + if test "$ext_shared" = "yes"; then + MYSQLND_SHARED_LIBADD="-lz $MYSQLND_SHARED_LIBADD" + else + + + case z in + c|c_r|pthread*) ;; + *) + LIBS="-lz $LIBS" + ;; + esac + + + fi + ;; + esac + + + MYSQLND_LIBS="$MYSQLND_LIBS -lz" + fi fi fi @@ -101418,7 +101477,7 @@ if test "$PHP_MYSQLND_ENABLED" = "yes" || test "$PHP_MYSQLI" != "no"; then for php_typename in int8 uint8 int16 uint16 int32 uint32 uchar ulong int8_t uint8_t int16_t uint16_t int32_t uint32_t int64_t uint64_t; do echo $ac_n "checking whether $php_typename exists""... $ac_c" 1>&6 -echo "configure:101422: checking whether $php_typename exists" >&5 +echo "configure:101481: checking whether $php_typename exists" >&5 php_cache_value=php_cv_sizeof_$php_typename if eval "test \"`echo '$''{'php_cv_sizeof_$php_typename'+set}'`\" = set"; then @@ -101435,7 +101494,7 @@ else else cat > conftest.$ac_ext < #if STDC_HEADERS @@ -101465,7 +101524,7 @@ int main() } EOF -if { (eval echo configure:101469: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:101528: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then eval $php_cache_value=`cat conftestval` @@ -101605,7 +101664,7 @@ if test "$PHP_RECODE" != "no"; then done echo $ac_n "checking for hash_insert in -l$MYSQL_LIBNAME""... $ac_c" 1>&6 -echo "configure:101609: checking for hash_insert in -l$MYSQL_LIBNAME" >&5 +echo "configure:101668: checking for hash_insert in -l$MYSQL_LIBNAME" >&5 ac_lib_var=`echo $MYSQL_LIBNAME'_'hash_insert | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -101613,7 +101672,7 @@ else ac_save_LIBS="$LIBS" LIBS="-l$MYSQL_LIBNAME $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:101687: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -101726,7 +101785,7 @@ fi php_with_pear=DEFAULT echo $ac_n "checking whether to install PEAR""... $ac_c" 1>&6 -echo "configure:101730: checking whether to install PEAR" >&5 +echo "configure:101789: checking whether to install PEAR" >&5 # Check whether --with-pear or --without-pear was given. if test "${with_pear+set}" = set; then withval="$with_pear" @@ -101831,7 +101890,7 @@ fi bison_version=none if test "$YACC"; then echo $ac_n "checking for bison version""... $ac_c" 1>&6 -echo "configure:101835: checking for bison version" >&5 +echo "configure:101894: checking for bison version" >&5 if eval "test \"`echo '$''{'php_cv_bison_version'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -101887,17 +101946,17 @@ dlfcn.h do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:101891: checking for $ac_hdr" >&5 +echo "configure:101950: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:101901: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:101960: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -101925,12 +101984,12 @@ done echo $ac_n "checking for size_t""... $ac_c" 1>&6 -echo "configure:101929: checking for size_t" >&5 +echo "configure:101988: checking for size_t" >&5 if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #if STDC_HEADERS @@ -101958,12 +102017,12 @@ EOF fi echo $ac_n "checking return type of signal handlers""... $ac_c" 1>&6 -echo "configure:101962: checking return type of signal handlers" >&5 +echo "configure:102021: checking return type of signal handlers" >&5 if eval "test \"`echo '$''{'ac_cv_type_signal'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include @@ -101980,7 +102039,7 @@ int main() { int i; ; return 0; } EOF -if { (eval echo configure:101984: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:102043: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_type_signal=void else @@ -102004,12 +102063,12 @@ EOF echo $ac_n "checking for uint""... $ac_c" 1>&6 -echo "configure:102008: checking for uint" >&5 +echo "configure:102067: checking for uint" >&5 if eval "test \"`echo '$''{'ac_cv_type_uint'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #if STDC_HEADERS @@ -102037,12 +102096,12 @@ EOF fi echo $ac_n "checking for ulong""... $ac_c" 1>&6 -echo "configure:102041: checking for ulong" >&5 +echo "configure:102100: checking for ulong" >&5 if eval "test \"`echo '$''{'ac_cv_type_ulong'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #if STDC_HEADERS @@ -102072,9 +102131,9 @@ fi echo $ac_n "checking for int32_t""... $ac_c" 1>&6 -echo "configure:102076: checking for int32_t" >&5 +echo "configure:102135: checking for int32_t" >&5 cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:102156: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* cat >> confdefs.h <&6 -echo "configure:102116: checking for uint32_t" >&5 +echo "configure:102175: checking for uint32_t" >&5 cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:102196: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* cat >> confdefs.h <&6 -echo "configure:102156: checking for vprintf" >&5 +echo "configure:102215: checking for vprintf" >&5 if eval "test \"`echo '$''{'ac_cv_func_vprintf'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:102243: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_vprintf=yes" else @@ -102204,12 +102263,12 @@ fi if test "$ac_cv_func_vprintf" != yes; then echo $ac_n "checking for _doprnt""... $ac_c" 1>&6 -echo "configure:102208: checking for _doprnt" >&5 +echo "configure:102267: checking for _doprnt" >&5 if eval "test \"`echo '$''{'ac_cv_func__doprnt'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:102295: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func__doprnt=yes" else @@ -102257,7 +102316,7 @@ fi fi echo $ac_n "checking for 8-bit clean memcmp""... $ac_c" 1>&6 -echo "configure:102261: checking for 8-bit clean memcmp" >&5 +echo "configure:102320: checking for 8-bit clean memcmp" >&5 if eval "test \"`echo '$''{'ac_cv_func_memcmp_clean'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -102265,7 +102324,7 @@ else ac_cv_func_memcmp_clean=no else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:102338: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_func_memcmp_clean=yes else @@ -102295,19 +102354,19 @@ test $ac_cv_func_memcmp_clean = no && LIBOBJS="$LIBOBJS memcmp.${ac_objext}" # The Ultrix 4.2 mips builtin alloca declared by alloca.h only works # for constant arguments. Useless! echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6 -echo "configure:102299: checking for working alloca.h" >&5 +echo "configure:102358: checking for working alloca.h" >&5 if eval "test \"`echo '$''{'ac_cv_header_alloca_h'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < int main() { char *p = alloca(2 * sizeof(int)); ; return 0; } EOF -if { (eval echo configure:102311: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:102370: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_header_alloca_h=yes else @@ -102328,12 +102387,12 @@ EOF fi echo $ac_n "checking for alloca""... $ac_c" 1>&6 -echo "configure:102332: checking for alloca" >&5 +echo "configure:102391: checking for alloca" >&5 if eval "test \"`echo '$''{'ac_cv_func_alloca_works'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:102424: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_func_alloca_works=yes else @@ -102393,12 +102452,12 @@ EOF echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6 -echo "configure:102397: checking whether alloca needs Cray hooks" >&5 +echo "configure:102456: checking whether alloca needs Cray hooks" >&5 if eval "test \"`echo '$''{'ac_cv_os_cray'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&6 if test $ac_cv_os_cray = yes; then for ac_func in _getb67 GETB67 getb67; do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:102427: checking for $ac_func" >&5 +echo "configure:102486: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:102514: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -102478,7 +102537,7 @@ done fi echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6 -echo "configure:102482: checking stack direction for C alloca" >&5 +echo "configure:102541: checking stack direction for C alloca" >&5 if eval "test \"`echo '$''{'ac_cv_c_stack_direction'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -102486,7 +102545,7 @@ else ac_cv_c_stack_direction=0 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:102568: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_c_stack_direction=1 else @@ -102529,12 +102588,12 @@ fi for ac_func in memcpy strdup getpid kill strtod strtol finite fpclass sigsetjmp do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:102533: checking for $ac_func" >&5 +echo "configure:102592: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:102620: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -102583,7 +102642,7 @@ done echo $ac_n "checking whether sprintf is broken""... $ac_c" 1>&6 -echo "configure:102587: checking whether sprintf is broken" >&5 +echo "configure:102646: checking whether sprintf is broken" >&5 if eval "test \"`echo '$''{'ac_cv_broken_sprintf'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -102594,11 +102653,11 @@ else else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:102661: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_broken_sprintf=no @@ -102632,12 +102691,12 @@ EOF for ac_func in finite isfinite isinf isnan do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:102636: checking for $ac_func" >&5 +echo "configure:102695: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:102723: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -102687,13 +102746,13 @@ done echo $ac_n "checking whether fp_except is defined""... $ac_c" 1>&6 -echo "configure:102691: checking whether fp_except is defined" >&5 +echo "configure:102750: checking whether fp_except is defined" >&5 if eval "test \"`echo '$''{'ac_cv_type_fp_except'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < @@ -102704,7 +102763,7 @@ fp_except x = (fp_except) 0; ; return 0; } EOF -if { (eval echo configure:102708: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:102767: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_type_fp_except=yes @@ -102731,9 +102790,9 @@ EOF echo $ac_n "checking for usable _FPU_SETCW""... $ac_c" 1>&6 -echo "configure:102735: checking for usable _FPU_SETCW" >&5 +echo "configure:102794: checking for usable _FPU_SETCW" >&5 cat > conftest.$ac_ext < @@ -102753,7 +102812,7 @@ int main() { ; return 0; } EOF -if { (eval echo configure:102757: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:102816: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cfp_have__fpu_setcw=yes else @@ -102774,9 +102833,9 @@ EOF fi echo $ac_n "checking for usable fpsetprec""... $ac_c" 1>&6 -echo "configure:102778: checking for usable fpsetprec" >&5 +echo "configure:102837: checking for usable fpsetprec" >&5 cat > conftest.$ac_ext < @@ -102795,7 +102854,7 @@ int main() { ; return 0; } EOF -if { (eval echo configure:102799: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:102858: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cfp_have_fpsetprec=yes else @@ -102816,9 +102875,9 @@ EOF fi echo $ac_n "checking for usable _controlfp""... $ac_c" 1>&6 -echo "configure:102820: checking for usable _controlfp" >&5 +echo "configure:102879: checking for usable _controlfp" >&5 cat > conftest.$ac_ext < @@ -102837,7 +102896,7 @@ int main() { ; return 0; } EOF -if { (eval echo configure:102841: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:102900: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cfp_have__controlfp=yes else @@ -102858,9 +102917,9 @@ EOF fi echo $ac_n "checking for usable _controlfp_s""... $ac_c" 1>&6 -echo "configure:102862: checking for usable _controlfp_s" >&5 +echo "configure:102921: checking for usable _controlfp_s" >&5 cat > conftest.$ac_ext < @@ -102880,7 +102939,7 @@ int main() { ; return 0; } EOF -if { (eval echo configure:102884: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:102943: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cfp_have__controlfp_s=yes else @@ -102901,9 +102960,9 @@ EOF fi echo $ac_n "checking whether FPU control word can be manipulated by inline assembler""... $ac_c" 1>&6 -echo "configure:102905: checking whether FPU control word can be manipulated by inline assembler" >&5 +echo "configure:102964: checking whether FPU control word can be manipulated by inline assembler" >&5 cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:102988: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cfp_have_fpu_inline_asm_x86=yes else @@ -102947,7 +103006,7 @@ EOF echo $ac_n "checking whether double cast to long preserves least significant bits""... $ac_c" 1>&6 -echo "configure:102951: checking whether double cast to long preserves least significant bits" >&5 +echo "configure:103010: checking whether double cast to long preserves least significant bits" >&5 if test "$cross_compiling" = yes; then @@ -102955,7 +103014,7 @@ if test "$cross_compiling" = yes; then else cat > conftest.$ac_ext < @@ -102979,7 +103038,7 @@ int main() } EOF -if { (eval echo configure:102983: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:103042: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then cat >> confdefs.h <<\EOF @@ -103005,17 +103064,17 @@ for ac_hdr in dlfcn.h do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:103009: checking for $ac_hdr" >&5 +echo "configure:103068: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:103019: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:103078: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -103043,14 +103102,14 @@ done echo $ac_n "checking whether dlsym() requires a leading underscore in symbol names""... $ac_c" 1>&6 -echo "configure:103047: checking whether dlsym() requires a leading underscore in symbol names" >&5 +echo "configure:103106: checking whether dlsym() requires a leading underscore in symbol names" >&5 if test "$cross_compiling" = yes; then : else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} 2>/dev/null; then + if { (eval echo configure:103176: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in @@ -103125,7 +103186,7 @@ EOF EOF ;; - x$lt_unknown|x*) + x$lt_dlunknown|x*) echo "$ac_t""no" 1>&6 ;; esac @@ -103194,23 +103255,23 @@ fi echo $ac_n "checking virtual machine dispatch method""... $ac_c" 1>&6 -echo "configure:103198: checking virtual machine dispatch method" >&5 +echo "configure:103259: checking virtual machine dispatch method" >&5 echo "$ac_t""$PHP_ZEND_VM" 1>&6 echo $ac_n "checking whether to enable thread-safety""... $ac_c" 1>&6 -echo "configure:103202: checking whether to enable thread-safety" >&5 +echo "configure:103263: checking whether to enable thread-safety" >&5 echo "$ac_t""$ZEND_MAINTAINER_ZTS" 1>&6 echo $ac_n "checking whether to enable inline optimization for GCC""... $ac_c" 1>&6 -echo "configure:103206: checking whether to enable inline optimization for GCC" >&5 +echo "configure:103267: checking whether to enable inline optimization for GCC" >&5 echo "$ac_t""$ZEND_INLINE_OPTIMIZATION" 1>&6 echo $ac_n "checking whether to enable Zend debugging""... $ac_c" 1>&6 -echo "configure:103210: checking whether to enable Zend debugging" >&5 +echo "configure:103271: checking whether to enable Zend debugging" >&5 echo "$ac_t""$ZEND_DEBUG" 1>&6 echo $ac_n "checking whether to enable Zend multibyte""... $ac_c" 1>&6 -echo "configure:103214: checking whether to enable Zend multibyte" >&5 +echo "configure:103275: checking whether to enable Zend multibyte" >&5 echo "$ac_t""$ZEND_MULTIBYTE" 1>&6 case $PHP_ZEND_VM in @@ -103283,21 +103344,21 @@ fi echo $ac_n "checking for inline""... $ac_c" 1>&6 -echo "configure:103287: checking for inline" >&5 +echo "configure:103348: checking for inline" >&5 if eval "test \"`echo '$''{'ac_cv_c_inline'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_cv_c_inline=no for ac_kw in inline __inline__ __inline; do cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:103362: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_c_inline=$ac_kw; break else @@ -103326,7 +103387,7 @@ esac echo $ac_n "checking target system is Darwin""... $ac_c" 1>&6 -echo "configure:103330: checking target system is Darwin" >&5 +echo "configure:103391: checking target system is Darwin" >&5 if echo "$target" | grep "darwin" > /dev/null; then cat >> confdefs.h <<\EOF #define DARWIN 1 @@ -103338,7 +103399,7 @@ else fi echo $ac_n "checking for MM alignment and log values""... $ac_c" 1>&6 -echo "configure:103342: checking for MM alignment and log values" >&5 +echo "configure:103403: checking for MM alignment and log values" >&5 if test "$cross_compiling" = yes; then @@ -103346,7 +103407,7 @@ if test "$cross_compiling" = yes; then else cat > conftest.$ac_ext < @@ -103382,7 +103443,7 @@ int main() } EOF -if { (eval echo configure:103386: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:103447: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then LIBZEND_MM_ALIGN=`cat conftest.zend | cut -d ' ' -f 1` @@ -103407,7 +103468,7 @@ fi echo "$ac_t""done" 1>&6 echo $ac_n "checking for memory allocation using mmap(MAP_ANON)""... $ac_c" 1>&6 -echo "configure:103411: checking for memory allocation using mmap(MAP_ANON)" >&5 +echo "configure:103472: checking for memory allocation using mmap(MAP_ANON)" >&5 if test "$cross_compiling" = yes; then @@ -103415,7 +103476,7 @@ if test "$cross_compiling" = yes; then else cat > conftest.$ac_ext < @@ -103451,7 +103512,7 @@ int main() } EOF -if { (eval echo configure:103455: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:103516: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then cat >> confdefs.h <<\EOF @@ -103473,7 +103534,7 @@ fi echo $ac_n "checking for memory allocation using mmap("/dev/zero")""... $ac_c" 1>&6 -echo "configure:103477: checking for memory allocation using mmap("/dev/zero")" >&5 +echo "configure:103538: checking for memory allocation using mmap("/dev/zero")" >&5 if test "$cross_compiling" = yes; then @@ -103481,7 +103542,7 @@ if test "$cross_compiling" = yes; then else cat > conftest.$ac_ext < @@ -103527,7 +103588,7 @@ int main() } EOF -if { (eval echo configure:103531: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:103592: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then cat >> confdefs.h <<\EOF @@ -103551,12 +103612,12 @@ fi for ac_func in mremap do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:103555: checking for $ac_func" >&5 +echo "configure:103616: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:103644: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -103646,17 +103707,17 @@ for ac_hdr in stdarg.h do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:103650: checking for $ac_hdr" >&5 +echo "configure:103711: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:103660: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:103721: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -103733,7 +103794,7 @@ if test "$TSRM_PTH" != "no"; then echo $ac_n "checking for GNU Pth""... $ac_c" 1>&6 -echo "configure:103737: checking for GNU Pth" >&5 +echo "configure:103798: checking for GNU Pth" >&5 PTH_PREFIX="`$TSRM_PTH --prefix`" if test -z "$PTH_PREFIX"; then echo "$ac_t""Please check your Pth installation" 1>&6 @@ -103763,17 +103824,17 @@ elif test "$TSRM_ST" != "no"; then do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:103767: checking for $ac_hdr" >&5 +echo "configure:103828: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:103777: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:103838: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -103803,7 +103864,7 @@ done LIBS="$LIBS -lst" echo $ac_n "checking for SGI's State Threads""... $ac_c" 1>&6 -echo "configure:103807: checking for SGI's State Threads" >&5 +echo "configure:103868: checking for SGI's State Threads" >&5 echo "$ac_t""yes" 1>&6 cat >> confdefs.h <<\EOF #define TSRM_ST 1 @@ -103842,7 +103903,7 @@ if test "$cross_compiling" = yes; then else cat > conftest.$ac_ext < @@ -103860,7 +103921,7 @@ int main() { return pthread_create(&thd, NULL, thread_routine, &data); } EOF -if { (eval echo configure:103864: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:103925: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then pthreads_working=yes @@ -103880,7 +103941,7 @@ fi CFLAGS=$save_CFLAGS echo $ac_n "checking for pthreads_cflags""... $ac_c" 1>&6 -echo "configure:103884: checking for pthreads_cflags" >&5 +echo "configure:103945: checking for pthreads_cflags" >&5 if eval "test \"`echo '$''{'ac_cv_pthreads_cflags'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -103902,7 +103963,7 @@ if test "$cross_compiling" = yes; then else cat > conftest.$ac_ext < @@ -103920,7 +103981,7 @@ int main() { return pthread_create(&thd, NULL, thread_routine, &data); } EOF -if { (eval echo configure:103924: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:103985: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then pthreads_working=yes @@ -103950,7 +104011,7 @@ fi echo "$ac_t""$ac_cv_pthreads_cflags" 1>&6 echo $ac_n "checking for pthreads_lib""... $ac_c" 1>&6 -echo "configure:103954: checking for pthreads_lib" >&5 +echo "configure:104015: checking for pthreads_lib" >&5 if eval "test \"`echo '$''{'ac_cv_pthreads_lib'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -103972,7 +104033,7 @@ if test "$cross_compiling" = yes; then else cat > conftest.$ac_ext < @@ -103990,7 +104051,7 @@ int main() { return pthread_create(&thd, NULL, thread_routine, &data); } EOF -if { (eval echo configure:103994: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:104055: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then pthreads_working=yes @@ -104041,7 +104102,7 @@ EOF echo $ac_n "checking for POSIX threads""... $ac_c" 1>&6 -echo "configure:104045: checking for POSIX threads" >&5 +echo "configure:104106: checking for POSIX threads" >&5 echo "$ac_t""yes" 1>&6 fi @@ -104125,6 +104186,7 @@ EXPANDED_PEAR_INSTALLDIR=`eval echo $PEAR_INSTALLDIR` EXPANDED_EXTENSION_DIR=`eval echo $EXTENSION_DIR` EXPANDED_LOCALSTATEDIR=`eval echo $localstatedir` EXPANDED_BINDIR=`eval echo $bindir` +EXPANDED_SBINDIR=`eval echo $sbindir` EXPANDED_LIBDIR=$libdir EXPANDED_SYSCONFDIR=`eval echo $sysconfdir` EXPANDED_DATADIR=$datadir @@ -104147,6 +104209,7 @@ datadir=$old_datadir + if test -n "$php_ldflags_add_usr_lib"; then PHP_RPATHS="$PHP_RPATHS /usr/lib" fi @@ -104273,6 +104336,7 @@ EOF PHP_INSTALLED_SAPIS="cli $PHP_SAPI" + PHP_EXECUTABLE="\$(top_builddir)/\$(SAPI_CLI_PATH)" else PHP_INSTALLED_SAPIS="$PHP_SAPI" fi @@ -104285,6 +104349,9 @@ fi + PHP_VAR_SUBST="$PHP_VAR_SUBST PHP_EXECUTABLE" + + PHP_VAR_SUBST="$PHP_VAR_SUBST PHP_CLI_TARGET" @@ -104337,6 +104404,9 @@ fi PHP_VAR_SUBST="$PHP_VAR_SUBST bindir" + PHP_VAR_SUBST="$PHP_VAR_SUBST sbindir" + + PHP_VAR_SUBST="$PHP_VAR_SUBST exec_prefix" @@ -104583,6 +104653,12 @@ fi LDFLAGS="$LDFLAGS $PHP_AIX_LDFLAGS" +case $host_alias in +*darwin9*|*darwin10*) + ac_cv_exeext= + ;; +esac + # Check whether --enable-shared or --disable-shared was given. if test "${enable_shared+set}" = set; then @@ -104660,7 +104736,7 @@ fi echo $ac_n "checking build system type""... $ac_c" 1>&6 -echo "configure:104664: checking build system type" >&5 +echo "configure:104740: checking build system type" >&5 build_alias=$build case "$build_alias" in @@ -104689,7 +104765,7 @@ ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. echo $ac_n "checking for ld used by $CC""... $ac_c" 1>&6 -echo "configure:104693: checking for ld used by $CC" >&5 +echo "configure:104769: checking for ld used by $CC" >&5 case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw @@ -104719,10 +104795,10 @@ echo "configure:104693: checking for ld used by $CC" >&5 esac elif test "$with_gnu_ld" = yes; then echo $ac_n "checking for GNU ld""... $ac_c" 1>&6 -echo "configure:104723: checking for GNU ld" >&5 +echo "configure:104799: checking for GNU ld" >&5 else echo $ac_n "checking for non-GNU ld""... $ac_c" 1>&6 -echo "configure:104726: checking for non-GNU ld" >&5 +echo "configure:104802: checking for non-GNU ld" >&5 fi if eval "test \"`echo '$''{'lt_cv_path_LD'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -104761,7 +104837,7 @@ else fi test -z "$LD" && { echo "configure: error: no acceptable ld found in \$PATH" 1>&2; exit 1; } echo $ac_n "checking if the linker ($LD) is GNU ld""... $ac_c" 1>&6 -echo "configure:104765: checking if the linker ($LD) is GNU ld" >&5 +echo "configure:104841: checking if the linker ($LD) is GNU ld" >&5 if eval "test \"`echo '$''{'lt_cv_prog_gnu_ld'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -104781,7 +104857,7 @@ with_gnu_ld=$lt_cv_prog_gnu_ld echo $ac_n "checking for $LD option to reload object files""... $ac_c" 1>&6 -echo "configure:104785: checking for $LD option to reload object files" >&5 +echo "configure:104861: checking for $LD option to reload object files" >&5 if eval "test \"`echo '$''{'lt_cv_ld_reload_flag'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -104798,7 +104874,7 @@ reload_cmds='$LD$reload_flag -o $output$reload_objs' case $host_os in darwin*) if test "$GCC" = yes; then - reload_cmds='$CC -nostdlib ${wl}-r -o $output$reload_objs' + reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' else reload_cmds='$LD$reload_flag -o $output$reload_objs' fi @@ -104806,7 +104882,7 @@ case $host_os in esac echo $ac_n "checking for BSD-compatible nm""... $ac_c" 1>&6 -echo "configure:104810: checking for BSD-compatible nm" >&5 +echo "configure:104886: checking for BSD-compatible nm" >&5 if eval "test \"`echo '$''{'lt_cv_path_NM'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -104814,36 +104890,43 @@ else # 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" + lt_nm_to_check="${ac_tool_prefix}nm" + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/$lt_tmp_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 ;; *) - 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 + 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 - esac - fi + fi + done + IFS="$lt_save_ifs" done - IFS="$lt_save_ifs" test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm fi fi @@ -104851,8 +104934,8 @@ fi echo "$ac_t""$lt_cv_path_NM" 1>&6 NM="$lt_cv_path_NM" -echo $ac_n "checking how to recognise dependent libraries""... $ac_c" 1>&6 -echo "configure:104856: checking how to recognise dependent libraries" >&5 +echo $ac_n "checking how to recognize dependent libraries""... $ac_c" 1>&6 +echo "configure:104939: checking how to recognize dependent libraries" >&5 if eval "test \"`echo '$''{'lt_cv_deplibs_check_method'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -104871,7 +104954,7 @@ lt_cv_deplibs_check_method='unknown' # whether `pass_all' will *always* work, you probably want this one. case $host_os in -aix4* | aix5*) +aix[4-9]*) lt_cv_deplibs_check_method=pass_all ;; @@ -104893,16 +104976,22 @@ cygwin*) 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' + # func_win32_libid shell function, so use a weaker test based on 'objdump', + # unless we find 'file', for example because we are cross-compiling. + if ( file / ) >/dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; -freebsd* | kfreebsd*-gnu | dragonfly*) +freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then case $host_cpu in i*86 ) @@ -104940,6 +105029,11 @@ hpux10.20* | hpux11*) esac ;; +interix[3-9]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' + ;; + irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; @@ -104951,7 +105045,7 @@ irix5* | irix6* | nonstopux*) ;; # This must be Linux ELF. -linux*) +linux* | k*bsd*-gnu) lt_cv_deplibs_check_method=pass_all ;; @@ -104985,7 +105079,7 @@ osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; -sco3.2v5*) +rdos*) lt_cv_deplibs_check_method=pass_all ;; @@ -104993,7 +105087,7 @@ solaris*) lt_cv_deplibs_check_method=pass_all ;; -sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) +sysv4 | sysv4.3*) 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]' @@ -105014,10 +105108,13 @@ sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) siemens) lt_cv_deplibs_check_method=pass_all ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; esac ;; -sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7* | sysv4*uw2*) +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; esac @@ -105030,13 +105127,13 @@ deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown echo $ac_n "checking for object suffix""... $ac_c" 1>&6 -echo "configure:105034: checking for object suffix" >&5 +echo "configure:105131: checking for object suffix" >&5 if eval "test \"`echo '$''{'ac_cv_objext'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else rm -f conftest* echo 'int i = 1;' > conftest.$ac_ext -if { (eval echo configure:105040: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:105137: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then for ac_file in conftest.*; do case $ac_file in *.c) ;; @@ -105056,7 +105153,7 @@ ac_objext=$ac_cv_objext echo $ac_n "checking for executable suffix""... $ac_c" 1>&6 -echo "configure:105060: checking for executable suffix" >&5 +echo "configure:105157: checking for executable suffix" >&5 if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -105066,7 +105163,7 @@ else rm -f conftest* echo 'int main () { return 0; }' > conftest.$ac_ext ac_cv_exeext= - if { (eval echo configure:105070: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then + if { (eval echo configure:105167: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then for file in conftest.*; do case $file in *.c | *.o | *.obj) ;; @@ -105090,6 +105187,9 @@ ac_exeext=$EXEEXT # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + # Allow CC to be a program name with arguments. compiler=$CC @@ -105109,7 +105209,7 @@ case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext - if { (eval echo configure:105113: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + if { (eval echo configure:105213: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" @@ -105123,8 +105223,8 @@ ia64-*-hpux*) ;; *-*-irix6*) # Find out which ABI we are using. - echo '#line 105127 "configure"' > conftest.$ac_ext - if { (eval echo configure:105128: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + echo '#line 105227 "configure"' > conftest.$ac_ext + if { (eval echo configure:105228: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) @@ -105154,13 +105254,17 @@ ia64-*-hpux*) rm -rf conftest* ;; -x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) +x86_64-*kfreebsd*-gnu|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 configure:105161: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + if { (eval echo configure:105262: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then case `/usr/bin/file conftest.o` in *32-bit*) case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; @@ -105177,6 +105281,9 @@ x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) ;; *64-bit*) case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; @@ -105201,7 +105308,7 @@ x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" echo $ac_n "checking whether the C compiler needs -belf""... $ac_c" 1>&6 -echo "configure:105205: checking whether the C compiler needs -belf" >&5 +echo "configure:105312: checking whether the C compiler needs -belf" >&5 if eval "test \"`echo '$''{'lt_cv_cc_needs_belf'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -105214,14 +105321,14 @@ ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$a cross_compiling=$ac_cv_prog_cc_cross cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:105332: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* lt_cv_cc_needs_belf=yes else @@ -105246,6 +105353,26 @@ echo "$ac_t""$lt_cv_cc_needs_belf" 1>&6 CFLAGS="$SAVE_CFLAGS" fi ;; +sparc*-*solaris*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { (eval echo configure:105360: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) LD="${LD-ld} -m elf64_sparc" ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + esac @@ -105258,7 +105385,7 @@ if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then echo $ac_n "checking how to run the C++ preprocessor""... $ac_c" 1>&6 -echo "configure:105262: checking how to run the C++ preprocessor" >&5 +echo "configure:105389: checking how to run the C++ preprocessor" >&5 if test -z "$CXXCPP"; then if eval "test \"`echo '$''{'ac_cv_prog_CXXCPP'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -105271,12 +105398,12 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes cross_compiling=$ac_cv_prog_cxx_cross CXXCPP="${CXX-g++} -E" cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:105280: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:105407: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : @@ -105304,10 +105431,9 @@ fi # Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! - # find the maximum length of command line arguments echo $ac_n "checking the maximum length of command line arguments""... $ac_c" 1>&6 -echo "configure:105311: checking the maximum length of command line arguments" >&5 +echo "configure:105437: checking the maximum length of command line arguments" >&5 if eval "test \"`echo '$''{'lt_cv_sys_max_cmd_len'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -105354,44 +105480,64 @@ else elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else - lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 - # + # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; *) - # 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. - SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} - while (test "X"`$SHELL $0 --fallback-echo "X$teststring" 2>/dev/null` \ + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + while (test "X"`$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` + 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` + fi ;; esac @@ -105406,9 +105552,10 @@ fi + # Check for command to grab the raw symbol name followed by C symbol from nm. echo $ac_n "checking command to parse $NM output from $compiler object""... $ac_c" 1>&6 -echo "configure:105412: checking command to parse $NM output from $compiler object" >&5 +echo "configure:105559: checking command to parse $NM output from $compiler object" >&5 if eval "test \"`echo '$''{'lt_cv_sys_global_symbol_pipe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -105443,7 +105590,7 @@ hpux*) # Its linker distinguishes data from code symbols 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'" ;; -linux*) +linux* | k*bsd*-gnu) if test "$host_cpu" = ia64; then symcode='[ABCDGIRSTW]' lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" @@ -105456,9 +105603,18 @@ irix* | nonstopux*) osf*) symcode='[BCDEGQRST]' ;; -solaris* | sysv5*) +solaris*) symcode='[BDRT]' ;; +sco3.2v5*) + symcode='[DT]' + ;; +sysv4.2uw2*) + symcode='[DT]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[ABDT]' + ;; sysv4) symcode='[DFNSTU]' ;; @@ -105503,10 +105659,10 @@ void nm_test_func(){} int main(){nm_test_var='a';nm_test_func();return(0);} EOF - if { (eval echo configure:105507: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + if { (eval echo configure:105663: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then # Now try to grab the symbols. nlist=conftest.nm - if { (eval echo configure:105510: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\") 1>&5; (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5; } && test -s "$nlist"; then + if { (eval echo configure:105666: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\") 1>&5; (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5; } && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" @@ -105557,7 +105713,7 @@ EOF lt_save_CFLAGS="$CFLAGS" LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" - if { (eval echo configure:105561: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + if { (eval echo configure:105717: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS="$lt_save_LIBS" @@ -105575,7 +105731,7 @@ EOF echo "$progname: failed program was:" >&5 cat conftest.$ac_ext >&5 fi - rm -f conftest* conftst* + rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then @@ -105597,7 +105753,7 @@ else fi echo $ac_n "checking for objdir""... $ac_c" 1>&6 -echo "configure:105601: checking for objdir" >&5 +echo "configure:105757: checking for objdir" >&5 if eval "test \"`echo '$''{'lt_cv_objdir'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -105663,7 +105819,7 @@ with_gnu_ld="$lt_cv_prog_gnu_ld" # 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 $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:105667: checking for $ac_word" >&5 +echo "configure:105823: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -105695,7 +105851,7 @@ if test -n "$ac_tool_prefix"; then # Extract the first word of "ar", so it can be a program name with args. set dummy ar; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:105699: checking for $ac_word" >&5 +echo "configure:105855: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -105730,7 +105886,7 @@ fi # 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 $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:105734: checking for $ac_word" >&5 +echo "configure:105890: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -105762,7 +105918,7 @@ if test -n "$ac_tool_prefix"; then # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:105766: checking for $ac_word" >&5 +echo "configure:105922: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -105797,7 +105953,7 @@ fi # 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 $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:105801: checking for $ac_word" >&5 +echo "configure:105957: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_STRIP'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -105829,7 +105985,7 @@ if test -n "$ac_tool_prefix"; then # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:105833: checking for $ac_word" >&5 +echo "configure:105989: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_STRIP'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -105871,6 +106027,7 @@ test -z "$AR_FLAGS" && AR_FLAGS=cru test -z "$AS" && AS=as test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$DLLTOOL" && DLLTOOL=dlltool test -z "$LD" && LD=ld test -z "$LN_S" && LN_S="ln -s" @@ -105883,17 +106040,17 @@ 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_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' 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="$old_postinstall_cmds~\$RANLIB -t \$oldlib" ;; *) - old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds" + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" @@ -105915,7 +106072,7 @@ case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then echo $ac_n "checking for ${ac_tool_prefix}file""... $ac_c" 1>&6 -echo "configure:105919: checking for ${ac_tool_prefix}file" >&5 +echo "configure:106076: checking for ${ac_tool_prefix}file" >&5 if eval "test \"`echo '$''{'lt_cv_path_MAGIC_CMD'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -105975,7 +106132,7 @@ fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then echo $ac_n "checking for file""... $ac_c" 1>&6 -echo "configure:105979: checking for file" >&5 +echo "configure:106136: checking for file" >&5 if eval "test \"`echo '$''{'lt_cv_path_MAGIC_CMD'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -106041,6 +106198,234 @@ fi ;; esac + + case $host_os in + rhapsody* | darwin*) + # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. +set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:106208: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_DSYMUTIL'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$DSYMUTIL"; then + ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" + break + fi + done + IFS="$ac_save_ifs" +fi +fi +DSYMUTIL="$ac_cv_prog_DSYMUTIL" +if test -n "$DSYMUTIL"; then + echo "$ac_t""$DSYMUTIL" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + +if test -z "$ac_cv_prog_DSYMUTIL"; then +if test -n "$ac_tool_prefix"; then + # Extract the first word of "dsymutil", so it can be a program name with args. +set dummy dsymutil; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:106240: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_DSYMUTIL'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$DSYMUTIL"; then + ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_DSYMUTIL="dsymutil" + break + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_prog_DSYMUTIL" && ac_cv_prog_DSYMUTIL=":" +fi +fi +DSYMUTIL="$ac_cv_prog_DSYMUTIL" +if test -n "$DSYMUTIL"; then + echo "$ac_t""$DSYMUTIL" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + +else + DSYMUTIL=":" +fi +fi + + # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. +set dummy ${ac_tool_prefix}nmedit; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:106275: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_NMEDIT'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$NMEDIT"; then + ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" + break + fi + done + IFS="$ac_save_ifs" +fi +fi +NMEDIT="$ac_cv_prog_NMEDIT" +if test -n "$NMEDIT"; then + echo "$ac_t""$NMEDIT" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + +if test -z "$ac_cv_prog_NMEDIT"; then +if test -n "$ac_tool_prefix"; then + # Extract the first word of "nmedit", so it can be a program name with args. +set dummy nmedit; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:106307: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_NMEDIT'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$NMEDIT"; then + ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_NMEDIT="nmedit" + break + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_prog_NMEDIT" && ac_cv_prog_NMEDIT=":" +fi +fi +NMEDIT="$ac_cv_prog_NMEDIT" +if test -n "$NMEDIT"; then + echo "$ac_t""$NMEDIT" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + +else + NMEDIT=":" +fi +fi + + + echo $ac_n "checking for -single_module linker flag""... $ac_c" 1>&6 +echo "configure:106341: checking for -single_module linker flag" >&5 +if eval "test \"`echo '$''{'lt_cv_apple_cc_single_mod'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + lt_cv_apple_cc_single_mod=no + if test -z "${LT_MULTI_MODULE}"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + echo "int foo(void){return 1;}" > conftest.c + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib ${wl}-single_module conftest.c + if test -f libconftest.dylib; then + lt_cv_apple_cc_single_mod=yes + rm -rf libconftest.dylib* + fi + rm conftest.c + fi +fi + +echo "$ac_t""$lt_cv_apple_cc_single_mod" 1>&6 + echo $ac_n "checking for -exported_symbols_list linker flag""... $ac_c" 1>&6 +echo "configure:106364: checking for -exported_symbols_list linker flag" >&5 +if eval "test \"`echo '$''{'lt_cv_ld_exported_symbols_list'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + lt_cv_ld_exported_symbols_list=yes + rm -rf conftest* +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&6 +lt_cv_ld_exported_symbols_list=no + rm -rf conftest* +fi +rm -f conftest* + LDFLAGS="$save_LDFLAGS" + +fi + +echo "$ac_t""$lt_cv_ld_exported_symbols_list" 1>&6 + case $host_os in + rhapsody* | darwin1.[0123]) + _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + darwin*) + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[91]*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + 10.[012]*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test "$lt_cv_apple_cc_single_mod" = "yes"; then + _lt_dar_single_mod='$single_module' + fi + if test "$lt_cv_ld_exported_symbols_list" = "yes"; then + _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' + else + _lt_dar_export_syms="~$NMEDIT -s \$output_objdir/\${libname}-symbols.expsym \${lib}" + fi + if test "$DSYMUTIL" != ":"; then + _lt_dsymutil="~$DSYMUTIL \$lib || :" + else + _lt_dsymutil= + fi + ;; + esac + + enable_dlopen=no enable_win32_dll=no @@ -106082,94 +106467,34 @@ objext=o objext=$objext # Code to be used in simple compile tests -lt_simple_compile_test_code="int some_variable = 0;\n" +lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests -lt_simple_link_test_code='int main(){return(0);}\n' +lt_simple_link_test_code='int main(){return(0);}' # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext -printf "$lt_simple_compile_test_code" >conftest.$ac_ext -eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d' >conftest.err +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $rm conftest* ac_outfile=conftest.$ac_objext -printf "$lt_simple_link_test_code" >conftest.$ac_ext -eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d' >conftest.err +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` -$rm conftest* - - -# -# 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 "configure: warning: \`$CC' requires \`$lt_prog_cc_shlib' to build shared libraries" 1>&2 - if echo "$old_CC $old_CFLAGS " | grep "[ ]$lt_prog_cc_shlib[ ]" >/dev/null; then : - else - echo "configure: warning: add \`$lt_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure" 1>&2 - lt_cv_prog_cc_can_build_shared=no - fi -fi - - -# -# Check to make sure the static flag actually works. -# -echo $ac_n "checking if $compiler static flag $lt_prog_compiler_static works""... $ac_c" 1>&6 -echo "configure:106138: checking if $compiler static flag $lt_prog_compiler_static works" >&5 -if eval "test \"`echo '$''{'lt_prog_compiler_static_works'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&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 linker 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 - $echo "X$_lt_linker_boilerplate" | $Xsed > conftest.exp - $SED '/^$/d' conftest.err >conftest.er2 - if diff conftest.exp conftest.er2 >/dev/null; then - lt_prog_compiler_static_works=yes - fi - else - lt_prog_compiler_static_works=yes - fi - fi - $rm conftest* - LDFLAGS="$save_LDFLAGS" - -fi - -echo "$ac_t""$lt_prog_compiler_static_works" 1>&6 - -if test x"$lt_prog_compiler_static_works" = xyes; then - : -else - lt_prog_compiler_static= -fi - +$rm -r conftest* ## CAVEAT EMPTOR: @@ -106184,13 +106509,13 @@ if test "$GCC" = yes; then echo $ac_n "checking if $compiler supports -fno-rtti -fno-exceptions""... $ac_c" 1>&6 -echo "configure:106188: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +echo "configure:106513: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 if eval "test \"`echo '$''{'lt_cv_prog_compiler_rtti_exceptions'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext - printf "$lt_simple_compile_test_code" > conftest.$ac_ext + echo "$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. @@ -106201,17 +106526,17 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"configure:106205: $lt_compile\"" >&5) + (eval echo "\"configure:106530: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "configure:106209: \$? = $ac_status" >&5 + echo "configure:106534: \$? = $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 other than the usual output. - $echo "X$_lt_compiler_boilerplate" | $Xsed >conftest.exp - $SED '/^$/d' conftest.err >conftest.er2 - if test ! -s conftest.err || diff conftest.exp conftest.er2 >/dev/null; then + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi @@ -106234,7 +106559,7 @@ lt_prog_compiler_pic= lt_prog_compiler_static= echo $ac_n "checking for $compiler option to produce PIC""... $ac_c" 1>&6 -echo "configure:106238: checking for $compiler option to produce PIC" >&5 +echo "configure:106563: checking for $compiler option to produce PIC" >&5 if test "$GCC" = yes; then lt_prog_compiler_wl='-Wl,' @@ -106256,14 +106581,16 @@ echo "configure:106238: checking for $compiler option to produce PIC" >&5 lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' ;; - beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; - mingw* | pw32* | os2*) + mingw* | cygwin* | 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' + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic='-DDLL_EXPORT' ;; darwin* | rhapsody*) @@ -106272,6 +106599,11 @@ echo "configure:106238: checking for $compiler option to produce PIC" >&5 lt_prog_compiler_pic='-fno-common' ;; + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. @@ -106325,10 +106657,10 @@ echo "configure:106238: checking for $compiler option to produce PIC" >&5 esac ;; - mingw* | pw32* | os2*) + mingw* | cygwin* | 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' + lt_prog_compiler_pic='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) @@ -106358,7 +106690,7 @@ echo "configure:106238: checking for $compiler option to produce PIC" >&5 lt_prog_compiler_static='-Bstatic' ;; - linux*) + linux* | k*bsd*-gnu) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) @@ -106385,6 +106717,22 @@ echo "configure:106238: checking for $compiler option to produce PIC" >&5 # All Alpha code is PIC. lt_prog_compiler_static='-non_shared' ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C 5.9 + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Wl,' + ;; + *Sun\ F*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='' + ;; + esac + ;; esac ;; @@ -106394,9 +106742,8 @@ echo "configure:106238: checking for $compiler option to produce PIC" >&5 lt_prog_compiler_static='-non_shared' ;; - sco3.2v5*) - lt_prog_compiler_pic='-Kpic' - lt_prog_compiler_static='-dn' + rdos*) + lt_prog_compiler_static='-non_shared' ;; solaris*) @@ -106416,7 +106763,7 @@ echo "configure:106238: checking for $compiler option to produce PIC" >&5 lt_prog_compiler_static='-Bstatic' ;; - sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' @@ -106429,6 +106776,12 @@ echo "configure:106238: checking for $compiler option to produce PIC" >&5 fi ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + unicos*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_can_build_shared=no @@ -106453,13 +106806,13 @@ echo "$ac_t""$lt_prog_compiler_pic" 1>&6 if test -n "$lt_prog_compiler_pic"; then echo $ac_n "checking if $compiler PIC flag $lt_prog_compiler_pic works""... $ac_c" 1>&6 -echo "configure:106457: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 -if eval "test \"`echo '$''{'lt_prog_compiler_pic_works'+set}'`\" = set"; then +echo "configure:106810: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 +if eval "test \"`echo '$''{'lt_cv_prog_compiler_pic_works'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else - lt_prog_compiler_pic_works=no + lt_cv_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext - printf "$lt_simple_compile_test_code" > conftest.$ac_ext + echo "$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. @@ -106470,27 +106823,27 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"configure:106474: $lt_compile\"" >&5) + (eval echo "\"configure:106827: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "configure:106478: \$? = $ac_status" >&5 + echo "configure:106831: \$? = $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 other than the usual output. - $echo "X$_lt_compiler_boilerplate" | $Xsed >conftest.exp - $SED '/^$/d' conftest.err >conftest.er2 - if test ! -s conftest.err || diff conftest.exp conftest.er2 >/dev/null; then - lt_prog_compiler_pic_works=yes + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works=yes fi fi $rm conftest* fi -echo "$ac_t""$lt_prog_compiler_pic_works" 1>&6 +echo "$ac_t""$lt_cv_prog_compiler_pic_works" 1>&6 -if test x"$lt_prog_compiler_pic_works" = xyes; then +if test x"$lt_cv_prog_compiler_pic_works" = xyes; then case $lt_prog_compiler_pic in "" | " "*) ;; *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; @@ -106511,8 +106864,50 @@ case $host_os in ;; esac +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" +echo $ac_n "checking if $compiler static flag $lt_tmp_static_flag works""... $ac_c" 1>&6 +echo "configure:106873: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +if eval "test \"`echo '$''{'lt_cv_prog_compiler_static_works'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + lt_cv_prog_compiler_static_works=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker 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 + $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works=yes + fi + else + lt_cv_prog_compiler_static_works=yes + fi + fi + $rm -r conftest* + LDFLAGS="$save_LDFLAGS" + +fi + +echo "$ac_t""$lt_cv_prog_compiler_static_works" 1>&6 + +if test x"$lt_cv_prog_compiler_static_works" = xyes; then + : +else + lt_prog_compiler_static= +fi + + echo $ac_n "checking if $compiler supports -c -o file.$ac_objext""... $ac_c" 1>&6 -echo "configure:106516: checking if $compiler supports -c -o file.$ac_objext" >&5 +echo "configure:106911: checking if $compiler supports -c -o file.$ac_objext" >&5 if eval "test \"`echo '$''{'lt_cv_prog_compiler_c_o'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -106521,7 +106916,7 @@ else mkdir conftest cd conftest mkdir out - printf "$lt_simple_compile_test_code" > conftest.$ac_ext + echo "$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 @@ -106532,18 +106927,18 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"configure:106536: $lt_compile\"" >&5) + (eval echo "\"configure:106931: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "configure:106540: \$? = $ac_status" >&5 + echo "configure:106935: \$? = $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 - $echo "X$_lt_compiler_boilerplate" | $Xsed > out/conftest.exp - $SED '/^$/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.err || diff out/conftest.exp out/conftest.er2 >/dev/null; then + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi @@ -106566,7 +106961,7 @@ 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 $ac_n "checking if we can lock with hard links""... $ac_c" 1>&6 -echo "configure:106570: checking if we can lock with hard links" >&5 +echo "configure:106965: checking if we can lock with hard links" >&5 hard_links=yes $rm conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no @@ -106583,7 +106978,7 @@ else fi echo $ac_n "checking whether the $compiler linker ($LD) supports shared libraries""... $ac_c" 1>&6 -echo "configure:106587: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +echo "configure:106982: checking whether the $compiler linker ($LD) supports shared libraries" >&5 runpath_var= allow_undefined_flag= @@ -106614,12 +107009,13 @@ echo "configure:106587: checking whether the $compiler linker ($LD) supports sha # 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_" + exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' # 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. + # Exclude shared library initialization/finalization symbols. extract_expsyms_cmds= # Just being paranoid about ensuring that cc_basename is set. for cc_temp in $compiler""; do @@ -106641,6 +107037,10 @@ cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` with_gnu_ld=no fi ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; openbsd*) with_gnu_ld=no ;; @@ -106650,7 +107050,7 @@ cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` if test "$with_gnu_ld" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' - + # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. @@ -106671,10 +107071,10 @@ cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac - + # See if GNU ld supports shared libraries. case $host_os in - aix3* | aix4* | aix5*) + aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no @@ -106722,10 +107122,10 @@ EOF 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 '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/'\'' -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' + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $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 @@ -106734,13 +107134,28 @@ EOF 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' + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs=no fi ;; - linux*) + interix[3-9]*) + hardcode_direct=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + export_dynamic_flag_spec='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | k*bsd*-gnu) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then tmp_addflag= case $cc_basename,$host_cpu in @@ -106748,7 +107163,7 @@ EOF whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; - pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers + pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 @@ -106758,13 +107173,22 @@ EOF ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; esac - archive_cmds='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + *) + tmp_sharedflag='-shared' ;; + esac + archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' 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'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi else ld_shlibs=no @@ -106781,7 +107205,7 @@ EOF fi ;; - solaris* | sysv5*) + solaris*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then ld_shlibs=no cat <&2 @@ -106802,6 +107226,33 @@ EOF fi ;; + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + ;; + sunos4*) archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= @@ -106835,14 +107286,14 @@ EOF # 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 + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; - aix4* | aix5*) + aix[4-9]*) 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. @@ -106862,13 +107313,14 @@ EOF # 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*) + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) 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' @@ -106895,7 +107347,7 @@ EOF strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 - hardcode_direct=yes + : else # We have old collect2 hardcode_direct=unsupported @@ -106906,6 +107358,7 @@ EOF hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi + ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then @@ -106918,11 +107371,11 @@ EOF # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else - if test "$aix_use_runtimelinking" = yes; then + if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' - fi + fi fi fi @@ -106936,18 +107389,25 @@ EOF # Determine the default libpath from the value encoded in an empty executable. cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - -aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'` +if { (eval echo configure:107398: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # 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=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +fi rm -rf conftest* else echo "configure: failed program was:" >&5 @@ -106957,28 +107417,35 @@ rm -f conftest* 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" + archive_expsym_cmds="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${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" + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - -aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'` +if { (eval echo configure:107436: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # 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=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +fi rm -rf conftest* else echo "configure: failed program was:" >&5 @@ -106992,13 +107459,11 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi # -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=' ' + whole_archive_flag_spec='$convenience' archive_cmds_need_lc=yes # This is similar to how AIX traditionally builds its 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' + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; @@ -107031,7 +107496,7 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi # 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' + old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' fix_srcfile_path='`cygpath -w "$srcfile"`' enable_shared_with_static_runtimes=yes ;; @@ -107064,19 +107529,18 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi link_all_deplibs=yes if test "$GCC" = yes ; then 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 lds - 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}' + archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" else case $cc_basename in xlc*) output_verbose_link_cmd='echo' - archive_cmds='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' + archive_cmds='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring' 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 lds - archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~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}' ;; *) @@ -107116,7 +107580,7 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. - freebsd* | kfreebsd*-gnu | dragonfly*) + freebsd* | dragonfly*) archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes @@ -107139,47 +107603,62 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi export_dynamic_flag_spec='${wl}-E' ;; - hpux10* | hpux11*) + hpux10*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + 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 + fi + ;; + + hpux11*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then case $host_cpu in - hppa*64*|ia64*) + hppa*64*) archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; + ia64*) + archive_cmds='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -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' + hppa*64*) + archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) - archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac fi if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + case $host_cpu in - hppa*64*) - hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hppa*64*|ia64*) 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' @@ -107223,24 +107702,28 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi ;; 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' - archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' - hardcode_libdir_flag_spec='${wl}-rpath,$libdir' - export_dynamic_flag_spec='${wl}-E' + if test -f /usr/libexec/ld.so; then + 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' + archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + 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 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 + ld_shlibs=no fi ;; @@ -107281,14 +107764,6 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; 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 @@ -107307,17 +107782,16 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) - # The compiler driver will combine linker options so we - # cannot just pass the convience library names through - # without $wl, iff we do not link with $LD. - # Luckily, gcc supports the same syntax we need for Sun Studio. + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. GCC discards it without `$wl', + # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) - case $wlarc in - '') - whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;; - *) - whole_archive_flag_spec='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;; - esac ;; + if test "$GCC" = yes; then + whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + else + whole_archive_flag_spec='-z allextract$convenience -z defaultextract' + fi + ;; esac link_all_deplibs=yes ;; @@ -107374,36 +107848,45 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi fi ;; - sysv4.2uw2*) - archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=yes - hardcode_minus_L=no + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag='${wl}-z,text' + archive_cmds_need_lc=no hardcode_shlibpath_var=no - hardcode_runpath_var=yes - runpath_var=LD_RUN_PATH - ;; + 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' + archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else - archive_cmds='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$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= + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag='${wl}-z,text' + allow_undefined_flag='${wl}-z,nodefs' + archive_cmds_need_lc=no hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' + hardcode_libdir_separator=':' + link_all_deplibs=yes + export_dynamic_flag_spec='${wl}-Bexport' runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi ;; uts4*) @@ -107421,11 +107904,6 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi echo "$ac_t""$ld_shlibs" 1>&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? # @@ -107444,16 +107922,17 @@ x|xyes) # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. echo $ac_n "checking whether -lc should be explicitly linked in""... $ac_c" 1>&6 -echo "configure:107448: checking whether -lc should be explicitly linked in" >&5 +echo "configure:107926: checking whether -lc should be explicitly linked in" >&5 $rm conftest* - printf "$lt_simple_compile_test_code" > conftest.$ac_ext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext - if { (eval echo configure:107452: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; } 2>conftest.err; then + if { (eval echo configure:107930: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl + pic_flag=$lt_prog_compiler_pic compiler_flags=-v linker_flags=-v verstring= @@ -107461,7 +107940,7 @@ echo "configure:107448: checking whether -lc should be explicitly linked in" >&5 libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag allow_undefined_flag= - if { (eval echo configure:107465: \"$archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\") 1>&5; (eval $archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5; } + if { (eval echo configure:107944: \"$archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\") 1>&5; (eval $archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5; } then archive_cmds_need_lc=no else @@ -107480,7 +107959,7 @@ echo "configure:107448: checking whether -lc should be explicitly linked in" >&5 esac echo $ac_n "checking dynamic linker characteristics""... $ac_c" 1>&6 -echo "configure:107484: checking dynamic linker characteristics" >&5 +echo "configure:107963: checking dynamic linker characteristics" >&5 library_names_spec= libname_spec='lib$name' soname_spec= @@ -107494,17 +107973,55 @@ 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 + case $host_os in + darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; + *) lt_awk_arg="/^libraries:/" ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$lt_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'` + lt_search_path_spec=`echo "$lt_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"` + lt_search_path_spec=`echo "$lt_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary. + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path/$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" + else + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`echo $lt_tmp_lt_search_path_spec | awk ' +BEGIN {RS=" "; FS="/|\n";} { + lt_foo=""; + lt_count=0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo="/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[lt_foo]++; } + if (lt_freq[lt_foo] == 1) { print lt_foo; } +}'` + sys_lib_search_path_spec=`echo $lt_search_path_spec` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi @@ -107525,7 +108042,7 @@ aix3*) soname_spec='${libname}${release}${shared_ext}$major' ;; -aix4* | aix5*) +aix[4-9]*) version_type=linux need_lib_prefix=no need_version=no @@ -107664,12 +108181,8 @@ darwin* | rhapsody*) 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_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; @@ -107686,18 +108199,6 @@ 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* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. @@ -107730,10 +108231,15 @@ freebsd* | dragonfly*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; - *) # from 3.2 on + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; esac ;; @@ -107793,6 +108299,18 @@ hpux9* | hpux10* | hpux11*) postinstall_cmds='chmod 555 $lib' ;; +interix[3-9]*) + 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' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; @@ -107836,7 +108354,7 @@ linux*oldld* | linux*aout* | linux*coff*) ;; # This must be Linux ELF. -linux*) +linux* | k*bsd*-gnu) version_type=linux need_lib_prefix=no need_version=no @@ -107850,27 +108368,10 @@ linux*) # 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 107858 "configure"' > conftest.$ac_ext - if { (eval echo configure:107859: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; 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" + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on @@ -107882,18 +108383,6 @@ linux*) 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 @@ -107931,6 +108420,7 @@ nto-qnx*) openbsd*) version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in @@ -107974,11 +108464,8 @@ osf3* | osf4* | osf5*) 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 +rdos*) + dynamic_linker=no ;; solaris*) @@ -108006,7 +108493,7 @@ sunos4*) need_version=yes ;; -sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) +sysv4 | sysv4.3*) 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' @@ -108039,6 +108526,29 @@ sysv4*MP*) fi ;; +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + shlibpath_overrides_runpath=no + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + shlibpath_overrides_runpath=yes + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' @@ -108053,8 +108563,28 @@ esac echo "$ac_t""$dynamic_linker" 1>&6 test "$dynamic_linker" = no && can_build_shared=no +if eval "test \"`echo '$''{'lt_cv_sys_lib_search_path_spec'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + lt_cv_sys_lib_search_path_spec="$sys_lib_search_path_spec" +fi + +sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +if eval "test \"`echo '$''{'lt_cv_sys_lib_dlsearch_path_spec'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + lt_cv_sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec" +fi + +sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" + +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 + echo $ac_n "checking how to hardcode library paths into programs""... $ac_c" 1>&6 -echo "configure:108058: checking how to hardcode library paths into programs" >&5 +echo "configure:108588: checking how to hardcode library paths into programs" >&5 hardcode_action= if test -n "$hardcode_libdir_flag_spec" || \ test -n "$runpath_var" || \ @@ -108092,7 +108622,7 @@ fi striplib= old_striplib= echo $ac_n "checking whether stripping libraries is possible""... $ac_c" 1>&6 -echo "configure:108096: checking whether stripping libraries is possible" >&5 +echo "configure:108626: checking whether stripping libraries is possible" >&5 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" @@ -108103,6 +108633,7 @@ else darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" + old_striplib="$STRIP -S" echo "$ac_t""yes" 1>&6 else echo "$ac_t""no" 1>&6 @@ -108142,7 +108673,7 @@ else darwin*) # if libdl is installed we need to link against it echo $ac_n "checking for dlopen in -ldl""... $ac_c" 1>&6 -echo "configure:108146: checking for dlopen in -ldl" >&5 +echo "configure:108677: checking for dlopen in -ldl" >&5 ac_lib_var=`echo dl'_'dlopen | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -108150,7 +108681,7 @@ else ac_save_LIBS="$LIBS" LIBS="-ldl $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:108696: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -108190,12 +108721,12 @@ fi *) echo $ac_n "checking for shl_load""... $ac_c" 1>&6 -echo "configure:108194: checking for shl_load" >&5 +echo "configure:108725: checking for shl_load" >&5 if eval "test \"`echo '$''{'ac_cv_func_shl_load'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:108753: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_shl_load=yes" else @@ -108236,7 +108767,7 @@ if eval "test \"`echo '$ac_cv_func_'shl_load`\" = yes"; then else echo "$ac_t""no" 1>&6 echo $ac_n "checking for shl_load in -ldld""... $ac_c" 1>&6 -echo "configure:108240: checking for shl_load in -ldld" >&5 +echo "configure:108771: checking for shl_load in -ldld" >&5 ac_lib_var=`echo dld'_'shl_load | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -108244,7 +108775,7 @@ else ac_save_LIBS="$LIBS" LIBS="-ldld $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:108790: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -108270,16 +108801,16 @@ LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 - lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld" + lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" else echo "$ac_t""no" 1>&6 echo $ac_n "checking for dlopen""... $ac_c" 1>&6 -echo "configure:108278: checking for dlopen" >&5 +echo "configure:108809: checking for dlopen" >&5 if eval "test \"`echo '$''{'ac_cv_func_dlopen'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:108837: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_dlopen=yes" else @@ -108320,7 +108851,7 @@ if eval "test \"`echo '$ac_cv_func_'dlopen`\" = yes"; then else echo "$ac_t""no" 1>&6 echo $ac_n "checking for dlopen in -ldl""... $ac_c" 1>&6 -echo "configure:108324: checking for dlopen in -ldl" >&5 +echo "configure:108855: checking for dlopen in -ldl" >&5 ac_lib_var=`echo dl'_'dlopen | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -108328,7 +108859,7 @@ else ac_save_LIBS="$LIBS" LIBS="-ldl $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:108874: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -108358,7 +108889,7 @@ if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then else echo "$ac_t""no" 1>&6 echo $ac_n "checking for dlopen in -lsvld""... $ac_c" 1>&6 -echo "configure:108362: checking for dlopen in -lsvld" >&5 +echo "configure:108893: checking for dlopen in -lsvld" >&5 ac_lib_var=`echo svld'_'dlopen | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -108366,7 +108897,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lsvld $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:108912: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -108396,7 +108927,7 @@ if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then else echo "$ac_t""no" 1>&6 echo $ac_n "checking for dld_link in -ldld""... $ac_c" 1>&6 -echo "configure:108400: checking for dld_link in -ldld" >&5 +echo "configure:108931: checking for dld_link in -ldld" >&5 ac_lib_var=`echo dld'_'dld_link | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -108404,7 +108935,7 @@ else ac_save_LIBS="$LIBS" LIBS="-ldld $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:108950: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -108430,7 +108961,7 @@ LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 - lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld" + lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" else echo "$ac_t""no" 1>&6 fi @@ -108465,13 +108996,13 @@ fi test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" - eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" echo $ac_n "checking whether a program can dlopen itself""... $ac_c" 1>&6 -echo "configure:108475: checking whether a program can dlopen itself" >&5 +echo "configure:109006: checking whether a program can dlopen itself" >&5 if eval "test \"`echo '$''{'lt_cv_dlopen_self'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -108481,7 +109012,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} 2>/dev/null; then + if { (eval echo configure:109079: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 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 ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed @@ -108563,9 +109096,9 @@ fi echo "$ac_t""$lt_cv_dlopen_self" 1>&6 if test "x$lt_cv_dlopen_self" = xyes; then - LDFLAGS="$LDFLAGS $link_static_flag" + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" echo $ac_n "checking whether a statically linked program can dlopen itself""... $ac_c" 1>&6 -echo "configure:108569: checking whether a statically linked program can dlopen itself" >&5 +echo "configure:109102: checking whether a statically linked program can dlopen itself" >&5 if eval "test \"`echo '$''{'lt_cv_dlopen_self_static'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -108575,7 +109108,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} 2>/dev/null; then + if { (eval echo configure:109175: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 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 ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed @@ -108675,13 +109210,13 @@ echo "$ac_t""$lt_cv_dlopen_self_static" 1>&6 fi -# Report which librarie types wil actually be built +# Report which library types will actually be built echo $ac_n "checking if libtool supports shared libraries""... $ac_c" 1>&6 -echo "configure:108681: checking if libtool supports shared libraries" >&5 +echo "configure:109216: checking if libtool supports shared libraries" >&5 echo "$ac_t""$can_build_shared" 1>&6 echo $ac_n "checking whether to build shared libraries""... $ac_c" 1>&6 -echo "configure:108685: checking whether to build shared libraries" >&5 +echo "configure:109220: checking whether to build shared libraries" >&5 test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and @@ -108695,7 +109230,7 @@ aix3*) fi ;; -aix4* | aix5*) +aix[4-9]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi @@ -108704,7 +109239,7 @@ esac echo "$ac_t""$enable_shared" 1>&6 echo $ac_n "checking whether to build static libraries""... $ac_c" 1>&6 -echo "configure:108708: checking whether to build static libraries" >&5 +echo "configure:109243: checking whether to build static libraries" >&5 # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes echo "$ac_t""$enable_static" 1>&6 @@ -108722,7 +109257,7 @@ if test -f "$ltmain"; then # 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 \ + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ SED SHELL STRIP \ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ @@ -108749,6 +109284,7 @@ if test -f "$ltmain"; then predeps \ postdeps \ compiler_lib_search_path \ + compiler_lib_search_dirs \ archive_cmds \ archive_expsym_cmds \ postinstall_cmds \ @@ -108764,6 +109300,7 @@ if test -f "$ltmain"; then module_cmds \ module_expsym_cmds \ lt_cv_prog_compiler_c_o \ + fix_srcfile_path \ exclude_expsyms \ include_expsyms; do @@ -108808,7 +109345,7 @@ creating $ofile" 1>&6 # 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 +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 # Free Software Foundation, Inc. # # This file is part of GNU Libtool: @@ -108888,6 +109425,9 @@ AR_FLAGS=$lt_AR_FLAGS # A C compiler. LTCC=$lt_LTCC +# LTCC compiler flags. +LTCFLAGS=$lt_LTCFLAGS + # A language-specific compiler. CC=$lt_compiler @@ -109041,6 +109581,10 @@ predeps=$lt_predeps # shared library. postdeps=$lt_postdeps +# The directories searched by this compiler when creating a shared +# library +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs + # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path @@ -109129,7 +109673,7 @@ sys_lib_search_path_spec=$lt_sys_lib_search_path_spec 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" +fix_srcfile_path=$lt_fix_srcfile_path # Set to yes if exported symbols are required. always_export_symbols=$always_export_symbols @@ -109216,6 +109760,9 @@ if test -f "$ltmain" && test -n "$tagnames"; then echo "configure: warning: using \`LTCC=$LTCC', extracted from \`$ofile'" 1>&2 fi fi + if test -z "$LTCFLAGS"; then + eval "`$SHELL ${ofile} --config | grep '^LTCFLAGS='`" + fi # Extract list of available tagged configurations in $ofile. # Note that this assumes the entire list is on one line. @@ -109266,6 +109813,7 @@ hardcode_libdir_flag_spec_CXX= hardcode_libdir_flag_spec_ld_CXX= hardcode_libdir_separator_CXX= hardcode_minus_L_CXX=no +hardcode_shlibpath_var_CXX=unsupported hardcode_automatic_CXX=no module_cmds_CXX= module_expsym_cmds_CXX= @@ -109281,6 +109829,7 @@ postdep_objects_CXX= predeps_CXX= postdeps_CXX= compiler_lib_search_path_CXX= +compiler_lib_search_dirs_CXX= # Source file extension for C++ test sources. ac_ext=cpp @@ -109290,32 +109839,35 @@ objext=o objext_CXX=$objext # Code to be used in simple compile tests -lt_simple_compile_test_code="int some_variable = 0;\n" +lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests -lt_simple_link_test_code='int main(int, char *) { return(0); }\n' +lt_simple_link_test_code='int main(int, char *[]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext -printf "$lt_simple_compile_test_code" >conftest.$ac_ext -eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d' >conftest.err +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $rm conftest* ac_outfile=conftest.$ac_objext -printf "$lt_simple_link_test_code" >conftest.$ac_ext -eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d' >conftest.err +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` -$rm conftest* +$rm -r conftest* # Allow CC to be a program name with arguments. @@ -109373,7 +109925,7 @@ ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. echo $ac_n "checking for ld used by $CC""... $ac_c" 1>&6 -echo "configure:109377: checking for ld used by $CC" >&5 +echo "configure:109929: checking for ld used by $CC" >&5 case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw @@ -109403,10 +109955,10 @@ echo "configure:109377: checking for ld used by $CC" >&5 esac elif test "$with_gnu_ld" = yes; then echo $ac_n "checking for GNU ld""... $ac_c" 1>&6 -echo "configure:109407: checking for GNU ld" >&5 +echo "configure:109959: checking for GNU ld" >&5 else echo $ac_n "checking for non-GNU ld""... $ac_c" 1>&6 -echo "configure:109410: checking for non-GNU ld" >&5 +echo "configure:109962: checking for non-GNU ld" >&5 fi if eval "test \"`echo '$''{'lt_cv_path_LD'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -109445,7 +109997,7 @@ else fi test -z "$LD" && { echo "configure: error: no acceptable ld found in \$PATH" 1>&2; exit 1; } echo $ac_n "checking if the linker ($LD) is GNU ld""... $ac_c" 1>&6 -echo "configure:109449: checking if the linker ($LD) is GNU ld" >&5 +echo "configure:110001: checking if the linker ($LD) is GNU ld" >&5 if eval "test \"`echo '$''{'lt_cv_prog_gnu_ld'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -109511,14 +110063,14 @@ fi # PORTME: fill in a description of your system's C++ link characteristics echo $ac_n "checking whether the $compiler linker ($LD) supports shared libraries""... $ac_c" 1>&6 -echo "configure:109515: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +echo "configure:110067: checking whether the $compiler linker ($LD) supports shared libraries" >&5 ld_shlibs_CXX=yes case $host_os in aix3*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; - aix4* | aix5*) + aix[4-9]*) 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. @@ -109531,7 +110083,7 @@ case $host_os in # 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*) + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) @@ -109540,6 +110092,7 @@ case $host_os in ;; esac done + ;; esac exp_sym_flag='-bexport' @@ -109566,7 +110119,7 @@ case $host_os in 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 @@ -109577,6 +110130,7 @@ case $host_os in hardcode_libdir_flag_spec_CXX='-L$libdir' hardcode_libdir_separator_CXX= fi + ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then @@ -109607,18 +110161,25 @@ case $host_os in # Determine the default libpath from the value encoded in an empty executable. cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - -aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'` +if { (eval echo configure:110170: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # 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=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +fi rm -rf conftest* else echo "configure: failed program was:" >&5 @@ -109629,28 +110190,35 @@ 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" + archive_expsym_cmds_CXX="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${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" + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - -aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'` +if { (eval echo configure:110209: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # 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=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +fi rm -rf conftest* else echo "configure: failed program was:" >&5 @@ -109664,16 +110232,26 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi # -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=' ' + whole_archive_flag_spec_CXX='$convenience' archive_cmds_need_lc_CXX=yes # This is similar to how AIX traditionally builds its 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' + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag_CXX=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs_CXX=no + fi + ;; + chorus*) case $cc_basename in *) @@ -109683,7 +110261,6 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi esac ;; - cygwin* | mingw* | pw32*) # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, # as there is no search path for DLLs. @@ -109693,7 +110270,7 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi 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' + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $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 @@ -109702,65 +110279,37 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi 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' + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs_CXX=no fi ;; darwin* | rhapsody*) - case $host_os in - rhapsody* | darwin1.[012]) - allow_undefined_flag_CXX='${wl}-undefined ${wl}suppress' - ;; - *) # Darwin 1.3 on - if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then - allow_undefined_flag_CXX='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' - else - case ${MACOSX_DEPLOYMENT_TARGET} in - 10.[012]) - allow_undefined_flag_CXX='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' - ;; - 10.*) - allow_undefined_flag_CXX='${wl}-undefined ${wl}dynamic_lookup' - ;; - esac - fi - ;; - esac archive_cmds_need_lc_CXX=no hardcode_direct_CXX=no hardcode_automatic_CXX=yes hardcode_shlibpath_var_CXX=unsupported whole_archive_flag_spec_CXX='' link_all_deplibs_CXX=yes - - if test "$GXX" = yes ; then - lt_int_apple_cc_single_mod=no + allow_undefined_flag_CXX="$_lt_dar_allow_undefined" + if test "$GXX" = yes ; then output_verbose_link_cmd='echo' - if $CC -dumpspecs 2>&1 | $EGREP 'single_module' >/dev/null ; then - lt_int_apple_cc_single_mod=yes + archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + if test "$lt_cv_apple_cc_single_mod" != "yes"; then + archive_cmds_CXX="\$CC -r -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${_lt_dsymutil}" + archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -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${_lt_dar_export_syms}${_lt_dsymutil}" 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 -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 $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 lds - 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 -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}' else case $cc_basename in xlc*) output_verbose_link_cmd='echo' - archive_cmds_CXX='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' + archive_cmds_CXX='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring' module_cmds_CXX='$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 lds - archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' 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}' ;; *) @@ -109794,7 +110343,7 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi freebsd-elf*) archive_cmds_need_lc_CXX=no ;; - freebsd* | kfreebsd*-gnu | dragonfly*) + freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions ld_shlibs_CXX=yes @@ -109839,33 +110388,20 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then + hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_CXX=: + 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' - ;; + hppa*64*|ia64*) ;; *) - 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*) + hppa*64*|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 @@ -109882,8 +110418,11 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi ;; aCC*) case $host_cpu in - hppa*64*|ia64*) - archive_cmds_CXX='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' + hppa*64*) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' @@ -109903,8 +110442,11 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi 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' + hppa*64*) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) 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' @@ -109918,6 +110460,20 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi ;; esac ;; + interix[3-9]*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; irix5* | irix6*) case $cc_basename in CC*) @@ -109944,7 +110500,7 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: ;; - linux*) + linux* | k*bsd*-gnu) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler @@ -109996,7 +110552,7 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi export_dynamic_flag_spec_CXX='${wl}--export-dynamic' whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; - pgCC*) + pgCC* | pgcpp*) # Portland Group C++ compiler archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' @@ -110024,6 +110580,29 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi # 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' ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' + hardcode_libdir_flag_spec_CXX='-R$libdir' + whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='echo' + + # 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' + ;; + esac + ;; esac ;; lynxos*) @@ -110062,16 +110641,20 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi ld_shlibs_CXX=no ;; openbsd*) - hardcode_direct_CXX=yes - hardcode_shlibpath_var_CXX=no - archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' - hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' - export_dynamic_flag_spec_CXX='${wl}-E' - whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + if test -f /usr/libexec/ld.so; then + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' + export_dynamic_flag_spec_CXX='${wl}-E' + whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + fi + output_verbose_link_cmd='echo' + else + ld_shlibs_CXX=no fi - output_verbose_link_cmd='echo' ;; osf3*) case $cc_basename in @@ -110200,19 +110783,6 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi # 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*) @@ -110235,26 +110805,21 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi case $cc_basename in CC*) # Sun C++ 4.2, 5.x and Centerline C++ - archive_cmds_need_lc_CXX=yes + archive_cmds_need_lc_CXX=yes no_undefined_flag_CXX=' -zdefs' - archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_cmds_CXX='$CC -G${allow_undefined_flag} -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} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + $CC -G${allow_undefined_flag} ${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. We must also pass each convience library through - # to the system linker between allextract/defaultextract. - # The C++ compiler will combine linker options so we - # cannot just pass the convience library names through - # without $wl. + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) - whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' + whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' ;; esac link_all_deplibs_CXX=yes @@ -110301,12 +110866,69 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi fi hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + ;; + esac fi ;; esac ;; - sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag_CXX='${wl}-z,text' + archive_cmds_need_lc_CXX=no + hardcode_shlibpath_var_CXX=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + # So that behaviour is only enabled if SCOABSPATH is set to a + # non-empty value in the environment. Most likely only useful for + # creating official distributions of packages. + # This is a hack until libtool officially supports absolute path + # names for shared libraries. + no_undefined_flag_CXX='${wl}-z,text' + allow_undefined_flag_CXX='${wl}-z,nodefs' archive_cmds_need_lc_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + export_dynamic_flag_spec_CXX='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + archive_cmds_CXX='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac ;; tandem*) case $cc_basename in @@ -110340,7 +110962,6 @@ LD_CXX="$LD" ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... - cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:110976: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then # Parse the compiler output and extract the necessary # objects, libraries and library flags. @@ -110438,20 +111059,66 @@ fi $rm -f confest.$objext +compiler_lib_search_dirs_CXX= +if test -n "$compiler_lib_search_path_CXX"; then + compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` +fi + # PORTME: override above test on systems where it is broken case $host_os in +interix[3-9]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + predep_objects_CXX= + postdep_objects_CXX= + postdeps_CXX= + ;; + +linux*) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + # + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + if test "$solaris_use_stlport4" != yes; then + postdeps_CXX='-library=Cstd -library=Crun' + fi + ;; + esac + ;; + solaris*) case $cc_basename in CC*) + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. - postdeps_CXX='-lCstd -lCrun' + if test "$solaris_use_stlport4" != yes; then + postdeps_CXX='-library=Cstd -library=Crun' + fi ;; esac + ;; esac - case " $postdeps_CXX " in *" -lc "*) archive_cmds_need_lc_CXX=no ;; esac @@ -110461,7 +111128,7 @@ lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX= echo $ac_n "checking for $compiler option to produce PIC""... $ac_c" 1>&6 -echo "configure:110465: checking for $compiler option to produce PIC" >&5 +echo "configure:111132: checking for $compiler option to produce PIC" >&5 # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then @@ -110482,13 +111149,15 @@ echo "configure:110465: checking for $compiler option to produce PIC" >&5 # like `-m68040'. lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' ;; - beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; - mingw* | os2* | pw32*) + mingw* | cygwin* | 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' + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic_CXX='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform @@ -110499,6 +111168,10 @@ echo "configure:110465: checking for $compiler option to produce PIC" >&5 # DJGPP does not support shared libraries at all lt_prog_compiler_pic_CXX= ;; + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_CXX=-Kconform_pic @@ -110521,7 +111194,7 @@ echo "configure:110465: checking for $compiler option to produce PIC" >&5 esac else case $host_os in - aix4* | aix5*) + aix[4-9]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor @@ -110561,21 +111234,21 @@ echo "configure:110465: checking for $compiler option to produce PIC" >&5 ;; esac ;; - freebsd* | kfreebsd*-gnu | dragonfly*) + freebsd* | dragonfly*) # 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" + lt_prog_compiler_static_CXX='${wl}-a ${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" + lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default @@ -110589,6 +111262,10 @@ echo "configure:110465: checking for $compiler option to produce PIC" >&5 ;; esac ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) @@ -110600,7 +111277,7 @@ echo "configure:110465: checking for $compiler option to produce PIC" >&5 ;; esac ;; - linux*) + linux* | k*bsd*-gnu) case $cc_basename in KCC*) # KAI C++ Compiler @@ -110619,7 +111296,7 @@ echo "configure:110465: checking for $compiler option to produce PIC" >&5 lt_prog_compiler_pic_CXX='-fPIC' lt_prog_compiler_static_CXX='-static' ;; - pgCC*) + pgCC* | pgcpp*) # Portland Group C++ compiler. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fpic' @@ -110633,6 +111310,14 @@ echo "configure:110465: checking for $compiler option to produce PIC" >&5 lt_prog_compiler_static_CXX='-non_shared' ;; *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + esac ;; esac ;; @@ -110674,15 +111359,6 @@ echo "configure:110465: checking for $compiler option to produce PIC" >&5 ;; psos*) ;; - sco*) - case $cc_basename in - CC*) - lt_prog_compiler_pic_CXX='-fPIC' - ;; - *) - ;; - esac - ;; solaris*) case $cc_basename in CC*) @@ -110724,7 +111400,14 @@ echo "configure:110465: checking for $compiler option to produce PIC" >&5 ;; esac ;; - unixware*) + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + esac ;; vxworks*) ;; @@ -110742,13 +111425,13 @@ echo "$ac_t""$lt_prog_compiler_pic_CXX" 1>&6 if test -n "$lt_prog_compiler_pic_CXX"; then echo $ac_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works""... $ac_c" 1>&6 -echo "configure:110746: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 -if eval "test \"`echo '$''{'lt_prog_compiler_pic_works_CXX'+set}'`\" = set"; then +echo "configure:111429: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 +if eval "test \"`echo '$''{'lt_cv_prog_compiler_pic_works_CXX'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else - lt_prog_compiler_pic_works_CXX=no + lt_cv_prog_compiler_pic_works_CXX=no ac_outfile=conftest.$ac_objext - printf "$lt_simple_compile_test_code" > conftest.$ac_ext + echo "$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. @@ -110759,27 +111442,27 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"configure:110763: $lt_compile\"" >&5) + (eval echo "\"configure:111446: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "configure:110767: \$? = $ac_status" >&5 + echo "configure:111450: \$? = $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 other than the usual output. - $echo "X$_lt_compiler_boilerplate" | $Xsed >conftest.exp - $SED '/^$/d' conftest.err >conftest.er2 - if test ! -s conftest.err || diff conftest.exp conftest.er2 >/dev/null; then - lt_prog_compiler_pic_works_CXX=yes + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works_CXX=yes fi fi $rm conftest* fi -echo "$ac_t""$lt_prog_compiler_pic_works_CXX" 1>&6 +echo "$ac_t""$lt_cv_prog_compiler_pic_works_CXX" 1>&6 -if test x"$lt_prog_compiler_pic_works_CXX" = xyes; then +if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then case $lt_prog_compiler_pic_CXX in "" | " "*) ;; *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; @@ -110800,8 +111483,50 @@ case $host_os in ;; esac +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" +echo $ac_n "checking if $compiler static flag $lt_tmp_static_flag works""... $ac_c" 1>&6 +echo "configure:111492: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +if eval "test \"`echo '$''{'lt_cv_prog_compiler_static_works_CXX'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + lt_cv_prog_compiler_static_works_CXX=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker 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 + $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works_CXX=yes + fi + else + lt_cv_prog_compiler_static_works_CXX=yes + fi + fi + $rm -r conftest* + LDFLAGS="$save_LDFLAGS" + +fi + +echo "$ac_t""$lt_cv_prog_compiler_static_works_CXX" 1>&6 + +if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then + : +else + lt_prog_compiler_static_CXX= +fi + + echo $ac_n "checking if $compiler supports -c -o file.$ac_objext""... $ac_c" 1>&6 -echo "configure:110805: checking if $compiler supports -c -o file.$ac_objext" >&5 +echo "configure:111530: checking if $compiler supports -c -o file.$ac_objext" >&5 if eval "test \"`echo '$''{'lt_cv_prog_compiler_c_o_CXX'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -110810,7 +111535,7 @@ else mkdir conftest cd conftest mkdir out - printf "$lt_simple_compile_test_code" > conftest.$ac_ext + echo "$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 @@ -110821,18 +111546,18 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"configure:110825: $lt_compile\"" >&5) + (eval echo "\"configure:111550: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "configure:110829: \$? = $ac_status" >&5 + echo "configure:111554: \$? = $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 - $echo "X$_lt_compiler_boilerplate" | $Xsed > out/conftest.exp - $SED '/^$/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.err || diff out/conftest.exp out/conftest.er2 >/dev/null; then + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi @@ -110855,7 +111580,7 @@ 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 $ac_n "checking if we can lock with hard links""... $ac_c" 1>&6 -echo "configure:110859: checking if we can lock with hard links" >&5 +echo "configure:111584: checking if we can lock with hard links" >&5 hard_links=yes $rm conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no @@ -110872,11 +111597,11 @@ else fi echo $ac_n "checking whether the $compiler linker ($LD) supports shared libraries""... $ac_c" 1>&6 -echo "configure:110876: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +echo "configure:111601: checking whether the $compiler linker ($LD) supports shared libraries" >&5 export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' case $host_os in - aix4* | aix5*) + aix[4-9]*) # 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 @@ -110889,21 +111614,17 @@ echo "configure:110876: checking whether the $compiler linker ($LD) supports sha export_symbols_cmds_CXX="$ltdll_cmds" ;; cygwin* | mingw*) - export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/;/^.* __nm__/s/^.* __nm__\([^ ]*\) [^ ]*/\1 DATA/;/^I /d;/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;/^.*[ ]__nm__/s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac + exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' echo "$ac_t""$ld_shlibs_CXX" 1>&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? # @@ -110922,16 +111643,17 @@ x|xyes) # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. echo $ac_n "checking whether -lc should be explicitly linked in""... $ac_c" 1>&6 -echo "configure:110926: checking whether -lc should be explicitly linked in" >&5 +echo "configure:111647: checking whether -lc should be explicitly linked in" >&5 $rm conftest* - printf "$lt_simple_compile_test_code" > conftest.$ac_ext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext - if { (eval echo configure:110930: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; } 2>conftest.err; then + if { (eval echo configure:111651: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_CXX + pic_flag=$lt_prog_compiler_pic_CXX compiler_flags=-v linker_flags=-v verstring= @@ -110939,7 +111661,7 @@ echo "configure:110926: checking whether -lc should be explicitly linked in" >&5 libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_CXX allow_undefined_flag_CXX= - if { (eval echo configure:110943: \"$archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\") 1>&5; (eval $archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5; } + if { (eval echo configure:111665: \"$archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\") 1>&5; (eval $archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5; } then archive_cmds_need_lc_CXX=no else @@ -110958,7 +111680,7 @@ echo "configure:110926: checking whether -lc should be explicitly linked in" >&5 esac echo $ac_n "checking dynamic linker characteristics""... $ac_c" 1>&6 -echo "configure:110962: checking dynamic linker characteristics" >&5 +echo "configure:111684: checking dynamic linker characteristics" >&5 library_names_spec= libname_spec='lib$name' soname_spec= @@ -110972,20 +111694,7 @@ 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 @@ -111003,7 +111712,7 @@ aix3*) soname_spec='${libname}${release}${shared_ext}$major' ;; -aix4* | aix5*) +aix[4-9]*) version_type=linux need_lib_prefix=no need_version=no @@ -111142,12 +111851,7 @@ darwin* | rhapsody*) 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' ;; @@ -111164,18 +111868,6 @@ 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* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. @@ -111208,10 +111900,15 @@ freebsd* | dragonfly*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; - *) # from 3.2 on + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; esac ;; @@ -111271,6 +111968,18 @@ hpux9* | hpux10* | hpux11*) postinstall_cmds='chmod 555 $lib' ;; +interix[3-9]*) + 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' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; @@ -111314,7 +112023,7 @@ linux*oldld* | linux*aout* | linux*coff*) ;; # This must be Linux ELF. -linux*) +linux* | k*bsd*-gnu) version_type=linux need_lib_prefix=no need_version=no @@ -111328,27 +112037,10 @@ linux*) # 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 111336 "configure"' > conftest.$ac_ext - if { (eval echo configure:111337: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; 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" + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on @@ -111360,18 +112052,6 @@ linux*) 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 @@ -111409,6 +112089,7 @@ nto-qnx*) openbsd*) version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in @@ -111452,11 +112133,8 @@ osf3* | osf4* | osf5*) 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 +rdos*) + dynamic_linker=no ;; solaris*) @@ -111484,7 +112162,7 @@ sunos4*) need_version=yes ;; -sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) +sysv4 | sysv4.3*) 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' @@ -111517,6 +112195,29 @@ sysv4*MP*) fi ;; +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + shlibpath_overrides_runpath=no + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + shlibpath_overrides_runpath=yes + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' @@ -111531,8 +112232,28 @@ esac echo "$ac_t""$dynamic_linker" 1>&6 test "$dynamic_linker" = no && can_build_shared=no +if eval "test \"`echo '$''{'lt_cv_sys_lib_search_path_spec'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + lt_cv_sys_lib_search_path_spec="$sys_lib_search_path_spec" +fi + +sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +if eval "test \"`echo '$''{'lt_cv_sys_lib_dlsearch_path_spec'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + lt_cv_sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec" +fi + +sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" + +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 + echo $ac_n "checking how to hardcode library paths into programs""... $ac_c" 1>&6 -echo "configure:111536: checking how to hardcode library paths into programs" >&5 +echo "configure:112257: checking how to hardcode library paths into programs" >&5 hardcode_action_CXX= if test -n "$hardcode_libdir_flag_spec_CXX" || \ test -n "$runpath_var_CXX" || \ @@ -111567,612 +112288,6 @@ elif test "$shlibpath_overrides_runpath" = yes || enable_fast_install=needless fi -striplib= -old_striplib= -echo $ac_n "checking whether stripping libraries is possible""... $ac_c" 1>&6 -echo "configure:111574: checking whether stripping libraries is possible" >&5 -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 "$ac_t""yes" 1>&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 "$ac_t""yes" 1>&6 - else - echo "$ac_t""no" 1>&6 -fi - ;; - *) - echo "$ac_t""no" 1>&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 $ac_n "checking for dlopen in -ldl""... $ac_c" 1>&6 -echo "configure:111624: checking for dlopen in -ldl" >&5 -ac_lib_var=`echo dl'_'dlopen | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-ldl $LIBS" -cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=no" -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then - echo "$ac_t""yes" 1>&6 - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" -else - echo "$ac_t""no" 1>&6 - - lt_cv_dlopen="dyld" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - -fi - - ;; - - *) - echo $ac_n "checking for shl_load""... $ac_c" 1>&6 -echo "configure:111675: checking for shl_load" >&5 -if eval "test \"`echo '$''{'ac_cv_func_shl_load'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -/* 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() { - -/* 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 -shl_load(); -#endif - -; return 0; } -EOF -if { (eval echo configure:111706: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_func_shl_load=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_func_shl_load=no" -fi -rm -f conftest* -fi - -if eval "test \"`echo '$ac_cv_func_'shl_load`\" = yes"; then - echo "$ac_t""yes" 1>&6 - lt_cv_dlopen="shl_load" -else - echo "$ac_t""no" 1>&6 -echo $ac_n "checking for shl_load in -ldld""... $ac_c" 1>&6 -echo "configure:111724: checking for shl_load in -ldld" >&5 -ac_lib_var=`echo dld'_'shl_load | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-ldld $LIBS" -cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=no" -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then - echo "$ac_t""yes" 1>&6 - lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld" -else - echo "$ac_t""no" 1>&6 -echo $ac_n "checking for dlopen""... $ac_c" 1>&6 -echo "configure:111765: checking for dlopen" >&5 -if eval "test \"`echo '$''{'ac_cv_func_dlopen'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -/* 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() { - -/* 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 -dlopen(); -#endif - -; return 0; } -EOF -if { (eval echo configure:111796: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_func_dlopen=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_func_dlopen=no" -fi -rm -f conftest* -fi - -if eval "test \"`echo '$ac_cv_func_'dlopen`\" = yes"; then - echo "$ac_t""yes" 1>&6 - lt_cv_dlopen="dlopen" -else - echo "$ac_t""no" 1>&6 -echo $ac_n "checking for dlopen in -ldl""... $ac_c" 1>&6 -echo "configure:111814: checking for dlopen in -ldl" >&5 -ac_lib_var=`echo dl'_'dlopen | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-ldl $LIBS" -cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=no" -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then - echo "$ac_t""yes" 1>&6 - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" -else - echo "$ac_t""no" 1>&6 -echo $ac_n "checking for dlopen in -lsvld""... $ac_c" 1>&6 -echo "configure:111855: checking for dlopen in -lsvld" >&5 -ac_lib_var=`echo svld'_'dlopen | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-lsvld $LIBS" -cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=no" -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then - echo "$ac_t""yes" 1>&6 - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" -else - echo "$ac_t""no" 1>&6 -echo $ac_n "checking for dld_link in -ldld""... $ac_c" 1>&6 -echo "configure:111896: checking for dld_link in -ldld" >&5 -ac_lib_var=`echo dld'_'dld_link | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-ldld $LIBS" -cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=no" -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then - echo "$ac_t""yes" 1>&6 - lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld" -else - echo "$ac_t""no" 1>&6 -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 $ac_n "checking whether a program can dlopen itself""... $ac_c" 1>&6 -echo "configure:111974: checking whether a program can dlopen itself" >&5 -if eval "test \"`echo '$''{'lt_cv_dlopen_self'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&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 < -#endif - -#include - -#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 configure:112045: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} 2>/dev/null; then - (./conftest; exit; ) >&5 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 "$ac_t""$lt_cv_dlopen_self" 1>&6 - - if test "x$lt_cv_dlopen_self" = xyes; then - LDFLAGS="$LDFLAGS $link_static_flag" - echo $ac_n "checking whether a statically linked program can dlopen itself""... $ac_c" 1>&6 -echo "configure:112068: checking whether a statically linked program can dlopen itself" >&5 -if eval "test \"`echo '$''{'lt_cv_dlopen_self_static'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&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 < -#endif - -#include - -#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 configure:112139: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} 2>/dev/null; then - (./conftest; exit; ) >&5 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 "$ac_t""$lt_cv_dlopen_self_static" 1>&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 @@ -112187,7 +112302,7 @@ if test -f "$ltmain"; then # 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 \ + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ SED SHELL STRIP \ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ @@ -112214,6 +112329,7 @@ if test -f "$ltmain"; then predeps_CXX \ postdeps_CXX \ compiler_lib_search_path_CXX \ + compiler_lib_search_dirs_CXX \ archive_cmds_CXX \ archive_expsym_cmds_CXX \ postinstall_cmds_CXX \ @@ -112229,6 +112345,7 @@ if test -f "$ltmain"; then module_cmds_CXX \ module_expsym_cmds_CXX \ lt_cv_prog_compiler_c_o_CXX \ + fix_srcfile_path_CXX \ exclude_expsyms_CXX \ include_expsyms_CXX; do @@ -112305,6 +112422,9 @@ AR_FLAGS=$lt_AR_FLAGS # A C compiler. LTCC=$lt_LTCC +# LTCC compiler flags. +LTCFLAGS=$lt_LTCFLAGS + # A language-specific compiler. CC=$lt_compiler_CXX @@ -112458,6 +112578,10 @@ predeps=$lt_predeps_CXX # shared library. postdeps=$lt_postdeps_CXX +# The directories searched by this compiler when creating a shared +# library +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_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 @@ -112546,7 +112670,7 @@ sys_lib_search_path_spec=$lt_sys_lib_search_path_spec 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" +fix_srcfile_path=$lt_fix_srcfile_path # Set to yes if exported symbols are required. always_export_symbols=$always_export_symbols_CXX @@ -112602,26 +112726,6 @@ lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld 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 -# ;; - *) { echo "configure: error: Unsupported tag name: $tagname" 1>&2; exit 1; } ;; @@ -112665,8 +112769,6 @@ LIBTOOL='$(SHELL) $(top_builddir)/libtool' - - if test "$enable_debug" != "yes"; then if test -z "$LIBTOOL"; then @@ -112691,14 +112793,6 @@ SHARED_LIBTOOL='$(LIBTOOL)' CC=$old_CC -if test "$php_did_darwin9_cheat" -eq 1; then - if test "$PHP_DEBUG" = "1"; then - CFLAGS=`echo "$CFLAGS" | $SED -e 's/-gstabs/-g/g'` - else - CFLAGS=`echo "-O2 $CFLAGS" | $SED -e 's/-gstabs//g'` - fi -fi - echo "$ac_t""" 1>&6 echo "$ac_t""${T_MD}Generating files${T_ME}" 1>&6 @@ -113457,6 +113551,7 @@ s%@INCLUDE_PATH@%$INCLUDE_PATH%g s%@EXPANDED_PEAR_INSTALLDIR@%$EXPANDED_PEAR_INSTALLDIR%g s%@EXPANDED_EXTENSION_DIR@%$EXPANDED_EXTENSION_DIR%g s%@EXPANDED_BINDIR@%$EXPANDED_BINDIR%g +s%@EXPANDED_SBINDIR@%$EXPANDED_SBINDIR%g s%@EXPANDED_LIBDIR@%$EXPANDED_LIBDIR%g s%@EXPANDED_DATADIR@%$EXPANDED_DATADIR%g s%@EXPANDED_SYSCONFDIR@%$EXPANDED_SYSCONFDIR%g @@ -113495,6 +113590,8 @@ s%@EXEEXT@%$EXEEXT%g s%@ECHO@%$ECHO%g s%@AR@%$AR%g s%@STRIP@%$STRIP%g +s%@DSYMUTIL@%$DSYMUTIL%g +s%@NMEDIT@%$NMEDIT%g s%@LIBTOOL@%$LIBTOOL%g CEOF diff --git a/configure.in b/configure.in index 388d3af22..ff29b8329 100644 --- a/configure.in +++ b/configure.in @@ -1,4 +1,4 @@ -## $Id: configure.in 290928 2009-11-18 19:43:33Z johannes $ -*- autoconf -*- +## $Id: configure.in 295792 2010-03-03 16:36:07Z johannes $ -*- autoconf -*- dnl ## Process this file with autoconf to produce a configure script. divert(1) @@ -41,7 +41,7 @@ AC_CONFIG_HEADER(main/php_config.h) PHP_MAJOR_VERSION=5 PHP_MINOR_VERSION=3 -PHP_RELEASE_VERSION=1 +PHP_RELEASE_VERSION=2 PHP_EXTRA_VERSION="" PHP_VERSION="$PHP_MAJOR_VERSION.$PHP_MINOR_VERSION.$PHP_RELEASE_VERSION$PHP_EXTRA_VERSION" PHP_VERSION_ID=`expr [$]PHP_MAJOR_VERSION \* 10000 + [$]PHP_MINOR_VERSION \* 100 + [$]PHP_RELEASE_VERSION` @@ -122,21 +122,6 @@ dnl or the contents of libs. $php_shtool mkdir -p libs rm -f libs/* -dnl Darwin 9 hack -dnl Because the default debugging format used by Apple's GCC on Mac OS 10.5 -dnl causes errors in all current and past versions of Autoconf, we do a little -dnl messing with the CFLAGS here to trick it. -php_did_darwin9_cheat=0 -case $host_alias in -*darwin9*) - hasg=`echo $CFLAGS | grep -E '(^-g)|([[:space:]]-g)'` - if test x"$hasg" = "x"; then - php_did_darwin9_cheat=1 - CFLAGS="$CFLAGS -gstabs" - fi - ;; -esac - dnl Checks for programs. dnl ------------------------------------------------------------------------- @@ -402,9 +387,6 @@ dnl Check for inet_aton dnl in -lc, -lbind and -lresolv PHP_CHECK_FUNC(inet_aton, resolv, bind) -dnl Some systems (like OpenSolaris) do not have nanosleep in libc -PHP_CHECK_FUNC(nanosleep, rt) - dnl Then headers. dnl ------------------------------------------------------------------------- @@ -424,7 +406,6 @@ sys/time.h \ netinet/in.h \ alloca.h \ arpa/inet.h \ -arpa/nameser_compat.h \ arpa/nameser.h \ assert.h \ crypt.h \ @@ -629,6 +610,9 @@ vasprintf \ asprintf \ ) +dnl Some systems (like OpenSolaris) do not have nanosleep in libc +AC_CACHE_CHECK([for nanosleep], ac_cv_func_nanosleep, [PHP_CHECK_FUNC_LIB(nanosleep, rt)]) + dnl Check for getaddrinfo, should be a better way, but... dnl Also check for working getaddrinfo AC_CACHE_CHECK([for getaddrinfo], ac_cv_func_getaddrinfo, @@ -1171,6 +1155,7 @@ EXPANDED_PEAR_INSTALLDIR=`eval echo $PEAR_INSTALLDIR` EXPANDED_EXTENSION_DIR=`eval echo $EXTENSION_DIR` EXPANDED_LOCALSTATEDIR=`eval echo $localstatedir` EXPANDED_BINDIR=`eval echo $bindir` +EXPANDED_SBINDIR=`eval echo $sbindir` EXPANDED_LIBDIR=$libdir EXPANDED_SYSCONFDIR=`eval echo $sysconfdir` EXPANDED_DATADIR=$datadir @@ -1186,6 +1171,7 @@ AC_SUBST(INCLUDE_PATH) AC_SUBST(EXPANDED_PEAR_INSTALLDIR) AC_SUBST(EXPANDED_EXTENSION_DIR) AC_SUBST(EXPANDED_BINDIR) +AC_SUBST(EXPANDED_SBINDIR) AC_SUBST(EXPANDED_LIBDIR) AC_SUBST(EXPANDED_DATADIR) AC_SUBST(EXPANDED_SYSCONFDIR) @@ -1230,12 +1216,14 @@ if test "$PHP_CLI" != "no"; then PHP_INSTALL_CLI_TARGET="install-cli" PHP_ADD_SOURCES(sapi/cli, php_cli.c php_cli_readline.c,, cli) PHP_INSTALLED_SAPIS="cli $PHP_SAPI" + PHP_EXECUTABLE="\$(top_builddir)/\$(SAPI_CLI_PATH)" else PHP_INSTALLED_SAPIS="$PHP_SAPI" fi PHP_SUBST_OLD(PHP_INSTALLED_SAPIS) +PHP_SUBST(PHP_EXECUTABLE) PHP_SUBST(PHP_CLI_TARGET) PHP_SUBST(PHP_SAPI_OBJS) PHP_SUBST(PHP_CLI_OBJS) @@ -1252,6 +1240,7 @@ PHP_SUBST_OLD(php_abs_top_builddir) PHP_SUBST_OLD(php_abs_top_srcdir) PHP_SUBST(bindir) +PHP_SUBST(sbindir) PHP_SUBST(exec_prefix) PHP_SUBST_OLD(program_prefix) PHP_SUBST_OLD(program_suffix) @@ -1336,6 +1325,14 @@ PHP_CONFIGURE_PART(Configuring libtool) LDFLAGS="$LDFLAGS $PHP_AIX_LDFLAGS" +dnl Autoconf 2.13's libtool checks go slightly nuts on Mac OS X 10.5 and 10.6. +dnl This hack works around it. Ugly. +case $host_alias in +*darwin9*|*darwin10*) + ac_cv_exeext= + ;; +esac + dnl Only allow AC_PROG_CXX and AC_PROG_CXXCPP if they are explicitly called (by PHP_REQUIRE_CXX). dnl Otherwise AC_PROG_LIBTOOL fails if there is no working C++ compiler. AC_PROVIDE_IFELSE([PHP_REQUIRE_CXX], [], [ @@ -1359,15 +1356,6 @@ SHARED_LIBTOOL='$(LIBTOOL)' CC=$old_CC -dnl Finish the Darwin hack -if test "$php_did_darwin9_cheat" -eq 1; then - if test "$PHP_DEBUG" = "1"; then - CFLAGS=`echo "$CFLAGS" | $SED -e 's/-gstabs/-g/g'` - else - CFLAGS=`echo "-O2 $CFLAGS" | $SED -e 's/-gstabs//g'` - fi -fi - PHP_CONFIGURE_PART(Generating files) CXXFLAGS_CLEAN=$CXXFLAGS diff --git a/ext/bcmath/bcmath.c b/ext/bcmath/bcmath.c index 66485ce3f..85440d668 100644 --- a/ext/bcmath/bcmath.c +++ b/ext/bcmath/bcmath.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: bcmath.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: bcmath.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/bcmath/php_bcmath.h b/ext/bcmath/php_bcmath.h index 49cdc1af0..888bb15be 100644 --- a/ext/bcmath/php_bcmath.h +++ b/ext/bcmath/php_bcmath.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_bcmath.h 287499 2009-08-20 11:19:20Z jani $ */ +/* $Id: php_bcmath.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_BCMATH_H #define PHP_BCMATH_H diff --git a/ext/bz2/bz2.c b/ext/bz2/bz2.c index 70eefc827..9ecaf29e1 100644 --- a/ext/bz2/bz2.c +++ b/ext/bz2/bz2.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: bz2.c 280600 2009-05-15 17:28:08Z kalle $ */ +/* $Id: bz2.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/bz2/bz2_filter.c b/ext/bz2/bz2_filter.c index 1522895bf..9daf498e0 100644 --- a/ext/bz2/bz2_filter.c +++ b/ext/bz2/bz2_filter.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: bz2_filter.c 275246 2009-02-05 21:45:43Z sixd $ */ +/* $Id: bz2_filter.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/bz2/php_bz2.h b/ext/bz2/php_bz2.h index 4c9085610..c97a8e91f 100644 --- a/ext/bz2/php_bz2.h +++ b/ext/bz2/php_bz2.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_bz2.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_bz2.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_BZ2_H #define PHP_BZ2_H diff --git a/ext/calendar/cal_unix.c b/ext/calendar/cal_unix.c index 117156de2..1a81f9d50 100644 --- a/ext/calendar/cal_unix.c +++ b/ext/calendar/cal_unix.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | diff --git a/ext/calendar/calendar.c b/ext/calendar/calendar.c index 5efc73928..6884d171d 100644 --- a/ext/calendar/calendar.c +++ b/ext/calendar/calendar.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -18,7 +18,7 @@ | Wez Furlong | +----------------------------------------------------------------------+ */ -/* $Id: calendar.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: calendar.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/calendar/easter.c b/ext/calendar/easter.c index 96509789d..dd3c63ffc 100644 --- a/ext/calendar/easter.c +++ b/ext/calendar/easter.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | diff --git a/ext/com_dotnet/com_com.c b/ext/com_dotnet/com_com.c index 7395ed2a6..9d36133f3 100644 --- a/ext/com_dotnet/com_com.c +++ b/ext/com_dotnet/com_com.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: com_com.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: com_com.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/com_dotnet/com_dotnet.c b/ext/com_dotnet/com_dotnet.c index 5d77d9e1f..9625e04e5 100644 --- a/ext/com_dotnet/com_dotnet.c +++ b/ext/com_dotnet/com_dotnet.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: com_dotnet.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: com_dotnet.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/com_dotnet/com_extension.c b/ext/com_dotnet/com_extension.c index 1b64d41d2..9606cc914 100644 --- a/ext/com_dotnet/com_extension.c +++ b/ext/com_dotnet/com_extension.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: com_extension.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: com_extension.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/com_dotnet/com_handlers.c b/ext/com_dotnet/com_handlers.c index 5256b8576..e25273490 100644 --- a/ext/com_dotnet/com_handlers.c +++ b/ext/com_dotnet/com_handlers.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: com_handlers.c 280806 2009-05-19 17:38:29Z kalle $ */ +/* $Id: com_handlers.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/com_dotnet/com_iterator.c b/ext/com_dotnet/com_iterator.c index 835320339..4423da297 100644 --- a/ext/com_dotnet/com_iterator.c +++ b/ext/com_dotnet/com_iterator.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: com_iterator.c 280806 2009-05-19 17:38:29Z kalle $ */ +/* $Id: com_iterator.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/com_dotnet/com_misc.c b/ext/com_dotnet/com_misc.c index 525dfa487..3cea97006 100644 --- a/ext/com_dotnet/com_misc.c +++ b/ext/com_dotnet/com_misc.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: com_misc.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: com_misc.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/com_dotnet/com_olechar.c b/ext/com_dotnet/com_olechar.c index 209446c33..8692517da 100644 --- a/ext/com_dotnet/com_olechar.c +++ b/ext/com_dotnet/com_olechar.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: com_olechar.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: com_olechar.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/com_dotnet/com_persist.c b/ext/com_dotnet/com_persist.c index c19b5a4ff..7bfc341e7 100755 --- a/ext/com_dotnet/com_persist.c +++ b/ext/com_dotnet/com_persist.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: com_persist.c 280806 2009-05-19 17:38:29Z kalle $ */ +/* $Id: com_persist.c 293036 2010-01-03 09:23:27Z sebastian $ */ /* Infrastructure for working with persistent COM objects. * Implements: IStream* wrapper for PHP streams. diff --git a/ext/com_dotnet/com_saproxy.c b/ext/com_dotnet/com_saproxy.c index 4c9e61f0b..10fe37ef5 100644 --- a/ext/com_dotnet/com_saproxy.c +++ b/ext/com_dotnet/com_saproxy.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: com_saproxy.c 280806 2009-05-19 17:38:29Z kalle $ */ +/* $Id: com_saproxy.c 293036 2010-01-03 09:23:27Z sebastian $ */ /* This module implements a SafeArray proxy which is used internally * by the engine when resolving multi-dimensional array accesses on diff --git a/ext/com_dotnet/com_typeinfo.c b/ext/com_dotnet/com_typeinfo.c index a26175d6f..3c032313c 100644 --- a/ext/com_dotnet/com_typeinfo.c +++ b/ext/com_dotnet/com_typeinfo.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: com_typeinfo.c 289996 2009-10-27 19:16:55Z pajoye $ */ +/* $Id: com_typeinfo.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/com_dotnet/com_variant.c b/ext/com_dotnet/com_variant.c index 44e5daa81..85e17745d 100644 --- a/ext/com_dotnet/com_variant.c +++ b/ext/com_dotnet/com_variant.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: com_variant.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: com_variant.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/com_dotnet/com_wrapper.c b/ext/com_dotnet/com_wrapper.c index 0b2cd1419..76d1473ed 100644 --- a/ext/com_dotnet/com_wrapper.c +++ b/ext/com_dotnet/com_wrapper.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: com_wrapper.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: com_wrapper.c 293036 2010-01-03 09:23:27Z sebastian $ */ /* This module exports a PHP object as a COM object by wrapping it * using IDispatchEx */ diff --git a/ext/com_dotnet/php_com_dotnet.h b/ext/com_dotnet/php_com_dotnet.h index 092a82638..5660c6e75 100644 --- a/ext/com_dotnet/php_com_dotnet.h +++ b/ext/com_dotnet/php_com_dotnet.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_com_dotnet.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_com_dotnet.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_COM_DOTNET_H #define PHP_COM_DOTNET_H diff --git a/ext/com_dotnet/php_com_dotnet_internal.h b/ext/com_dotnet/php_com_dotnet_internal.h index 54963b939..f8715ff4c 100644 --- a/ext/com_dotnet/php_com_dotnet_internal.h +++ b/ext/com_dotnet/php_com_dotnet_internal.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_com_dotnet_internal.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_com_dotnet_internal.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_COM_DOTNET_INTERNAL_H #define PHP_COM_DOTNET_INTERNAL_H diff --git a/ext/ctype/ctype.c b/ext/ctype/ctype.c index 2297d8e18..1e02621cd 100644 --- a/ext/ctype/ctype.c +++ b/ext/ctype/ctype.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | diff --git a/ext/ctype/php_ctype.h b/ext/ctype/php_ctype.h index 62c8d6022..ea4f33886 100644 --- a/ext/ctype/php_ctype.h +++ b/ext/ctype/php_ctype.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | diff --git a/ext/curl/interface.c b/ext/curl/interface.c index 98883e97d..1f6f6a928 100644 --- a/ext/curl/interface.c +++ b/ext/curl/interface.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: interface.c 289495 2009-10-10 09:24:59Z pajoye $ */ +/* $Id: interface.c 294464 2010-02-03 20:53:31Z pajoye $ */ #define ZEND_INCLUDE_FULL_WINDOWS_HEADERS @@ -629,6 +629,9 @@ PHP_MINIT_FUNCTION(curl) REGISTER_CURL_CONSTANT(CURLINFO_REDIRECT_COUNT); REGISTER_CURL_CONSTANT(CURLINFO_HEADER_OUT); REGISTER_CURL_CONSTANT(CURLINFO_PRIVATE); +#if LIBCURL_VERSION_NUM > 0x071301 + REGISTER_CURL_CONSTANT(CURLINFO_CERTINFO); +#endif /* cURL protocol constants (curl_version) */ REGISTER_CURL_CONSTANT(CURL_VERSION_IPV6); @@ -745,6 +748,11 @@ PHP_MINIT_FUNCTION(curl) REGISTER_CURL_CONSTANT(CURLFTPSSL_ALL); #endif +#if LIBCURL_VERSION_NUM > 0x071301 + REGISTER_CURL_CONSTANT(CURLOPT_CERTINFO); + REGISTER_CURL_CONSTANT(CURLOPT_POSTREDIR); +#endif + /* SSH support works in 7.19.0+ using libssh2 */ #if LIBCURL_VERSION_NUM >= 0x071300 REGISTER_CURL_CONSTANT(CURLSSH_AUTH_NONE); @@ -781,6 +789,7 @@ PHP_MINIT_FUNCTION(curl) #if LIBCURL_VERSION_NUM >= 0x070f01 REGISTER_CURL_CONSTANT(CURLOPT_FTP_FILEMETHOD); + REGISTER_CURL_CONSTANT(CURLOPT_FTP_SKIP_PASV_IP); #endif #if LIBCURL_VERSION_NUM >= 0x071001 @@ -1336,6 +1345,83 @@ static void alloc_curl_handle(php_curl **ch) } /* }}} */ +#if LIBCURL_VERSION_NUM > 0x071301 +/* {{{ split_certinfo + */ +static void split_certinfo(char *string, zval *hash) +{ + char *org = estrdup(string); + char *s = org; + char *split; + + if(org) { + do { + char *key; + char *val; + char *tmp; + + split = strstr(s, "; "); + if(split) + *split = '\0'; + + key = s; + tmp = memchr(key, '=', 64); + if(tmp) { + *tmp = '\0'; + val = tmp+1; + add_assoc_string(hash, key, val, 1); + } + s = split+2; + } while(split); + efree(org); + } +} + +/* {{{ create_certinfo + */ +static void create_certinfo(struct curl_certinfo *ci, zval *listcode TSRMLS_DC) +{ + int i; + + if(ci) { + zval *certhash = NULL; + + for(i=0; inum_of_certs; i++) { + struct curl_slist *slist; + + MAKE_STD_ZVAL(certhash); + array_init(certhash); + for(slist = ci->certinfo[i]; slist; slist = slist->next) { + int len; + char s[64]; + char *tmp; + strncpy(s, slist->data, 64); + tmp = memchr(s, ':', 64); + if(tmp) { + *tmp = '\0'; + len = strlen(s); + if(!strcmp(s, "Subject") || !strcmp(s, "Issuer")) { + zval *hash; + + MAKE_STD_ZVAL(hash); + array_init(hash); + + split_certinfo(&slist->data[len+1], hash); + add_assoc_zval(certhash, s, hash); + } else { + add_assoc_string(certhash, s, &slist->data[len+1], 1); + } + } else { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not extract hash key from certificate info"); + } + } + add_next_index_zval(listcode, certhash); + } + } +} +/* }}} */ +#endif + /* {{{ proto resource curl_init([string url]) Initialize a cURL session */ PHP_FUNCTION(curl_init) @@ -1572,6 +1658,10 @@ static int _php_curl_setopt(php_curl *ch, long option, zval **zvalue, zval *retu #endif #if LIBCURL_VERSION_NUM >= 0x070f01 case CURLOPT_FTP_FILEMETHOD: + case CURLOPT_FTP_SKIP_PASV_IP: +#endif +#if LIBCURL_VERSION_NUM > 0x071301 + case CURLOPT_CERTINFO: #endif convert_to_long_ex(zvalue); #if LIBCURL_VERSION_NUM >= 0x71304 @@ -1595,6 +1685,12 @@ static int _php_curl_setopt(php_curl *ch, long option, zval **zvalue, zval *retu } error = curl_easy_setopt(ch->cp, option, Z_LVAL_PP(zvalue)); break; +#if LIBCURL_VERSION_NUM > 0x071301 + case CURLOPT_POSTREDIR: + convert_to_long_ex(zvalue); + error = curl_easy_setopt(ch->cp, CURLOPT_POSTREDIR, Z_LVAL_PP(zvalue) & CURL_REDIR_POST_ALL); + break; +#endif case CURLOPT_PRIVATE: case CURLOPT_URL: case CURLOPT_PROXY: @@ -1852,7 +1948,7 @@ static int _php_curl_setopt(php_curl *ch, long option, zval **zvalue, zval *retu error = curl_formadd(&first, &last, CURLFORM_COPYNAME, string_key, CURLFORM_NAMELENGTH, (long)string_key_len - 1, - CURLFORM_FILENAME, filename ? filename : postval, + CURLFORM_FILENAME, filename ? filename + sizeof(";filename=") - 1 : postval, CURLFORM_CONTENTTYPE, type ? type + sizeof(";type=") - 1 : "application/octet-stream", CURLFORM_FILE, postval, CURLFORM_END); @@ -2121,6 +2217,10 @@ PHP_FUNCTION(curl_getinfo) char *s_code; long l_code; double d_code; +#if LIBCURL_VERSION_NUM > 0x071301 + struct curl_certinfo *ci = NULL; + zval *listcode; +#endif array_init(return_value); @@ -2191,6 +2291,14 @@ PHP_FUNCTION(curl_getinfo) if (curl_easy_getinfo(ch->cp, CURLINFO_REDIRECT_TIME, &d_code) == CURLE_OK) { CAAD("redirect_time", d_code); } +#if LIBCURL_VERSION_NUM > 0x071301 + if (curl_easy_getinfo(ch->cp, CURLINFO_CERTINFO, &ci) == CURLE_OK) { + MAKE_STD_ZVAL(listcode); + array_init(listcode); + create_certinfo(ci, listcode TSRMLS_CC); + CAAZ("certinfo", listcode); + } +#endif if (ch->header.str_len > 0) { CAAS("request_header", ch->header.str); } @@ -2250,6 +2358,20 @@ PHP_FUNCTION(curl_getinfo) } else { RETURN_FALSE; } +#if LIBCURL_VERSION_NUM > 0x071301 + case CURLINFO_CERTINFO: { + struct curl_certinfo *ci = NULL; + + array_init(return_value); + + if (curl_easy_getinfo(ch->cp, CURLINFO_CERTINFO, &ci) == CURLE_OK) { + create_certinfo(ci, return_value TSRMLS_CC); + } else { + RETURN_FALSE; + } + break; + } +#endif } } } diff --git a/ext/curl/multi.c b/ext/curl/multi.c index 91312e4ce..0fdad1a46 100644 --- a/ext/curl/multi.c +++ b/ext/curl/multi.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: multi.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: multi.c 293036 2010-01-03 09:23:27Z sebastian $ */ #define ZEND_INCLUDE_FULL_WINDOWS_HEADERS diff --git a/ext/curl/php_curl.h b/ext/curl/php_curl.h index 657a0cd9b..21e3ec1d2 100644 --- a/ext/curl/php_curl.h +++ b/ext/curl/php_curl.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_curl.h 289496 2009-10-10 09:29:34Z pajoye $ */ +/* $Id: php_curl.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef _PHP_CURL_H #define _PHP_CURL_H diff --git a/ext/curl/streams.c b/ext/curl/streams.c index 26786ad18..39d78f740 100644 --- a/ext/curl/streams.c +++ b/ext/curl/streams.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: streams.c 284747 2009-07-25 13:00:25Z jani $ */ +/* $Id: streams.c 294462 2010-02-03 20:49:03Z pajoye $ */ /* This file implements cURL based wrappers. * NOTE: If you are implementing your own streams that are intended to @@ -280,7 +280,7 @@ php_stream *php_curl_stream_opener(php_stream_wrapper *wrapper, char *filename, * have a FILE* associated with it. * Otherwise, use the "smart" memory stream that will turn itself into a file * when it gets large */ -#if !HAVE_FOPENCOOKIE +#ifndef HAVE_FOPENCOOKIE if (options & STREAM_WILL_CAST) { curlstream->readbuffer.buf = php_stream_fopen_tmpfile(); } else @@ -445,7 +445,7 @@ php_stream *php_curl_stream_opener(php_stream_wrapper *wrapper, char *filename, php_stream_to_zval(curlstream->readbuffer.buf, tmp); add_assoc_zval(stream->wrapperdata, "readbuf", tmp); -#if !HAVE_FOPENCOOKIE +#ifndef HAVE_FOPENCOOKIE if (options & STREAM_WILL_CAST) { /* we will need to download the whole resource now, * since we cannot get the actual FD for the download, diff --git a/ext/curl/tests/curl_basic_016.phpt b/ext/curl/tests/curl_basic_016.phpt index 5c947eb88..b5890c0f6 100644 --- a/ext/curl/tests/curl_basic_016.phpt +++ b/ext/curl/tests/curl_basic_016.phpt @@ -3,7 +3,13 @@ Test curl_getinfo() function with basic functionality --CREDITS-- Jean-Marc Fontaine --SKIPIF-- - + 0x071201) { + exit("skip: tests works only on older versions of curl"); +} +?> --FILE-- ?> ===DONE=== --EXPECTF-- -array(20) { +array(2%d) { [%u|b%"url"]=> string(0) "" ["content_type"]=> diff --git a/ext/curl/tests/curl_ftp_pasv.phpt b/ext/curl/tests/curl_ftp_pasv.phpt new file mode 100644 index 000000000..6cd742910 --- /dev/null +++ b/ext/curl/tests/curl_ftp_pasv.phpt @@ -0,0 +1,59 @@ +--TEST-- +Test curl_exec() function with basic functionality +--CREDITS-- +--SKIPIF-- + +--FILE-- + +===DONE=== +--EXPECTF-- +bool(true) +===DONE=== diff --git a/ext/curl/tests/curl_setopt_basic001.phpt b/ext/curl/tests/curl_setopt_basic001.phpt index 4167c0532..99cb538d3 100644 --- a/ext/curl/tests/curl_setopt_basic001.phpt +++ b/ext/curl/tests/curl_setopt_basic001.phpt @@ -27,7 +27,7 @@ curl_close($ch); var_dump( $curl_content ); ?> --EXPECTF-- -PHP Warning: Directive 'safe_mode' is deprecated in PHP 5.3 and greater in Unknown on line 0 +Warning: Directive 'safe_mode' is deprecated in PHP 5.3 and greater in Unknown on line 0 *** Testing curl_setopt with CURLOPT_FOLLOWLOCATION in safemode Warning: curl_setopt(): CURLOPT_FOLLOWLOCATION cannot be activated when in safe_mode or an open_basedir is set in %s on line %d diff --git a/ext/date/config0.m4 b/ext/date/config0.m4 index c26f50b60..1d5ed74a8 100644 --- a/ext/date/config0.m4 +++ b/ext/date/config0.m4 @@ -1,4 +1,4 @@ -dnl $Id: config0.m4 280468 2009-05-13 18:48:20Z jani $ +dnl $Id: config0.m4 294880 2010-02-11 11:11:47Z pajoye $ dnl config.m4 for date extension sinclude(ext/date/lib/timelib.m4) diff --git a/ext/date/lib/astro.c b/ext/date/lib/astro.c index a9fd43d05..e176aebf2 100644 --- a/ext/date/lib/astro.c +++ b/ext/date/lib/astro.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -19,7 +19,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: astro.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: astro.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include #include diff --git a/ext/date/lib/dow.c b/ext/date/lib/dow.c index eb4b329ad..857ded286 100644 --- a/ext/date/lib/dow.c +++ b/ext/date/lib/dow.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: dow.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: dow.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "timelib.h" diff --git a/ext/date/lib/interval.c b/ext/date/lib/interval.c index 07be0264b..42bb13b00 100644 --- a/ext/date/lib/interval.c +++ b/ext/date/lib/interval.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: interval.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: interval.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "timelib.h" diff --git a/ext/date/lib/parse_date.c b/ext/date/lib/parse_date.c index 493812750..1f08a951e 100644 --- a/ext/date/lib/parse_date.c +++ b/ext/date/lib/parse_date.c @@ -1,4 +1,4 @@ -/* Generated by re2c 0.13.5 on Wed Jul 29 16:20:12 2009 */ +/* Generated by re2c 0.13.5 on Wed Feb 10 15:19:23 2010 */ /* +----------------------------------------------------------------------+ | PHP Version 5 | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: parse_date.c 286515 2009-07-29 15:34:59Z derick $ */ +/* $Id: parse_date.c 294880 2010-02-11 11:11:47Z pajoye $ */ #include "timelib.h" @@ -237,6 +237,7 @@ static timelib_lookup_table const timelib_reltext_lookup[] = { { "sixth", 0, 6 }, { "seventh", 0, 7 }, { "eight", 0, 8 }, + { "eighth", 0, 8 }, { "ninth", 0, 9 }, { "tenth", 0, 10 }, { "eleventh", 0, 11 }, @@ -967,14 +968,14 @@ yy2: } else { if (yych <= '@') goto yy3; if (yych <= 'D') goto yy140; - goto yy1521; + goto yy1523; } } else { if (yych <= 'd') { if (yych <= 'Z') goto yy140; if (yych >= 'a') goto yy145; } else { - if (yych <= 'e') goto yy1530; + if (yych <= 'e') goto yy1532; if (yych <= 'z') goto yy145; } } @@ -1002,7 +1003,7 @@ yy4: } else { if (yych <= '@') goto yy3; if (yych <= 'D') goto yy140; - goto yy1521; + goto yy1523; } } else { if (yych <= 'd') { @@ -1010,7 +1011,7 @@ yy4: if (yych <= '`') goto yy3; goto yy140; } else { - if (yych <= 'e') goto yy1521; + if (yych <= 'e') goto yy1523; if (yych <= 'z') goto yy140; goto yy3; } @@ -1025,12 +1026,12 @@ yy5: goto yy140; } else { if (yych <= 'H') { - if (yych <= 'E') goto yy1492; + if (yych <= 'E') goto yy1494; goto yy140; } else { - if (yych <= 'I') goto yy1493; + if (yych <= 'I') goto yy1495; if (yych <= 'N') goto yy140; - goto yy1491; + goto yy1493; } } } else { @@ -1039,15 +1040,15 @@ yy5: if (yych <= 'Z') goto yy140; goto yy3; } else { - if (yych == 'e') goto yy1508; + if (yych == 'e') goto yy1510; goto yy145; } } else { if (yych <= 'n') { - if (yych <= 'i') goto yy1509; + if (yych <= 'i') goto yy1511; goto yy145; } else { - if (yych <= 'o') goto yy1507; + if (yych <= 'o') goto yy1509; if (yych <= 'z') goto yy145; goto yy3; } @@ -1063,12 +1064,12 @@ yy6: goto yy140; } else { if (yych <= 'H') { - if (yych <= 'E') goto yy1492; + if (yych <= 'E') goto yy1494; goto yy140; } else { - if (yych <= 'I') goto yy1493; + if (yych <= 'I') goto yy1495; if (yych <= 'N') goto yy140; - goto yy1491; + goto yy1493; } } } else { @@ -1077,15 +1078,15 @@ yy6: if (yych <= 'Z') goto yy140; goto yy3; } else { - if (yych == 'e') goto yy1492; + if (yych == 'e') goto yy1494; goto yy140; } } else { if (yych <= 'n') { - if (yych <= 'i') goto yy1493; + if (yych <= 'i') goto yy1495; goto yy140; } else { - if (yych <= 'o') goto yy1491; + if (yych <= 'o') goto yy1493; if (yych <= 'z') goto yy140; goto yy3; } @@ -1098,24 +1099,24 @@ yy7: if (yych <= 'A') { if (yych == ')') goto yy139; if (yych <= '@') goto yy3; - goto yy1461; + goto yy1463; } else { - if (yych == 'I') goto yy1462; + if (yych == 'I') goto yy1464; if (yych <= 'N') goto yy140; - goto yy1463; + goto yy1465; } } else { if (yych <= 'h') { if (yych <= 'Z') goto yy140; if (yych <= '`') goto yy3; - if (yych <= 'a') goto yy1476; + if (yych <= 'a') goto yy1478; goto yy145; } else { if (yych <= 'n') { - if (yych <= 'i') goto yy1477; + if (yych <= 'i') goto yy1479; goto yy145; } else { - if (yych <= 'o') goto yy1478; + if (yych <= 'o') goto yy1480; if (yych <= 'z') goto yy145; goto yy3; } @@ -1128,24 +1129,24 @@ yy8: if (yych <= 'A') { if (yych == ')') goto yy139; if (yych <= '@') goto yy3; - goto yy1461; + goto yy1463; } else { - if (yych == 'I') goto yy1462; + if (yych == 'I') goto yy1464; if (yych <= 'N') goto yy140; - goto yy1463; + goto yy1465; } } else { if (yych <= 'h') { if (yych <= 'Z') goto yy140; if (yych <= '`') goto yy3; - if (yych <= 'a') goto yy1461; + if (yych <= 'a') goto yy1463; goto yy140; } else { if (yych <= 'n') { - if (yych <= 'i') goto yy1462; + if (yych <= 'i') goto yy1464; goto yy140; } else { - if (yych <= 'o') goto yy1463; + if (yych <= 'o') goto yy1465; if (yych <= 'z') goto yy140; goto yy3; } @@ -1159,15 +1160,15 @@ yy9: switch (yych) { case ')': goto yy139; case '0': - case '1': goto yy1391; - case '2': goto yy1392; + case '1': goto yy1393; + case '2': goto yy1394; case '3': case '4': case '5': case '6': case '7': case '8': - case '9': goto yy1393; + case '9': goto yy1395; case 'A': case 'B': case 'C': @@ -1189,11 +1190,11 @@ yy9: case 'X': case 'Y': case 'Z': goto yy140; - case 'E': goto yy1386; - case 'H': goto yy1387; - case 'O': goto yy1388; - case 'U': goto yy1389; - case 'W': goto yy1390; + case 'E': goto yy1388; + case 'H': goto yy1389; + case 'O': goto yy1390; + case 'U': goto yy1391; + case 'W': goto yy1392; case 'a': case 'b': case 'c': @@ -1215,11 +1216,11 @@ yy9: case 'x': case 'y': case 'z': goto yy145; - case 'e': goto yy1429; - case 'h': goto yy1430; - case 'o': goto yy1431; - case 'u': goto yy1432; - case 'w': goto yy1433; + case 'e': goto yy1431; + case 'h': goto yy1432; + case 'o': goto yy1433; + case 'u': goto yy1434; + case 'w': goto yy1435; default: goto yy3; } yy10: @@ -1230,15 +1231,15 @@ yy10: switch (yych) { case ')': goto yy139; case '0': - case '1': goto yy1391; - case '2': goto yy1392; + case '1': goto yy1393; + case '2': goto yy1394; case '3': case '4': case '5': case '6': case '7': case '8': - case '9': goto yy1393; + case '9': goto yy1395; case 'A': case 'B': case 'C': @@ -1282,24 +1283,24 @@ yy10: case 'y': case 'z': goto yy140; case 'E': - case 'e': goto yy1386; + case 'e': goto yy1388; case 'H': - case 'h': goto yy1387; + case 'h': goto yy1389; case 'O': - case 'o': goto yy1388; + case 'o': goto yy1390; case 'U': - case 'u': goto yy1389; + case 'u': goto yy1391; case 'W': - case 'w': goto yy1390; + case 'w': goto yy1392; default: goto yy3; } yy11: YYDEBUG(11, *YYCURSOR); yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); - if (yych == '-') goto yy1382; + if (yych == '-') goto yy1384; if (yych <= '/') goto yy12; - if (yych <= '9') goto yy1383; + if (yych <= '9') goto yy1385; yy12: YYDEBUG(12, *YYCURSOR); { @@ -1317,16 +1318,16 @@ yy13: } else { if (yych <= '@') goto yy3; if (yych <= 'D') goto yy140; - goto yy1318; + goto yy1320; } } else { if (yych <= 'N') { - if (yych == 'I') goto yy1319; + if (yych == 'I') goto yy1321; goto yy140; } else { - if (yych <= 'O') goto yy1320; + if (yych <= 'O') goto yy1322; if (yych <= 'Q') goto yy140; - goto yy1321; + goto yy1323; } } } else { @@ -1336,16 +1337,16 @@ yy13: if (yych <= '`') goto yy3; goto yy145; } else { - if (yych <= 'e') goto yy1359; + if (yych <= 'e') goto yy1361; if (yych <= 'h') goto yy145; - goto yy1360; + goto yy1362; } } else { if (yych <= 'q') { - if (yych == 'o') goto yy1361; + if (yych == 'o') goto yy1363; goto yy145; } else { - if (yych <= 'r') goto yy1362; + if (yych <= 'r') goto yy1364; if (yych <= 'z') goto yy145; goto yy3; } @@ -1362,16 +1363,16 @@ yy14: } else { if (yych <= '@') goto yy3; if (yych <= 'D') goto yy140; - goto yy1318; + goto yy1320; } } else { if (yych <= 'N') { - if (yych == 'I') goto yy1319; + if (yych == 'I') goto yy1321; goto yy140; } else { - if (yych <= 'O') goto yy1320; + if (yych <= 'O') goto yy1322; if (yych <= 'Q') goto yy140; - goto yy1321; + goto yy1323; } } } else { @@ -1381,16 +1382,16 @@ yy14: if (yych <= '`') goto yy3; goto yy140; } else { - if (yych <= 'e') goto yy1318; + if (yych <= 'e') goto yy1320; if (yych <= 'h') goto yy140; - goto yy1319; + goto yy1321; } } else { if (yych <= 'q') { - if (yych == 'o') goto yy1320; + if (yych == 'o') goto yy1322; goto yy140; } else { - if (yych <= 'r') goto yy1321; + if (yych <= 'r') goto yy1323; if (yych <= 'z') goto yy140; goto yy3; } @@ -1402,13 +1403,13 @@ yy15: if (yych <= 'A') { if (yych == ')') goto yy139; if (yych <= '@') goto yy3; - goto yy1304; + goto yy1306; } else { if (yych <= '`') { if (yych <= 'Z') goto yy140; goto yy3; } else { - if (yych <= 'a') goto yy1315; + if (yych <= 'a') goto yy1317; if (yych <= 'z') goto yy145; goto yy3; } @@ -1419,13 +1420,13 @@ yy16: if (yych <= 'A') { if (yych == ')') goto yy139; if (yych <= '@') goto yy3; - goto yy1304; + goto yy1306; } else { if (yych <= '`') { if (yych <= 'Z') goto yy140; goto yy3; } else { - if (yych <= 'a') goto yy1304; + if (yych <= 'a') goto yy1306; if (yych <= 'z') goto yy140; goto yy3; } @@ -1436,13 +1437,13 @@ yy17: if (yych <= 'A') { if (yych == ')') goto yy139; if (yych <= '@') goto yy3; - goto yy1284; + goto yy1286; } else { if (yych <= '`') { if (yych <= 'Z') goto yy140; goto yy3; } else { - if (yych <= 'a') goto yy1301; + if (yych <= 'a') goto yy1303; if (yych <= 'z') goto yy145; goto yy3; } @@ -1453,13 +1454,13 @@ yy18: if (yych <= 'A') { if (yych == ')') goto yy139; if (yych <= '@') goto yy3; - goto yy1284; + goto yy1286; } else { if (yych <= '`') { if (yych <= 'Z') goto yy140; goto yy3; } else { - if (yych <= 'a') goto yy1284; + if (yych <= 'a') goto yy1286; if (yych <= 'z') goto yy140; goto yy3; } @@ -1474,17 +1475,17 @@ yy19: goto yy139; } else { if (yych <= '@') goto yy3; - if (yych <= 'A') goto yy1227; + if (yych <= 'A') goto yy1229; goto yy140; } } else { if (yych <= 'H') { - if (yych <= 'E') goto yy1226; + if (yych <= 'E') goto yy1228; goto yy140; } else { - if (yych <= 'I') goto yy1228; + if (yych <= 'I') goto yy1230; if (yych <= 'T') goto yy140; - goto yy1229; + goto yy1231; } } } else { @@ -1493,16 +1494,16 @@ yy19: if (yych <= 'Z') goto yy140; goto yy3; } else { - if (yych <= 'a') goto yy1256; + if (yych <= 'a') goto yy1258; if (yych <= 'd') goto yy145; - goto yy1255; + goto yy1257; } } else { if (yych <= 't') { - if (yych == 'i') goto yy1257; + if (yych == 'i') goto yy1259; goto yy145; } else { - if (yych <= 'u') goto yy1258; + if (yych <= 'u') goto yy1260; if (yych <= 'z') goto yy145; goto yy3; } @@ -1518,17 +1519,17 @@ yy20: goto yy139; } else { if (yych <= '@') goto yy3; - if (yych <= 'A') goto yy1227; + if (yych <= 'A') goto yy1229; goto yy140; } } else { if (yych <= 'H') { - if (yych <= 'E') goto yy1226; + if (yych <= 'E') goto yy1228; goto yy140; } else { - if (yych <= 'I') goto yy1228; + if (yych <= 'I') goto yy1230; if (yych <= 'T') goto yy140; - goto yy1229; + goto yy1231; } } } else { @@ -1537,16 +1538,16 @@ yy20: if (yych <= 'Z') goto yy140; goto yy3; } else { - if (yych <= 'a') goto yy1227; + if (yych <= 'a') goto yy1229; if (yych <= 'd') goto yy140; - goto yy1226; + goto yy1228; } } else { if (yych <= 't') { - if (yych == 'i') goto yy1228; + if (yych == 'i') goto yy1230; goto yy140; } else { - if (yych <= 'u') goto yy1229; + if (yych <= 'u') goto yy1231; if (yych <= 'z') goto yy140; goto yy3; } @@ -1569,9 +1570,9 @@ yy21: if (yych <= 'Z') goto yy140; if (yych <= '`') goto yy3; if (yych <= 'h') goto yy145; - goto yy1215; + goto yy1216; } else { - if (yych == 'l') goto yy1216; + if (yych == 'l') goto yy1217; if (yych <= 'z') goto yy145; goto yy3; } @@ -2553,27 +2554,27 @@ yy56: if (yyaccept <= 27) { goto yy1141; } else { - goto yy1292; + goto yy1294; } } else { if (yyaccept <= 29) { - goto yy1311; + goto yy1313; } else { - goto yy1415; + goto yy1417; } } } else { if (yyaccept <= 32) { if (yyaccept <= 31) { - goto yy1418; + goto yy1420; } else { - goto yy1498; + goto yy1500; } } else { if (yyaccept <= 33) { - goto yy1506; + goto yy1508; } else { - goto yy1529; + goto yy1531; } } } @@ -17389,21 +17390,22 @@ yy1214: YYDEBUG(1214, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '(') { - if (yych <= '\t') { - if (yych <= 0x08) goto yy3; - goto yy1206; + if (yych <= '@') { + if (yych <= 0x1F) { + if (yych == '\t') goto yy1206; + goto yy3; } else { - if (yych == ' ') goto yy1206; + if (yych <= ' ') goto yy1206; + if (yych == ')') goto yy139; goto yy3; } } else { - if (yych <= 'Z') { - if (yych <= ')') goto yy139; - if (yych <= '@') goto yy3; - goto yy144; + if (yych <= '`') { + if (yych == 'H') goto yy1215; + if (yych <= 'Z') goto yy144; + goto yy3; } else { - if (yych <= '`') goto yy3; + if (yych == 'h') goto yy1215; if (yych <= 'z') goto yy144; goto yy3; } @@ -17412,6 +17414,18 @@ yy1215: YYDEBUG(1215, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); + if (yych <= 0x1F) { + if (yych == '\t') goto yy1206; + goto yy3; + } else { + if (yych <= ' ') goto yy1206; + if (yych == ')') goto yy139; + goto yy3; + } +yy1216: + YYDEBUG(1216, *YYCURSOR); + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'G') { if (yych <= '.') { if (yych == ')') goto yy139; @@ -17428,13 +17442,13 @@ yy1215: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'g') goto yy1223; + if (yych == 'g') goto yy1224; if (yych <= 'z') goto yy146; goto yy3; } } -yy1216: - YYDEBUG(1216, *YYCURSOR); +yy1217: + YYDEBUG(1217, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'E') { @@ -17453,13 +17467,13 @@ yy1216: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'e') goto yy1217; + if (yych == 'e') goto yy1218; if (yych <= 'z') goto yy146; goto yy3; } } -yy1217: - YYDEBUG(1217, *YYCURSOR); +yy1218: + YYDEBUG(1218, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'V') { @@ -17478,13 +17492,13 @@ yy1217: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'v') goto yy1218; + if (yych == 'v') goto yy1219; if (yych <= 'z') goto yy151; goto yy3; } } -yy1218: - YYDEBUG(1218, *YYCURSOR); +yy1219: + YYDEBUG(1219, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'E') { @@ -17503,13 +17517,13 @@ yy1218: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'e') goto yy1219; + if (yych == 'e') goto yy1220; if (yych <= 'z') goto yy152; goto yy3; } } -yy1219: - YYDEBUG(1219, *YYCURSOR); +yy1220: + YYDEBUG(1220, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'N') { @@ -17528,13 +17542,13 @@ yy1219: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'n') goto yy1220; + if (yych == 'n') goto yy1221; if (yych <= 'z') goto yy153; goto yy3; } } -yy1220: - YYDEBUG(1220, *YYCURSOR); +yy1221: + YYDEBUG(1221, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'T') { @@ -17551,18 +17565,18 @@ yy1220: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 't') goto yy1221; + if (yych == 't') goto yy1222; if (yych <= 'z') goto yy154; goto yy3; } } -yy1221: - YYDEBUG(1221, *YYCURSOR); +yy1222: + YYDEBUG(1222, *YYCURSOR); yych = *++YYCURSOR; if (yych == 'H') goto yy1205; if (yych != 'h') goto yy155; -yy1222: - YYDEBUG(1222, *YYCURSOR); +yy1223: + YYDEBUG(1223, *YYCURSOR); yych = *++YYCURSOR; if (yych <= '.') { if (yych <= '\t') { @@ -17583,8 +17597,8 @@ yy1222: goto yy56; } } -yy1223: - YYDEBUG(1223, *YYCURSOR); +yy1224: + YYDEBUG(1224, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'H') { @@ -17603,13 +17617,13 @@ yy1223: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'h') goto yy1224; + if (yych == 'h') goto yy1225; if (yych <= 'z') goto yy151; goto yy3; } } -yy1224: - YYDEBUG(1224, *YYCURSOR); +yy1225: + YYDEBUG(1225, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'T') { @@ -17628,39 +17642,76 @@ yy1224: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 't') goto yy1225; + if (yych == 't') goto yy1226; if (yych <= 'z') goto yy152; goto yy3; } } -yy1225: - YYDEBUG(1225, *YYCURSOR); +yy1226: + YYDEBUG(1226, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '.') { + if (yych <= '@') { + if (yych <= ' ') { + if (yych == '\t') goto yy1206; + if (yych <= 0x1F) goto yy3; + goto yy1206; + } else { + if (yych <= ')') { + if (yych <= '(') goto yy3; + goto yy139; + } else { + if (yych == '/') goto yy147; + goto yy3; + } + } + } else { + if (yych <= '_') { + if (yych <= 'H') { + if (yych <= 'G') goto yy144; + goto yy1215; + } else { + if (yych <= 'Z') goto yy144; + if (yych <= '^') goto yy3; + goto yy147; + } + } else { + if (yych <= 'g') { + if (yych <= '`') goto yy3; + goto yy153; + } else { + if (yych <= 'h') goto yy1227; + if (yych <= 'z') goto yy153; + goto yy3; + } + } + } +yy1227: + YYDEBUG(1227, *YYCURSOR); + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= ')') { if (yych <= 0x1F) { if (yych == '\t') goto yy1206; goto yy3; } else { if (yych <= ' ') goto yy1206; - if (yych == ')') goto yy139; - goto yy3; + if (yych <= '(') goto yy3; + goto yy139; } } else { if (yych <= '^') { - if (yych <= '/') goto yy147; - if (yych <= '@') goto yy3; - if (yych <= 'Z') goto yy144; + if (yych == '/') goto yy147; goto yy3; } else { if (yych <= '_') goto yy147; if (yych <= '`') goto yy3; - if (yych <= 'z') goto yy153; + if (yych <= 'z') goto yy154; goto yy3; } } -yy1226: - YYDEBUG(1226, *YYCURSOR); +yy1228: + YYDEBUG(1228, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'V') { if (yych <= 'B') { @@ -17669,12 +17720,12 @@ yy1226: goto yy141; } else { if (yych <= 'O') { - if (yych <= 'C') goto yy1241; + if (yych <= 'C') goto yy1244; goto yy141; } else { - if (yych <= 'P') goto yy1243; + if (yych <= 'P') goto yy1246; if (yych <= 'U') goto yy141; - goto yy1242; + goto yy1245; } } } else { @@ -17683,22 +17734,22 @@ yy1226: if (yych <= 'Z') goto yy141; goto yy3; } else { - if (yych == 'c') goto yy1241; + if (yych == 'c') goto yy1244; goto yy141; } } else { if (yych <= 'u') { - if (yych <= 'p') goto yy1243; + if (yych <= 'p') goto yy1246; goto yy141; } else { - if (yych <= 'v') goto yy1242; + if (yych <= 'v') goto yy1245; if (yych <= 'z') goto yy141; goto yy3; } } } -yy1227: - YYDEBUG(1227, *YYCURSOR); +yy1229: + YYDEBUG(1229, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'T') { if (yych <= ')') { @@ -17707,7 +17758,7 @@ yy1227: } else { if (yych <= '@') goto yy3; if (yych <= 'S') goto yy141; - goto yy1236; + goto yy1239; } } else { if (yych <= 's') { @@ -17715,13 +17766,13 @@ yy1227: if (yych <= '`') goto yy3; goto yy141; } else { - if (yych <= 't') goto yy1236; + if (yych <= 't') goto yy1239; if (yych <= 'z') goto yy141; goto yy3; } } -yy1228: - YYDEBUG(1228, *YYCURSOR); +yy1230: + YYDEBUG(1230, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'X') { if (yych <= ')') { @@ -17730,7 +17781,7 @@ yy1228: } else { if (yych <= '@') goto yy3; if (yych <= 'W') goto yy141; - goto yy1234; + goto yy1236; } } else { if (yych <= 'w') { @@ -17738,13 +17789,13 @@ yy1228: if (yych <= '`') goto yy3; goto yy141; } else { - if (yych <= 'x') goto yy1234; + if (yych <= 'x') goto yy1236; if (yych <= 'z') goto yy141; goto yy3; } } -yy1229: - YYDEBUG(1229, *YYCURSOR); +yy1231: + YYDEBUG(1231, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'N') { if (yych <= ')') { @@ -17760,13 +17811,13 @@ yy1229: if (yych <= '`') goto yy3; goto yy141; } else { - if (yych <= 'n') goto yy1230; + if (yych <= 'n') goto yy1232; if (yych <= 'z') goto yy141; goto yy3; } } -yy1230: - YYDEBUG(1230, *YYCURSOR); +yy1232: + YYDEBUG(1232, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'D') { if (yych <= ')') { @@ -17782,13 +17833,13 @@ yy1230: if (yych <= '`') goto yy167; goto yy142; } else { - if (yych <= 'd') goto yy1231; + if (yych <= 'd') goto yy1233; if (yych <= 'z') goto yy142; goto yy167; } } -yy1231: - YYDEBUG(1231, *YYCURSOR); +yy1233: + YYDEBUG(1233, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'A') { if (yych == ')') goto yy139; @@ -17798,13 +17849,13 @@ yy1231: if (yych <= 'Z') goto yy143; goto yy3; } else { - if (yych <= 'a') goto yy1232; + if (yych <= 'a') goto yy1234; if (yych <= 'z') goto yy143; goto yy3; } } -yy1232: - YYDEBUG(1232, *YYCURSOR); +yy1234: + YYDEBUG(1234, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'Y') { if (yych <= ')') { @@ -17820,18 +17871,18 @@ yy1232: if (yych <= '`') goto yy3; goto yy144; } else { - if (yych <= 'y') goto yy1233; + if (yych <= 'y') goto yy1235; if (yych <= 'z') goto yy144; goto yy3; } } -yy1233: - YYDEBUG(1233, *YYCURSOR); +yy1235: + YYDEBUG(1235, *YYCURSOR); yych = *++YYCURSOR; if (yych == ')') goto yy139; goto yy167; -yy1234: - YYDEBUG(1234, *YYCURSOR); +yy1236: + YYDEBUG(1236, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'T') { if (yych <= ')') { @@ -17847,13 +17898,13 @@ yy1234: if (yych <= '`') goto yy3; goto yy142; } else { - if (yych <= 't') goto yy1235; + if (yych <= 't') goto yy1237; if (yych <= 'z') goto yy142; goto yy3; } } -yy1235: - YYDEBUG(1235, *YYCURSOR); +yy1237: + YYDEBUG(1237, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'H') { if (yych <= ')') { @@ -17862,7 +17913,6 @@ yy1235: } else { if (yych <= '@') goto yy3; if (yych <= 'G') goto yy143; - goto yy1214; } } else { if (yych <= 'g') { @@ -17870,13 +17920,36 @@ yy1235: if (yych <= '`') goto yy3; goto yy143; } else { - if (yych <= 'h') goto yy1214; + if (yych <= 'h') goto yy1238; if (yych <= 'z') goto yy143; goto yy3; } } -yy1236: - YYDEBUG(1236, *YYCURSOR); +yy1238: + YYDEBUG(1238, *YYCURSOR); + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '(') { + if (yych <= '\t') { + if (yych <= 0x08) goto yy3; + goto yy1206; + } else { + if (yych == ' ') goto yy1206; + goto yy3; + } + } else { + if (yych <= 'Z') { + if (yych <= ')') goto yy139; + if (yych <= '@') goto yy3; + goto yy144; + } else { + if (yych <= '`') goto yy3; + if (yych <= 'z') goto yy144; + goto yy3; + } + } +yy1239: + YYDEBUG(1239, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'U') { if (yych <= ')') { @@ -17892,13 +17965,13 @@ yy1236: if (yych <= '`') goto yy167; goto yy142; } else { - if (yych <= 'u') goto yy1237; + if (yych <= 'u') goto yy1240; if (yych <= 'z') goto yy142; goto yy167; } } -yy1237: - YYDEBUG(1237, *YYCURSOR); +yy1240: + YYDEBUG(1240, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'R') { if (yych <= ')') { @@ -17914,13 +17987,13 @@ yy1237: if (yych <= '`') goto yy3; goto yy143; } else { - if (yych <= 'r') goto yy1238; + if (yych <= 'r') goto yy1241; if (yych <= 'z') goto yy143; goto yy3; } } -yy1238: - YYDEBUG(1238, *YYCURSOR); +yy1241: + YYDEBUG(1241, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'D') { if (yych <= ')') { @@ -17936,30 +18009,30 @@ yy1238: if (yych <= '`') goto yy3; goto yy144; } else { - if (yych <= 'd') goto yy1239; + if (yych <= 'd') goto yy1242; if (yych <= 'z') goto yy144; goto yy3; } } -yy1239: - YYDEBUG(1239, *YYCURSOR); +yy1242: + YYDEBUG(1242, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '@') { if (yych == ')') goto yy139; goto yy3; } else { - if (yych <= 'A') goto yy1240; + if (yych <= 'A') goto yy1243; if (yych != 'a') goto yy3; } -yy1240: - YYDEBUG(1240, *YYCURSOR); +yy1243: + YYDEBUG(1243, *YYCURSOR); yych = *++YYCURSOR; if (yych == 'Y') goto yy173; if (yych == 'y') goto yy173; goto yy56; -yy1241: - YYDEBUG(1241, *YYCURSOR); +yy1244: + YYDEBUG(1244, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'O') { if (yych <= ')') { @@ -17968,7 +18041,7 @@ yy1241: } else { if (yych <= '@') goto yy3; if (yych <= 'N') goto yy142; - goto yy1252; + goto yy1255; } } else { if (yych <= 'n') { @@ -17976,13 +18049,13 @@ yy1241: if (yych <= '`') goto yy3; goto yy142; } else { - if (yych <= 'o') goto yy1252; + if (yych <= 'o') goto yy1255; if (yych <= 'z') goto yy142; goto yy3; } } -yy1242: - YYDEBUG(1242, *YYCURSOR); +yy1245: + YYDEBUG(1245, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'E') { if (yych <= ')') { @@ -17991,7 +18064,7 @@ yy1242: } else { if (yych <= '@') goto yy3; if (yych <= 'D') goto yy142; - goto yy1249; + goto yy1252; } } else { if (yych <= 'd') { @@ -17999,13 +18072,13 @@ yy1242: if (yych <= '`') goto yy3; goto yy142; } else { - if (yych <= 'e') goto yy1249; + if (yych <= 'e') goto yy1252; if (yych <= 'z') goto yy142; goto yy3; } } -yy1243: - YYDEBUG(1243, *YYCURSOR); +yy1246: + YYDEBUG(1246, *YYCURSOR); yyaccept = 5; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '/') { @@ -18040,14 +18113,14 @@ yy1243: if (yych <= '`') goto yy194; goto yy142; } else { - if (yych <= 't') goto yy1244; + if (yych <= 't') goto yy1247; if (yych <= 'z') goto yy142; goto yy194; } } } -yy1244: - YYDEBUG(1244, *YYCURSOR); +yy1247: + YYDEBUG(1247, *YYCURSOR); yyaccept = 5; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '/') { @@ -18082,14 +18155,14 @@ yy1244: if (yych <= '`') goto yy194; goto yy143; } else { - if (yych <= 'e') goto yy1245; + if (yych <= 'e') goto yy1248; if (yych <= 'z') goto yy143; goto yy194; } } } -yy1245: - YYDEBUG(1245, *YYCURSOR); +yy1248: + YYDEBUG(1248, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'M') { if (yych <= ')') { @@ -18105,35 +18178,35 @@ yy1245: if (yych <= '`') goto yy3; goto yy144; } else { - if (yych <= 'm') goto yy1246; + if (yych <= 'm') goto yy1249; if (yych <= 'z') goto yy144; goto yy3; } } -yy1246: - YYDEBUG(1246, *YYCURSOR); +yy1249: + YYDEBUG(1249, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'A') { if (yych == ')') goto yy139; goto yy3; } else { - if (yych <= 'B') goto yy1247; + if (yych <= 'B') goto yy1250; if (yych != 'b') goto yy3; } -yy1247: - YYDEBUG(1247, *YYCURSOR); +yy1250: + YYDEBUG(1250, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy1248; + if (yych == 'E') goto yy1251; if (yych != 'e') goto yy56; -yy1248: - YYDEBUG(1248, *YYCURSOR); +yy1251: + YYDEBUG(1251, *YYCURSOR); yych = *++YYCURSOR; if (yych == 'R') goto yy206; if (yych == 'r') goto yy206; goto yy56; -yy1249: - YYDEBUG(1249, *YYCURSOR); +yy1252: + YYDEBUG(1252, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'N') { if (yych <= ')') { @@ -18149,13 +18222,13 @@ yy1249: if (yych <= '`') goto yy3; goto yy143; } else { - if (yych <= 'n') goto yy1250; + if (yych <= 'n') goto yy1253; if (yych <= 'z') goto yy143; goto yy3; } } -yy1250: - YYDEBUG(1250, *YYCURSOR); +yy1253: + YYDEBUG(1253, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'T') { if (yych <= ')') { @@ -18171,13 +18244,13 @@ yy1250: if (yych <= '`') goto yy3; goto yy144; } else { - if (yych <= 't') goto yy1251; + if (yych <= 't') goto yy1254; if (yych <= 'z') goto yy144; goto yy3; } } -yy1251: - YYDEBUG(1251, *YYCURSOR); +yy1254: + YYDEBUG(1254, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'G') { @@ -18188,8 +18261,8 @@ yy1251: if (yych == 'h') goto yy1205; goto yy3; } -yy1252: - YYDEBUG(1252, *YYCURSOR); +yy1255: + YYDEBUG(1255, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'N') { if (yych <= ')') { @@ -18205,13 +18278,13 @@ yy1252: if (yych <= '`') goto yy3; goto yy143; } else { - if (yych <= 'n') goto yy1253; + if (yych <= 'n') goto yy1256; if (yych <= 'z') goto yy143; goto yy3; } } -yy1253: - YYDEBUG(1253, *YYCURSOR); +yy1256: + YYDEBUG(1256, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'D') { if (yych <= ')') { @@ -18220,6 +18293,7 @@ yy1253: } else { if (yych <= '@') goto yy3; if (yych <= 'C') goto yy144; + goto yy1215; } } else { if (yych <= 'c') { @@ -18227,25 +18301,13 @@ yy1253: if (yych <= '`') goto yy3; goto yy144; } else { - if (yych <= 'd') goto yy1254; + if (yych <= 'd') goto yy1215; if (yych <= 'z') goto yy144; goto yy3; } } -yy1254: - YYDEBUG(1254, *YYCURSOR); - yyaccept = 0; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= 0x1F) { - if (yych == '\t') goto yy1206; - goto yy3; - } else { - if (yych <= ' ') goto yy1206; - if (yych == ')') goto yy139; - goto yy3; - } -yy1255: - YYDEBUG(1255, *YYCURSOR); +yy1257: + YYDEBUG(1257, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'V') { @@ -18259,12 +18321,12 @@ yy1255: } } else { if (yych <= 'O') { - if (yych == 'C') goto yy1241; + if (yych == 'C') goto yy1244; goto yy141; } else { - if (yych <= 'P') goto yy1243; + if (yych <= 'P') goto yy1246; if (yych <= 'U') goto yy141; - goto yy1242; + goto yy1245; } } } else { @@ -18276,21 +18338,21 @@ yy1255: } else { if (yych <= '`') goto yy3; if (yych <= 'b') goto yy146; - goto yy1270; + goto yy1273; } } else { if (yych <= 'u') { - if (yych == 'p') goto yy1272; + if (yych == 'p') goto yy1275; goto yy146; } else { - if (yych <= 'v') goto yy1271; + if (yych <= 'v') goto yy1274; if (yych <= 'z') goto yy146; goto yy3; } } } -yy1256: - YYDEBUG(1256, *YYCURSOR); +yy1258: + YYDEBUG(1258, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'T') { @@ -18301,7 +18363,7 @@ yy1256: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'S') goto yy141; - goto yy1236; + goto yy1239; } } else { if (yych <= '`') { @@ -18309,13 +18371,13 @@ yy1256: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 't') goto yy1265; + if (yych == 't') goto yy1268; if (yych <= 'z') goto yy146; goto yy3; } } -yy1257: - YYDEBUG(1257, *YYCURSOR); +yy1259: + YYDEBUG(1259, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'X') { @@ -18326,7 +18388,7 @@ yy1257: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'W') goto yy141; - goto yy1234; + goto yy1236; } } else { if (yych <= '`') { @@ -18334,13 +18396,13 @@ yy1257: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'x') goto yy1263; + if (yych == 'x') goto yy1265; if (yych <= 'z') goto yy146; goto yy3; } } -yy1258: - YYDEBUG(1258, *YYCURSOR); +yy1260: + YYDEBUG(1260, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'N') { @@ -18351,7 +18413,7 @@ yy1258: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'M') goto yy141; - goto yy1230; + goto yy1232; } } else { if (yych <= '`') { @@ -18359,13 +18421,13 @@ yy1258: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'n') goto yy1259; + if (yych == 'n') goto yy1261; if (yych <= 'z') goto yy146; goto yy3; } } -yy1259: - YYDEBUG(1259, *YYCURSOR); +yy1261: + YYDEBUG(1261, *YYCURSOR); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'D') { @@ -18376,7 +18438,7 @@ yy1259: if (yych <= '/') goto yy147; if (yych <= '@') goto yy167; if (yych <= 'C') goto yy142; - goto yy1231; + goto yy1233; } } else { if (yych <= '`') { @@ -18384,13 +18446,13 @@ yy1259: if (yych == '_') goto yy147; goto yy167; } else { - if (yych == 'd') goto yy1260; + if (yych == 'd') goto yy1262; if (yych <= 'z') goto yy151; goto yy167; } } -yy1260: - YYDEBUG(1260, *YYCURSOR); +yy1262: + YYDEBUG(1262, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'A') { @@ -18400,7 +18462,7 @@ yy1260: } else { if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; - goto yy1232; + goto yy1234; } } else { if (yych <= '_') { @@ -18409,13 +18471,13 @@ yy1260: goto yy147; } else { if (yych <= '`') goto yy3; - if (yych <= 'a') goto yy1261; + if (yych <= 'a') goto yy1263; if (yych <= 'z') goto yy152; goto yy3; } } -yy1261: - YYDEBUG(1261, *YYCURSOR); +yy1263: + YYDEBUG(1263, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'Y') { @@ -18426,7 +18488,7 @@ yy1261: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'X') goto yy144; - goto yy1233; + goto yy1235; } } else { if (yych <= '`') { @@ -18434,13 +18496,13 @@ yy1261: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'y') goto yy1262; + if (yych == 'y') goto yy1264; if (yych <= 'z') goto yy153; goto yy3; } } -yy1262: - YYDEBUG(1262, *YYCURSOR); +yy1264: + YYDEBUG(1264, *YYCURSOR); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '/') { @@ -18457,8 +18519,8 @@ yy1262: goto yy167; } } -yy1263: - YYDEBUG(1263, *YYCURSOR); +yy1265: + YYDEBUG(1265, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'T') { @@ -18469,7 +18531,7 @@ yy1263: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'S') goto yy142; - goto yy1235; + goto yy1237; } } else { if (yych <= '`') { @@ -18477,13 +18539,13 @@ yy1263: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 't') goto yy1264; + if (yych == 't') goto yy1266; if (yych <= 'z') goto yy151; goto yy3; } } -yy1264: - YYDEBUG(1264, *YYCURSOR); +yy1266: + YYDEBUG(1266, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'H') { @@ -18494,7 +18556,7 @@ yy1264: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'G') goto yy143; - goto yy1214; + goto yy1238; } } else { if (yych <= '`') { @@ -18502,13 +18564,39 @@ yy1264: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'h') goto yy1225; + if (yych == 'h') goto yy1267; if (yych <= 'z') goto yy152; goto yy3; } } -yy1265: - YYDEBUG(1265, *YYCURSOR); +yy1267: + YYDEBUG(1267, *YYCURSOR); + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '.') { + if (yych <= 0x1F) { + if (yych == '\t') goto yy1206; + goto yy3; + } else { + if (yych <= ' ') goto yy1206; + if (yych == ')') goto yy139; + goto yy3; + } + } else { + if (yych <= '^') { + if (yych <= '/') goto yy147; + if (yych <= '@') goto yy3; + if (yych <= 'Z') goto yy144; + goto yy3; + } else { + if (yych <= '_') goto yy147; + if (yych <= '`') goto yy3; + if (yych <= 'z') goto yy153; + goto yy3; + } + } +yy1268: + YYDEBUG(1268, *YYCURSOR); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'U') { @@ -18519,7 +18607,7 @@ yy1265: if (yych <= '/') goto yy147; if (yych <= '@') goto yy167; if (yych <= 'T') goto yy142; - goto yy1237; + goto yy1240; } } else { if (yych <= '`') { @@ -18527,13 +18615,13 @@ yy1265: if (yych == '_') goto yy147; goto yy167; } else { - if (yych == 'u') goto yy1266; + if (yych == 'u') goto yy1269; if (yych <= 'z') goto yy151; goto yy167; } } -yy1266: - YYDEBUG(1266, *YYCURSOR); +yy1269: + YYDEBUG(1269, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'R') { @@ -18544,7 +18632,7 @@ yy1266: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'Q') goto yy143; - goto yy1238; + goto yy1241; } } else { if (yych <= '`') { @@ -18552,13 +18640,13 @@ yy1266: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'r') goto yy1267; + if (yych == 'r') goto yy1270; if (yych <= 'z') goto yy152; goto yy3; } } -yy1267: - YYDEBUG(1267, *YYCURSOR); +yy1270: + YYDEBUG(1270, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'D') { @@ -18569,7 +18657,7 @@ yy1267: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'C') goto yy144; - goto yy1239; + goto yy1242; } } else { if (yych <= '`') { @@ -18577,13 +18665,13 @@ yy1267: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'd') goto yy1268; + if (yych == 'd') goto yy1271; if (yych <= 'z') goto yy153; goto yy3; } } -yy1268: - YYDEBUG(1268, *YYCURSOR); +yy1271: + YYDEBUG(1271, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'A') { @@ -18593,26 +18681,26 @@ yy1268: } else { if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; - goto yy1240; + goto yy1243; } } else { if (yych <= '`') { if (yych == '_') goto yy147; goto yy3; } else { - if (yych <= 'a') goto yy1269; + if (yych <= 'a') goto yy1272; if (yych <= 'z') goto yy154; goto yy3; } } -yy1269: - YYDEBUG(1269, *YYCURSOR); +yy1272: + YYDEBUG(1272, *YYCURSOR); yych = *++YYCURSOR; if (yych == 'Y') goto yy173; if (yych == 'y') goto yy186; goto yy155; -yy1270: - YYDEBUG(1270, *YYCURSOR); +yy1273: + YYDEBUG(1273, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'O') { @@ -18623,7 +18711,7 @@ yy1270: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'N') goto yy142; - goto yy1252; + goto yy1255; } } else { if (yych <= '`') { @@ -18631,13 +18719,13 @@ yy1270: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'o') goto yy1281; + if (yych == 'o') goto yy1284; if (yych <= 'z') goto yy151; goto yy3; } } -yy1271: - YYDEBUG(1271, *YYCURSOR); +yy1274: + YYDEBUG(1274, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'E') { @@ -18648,7 +18736,7 @@ yy1271: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'D') goto yy142; - goto yy1249; + goto yy1252; } } else { if (yych <= '`') { @@ -18656,13 +18744,13 @@ yy1271: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'e') goto yy1278; + if (yych == 'e') goto yy1281; if (yych <= 'z') goto yy151; goto yy3; } } -yy1272: - YYDEBUG(1272, *YYCURSOR); +yy1275: + YYDEBUG(1275, *YYCURSOR); yyaccept = 5; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '9') { @@ -18690,7 +18778,7 @@ yy1272: if (yych <= '@') goto yy194; goto yy142; } else { - if (yych <= 'T') goto yy1244; + if (yych <= 'T') goto yy1247; if (yych <= 'Z') goto yy142; goto yy194; } @@ -18700,14 +18788,14 @@ yy1272: if (yych <= '`') goto yy194; goto yy151; } else { - if (yych <= 't') goto yy1273; + if (yych <= 't') goto yy1276; if (yych <= 'z') goto yy151; goto yy194; } } } -yy1273: - YYDEBUG(1273, *YYCURSOR); +yy1276: + YYDEBUG(1276, *YYCURSOR); yyaccept = 5; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '9') { @@ -18735,7 +18823,7 @@ yy1273: if (yych <= '@') goto yy194; goto yy143; } else { - if (yych <= 'E') goto yy1245; + if (yych <= 'E') goto yy1248; if (yych <= 'Z') goto yy143; goto yy194; } @@ -18745,14 +18833,14 @@ yy1273: if (yych <= '`') goto yy194; goto yy152; } else { - if (yych <= 'e') goto yy1274; + if (yych <= 'e') goto yy1277; if (yych <= 'z') goto yy152; goto yy194; } } } -yy1274: - YYDEBUG(1274, *YYCURSOR); +yy1277: + YYDEBUG(1277, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'M') { @@ -18763,7 +18851,7 @@ yy1274: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'L') goto yy144; - goto yy1246; + goto yy1249; } } else { if (yych <= '`') { @@ -18771,13 +18859,13 @@ yy1274: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'm') goto yy1275; + if (yych == 'm') goto yy1278; if (yych <= 'z') goto yy153; goto yy3; } } -yy1275: - YYDEBUG(1275, *YYCURSOR); +yy1278: + YYDEBUG(1278, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'B') { @@ -18787,30 +18875,30 @@ yy1275: } else { if (yych <= '/') goto yy147; if (yych <= 'A') goto yy3; - goto yy1247; + goto yy1250; } } else { if (yych <= '`') { if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'b') goto yy1276; + if (yych == 'b') goto yy1279; if (yych <= 'z') goto yy154; goto yy3; } } -yy1276: - YYDEBUG(1276, *YYCURSOR); +yy1279: + YYDEBUG(1279, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy1248; + if (yych == 'E') goto yy1251; if (yych != 'e') goto yy155; - YYDEBUG(1277, *YYCURSOR); + YYDEBUG(1280, *YYCURSOR); yych = *++YYCURSOR; if (yych == 'R') goto yy206; if (yych == 'r') goto yy377; goto yy155; -yy1278: - YYDEBUG(1278, *YYCURSOR); +yy1281: + YYDEBUG(1281, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'N') { @@ -18821,7 +18909,7 @@ yy1278: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'M') goto yy143; - goto yy1250; + goto yy1253; } } else { if (yych <= '`') { @@ -18829,13 +18917,13 @@ yy1278: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'n') goto yy1279; + if (yych == 'n') goto yy1282; if (yych <= 'z') goto yy152; goto yy3; } } -yy1279: - YYDEBUG(1279, *YYCURSOR); +yy1282: + YYDEBUG(1282, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'T') { @@ -18846,7 +18934,7 @@ yy1279: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'S') goto yy144; - goto yy1251; + goto yy1254; } } else { if (yych <= '`') { @@ -18854,13 +18942,13 @@ yy1279: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 't') goto yy1280; + if (yych == 't') goto yy1283; if (yych <= 'z') goto yy153; goto yy3; } } -yy1280: - YYDEBUG(1280, *YYCURSOR); +yy1283: + YYDEBUG(1283, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'H') { @@ -18877,13 +18965,13 @@ yy1280: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'h') goto yy1222; + if (yych == 'h') goto yy1223; if (yych <= 'z') goto yy154; goto yy3; } } -yy1281: - YYDEBUG(1281, *YYCURSOR); +yy1284: + YYDEBUG(1284, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'N') { @@ -18894,7 +18982,7 @@ yy1281: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'M') goto yy143; - goto yy1253; + goto yy1256; } } else { if (yych <= '`') { @@ -18902,13 +18990,13 @@ yy1281: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'n') goto yy1282; + if (yych == 'n') goto yy1285; if (yych <= 'z') goto yy152; goto yy3; } } -yy1282: - YYDEBUG(1282, *YYCURSOR); +yy1285: + YYDEBUG(1285, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'D') { @@ -18919,7 +19007,7 @@ yy1282: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'C') goto yy144; - goto yy1254; + goto yy1215; } } else { if (yych <= '`') { @@ -18927,37 +19015,13 @@ yy1282: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'd') goto yy1283; + if (yych == 'd') goto yy1227; if (yych <= 'z') goto yy153; goto yy3; } } -yy1283: - YYDEBUG(1283, *YYCURSOR); - yyaccept = 0; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= ')') { - if (yych <= 0x1F) { - if (yych == '\t') goto yy1206; - goto yy3; - } else { - if (yych <= ' ') goto yy1206; - if (yych <= '(') goto yy3; - goto yy139; - } - } else { - if (yych <= '^') { - if (yych == '/') goto yy147; - goto yy3; - } else { - if (yych <= '_') goto yy147; - if (yych <= '`') goto yy3; - if (yych <= 'z') goto yy154; - goto yy3; - } - } -yy1284: - YYDEBUG(1284, *YYCURSOR); +yy1286: + YYDEBUG(1286, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'C') { if (yych <= ')') { @@ -18973,13 +19037,13 @@ yy1284: if (yych <= '`') goto yy3; goto yy141; } else { - if (yych <= 'c') goto yy1285; + if (yych <= 'c') goto yy1287; if (yych <= 'z') goto yy141; goto yy3; } } -yy1285: - YYDEBUG(1285, *YYCURSOR); +yy1287: + YYDEBUG(1287, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'K') { if (yych <= ')') { @@ -18995,17 +19059,17 @@ yy1285: if (yych <= '`') goto yy3; goto yy142; } else { - if (yych <= 'k') goto yy1286; + if (yych <= 'k') goto yy1288; if (yych <= 'z') goto yy142; goto yy3; } } -yy1286: - YYDEBUG(1286, *YYCURSOR); +yy1288: + YYDEBUG(1288, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= ')') { - if (yych == ' ') goto yy1287; + if (yych == ' ') goto yy1289; if (yych <= '(') goto yy3; goto yy139; } else { @@ -19018,36 +19082,36 @@ yy1286: goto yy3; } } -yy1287: - YYDEBUG(1287, *YYCURSOR); +yy1289: + YYDEBUG(1289, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy1288; + if (yych == 'O') goto yy1290; if (yych != 'o') goto yy56; -yy1288: - YYDEBUG(1288, *YYCURSOR); +yy1290: + YYDEBUG(1290, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'F') goto yy1289; + if (yych == 'F') goto yy1291; if (yych != 'f') goto yy56; -yy1289: - YYDEBUG(1289, *YYCURSOR); +yy1291: + YYDEBUG(1291, *YYCURSOR); yych = *++YYCURSOR; if (yych != ' ') goto yy56; - YYDEBUG(1290, *YYCURSOR); + YYDEBUG(1292, *YYCURSOR); yych = *++YYCURSOR; if (yych <= '/') goto yy56; - if (yych <= '1') goto yy1291; - if (yych <= '2') goto yy1293; - if (yych <= '9') goto yy1294; + if (yych <= '1') goto yy1293; + if (yych <= '2') goto yy1295; + if (yych <= '9') goto yy1296; goto yy56; -yy1291: - YYDEBUG(1291, *YYCURSOR); +yy1293: + YYDEBUG(1293, *YYCURSOR); yyaccept = 28; yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '/') goto yy1295; - if (yych <= '9') goto yy1294; - goto yy1295; -yy1292: - YYDEBUG(1292, *YYCURSOR); + if (yych <= '/') goto yy1297; + if (yych <= '9') goto yy1296; + goto yy1297; +yy1294: + YYDEBUG(1294, *YYCURSOR); { DEBUG_OUTPUT("backof | frontof"); TIMELIB_INIT; @@ -19069,75 +19133,75 @@ yy1292: TIMELIB_DEINIT; return TIMELIB_LF_DAY_OF_MONTH; } -yy1293: - YYDEBUG(1293, *YYCURSOR); +yy1295: + YYDEBUG(1295, *YYCURSOR); yyaccept = 28; yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '/') goto yy1295; - if (yych >= '5') goto yy1295; -yy1294: - YYDEBUG(1294, *YYCURSOR); + if (yych <= '/') goto yy1297; + if (yych >= '5') goto yy1297; +yy1296: + YYDEBUG(1296, *YYCURSOR); yyaccept = 28; YYMARKER = ++YYCURSOR; if ((YYLIMIT - YYCURSOR) < 5) YYFILL(5); yych = *YYCURSOR; -yy1295: - YYDEBUG(1295, *YYCURSOR); +yy1297: + YYDEBUG(1297, *YYCURSOR); if (yych <= 'A') { if (yych <= 0x1F) { - if (yych == '\t') goto yy1294; - goto yy1292; + if (yych == '\t') goto yy1296; + goto yy1294; } else { - if (yych <= ' ') goto yy1294; - if (yych <= '@') goto yy1292; + if (yych <= ' ') goto yy1296; + if (yych <= '@') goto yy1294; } } else { if (yych <= '`') { - if (yych != 'P') goto yy1292; + if (yych != 'P') goto yy1294; } else { - if (yych <= 'a') goto yy1296; - if (yych != 'p') goto yy1292; + if (yych <= 'a') goto yy1298; + if (yych != 'p') goto yy1294; } } -yy1296: - YYDEBUG(1296, *YYCURSOR); +yy1298: + YYDEBUG(1298, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'L') { if (yych != '.') goto yy56; } else { - if (yych <= 'M') goto yy1298; - if (yych == 'm') goto yy1298; + if (yych <= 'M') goto yy1300; + if (yych == 'm') goto yy1300; goto yy56; } - YYDEBUG(1297, *YYCURSOR); + YYDEBUG(1299, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'M') goto yy1298; + if (yych == 'M') goto yy1300; if (yych != 'm') goto yy56; -yy1298: - YYDEBUG(1298, *YYCURSOR); +yy1300: + YYDEBUG(1300, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 0x1F) { - if (yych <= 0x00) goto yy1300; - if (yych == '\t') goto yy1300; + if (yych <= 0x00) goto yy1302; + if (yych == '\t') goto yy1302; goto yy56; } else { - if (yych <= ' ') goto yy1300; + if (yych <= ' ') goto yy1302; if (yych != '.') goto yy56; } - YYDEBUG(1299, *YYCURSOR); + YYDEBUG(1301, *YYCURSOR); yych = *++YYCURSOR; if (yych <= '\t') { - if (yych <= 0x00) goto yy1300; + if (yych <= 0x00) goto yy1302; if (yych <= 0x08) goto yy56; } else { if (yych != ' ') goto yy56; } -yy1300: - YYDEBUG(1300, *YYCURSOR); +yy1302: + YYDEBUG(1302, *YYCURSOR); yych = *++YYCURSOR; - goto yy1292; -yy1301: - YYDEBUG(1301, *YYCURSOR); + goto yy1294; +yy1303: + YYDEBUG(1303, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'C') { @@ -19148,7 +19212,7 @@ yy1301: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'B') goto yy141; - goto yy1285; + goto yy1287; } } else { if (yych <= '`') { @@ -19156,13 +19220,13 @@ yy1301: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'c') goto yy1302; + if (yych == 'c') goto yy1304; if (yych <= 'z') goto yy146; goto yy3; } } -yy1302: - YYDEBUG(1302, *YYCURSOR); +yy1304: + YYDEBUG(1304, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'K') { @@ -19173,7 +19237,7 @@ yy1302: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'J') goto yy142; - goto yy1286; + goto yy1288; } } else { if (yych <= '`') { @@ -19181,18 +19245,18 @@ yy1302: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'k') goto yy1303; + if (yych == 'k') goto yy1305; if (yych <= 'z') goto yy151; goto yy3; } } -yy1303: - YYDEBUG(1303, *YYCURSOR); +yy1305: + YYDEBUG(1305, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '/') { if (yych <= '(') { - if (yych == ' ') goto yy1287; + if (yych == ' ') goto yy1289; goto yy3; } else { if (yych <= ')') goto yy139; @@ -19211,8 +19275,8 @@ yy1303: goto yy3; } } -yy1304: - YYDEBUG(1304, *YYCURSOR); +yy1306: + YYDEBUG(1306, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'S') { if (yych <= ')') { @@ -19228,13 +19292,13 @@ yy1304: if (yych <= '`') goto yy3; goto yy141; } else { - if (yych <= 's') goto yy1305; + if (yych <= 's') goto yy1307; if (yych <= 'z') goto yy141; goto yy3; } } -yy1305: - YYDEBUG(1305, *YYCURSOR); +yy1307: + YYDEBUG(1307, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'T') { if (yych <= ')') { @@ -19250,13 +19314,13 @@ yy1305: if (yych <= '`') goto yy3; goto yy142; } else { - if (yych <= 't') goto yy1306; + if (yych <= 't') goto yy1308; if (yych <= 'z') goto yy142; goto yy3; } } -yy1306: - YYDEBUG(1306, *YYCURSOR); +yy1308: + YYDEBUG(1308, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '(') { @@ -19277,33 +19341,33 @@ yy1306: goto yy3; } } -yy1307: - YYDEBUG(1307, *YYCURSOR); +yy1309: + YYDEBUG(1309, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'D') goto yy1308; + if (yych == 'D') goto yy1310; if (yych != 'd') goto yy1105; -yy1308: - YYDEBUG(1308, *YYCURSOR); +yy1310: + YYDEBUG(1310, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy1309; + if (yych == 'A') goto yy1311; if (yych != 'a') goto yy56; -yy1309: - YYDEBUG(1309, *YYCURSOR); +yy1311: + YYDEBUG(1311, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'Y') goto yy1310; + if (yych == 'Y') goto yy1312; if (yych != 'y') goto yy56; -yy1310: - YYDEBUG(1310, *YYCURSOR); +yy1312: + YYDEBUG(1312, *YYCURSOR); yyaccept = 29; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'R') { - if (yych == ' ') goto yy1312; + if (yych == ' ') goto yy1314; } else { if (yych <= 'S') goto yy1142; if (yych == 's') goto yy1142; } -yy1311: - YYDEBUG(1311, *YYCURSOR); +yy1313: + YYDEBUG(1313, *YYCURSOR); { DEBUG_OUTPUT("firstdayof | lastdayof"); TIMELIB_INIT; @@ -19319,22 +19383,22 @@ yy1311: TIMELIB_DEINIT; return TIMELIB_LF_DAY_OF_MONTH; } -yy1312: - YYDEBUG(1312, *YYCURSOR); +yy1314: + YYDEBUG(1314, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy1313; + if (yych == 'O') goto yy1315; if (yych != 'o') goto yy56; -yy1313: - YYDEBUG(1313, *YYCURSOR); +yy1315: + YYDEBUG(1315, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'F') goto yy1314; + if (yych == 'F') goto yy1316; if (yych != 'f') goto yy56; -yy1314: - YYDEBUG(1314, *YYCURSOR); +yy1316: + YYDEBUG(1316, *YYCURSOR); yych = *++YYCURSOR; - goto yy1311; -yy1315: - YYDEBUG(1315, *YYCURSOR); + goto yy1313; +yy1317: + YYDEBUG(1317, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'S') { @@ -19345,7 +19409,7 @@ yy1315: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'R') goto yy141; - goto yy1305; + goto yy1307; } } else { if (yych <= '`') { @@ -19353,13 +19417,13 @@ yy1315: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 's') goto yy1316; + if (yych == 's') goto yy1318; if (yych <= 'z') goto yy146; goto yy3; } } -yy1316: - YYDEBUG(1316, *YYCURSOR); +yy1318: + YYDEBUG(1318, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'T') { @@ -19370,7 +19434,7 @@ yy1316: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'S') goto yy142; - goto yy1306; + goto yy1308; } } else { if (yych <= '`') { @@ -19378,13 +19442,13 @@ yy1316: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 't') goto yy1317; + if (yych == 't') goto yy1319; if (yych <= 'z') goto yy151; goto yy3; } } -yy1317: - YYDEBUG(1317, *YYCURSOR); +yy1319: + YYDEBUG(1319, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '.') { @@ -19392,7 +19456,7 @@ yy1317: if (yych == '\t') goto yy1104; goto yy3; } else { - if (yych <= ' ') goto yy1307; + if (yych <= ' ') goto yy1309; if (yych == ')') goto yy139; goto yy3; } @@ -19409,8 +19473,8 @@ yy1317: goto yy3; } } -yy1318: - YYDEBUG(1318, *YYCURSOR); +yy1320: + YYDEBUG(1320, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'B') { if (yych <= ')') { @@ -19419,7 +19483,7 @@ yy1318: } else { if (yych <= '@') goto yy3; if (yych <= 'A') goto yy141; - goto yy1354; + goto yy1356; } } else { if (yych <= 'a') { @@ -19427,37 +19491,37 @@ yy1318: if (yych <= '`') goto yy3; goto yy141; } else { - if (yych <= 'b') goto yy1354; + if (yych <= 'b') goto yy1356; if (yych <= 'z') goto yy141; goto yy3; } } -yy1319: - YYDEBUG(1319, *YYCURSOR); +yy1321: + YYDEBUG(1321, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'R') { if (yych <= '@') { if (yych == ')') goto yy139; goto yy3; } else { - if (yych == 'F') goto yy1344; + if (yych == 'F') goto yy1346; if (yych <= 'Q') goto yy141; - goto yy1343; + goto yy1345; } } else { if (yych <= 'f') { if (yych <= 'Z') goto yy141; if (yych <= '`') goto yy3; if (yych <= 'e') goto yy141; - goto yy1344; + goto yy1346; } else { - if (yych == 'r') goto yy1343; + if (yych == 'r') goto yy1345; if (yych <= 'z') goto yy141; goto yy3; } } -yy1320: - YYDEBUG(1320, *YYCURSOR); +yy1322: + YYDEBUG(1322, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'U') { if (yych <= ')') { @@ -19466,7 +19530,7 @@ yy1320: } else { if (yych <= '@') goto yy3; if (yych <= 'T') goto yy141; - goto yy1340; + goto yy1342; } } else { if (yych <= 't') { @@ -19474,20 +19538,20 @@ yy1320: if (yych <= '`') goto yy3; goto yy141; } else { - if (yych <= 'u') goto yy1340; + if (yych <= 'u') goto yy1342; if (yych <= 'z') goto yy141; goto yy3; } } -yy1321: - YYDEBUG(1321, *YYCURSOR); +yy1323: + YYDEBUG(1323, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'O') { if (yych <= '@') { if (yych == ')') goto yy139; goto yy3; } else { - if (yych == 'I') goto yy1323; + if (yych == 'I') goto yy1325; if (yych <= 'N') goto yy141; } } else { @@ -19495,15 +19559,15 @@ yy1321: if (yych <= 'Z') goto yy141; if (yych <= '`') goto yy3; if (yych <= 'h') goto yy141; - goto yy1323; + goto yy1325; } else { - if (yych == 'o') goto yy1322; + if (yych == 'o') goto yy1324; if (yych <= 'z') goto yy141; goto yy3; } } -yy1322: - YYDEBUG(1322, *YYCURSOR); +yy1324: + YYDEBUG(1324, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'N') { if (yych <= ')') { @@ -19512,7 +19576,7 @@ yy1322: } else { if (yych <= '@') goto yy3; if (yych <= 'M') goto yy142; - goto yy1326; + goto yy1328; } } else { if (yych <= 'm') { @@ -19520,13 +19584,13 @@ yy1322: if (yych <= '`') goto yy3; goto yy142; } else { - if (yych <= 'n') goto yy1326; + if (yych <= 'n') goto yy1328; if (yych <= 'z') goto yy142; goto yy3; } } -yy1323: - YYDEBUG(1323, *YYCURSOR); +yy1325: + YYDEBUG(1325, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'D') { if (yych <= ')') { @@ -19542,13 +19606,13 @@ yy1323: if (yych <= '`') goto yy167; goto yy142; } else { - if (yych <= 'd') goto yy1324; + if (yych <= 'd') goto yy1326; if (yych <= 'z') goto yy142; goto yy167; } } -yy1324: - YYDEBUG(1324, *YYCURSOR); +yy1326: + YYDEBUG(1326, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'A') { if (yych == ')') goto yy139; @@ -19558,13 +19622,13 @@ yy1324: if (yych <= 'Z') goto yy143; goto yy3; } else { - if (yych <= 'a') goto yy1325; + if (yych <= 'a') goto yy1327; if (yych <= 'z') goto yy143; goto yy3; } } -yy1325: - YYDEBUG(1325, *YYCURSOR); +yy1327: + YYDEBUG(1327, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'Y') { if (yych <= ')') { @@ -19573,7 +19637,7 @@ yy1325: } else { if (yych <= '@') goto yy3; if (yych <= 'X') goto yy144; - goto yy1233; + goto yy1235; } } else { if (yych <= 'x') { @@ -19581,13 +19645,13 @@ yy1325: if (yych <= '`') goto yy3; goto yy144; } else { - if (yych <= 'y') goto yy1233; + if (yych <= 'y') goto yy1235; if (yych <= 'z') goto yy144; goto yy3; } } -yy1326: - YYDEBUG(1326, *YYCURSOR); +yy1328: + YYDEBUG(1328, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'T') { if (yych <= ')') { @@ -19603,17 +19667,17 @@ yy1326: if (yych <= '`') goto yy3; goto yy143; } else { - if (yych <= 't') goto yy1327; + if (yych <= 't') goto yy1329; if (yych <= 'z') goto yy143; goto yy3; } } -yy1327: - YYDEBUG(1327, *YYCURSOR); +yy1329: + YYDEBUG(1329, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= ')') { - if (yych == ' ') goto yy1328; + if (yych == ' ') goto yy1330; if (yych <= '(') goto yy3; goto yy139; } else { @@ -19626,101 +19690,101 @@ yy1327: goto yy3; } } -yy1328: - YYDEBUG(1328, *YYCURSOR); +yy1330: + YYDEBUG(1330, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy1329; + if (yych == 'O') goto yy1331; if (yych != 'o') goto yy56; -yy1329: - YYDEBUG(1329, *YYCURSOR); +yy1331: + YYDEBUG(1331, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'F') goto yy1330; + if (yych == 'F') goto yy1332; if (yych != 'f') goto yy56; -yy1330: - YYDEBUG(1330, *YYCURSOR); +yy1332: + YYDEBUG(1332, *YYCURSOR); yych = *++YYCURSOR; if (yych != ' ') goto yy56; - YYDEBUG(1331, *YYCURSOR); + YYDEBUG(1333, *YYCURSOR); yych = *++YYCURSOR; if (yych <= '/') goto yy56; - if (yych <= '1') goto yy1332; - if (yych <= '2') goto yy1333; - if (yych <= '9') goto yy1334; + if (yych <= '1') goto yy1334; + if (yych <= '2') goto yy1335; + if (yych <= '9') goto yy1336; goto yy56; -yy1332: - YYDEBUG(1332, *YYCURSOR); +yy1334: + YYDEBUG(1334, *YYCURSOR); yyaccept = 28; yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '/') goto yy1335; - if (yych <= '9') goto yy1334; - goto yy1335; -yy1333: - YYDEBUG(1333, *YYCURSOR); + if (yych <= '/') goto yy1337; + if (yych <= '9') goto yy1336; + goto yy1337; +yy1335: + YYDEBUG(1335, *YYCURSOR); yyaccept = 28; yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '/') goto yy1335; - if (yych >= '5') goto yy1335; -yy1334: - YYDEBUG(1334, *YYCURSOR); + if (yych <= '/') goto yy1337; + if (yych >= '5') goto yy1337; +yy1336: + YYDEBUG(1336, *YYCURSOR); yyaccept = 28; YYMARKER = ++YYCURSOR; if ((YYLIMIT - YYCURSOR) < 5) YYFILL(5); yych = *YYCURSOR; -yy1335: - YYDEBUG(1335, *YYCURSOR); +yy1337: + YYDEBUG(1337, *YYCURSOR); if (yych <= 'A') { if (yych <= 0x1F) { - if (yych == '\t') goto yy1334; - goto yy1292; + if (yych == '\t') goto yy1336; + goto yy1294; } else { - if (yych <= ' ') goto yy1334; - if (yych <= '@') goto yy1292; + if (yych <= ' ') goto yy1336; + if (yych <= '@') goto yy1294; } } else { if (yych <= '`') { - if (yych != 'P') goto yy1292; + if (yych != 'P') goto yy1294; } else { - if (yych <= 'a') goto yy1336; - if (yych != 'p') goto yy1292; + if (yych <= 'a') goto yy1338; + if (yych != 'p') goto yy1294; } } -yy1336: - YYDEBUG(1336, *YYCURSOR); +yy1338: + YYDEBUG(1338, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'L') { if (yych != '.') goto yy56; } else { - if (yych <= 'M') goto yy1338; - if (yych == 'm') goto yy1338; + if (yych <= 'M') goto yy1340; + if (yych == 'm') goto yy1340; goto yy56; } - YYDEBUG(1337, *YYCURSOR); + YYDEBUG(1339, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'M') goto yy1338; + if (yych == 'M') goto yy1340; if (yych != 'm') goto yy56; -yy1338: - YYDEBUG(1338, *YYCURSOR); +yy1340: + YYDEBUG(1340, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 0x1F) { - if (yych <= 0x00) goto yy1300; - if (yych == '\t') goto yy1300; + if (yych <= 0x00) goto yy1302; + if (yych == '\t') goto yy1302; goto yy56; } else { - if (yych <= ' ') goto yy1300; + if (yych <= ' ') goto yy1302; if (yych != '.') goto yy56; } - YYDEBUG(1339, *YYCURSOR); + YYDEBUG(1341, *YYCURSOR); yych = *++YYCURSOR; if (yych <= '\t') { - if (yych <= 0x00) goto yy1300; + if (yych <= 0x00) goto yy1302; if (yych <= 0x08) goto yy56; - goto yy1300; + goto yy1302; } else { - if (yych == ' ') goto yy1300; + if (yych == ' ') goto yy1302; goto yy56; } -yy1340: - YYDEBUG(1340, *YYCURSOR); +yy1342: + YYDEBUG(1342, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'R') { if (yych <= ')') { @@ -19736,13 +19800,13 @@ yy1340: if (yych <= '`') goto yy3; goto yy142; } else { - if (yych <= 'r') goto yy1341; + if (yych <= 'r') goto yy1343; if (yych <= 'z') goto yy142; goto yy3; } } -yy1341: - YYDEBUG(1341, *YYCURSOR); +yy1343: + YYDEBUG(1343, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'T') { if (yych <= ')') { @@ -19758,13 +19822,13 @@ yy1341: if (yych <= '`') goto yy3; goto yy143; } else { - if (yych <= 't') goto yy1342; + if (yych <= 't') goto yy1344; if (yych <= 'z') goto yy143; goto yy3; } } -yy1342: - YYDEBUG(1342, *YYCURSOR); +yy1344: + YYDEBUG(1344, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'H') { if (yych <= ')') { @@ -19773,7 +19837,7 @@ yy1342: } else { if (yych <= '@') goto yy3; if (yych <= 'G') goto yy144; - goto yy1254; + goto yy1215; } } else { if (yych <= 'g') { @@ -19781,13 +19845,13 @@ yy1342: if (yych <= '`') goto yy3; goto yy144; } else { - if (yych <= 'h') goto yy1254; + if (yych <= 'h') goto yy1215; if (yych <= 'z') goto yy144; goto yy3; } } -yy1343: - YYDEBUG(1343, *YYCURSOR); +yy1345: + YYDEBUG(1345, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'S') { if (yych <= ')') { @@ -19796,7 +19860,7 @@ yy1343: } else { if (yych <= '@') goto yy3; if (yych <= 'R') goto yy142; - goto yy1346; + goto yy1348; } } else { if (yych <= 'r') { @@ -19804,13 +19868,13 @@ yy1343: if (yych <= '`') goto yy3; goto yy142; } else { - if (yych <= 's') goto yy1346; + if (yych <= 's') goto yy1348; if (yych <= 'z') goto yy142; goto yy3; } } -yy1344: - YYDEBUG(1344, *YYCURSOR); +yy1346: + YYDEBUG(1346, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'T') { if (yych <= ')') { @@ -19826,13 +19890,13 @@ yy1344: if (yych <= '`') goto yy3; goto yy142; } else { - if (yych <= 't') goto yy1345; + if (yych <= 't') goto yy1347; if (yych <= 'z') goto yy142; goto yy3; } } -yy1345: - YYDEBUG(1345, *YYCURSOR); +yy1347: + YYDEBUG(1347, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'H') { if (yych <= ')') { @@ -19841,7 +19905,7 @@ yy1345: } else { if (yych <= '@') goto yy3; if (yych <= 'G') goto yy143; - goto yy1214; + goto yy1238; } } else { if (yych <= 'g') { @@ -19849,13 +19913,13 @@ yy1345: if (yych <= '`') goto yy3; goto yy143; } else { - if (yych <= 'h') goto yy1214; + if (yych <= 'h') goto yy1238; if (yych <= 'z') goto yy143; goto yy3; } } -yy1346: - YYDEBUG(1346, *YYCURSOR); +yy1348: + YYDEBUG(1348, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'T') { if (yych <= ')') { @@ -19871,13 +19935,13 @@ yy1346: if (yych <= '`') goto yy3; goto yy143; } else { - if (yych <= 't') goto yy1347; + if (yych <= 't') goto yy1349; if (yych <= 'z') goto yy143; goto yy3; } } -yy1347: - YYDEBUG(1347, *YYCURSOR); +yy1349: + YYDEBUG(1349, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '(') { @@ -19898,44 +19962,44 @@ yy1347: goto yy3; } } -yy1348: - YYDEBUG(1348, *YYCURSOR); +yy1350: + YYDEBUG(1350, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'D') goto yy1349; + if (yych == 'D') goto yy1351; if (yych != 'd') goto yy1207; -yy1349: - YYDEBUG(1349, *YYCURSOR); +yy1351: + YYDEBUG(1351, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy1350; + if (yych == 'A') goto yy1352; if (yych != 'a') goto yy56; -yy1350: - YYDEBUG(1350, *YYCURSOR); +yy1352: + YYDEBUG(1352, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'Y') goto yy1351; + if (yych == 'Y') goto yy1353; if (yych != 'y') goto yy56; -yy1351: - YYDEBUG(1351, *YYCURSOR); +yy1353: + YYDEBUG(1353, *YYCURSOR); yyaccept = 29; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'R') { - if (yych != ' ') goto yy1311; + if (yych != ' ') goto yy1313; } else { if (yych <= 'S') goto yy1142; if (yych == 's') goto yy1142; - goto yy1311; + goto yy1313; } - YYDEBUG(1352, *YYCURSOR); + YYDEBUG(1354, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy1353; + if (yych == 'O') goto yy1355; if (yych != 'o') goto yy56; -yy1353: - YYDEBUG(1353, *YYCURSOR); +yy1355: + YYDEBUG(1355, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'F') goto yy1314; - if (yych == 'f') goto yy1314; + if (yych == 'F') goto yy1316; + if (yych == 'f') goto yy1316; goto yy56; -yy1354: - YYDEBUG(1354, *YYCURSOR); +yy1356: + YYDEBUG(1356, *YYCURSOR); yyaccept = 5; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '/') { @@ -19970,14 +20034,14 @@ yy1354: if (yych <= '`') goto yy194; goto yy142; } else { - if (yych <= 'r') goto yy1355; + if (yych <= 'r') goto yy1357; if (yych <= 'z') goto yy142; goto yy194; } } } -yy1355: - YYDEBUG(1355, *YYCURSOR); +yy1357: + YYDEBUG(1357, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'U') { if (yych <= ')') { @@ -19993,13 +20057,13 @@ yy1355: if (yych <= '`') goto yy3; goto yy143; } else { - if (yych <= 'u') goto yy1356; + if (yych <= 'u') goto yy1358; if (yych <= 'z') goto yy143; goto yy3; } } -yy1356: - YYDEBUG(1356, *YYCURSOR); +yy1358: + YYDEBUG(1358, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'A') { if (yych == ')') goto yy139; @@ -20009,30 +20073,30 @@ yy1356: if (yych <= 'Z') goto yy144; goto yy3; } else { - if (yych <= 'a') goto yy1357; + if (yych <= 'a') goto yy1359; if (yych <= 'z') goto yy144; goto yy3; } } -yy1357: - YYDEBUG(1357, *YYCURSOR); +yy1359: + YYDEBUG(1359, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'Q') { if (yych == ')') goto yy139; goto yy3; } else { - if (yych <= 'R') goto yy1358; + if (yych <= 'R') goto yy1360; if (yych != 'r') goto yy3; } -yy1358: - YYDEBUG(1358, *YYCURSOR); +yy1360: + YYDEBUG(1360, *YYCURSOR); yych = *++YYCURSOR; if (yych == 'Y') goto yy206; if (yych == 'y') goto yy206; goto yy56; -yy1359: - YYDEBUG(1359, *YYCURSOR); +yy1361: + YYDEBUG(1361, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'B') { @@ -20043,7 +20107,7 @@ yy1359: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'A') goto yy141; - goto yy1354; + goto yy1356; } } else { if (yych <= '`') { @@ -20051,13 +20115,13 @@ yy1359: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'b') goto yy1377; + if (yych == 'b') goto yy1379; if (yych <= 'z') goto yy146; goto yy3; } } -yy1360: - YYDEBUG(1360, *YYCURSOR); +yy1362: + YYDEBUG(1362, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'R') { @@ -20070,9 +20134,9 @@ yy1360: if (yych <= '@') goto yy3; goto yy141; } else { - if (yych <= 'F') goto yy1344; + if (yych <= 'F') goto yy1346; if (yych <= 'Q') goto yy141; - goto yy1343; + goto yy1345; } } } else { @@ -20087,17 +20151,17 @@ yy1360: } } else { if (yych <= 'q') { - if (yych <= 'f') goto yy1373; + if (yych <= 'f') goto yy1375; goto yy146; } else { - if (yych <= 'r') goto yy1372; + if (yych <= 'r') goto yy1374; if (yych <= 'z') goto yy146; goto yy3; } } } -yy1361: - YYDEBUG(1361, *YYCURSOR); +yy1363: + YYDEBUG(1363, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'U') { @@ -20108,7 +20172,7 @@ yy1361: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'T') goto yy141; - goto yy1340; + goto yy1342; } } else { if (yych <= '`') { @@ -20116,13 +20180,13 @@ yy1361: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'u') goto yy1369; + if (yych == 'u') goto yy1371; if (yych <= 'z') goto yy146; goto yy3; } } -yy1362: - YYDEBUG(1362, *YYCURSOR); +yy1364: + YYDEBUG(1364, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'O') { @@ -20135,9 +20199,9 @@ yy1362: if (yych <= '@') goto yy3; goto yy141; } else { - if (yych <= 'I') goto yy1323; + if (yych <= 'I') goto yy1325; if (yych <= 'N') goto yy141; - goto yy1322; + goto yy1324; } } } else { @@ -20152,17 +20216,17 @@ yy1362: } } else { if (yych <= 'n') { - if (yych <= 'i') goto yy1364; + if (yych <= 'i') goto yy1366; goto yy146; } else { - if (yych <= 'o') goto yy1363; + if (yych <= 'o') goto yy1365; if (yych <= 'z') goto yy146; goto yy3; } } } -yy1363: - YYDEBUG(1363, *YYCURSOR); +yy1365: + YYDEBUG(1365, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'N') { @@ -20173,7 +20237,7 @@ yy1363: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'M') goto yy142; - goto yy1326; + goto yy1328; } } else { if (yych <= '`') { @@ -20181,13 +20245,13 @@ yy1363: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'n') goto yy1367; + if (yych == 'n') goto yy1369; if (yych <= 'z') goto yy151; goto yy3; } } -yy1364: - YYDEBUG(1364, *YYCURSOR); +yy1366: + YYDEBUG(1366, *YYCURSOR); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'D') { @@ -20198,7 +20262,7 @@ yy1364: if (yych <= '/') goto yy147; if (yych <= '@') goto yy167; if (yych <= 'C') goto yy142; - goto yy1324; + goto yy1326; } } else { if (yych <= '`') { @@ -20206,13 +20270,13 @@ yy1364: if (yych == '_') goto yy147; goto yy167; } else { - if (yych == 'd') goto yy1365; + if (yych == 'd') goto yy1367; if (yych <= 'z') goto yy151; goto yy167; } } -yy1365: - YYDEBUG(1365, *YYCURSOR); +yy1367: + YYDEBUG(1367, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'A') { @@ -20222,7 +20286,7 @@ yy1365: } else { if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; - goto yy1325; + goto yy1327; } } else { if (yych <= '_') { @@ -20231,13 +20295,13 @@ yy1365: goto yy147; } else { if (yych <= '`') goto yy3; - if (yych <= 'a') goto yy1366; + if (yych <= 'a') goto yy1368; if (yych <= 'z') goto yy152; goto yy3; } } -yy1366: - YYDEBUG(1366, *YYCURSOR); +yy1368: + YYDEBUG(1368, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'Y') { @@ -20248,7 +20312,7 @@ yy1366: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'X') goto yy144; - goto yy1233; + goto yy1235; } } else { if (yych <= '`') { @@ -20256,13 +20320,13 @@ yy1366: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'y') goto yy1262; + if (yych == 'y') goto yy1264; if (yych <= 'z') goto yy153; goto yy3; } } -yy1367: - YYDEBUG(1367, *YYCURSOR); +yy1369: + YYDEBUG(1369, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'T') { @@ -20273,7 +20337,7 @@ yy1367: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'S') goto yy143; - goto yy1327; + goto yy1329; } } else { if (yych <= '`') { @@ -20281,18 +20345,18 @@ yy1367: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 't') goto yy1368; + if (yych == 't') goto yy1370; if (yych <= 'z') goto yy152; goto yy3; } } -yy1368: - YYDEBUG(1368, *YYCURSOR); +yy1370: + YYDEBUG(1370, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '/') { if (yych <= '(') { - if (yych == ' ') goto yy1328; + if (yych == ' ') goto yy1330; goto yy3; } else { if (yych <= ')') goto yy139; @@ -20311,8 +20375,8 @@ yy1368: goto yy3; } } -yy1369: - YYDEBUG(1369, *YYCURSOR); +yy1371: + YYDEBUG(1371, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'R') { @@ -20323,7 +20387,7 @@ yy1369: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'Q') goto yy142; - goto yy1341; + goto yy1343; } } else { if (yych <= '`') { @@ -20331,13 +20395,13 @@ yy1369: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'r') goto yy1370; + if (yych == 'r') goto yy1372; if (yych <= 'z') goto yy151; goto yy3; } } -yy1370: - YYDEBUG(1370, *YYCURSOR); +yy1372: + YYDEBUG(1372, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'T') { @@ -20348,7 +20412,7 @@ yy1370: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'S') goto yy143; - goto yy1342; + goto yy1344; } } else { if (yych <= '`') { @@ -20356,13 +20420,13 @@ yy1370: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 't') goto yy1371; + if (yych == 't') goto yy1373; if (yych <= 'z') goto yy152; goto yy3; } } -yy1371: - YYDEBUG(1371, *YYCURSOR); +yy1373: + YYDEBUG(1373, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'H') { @@ -20373,7 +20437,7 @@ yy1371: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'G') goto yy144; - goto yy1254; + goto yy1215; } } else { if (yych <= '`') { @@ -20381,13 +20445,13 @@ yy1371: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'h') goto yy1283; + if (yych == 'h') goto yy1227; if (yych <= 'z') goto yy153; goto yy3; } } -yy1372: - YYDEBUG(1372, *YYCURSOR); +yy1374: + YYDEBUG(1374, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'S') { @@ -20398,7 +20462,7 @@ yy1372: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'R') goto yy142; - goto yy1346; + goto yy1348; } } else { if (yych <= '`') { @@ -20406,13 +20470,13 @@ yy1372: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 's') goto yy1375; + if (yych == 's') goto yy1377; if (yych <= 'z') goto yy151; goto yy3; } } -yy1373: - YYDEBUG(1373, *YYCURSOR); +yy1375: + YYDEBUG(1375, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'T') { @@ -20423,7 +20487,7 @@ yy1373: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'S') goto yy142; - goto yy1345; + goto yy1347; } } else { if (yych <= '`') { @@ -20431,13 +20495,13 @@ yy1373: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 't') goto yy1374; + if (yych == 't') goto yy1376; if (yych <= 'z') goto yy151; goto yy3; } } -yy1374: - YYDEBUG(1374, *YYCURSOR); +yy1376: + YYDEBUG(1376, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'H') { @@ -20448,7 +20512,7 @@ yy1374: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'G') goto yy143; - goto yy1214; + goto yy1238; } } else { if (yych <= '`') { @@ -20456,13 +20520,13 @@ yy1374: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'h') goto yy1225; + if (yych == 'h') goto yy1267; if (yych <= 'z') goto yy152; goto yy3; } } -yy1375: - YYDEBUG(1375, *YYCURSOR); +yy1377: + YYDEBUG(1377, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'T') { @@ -20473,7 +20537,7 @@ yy1375: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'S') goto yy143; - goto yy1347; + goto yy1349; } } else { if (yych <= '`') { @@ -20481,13 +20545,13 @@ yy1375: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 't') goto yy1376; + if (yych == 't') goto yy1378; if (yych <= 'z') goto yy152; goto yy3; } } -yy1376: - YYDEBUG(1376, *YYCURSOR); +yy1378: + YYDEBUG(1378, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '.') { @@ -20495,7 +20559,7 @@ yy1376: if (yych == '\t') goto yy1206; goto yy3; } else { - if (yych <= ' ') goto yy1348; + if (yych <= ' ') goto yy1350; if (yych == ')') goto yy139; goto yy3; } @@ -20512,8 +20576,8 @@ yy1376: goto yy3; } } -yy1377: - YYDEBUG(1377, *YYCURSOR); +yy1379: + YYDEBUG(1379, *YYCURSOR); yyaccept = 5; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '9') { @@ -20541,7 +20605,7 @@ yy1377: if (yych <= '@') goto yy194; goto yy142; } else { - if (yych <= 'R') goto yy1355; + if (yych <= 'R') goto yy1357; if (yych <= 'Z') goto yy142; goto yy194; } @@ -20551,14 +20615,14 @@ yy1377: if (yych <= '`') goto yy194; goto yy151; } else { - if (yych <= 'r') goto yy1378; + if (yych <= 'r') goto yy1380; if (yych <= 'z') goto yy151; goto yy194; } } } -yy1378: - YYDEBUG(1378, *YYCURSOR); +yy1380: + YYDEBUG(1380, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'U') { @@ -20569,7 +20633,7 @@ yy1378: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'T') goto yy143; - goto yy1356; + goto yy1358; } } else { if (yych <= '`') { @@ -20577,13 +20641,13 @@ yy1378: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'u') goto yy1379; + if (yych == 'u') goto yy1381; if (yych <= 'z') goto yy152; goto yy3; } } -yy1379: - YYDEBUG(1379, *YYCURSOR); +yy1381: + YYDEBUG(1381, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'A') { @@ -20593,7 +20657,7 @@ yy1379: } else { if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; - goto yy1357; + goto yy1359; } } else { if (yych <= '_') { @@ -20602,13 +20666,13 @@ yy1379: goto yy147; } else { if (yych <= '`') goto yy3; - if (yych <= 'a') goto yy1380; + if (yych <= 'a') goto yy1382; if (yych <= 'z') goto yy153; goto yy3; } } -yy1380: - YYDEBUG(1380, *YYCURSOR); +yy1382: + YYDEBUG(1382, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'R') { @@ -20618,39 +20682,39 @@ yy1380: } else { if (yych <= '/') goto yy147; if (yych <= 'Q') goto yy3; - goto yy1358; + goto yy1360; } } else { if (yych <= '`') { if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'r') goto yy1381; + if (yych == 'r') goto yy1383; if (yych <= 'z') goto yy154; goto yy3; } } -yy1381: - YYDEBUG(1381, *YYCURSOR); +yy1383: + YYDEBUG(1383, *YYCURSOR); yych = *++YYCURSOR; if (yych == 'Y') goto yy206; if (yych == 'y') goto yy377; goto yy155; -yy1382: - YYDEBUG(1382, *YYCURSOR); +yy1384: + YYDEBUG(1384, *YYCURSOR); yych = *++YYCURSOR; if (yych <= '/') goto yy56; if (yych >= ':') goto yy56; -yy1383: - YYDEBUG(1383, *YYCURSOR); +yy1385: + YYDEBUG(1385, *YYCURSOR); ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); yych = *YYCURSOR; - YYDEBUG(1384, *YYCURSOR); - if (yych <= '/') goto yy1385; - if (yych <= '9') goto yy1383; -yy1385: - YYDEBUG(1385, *YYCURSOR); + YYDEBUG(1386, *YYCURSOR); + if (yych <= '/') goto yy1387; + if (yych <= '9') goto yy1385; +yy1387: + YYDEBUG(1387, *YYCURSOR); { timelib_ull i; @@ -20674,8 +20738,8 @@ yy1385: TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -yy1386: - YYDEBUG(1386, *YYCURSOR); +yy1388: + YYDEBUG(1388, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'N') { if (yych <= ')') { @@ -20684,7 +20748,7 @@ yy1386: } else { if (yych <= '@') goto yy3; if (yych <= 'M') goto yy141; - goto yy1427; + goto yy1429; } } else { if (yych <= 'm') { @@ -20692,61 +20756,61 @@ yy1386: if (yych <= '`') goto yy3; goto yy141; } else { - if (yych <= 'n') goto yy1427; + if (yych <= 'n') goto yy1429; if (yych <= 'z') goto yy141; goto yy3; } } -yy1387: - YYDEBUG(1387, *YYCURSOR); +yy1389: + YYDEBUG(1389, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'U') { if (yych <= '@') { if (yych == ')') goto yy139; goto yy3; } else { - if (yych == 'I') goto yy1419; + if (yych == 'I') goto yy1421; if (yych <= 'T') goto yy141; - goto yy1420; + goto yy1422; } } else { if (yych <= 'i') { if (yych <= 'Z') goto yy141; if (yych <= '`') goto yy3; if (yych <= 'h') goto yy141; - goto yy1419; + goto yy1421; } else { - if (yych == 'u') goto yy1420; + if (yych == 'u') goto yy1422; if (yych <= 'z') goto yy141; goto yy3; } } -yy1388: - YYDEBUG(1388, *YYCURSOR); +yy1390: + YYDEBUG(1390, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'M') { if (yych <= '@') { if (yych == ')') goto yy139; goto yy3; } else { - if (yych == 'D') goto yy1408; + if (yych == 'D') goto yy1410; if (yych <= 'L') goto yy141; - goto yy1409; + goto yy1411; } } else { if (yych <= 'd') { if (yych <= 'Z') goto yy141; if (yych <= '`') goto yy3; if (yych <= 'c') goto yy141; - goto yy1408; + goto yy1410; } else { - if (yych == 'm') goto yy1409; + if (yych == 'm') goto yy1411; if (yych <= 'z') goto yy141; goto yy3; } } -yy1389: - YYDEBUG(1389, *YYCURSOR); +yy1391: + YYDEBUG(1391, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'E') { if (yych <= ')') { @@ -20755,7 +20819,7 @@ yy1389: } else { if (yych <= '@') goto yy3; if (yych <= 'D') goto yy141; - goto yy1404; + goto yy1406; } } else { if (yych <= 'd') { @@ -20763,13 +20827,13 @@ yy1389: if (yych <= '`') goto yy3; goto yy141; } else { - if (yych <= 'e') goto yy1404; + if (yych <= 'e') goto yy1406; if (yych <= 'z') goto yy141; goto yy3; } } -yy1390: - YYDEBUG(1390, *YYCURSOR); +yy1392: + YYDEBUG(1392, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'E') { if (yych <= ')') { @@ -20778,7 +20842,7 @@ yy1390: } else { if (yych <= '@') goto yy3; if (yych <= 'D') goto yy141; - goto yy1400; + goto yy1402; } } else { if (yych <= 'd') { @@ -20786,78 +20850,78 @@ yy1390: if (yych <= '`') goto yy3; goto yy141; } else { - if (yych <= 'e') goto yy1400; + if (yych <= 'e') goto yy1402; if (yych <= 'z') goto yy141; goto yy3; } } -yy1391: - YYDEBUG(1391, *YYCURSOR); +yy1393: + YYDEBUG(1393, *YYCURSOR); yych = *++YYCURSOR; if (yych <= '/') { if (yych == '.') goto yy1064; goto yy56; } else { - if (yych <= '9') goto yy1394; + if (yych <= '9') goto yy1396; if (yych <= ':') goto yy1064; goto yy56; } -yy1392: - YYDEBUG(1392, *YYCURSOR); +yy1394: + YYDEBUG(1394, *YYCURSOR); yych = *++YYCURSOR; if (yych <= '/') { if (yych == '.') goto yy1064; goto yy56; } else { - if (yych <= '4') goto yy1394; + if (yych <= '4') goto yy1396; if (yych == ':') goto yy1064; goto yy56; } -yy1393: - YYDEBUG(1393, *YYCURSOR); +yy1395: + YYDEBUG(1395, *YYCURSOR); yych = *++YYCURSOR; if (yych == '.') goto yy1064; if (yych == ':') goto yy1064; goto yy56; -yy1394: - YYDEBUG(1394, *YYCURSOR); +yy1396: + YYDEBUG(1396, *YYCURSOR); yych = *++YYCURSOR; if (yych <= '/') { if (yych == '.') goto yy1064; goto yy56; } else { - if (yych <= '5') goto yy1395; + if (yych <= '5') goto yy1397; if (yych == ':') goto yy1064; goto yy56; } -yy1395: - YYDEBUG(1395, *YYCURSOR); +yy1397: + YYDEBUG(1397, *YYCURSOR); yych = *++YYCURSOR; if (yych <= '/') goto yy56; if (yych >= ':') goto yy56; - YYDEBUG(1396, *YYCURSOR); + YYDEBUG(1398, *YYCURSOR); yyaccept = 24; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '/') goto yy1067; - if (yych <= '5') goto yy1397; - if (yych <= '6') goto yy1398; + if (yych <= '5') goto yy1399; + if (yych <= '6') goto yy1400; goto yy1067; -yy1397: - YYDEBUG(1397, *YYCURSOR); +yy1399: + YYDEBUG(1399, *YYCURSOR); yych = *++YYCURSOR; if (yych <= '/') goto yy56; - if (yych <= '9') goto yy1399; + if (yych <= '9') goto yy1401; goto yy56; -yy1398: - YYDEBUG(1398, *YYCURSOR); +yy1400: + YYDEBUG(1400, *YYCURSOR); yych = *++YYCURSOR; if (yych != '0') goto yy56; -yy1399: - YYDEBUG(1399, *YYCURSOR); +yy1401: + YYDEBUG(1401, *YYCURSOR); yych = *++YYCURSOR; goto yy1075; -yy1400: - YYDEBUG(1400, *YYCURSOR); +yy1402: + YYDEBUG(1402, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'L') { if (yych <= ')') { @@ -20873,13 +20937,13 @@ yy1400: if (yych <= '`') goto yy3; goto yy142; } else { - if (yych <= 'l') goto yy1401; + if (yych <= 'l') goto yy1403; if (yych <= 'z') goto yy142; goto yy3; } } -yy1401: - YYDEBUG(1401, *YYCURSOR); +yy1403: + YYDEBUG(1403, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'F') { if (yych <= ')') { @@ -20895,13 +20959,13 @@ yy1401: if (yych <= '`') goto yy3; goto yy143; } else { - if (yych <= 'f') goto yy1402; + if (yych <= 'f') goto yy1404; if (yych <= 'z') goto yy143; goto yy3; } } -yy1402: - YYDEBUG(1402, *YYCURSOR); +yy1404: + YYDEBUG(1404, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'T') { if (yych <= ')') { @@ -20917,13 +20981,13 @@ yy1402: if (yych <= '`') goto yy3; goto yy144; } else { - if (yych <= 't') goto yy1403; + if (yych <= 't') goto yy1405; if (yych <= 'z') goto yy144; goto yy3; } } -yy1403: - YYDEBUG(1403, *YYCURSOR); +yy1405: + YYDEBUG(1405, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'G') { @@ -20934,8 +20998,8 @@ yy1403: if (yych == 'h') goto yy1205; goto yy3; } -yy1404: - YYDEBUG(1404, *YYCURSOR); +yy1406: + YYDEBUG(1406, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'S') { if (yych <= ')') { @@ -20951,13 +21015,13 @@ yy1404: if (yych <= '`') goto yy167; goto yy142; } else { - if (yych <= 's') goto yy1405; + if (yych <= 's') goto yy1407; if (yych <= 'z') goto yy142; goto yy167; } } -yy1405: - YYDEBUG(1405, *YYCURSOR); +yy1407: + YYDEBUG(1407, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'D') { if (yych <= ')') { @@ -20973,13 +21037,13 @@ yy1405: if (yych <= '`') goto yy3; goto yy143; } else { - if (yych <= 'd') goto yy1406; + if (yych <= 'd') goto yy1408; if (yych <= 'z') goto yy143; goto yy3; } } -yy1406: - YYDEBUG(1406, *YYCURSOR); +yy1408: + YYDEBUG(1408, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'A') { if (yych == ')') goto yy139; @@ -20989,13 +21053,13 @@ yy1406: if (yych <= 'Z') goto yy144; goto yy3; } else { - if (yych <= 'a') goto yy1407; + if (yych <= 'a') goto yy1409; if (yych <= 'z') goto yy144; goto yy3; } } -yy1407: - YYDEBUG(1407, *YYCURSOR); +yy1409: + YYDEBUG(1409, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'X') { if (yych == ')') goto yy139; @@ -21005,25 +21069,25 @@ yy1407: if (yych == 'y') goto yy173; goto yy3; } -yy1408: - YYDEBUG(1408, *YYCURSOR); +yy1410: + YYDEBUG(1410, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'A') { if (yych == ')') goto yy139; if (yych <= '@') goto yy3; - goto yy1416; + goto yy1418; } else { if (yych <= '`') { if (yych <= 'Z') goto yy142; goto yy3; } else { - if (yych <= 'a') goto yy1416; + if (yych <= 'a') goto yy1418; if (yych <= 'z') goto yy142; goto yy3; } } -yy1409: - YYDEBUG(1409, *YYCURSOR); +yy1411: + YYDEBUG(1411, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'O') { if (yych <= ')') { @@ -21039,13 +21103,13 @@ yy1409: if (yych <= '`') goto yy3; goto yy142; } else { - if (yych <= 'o') goto yy1410; + if (yych <= 'o') goto yy1412; if (yych <= 'z') goto yy142; goto yy3; } } -yy1410: - YYDEBUG(1410, *YYCURSOR); +yy1412: + YYDEBUG(1412, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'R') { if (yych <= ')') { @@ -21061,13 +21125,13 @@ yy1410: if (yych <= '`') goto yy3; goto yy143; } else { - if (yych <= 'r') goto yy1411; + if (yych <= 'r') goto yy1413; if (yych <= 'z') goto yy143; goto yy3; } } -yy1411: - YYDEBUG(1411, *YYCURSOR); +yy1413: + YYDEBUG(1413, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'R') { if (yych <= ')') { @@ -21083,32 +21147,32 @@ yy1411: if (yych <= '`') goto yy3; goto yy144; } else { - if (yych <= 'r') goto yy1412; + if (yych <= 'r') goto yy1414; if (yych <= 'z') goto yy144; goto yy3; } } -yy1412: - YYDEBUG(1412, *YYCURSOR); +yy1414: + YYDEBUG(1414, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'N') { if (yych == ')') goto yy139; goto yy3; } else { - if (yych <= 'O') goto yy1413; + if (yych <= 'O') goto yy1415; if (yych != 'o') goto yy3; } -yy1413: - YYDEBUG(1413, *YYCURSOR); +yy1415: + YYDEBUG(1415, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'W') goto yy1414; + if (yych == 'W') goto yy1416; if (yych != 'w') goto yy56; -yy1414: - YYDEBUG(1414, *YYCURSOR); +yy1416: + YYDEBUG(1416, *YYCURSOR); ++YYCURSOR; -yy1415: - YYDEBUG(1415, *YYCURSOR); +yy1417: + YYDEBUG(1417, *YYCURSOR); { DEBUG_OUTPUT("tomorrow"); TIMELIB_INIT; @@ -21119,8 +21183,8 @@ yy1415: TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -yy1416: - YYDEBUG(1416, *YYCURSOR); +yy1418: + YYDEBUG(1418, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'Y') { if (yych <= ')') { @@ -21136,23 +21200,23 @@ yy1416: if (yych <= '`') goto yy3; goto yy143; } else { - if (yych <= 'y') goto yy1417; + if (yych <= 'y') goto yy1419; if (yych <= 'z') goto yy143; goto yy3; } } -yy1417: - YYDEBUG(1417, *YYCURSOR); +yy1419: + YYDEBUG(1419, *YYCURSOR); ++YYCURSOR; if ((yych = *YYCURSOR) <= '@') { if (yych == ')') goto yy139; } else { if (yych <= 'Z') goto yy144; - if (yych <= '`') goto yy1418; + if (yych <= '`') goto yy1420; if (yych <= 'z') goto yy144; } -yy1418: - YYDEBUG(1418, *YYCURSOR); +yy1420: + YYDEBUG(1420, *YYCURSOR); { DEBUG_OUTPUT("midnight | today"); TIMELIB_INIT; @@ -21161,8 +21225,8 @@ yy1418: TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -yy1419: - YYDEBUG(1419, *YYCURSOR); +yy1421: + YYDEBUG(1421, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'S') { if (yych <= '@') { @@ -21170,8 +21234,8 @@ yy1419: goto yy3; } else { if (yych <= 'Q') goto yy142; - if (yych <= 'R') goto yy1425; - goto yy1426; + if (yych <= 'R') goto yy1427; + goto yy1428; } } else { if (yych <= 'q') { @@ -21179,14 +21243,14 @@ yy1419: if (yych <= '`') goto yy3; goto yy142; } else { - if (yych <= 'r') goto yy1425; - if (yych <= 's') goto yy1426; + if (yych <= 'r') goto yy1427; + if (yych <= 's') goto yy1428; if (yych <= 'z') goto yy142; goto yy3; } } -yy1420: - YYDEBUG(1420, *YYCURSOR); +yy1422: + YYDEBUG(1422, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'R') { if (yych <= ')') { @@ -21202,13 +21266,13 @@ yy1420: if (yych <= '`') goto yy167; goto yy142; } else { - if (yych <= 'r') goto yy1421; + if (yych <= 'r') goto yy1423; if (yych <= 'z') goto yy142; goto yy167; } } -yy1421: - YYDEBUG(1421, *YYCURSOR); +yy1423: + YYDEBUG(1423, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'S') { if (yych <= ')') { @@ -21224,13 +21288,13 @@ yy1421: if (yych <= '`') goto yy3; goto yy143; } else { - if (yych <= 's') goto yy1422; + if (yych <= 's') goto yy1424; if (yych <= 'z') goto yy143; goto yy3; } } -yy1422: - YYDEBUG(1422, *YYCURSOR); +yy1424: + YYDEBUG(1424, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'D') { if (yych <= ')') { @@ -21246,30 +21310,30 @@ yy1422: if (yych <= '`') goto yy3; goto yy144; } else { - if (yych <= 'd') goto yy1423; + if (yych <= 'd') goto yy1425; if (yych <= 'z') goto yy144; goto yy3; } } -yy1423: - YYDEBUG(1423, *YYCURSOR); +yy1425: + YYDEBUG(1425, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '@') { if (yych == ')') goto yy139; goto yy3; } else { - if (yych <= 'A') goto yy1424; + if (yych <= 'A') goto yy1426; if (yych != 'a') goto yy3; } -yy1424: - YYDEBUG(1424, *YYCURSOR); +yy1426: + YYDEBUG(1426, *YYCURSOR); yych = *++YYCURSOR; if (yych == 'Y') goto yy173; if (yych == 'y') goto yy173; goto yy56; -yy1425: - YYDEBUG(1425, *YYCURSOR); +yy1427: + YYDEBUG(1427, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'D') { if (yych <= ')') { @@ -21278,7 +21342,7 @@ yy1425: } else { if (yych <= '@') goto yy3; if (yych <= 'C') goto yy143; - goto yy1214; + goto yy1238; } } else { if (yych <= 'c') { @@ -21286,13 +21350,13 @@ yy1425: if (yych <= '`') goto yy3; goto yy143; } else { - if (yych <= 'd') goto yy1214; + if (yych <= 'd') goto yy1238; if (yych <= 'z') goto yy143; goto yy3; } } -yy1426: - YYDEBUG(1426, *YYCURSOR); +yy1428: + YYDEBUG(1428, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '(') { @@ -21314,8 +21378,8 @@ yy1426: goto yy3; } } -yy1427: - YYDEBUG(1427, *YYCURSOR); +yy1429: + YYDEBUG(1429, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'T') { if (yych <= ')') { @@ -21331,13 +21395,13 @@ yy1427: if (yych <= '`') goto yy3; goto yy142; } else { - if (yych <= 't') goto yy1428; + if (yych <= 't') goto yy1430; if (yych <= 'z') goto yy142; goto yy3; } } -yy1428: - YYDEBUG(1428, *YYCURSOR); +yy1430: + YYDEBUG(1430, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'H') { if (yych <= ')') { @@ -21346,7 +21410,7 @@ yy1428: } else { if (yych <= '@') goto yy3; if (yych <= 'G') goto yy143; - goto yy1214; + goto yy1238; } } else { if (yych <= 'g') { @@ -21354,13 +21418,13 @@ yy1428: if (yych <= '`') goto yy3; goto yy143; } else { - if (yych <= 'h') goto yy1214; + if (yych <= 'h') goto yy1238; if (yych <= 'z') goto yy143; goto yy3; } } -yy1429: - YYDEBUG(1429, *YYCURSOR); +yy1431: + YYDEBUG(1431, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'N') { @@ -21371,7 +21435,7 @@ yy1429: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'M') goto yy141; - goto yy1427; + goto yy1429; } } else { if (yych <= '`') { @@ -21379,13 +21443,13 @@ yy1429: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'n') goto yy1459; + if (yych == 'n') goto yy1461; if (yych <= 'z') goto yy146; goto yy3; } } -yy1430: - YYDEBUG(1430, *YYCURSOR); +yy1432: + YYDEBUG(1432, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'U') { @@ -21398,9 +21462,9 @@ yy1430: if (yych <= '@') goto yy3; goto yy141; } else { - if (yych <= 'I') goto yy1419; + if (yych <= 'I') goto yy1421; if (yych <= 'T') goto yy141; - goto yy1420; + goto yy1422; } } } else { @@ -21415,17 +21479,17 @@ yy1430: } } else { if (yych <= 't') { - if (yych <= 'i') goto yy1451; + if (yych <= 'i') goto yy1453; goto yy146; } else { - if (yych <= 'u') goto yy1452; + if (yych <= 'u') goto yy1454; if (yych <= 'z') goto yy146; goto yy3; } } } -yy1431: - YYDEBUG(1431, *YYCURSOR); +yy1433: + YYDEBUG(1433, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'M') { @@ -21438,9 +21502,9 @@ yy1431: if (yych <= '@') goto yy3; goto yy141; } else { - if (yych <= 'D') goto yy1408; + if (yych <= 'D') goto yy1410; if (yych <= 'L') goto yy141; - goto yy1409; + goto yy1411; } } } else { @@ -21455,17 +21519,17 @@ yy1431: } } else { if (yych <= 'l') { - if (yych <= 'd') goto yy1442; + if (yych <= 'd') goto yy1444; goto yy146; } else { - if (yych <= 'm') goto yy1443; + if (yych <= 'm') goto yy1445; if (yych <= 'z') goto yy146; goto yy3; } } } -yy1432: - YYDEBUG(1432, *YYCURSOR); +yy1434: + YYDEBUG(1434, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'E') { @@ -21476,7 +21540,7 @@ yy1432: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'D') goto yy141; - goto yy1404; + goto yy1406; } } else { if (yych <= '`') { @@ -21484,13 +21548,13 @@ yy1432: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'e') goto yy1438; + if (yych == 'e') goto yy1440; if (yych <= 'z') goto yy146; goto yy3; } } -yy1433: - YYDEBUG(1433, *YYCURSOR); +yy1435: + YYDEBUG(1435, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'E') { @@ -21501,7 +21565,7 @@ yy1433: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'D') goto yy141; - goto yy1400; + goto yy1402; } } else { if (yych <= '`') { @@ -21509,13 +21573,13 @@ yy1433: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'e') goto yy1434; + if (yych == 'e') goto yy1436; if (yych <= 'z') goto yy146; goto yy3; } } -yy1434: - YYDEBUG(1434, *YYCURSOR); +yy1436: + YYDEBUG(1436, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'L') { @@ -21526,7 +21590,7 @@ yy1434: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'K') goto yy142; - goto yy1401; + goto yy1403; } } else { if (yych <= '`') { @@ -21534,13 +21598,13 @@ yy1434: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'l') goto yy1435; + if (yych == 'l') goto yy1437; if (yych <= 'z') goto yy151; goto yy3; } } -yy1435: - YYDEBUG(1435, *YYCURSOR); +yy1437: + YYDEBUG(1437, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'F') { @@ -21551,7 +21615,7 @@ yy1435: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'E') goto yy143; - goto yy1402; + goto yy1404; } } else { if (yych <= '`') { @@ -21559,13 +21623,13 @@ yy1435: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'f') goto yy1436; + if (yych == 'f') goto yy1438; if (yych <= 'z') goto yy152; goto yy3; } } -yy1436: - YYDEBUG(1436, *YYCURSOR); +yy1438: + YYDEBUG(1438, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'T') { @@ -21576,7 +21640,7 @@ yy1436: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'S') goto yy144; - goto yy1403; + goto yy1405; } } else { if (yych <= '`') { @@ -21584,13 +21648,13 @@ yy1436: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 't') goto yy1437; + if (yych == 't') goto yy1439; if (yych <= 'z') goto yy153; goto yy3; } } -yy1437: - YYDEBUG(1437, *YYCURSOR); +yy1439: + YYDEBUG(1439, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'H') { @@ -21607,13 +21671,13 @@ yy1437: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'h') goto yy1222; + if (yych == 'h') goto yy1223; if (yych <= 'z') goto yy154; goto yy3; } } -yy1438: - YYDEBUG(1438, *YYCURSOR); +yy1440: + YYDEBUG(1440, *YYCURSOR); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'S') { @@ -21624,7 +21688,7 @@ yy1438: if (yych <= '/') goto yy147; if (yych <= '@') goto yy167; if (yych <= 'R') goto yy142; - goto yy1405; + goto yy1407; } } else { if (yych <= '`') { @@ -21632,13 +21696,13 @@ yy1438: if (yych == '_') goto yy147; goto yy167; } else { - if (yych == 's') goto yy1439; + if (yych == 's') goto yy1441; if (yych <= 'z') goto yy151; goto yy167; } } -yy1439: - YYDEBUG(1439, *YYCURSOR); +yy1441: + YYDEBUG(1441, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'D') { @@ -21649,7 +21713,7 @@ yy1439: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'C') goto yy143; - goto yy1406; + goto yy1408; } } else { if (yych <= '`') { @@ -21657,13 +21721,13 @@ yy1439: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'd') goto yy1440; + if (yych == 'd') goto yy1442; if (yych <= 'z') goto yy152; goto yy3; } } -yy1440: - YYDEBUG(1440, *YYCURSOR); +yy1442: + YYDEBUG(1442, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'A') { @@ -21673,7 +21737,7 @@ yy1440: } else { if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; - goto yy1407; + goto yy1409; } } else { if (yych <= '_') { @@ -21682,13 +21746,13 @@ yy1440: goto yy147; } else { if (yych <= '`') goto yy3; - if (yych <= 'a') goto yy1441; + if (yych <= 'a') goto yy1443; if (yych <= 'z') goto yy153; goto yy3; } } -yy1441: - YYDEBUG(1441, *YYCURSOR); +yy1443: + YYDEBUG(1443, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'Y') { @@ -21710,8 +21774,8 @@ yy1441: goto yy3; } } -yy1442: - YYDEBUG(1442, *YYCURSOR); +yy1444: + YYDEBUG(1444, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'A') { @@ -21721,7 +21785,7 @@ yy1442: } else { if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; - goto yy1416; + goto yy1418; } } else { if (yych <= '_') { @@ -21730,13 +21794,13 @@ yy1442: goto yy147; } else { if (yych <= '`') goto yy3; - if (yych <= 'a') goto yy1449; + if (yych <= 'a') goto yy1451; if (yych <= 'z') goto yy151; goto yy3; } } -yy1443: - YYDEBUG(1443, *YYCURSOR); +yy1445: + YYDEBUG(1445, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'O') { @@ -21747,7 +21811,7 @@ yy1443: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'N') goto yy142; - goto yy1410; + goto yy1412; } } else { if (yych <= '`') { @@ -21755,13 +21819,13 @@ yy1443: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'o') goto yy1444; + if (yych == 'o') goto yy1446; if (yych <= 'z') goto yy151; goto yy3; } } -yy1444: - YYDEBUG(1444, *YYCURSOR); +yy1446: + YYDEBUG(1446, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'R') { @@ -21772,7 +21836,7 @@ yy1444: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'Q') goto yy143; - goto yy1411; + goto yy1413; } } else { if (yych <= '`') { @@ -21780,13 +21844,13 @@ yy1444: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'r') goto yy1445; + if (yych == 'r') goto yy1447; if (yych <= 'z') goto yy152; goto yy3; } } -yy1445: - YYDEBUG(1445, *YYCURSOR); +yy1447: + YYDEBUG(1447, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'R') { @@ -21797,7 +21861,7 @@ yy1445: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'Q') goto yy144; - goto yy1412; + goto yy1414; } } else { if (yych <= '`') { @@ -21805,13 +21869,13 @@ yy1445: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'r') goto yy1446; + if (yych == 'r') goto yy1448; if (yych <= 'z') goto yy153; goto yy3; } } -yy1446: - YYDEBUG(1446, *YYCURSOR); +yy1448: + YYDEBUG(1448, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'O') { @@ -21821,37 +21885,37 @@ yy1446: } else { if (yych <= '/') goto yy147; if (yych <= 'N') goto yy3; - goto yy1413; + goto yy1415; } } else { if (yych <= '`') { if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'o') goto yy1447; + if (yych == 'o') goto yy1449; if (yych <= 'z') goto yy154; goto yy3; } } -yy1447: - YYDEBUG(1447, *YYCURSOR); +yy1449: + YYDEBUG(1449, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'W') goto yy1414; + if (yych == 'W') goto yy1416; if (yych != 'w') goto yy155; - YYDEBUG(1448, *YYCURSOR); + YYDEBUG(1450, *YYCURSOR); yyaccept = 30; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '^') { if (yych == '/') goto yy147; - goto yy1415; + goto yy1417; } else { if (yych <= '_') goto yy147; - if (yych <= '`') goto yy1415; + if (yych <= '`') goto yy1417; if (yych <= 'z') goto yy154; - goto yy1415; + goto yy1417; } -yy1449: - YYDEBUG(1449, *YYCURSOR); +yy1451: + YYDEBUG(1451, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'Y') { @@ -21862,7 +21926,7 @@ yy1449: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'X') goto yy143; - goto yy1417; + goto yy1419; } } else { if (yych <= '`') { @@ -21870,36 +21934,36 @@ yy1449: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'y') goto yy1450; + if (yych == 'y') goto yy1452; if (yych <= 'z') goto yy152; goto yy3; } } -yy1450: - YYDEBUG(1450, *YYCURSOR); +yy1452: + YYDEBUG(1452, *YYCURSOR); yyaccept = 31; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '@') { if (yych <= ')') { - if (yych <= '(') goto yy1418; + if (yych <= '(') goto yy1420; goto yy139; } else { if (yych == '/') goto yy147; - goto yy1418; + goto yy1420; } } else { if (yych <= '_') { if (yych <= 'Z') goto yy144; - if (yych <= '^') goto yy1418; + if (yych <= '^') goto yy1420; goto yy147; } else { - if (yych <= '`') goto yy1418; + if (yych <= '`') goto yy1420; if (yych <= 'z') goto yy153; - goto yy1418; + goto yy1420; } } -yy1451: - YYDEBUG(1451, *YYCURSOR); +yy1453: + YYDEBUG(1453, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'S') { @@ -21910,8 +21974,8 @@ yy1451: } else { if (yych <= '@') goto yy3; if (yych <= 'Q') goto yy142; - if (yych <= 'R') goto yy1425; - goto yy1426; + if (yych <= 'R') goto yy1427; + goto yy1428; } } else { if (yych <= '`') { @@ -21921,16 +21985,16 @@ yy1451: } else { if (yych <= 'r') { if (yych <= 'q') goto yy151; - goto yy1457; + goto yy1459; } else { - if (yych <= 's') goto yy1458; + if (yych <= 's') goto yy1460; if (yych <= 'z') goto yy151; goto yy3; } } } -yy1452: - YYDEBUG(1452, *YYCURSOR); +yy1454: + YYDEBUG(1454, *YYCURSOR); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'R') { @@ -21941,7 +22005,7 @@ yy1452: if (yych <= '/') goto yy147; if (yych <= '@') goto yy167; if (yych <= 'Q') goto yy142; - goto yy1421; + goto yy1423; } } else { if (yych <= '`') { @@ -21949,13 +22013,13 @@ yy1452: if (yych == '_') goto yy147; goto yy167; } else { - if (yych == 'r') goto yy1453; + if (yych == 'r') goto yy1455; if (yych <= 'z') goto yy151; goto yy167; } } -yy1453: - YYDEBUG(1453, *YYCURSOR); +yy1455: + YYDEBUG(1455, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'S') { @@ -21966,7 +22030,7 @@ yy1453: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'R') goto yy143; - goto yy1422; + goto yy1424; } } else { if (yych <= '`') { @@ -21974,13 +22038,13 @@ yy1453: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 's') goto yy1454; + if (yych == 's') goto yy1456; if (yych <= 'z') goto yy152; goto yy3; } } -yy1454: - YYDEBUG(1454, *YYCURSOR); +yy1456: + YYDEBUG(1456, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'D') { @@ -21991,7 +22055,7 @@ yy1454: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'C') goto yy144; - goto yy1423; + goto yy1425; } } else { if (yych <= '`') { @@ -21999,13 +22063,13 @@ yy1454: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'd') goto yy1455; + if (yych == 'd') goto yy1457; if (yych <= 'z') goto yy153; goto yy3; } } -yy1455: - YYDEBUG(1455, *YYCURSOR); +yy1457: + YYDEBUG(1457, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'A') { @@ -22015,26 +22079,26 @@ yy1455: } else { if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; - goto yy1424; + goto yy1426; } } else { if (yych <= '`') { if (yych == '_') goto yy147; goto yy3; } else { - if (yych <= 'a') goto yy1456; + if (yych <= 'a') goto yy1458; if (yych <= 'z') goto yy154; goto yy3; } } -yy1456: - YYDEBUG(1456, *YYCURSOR); +yy1458: + YYDEBUG(1458, *YYCURSOR); yych = *++YYCURSOR; if (yych == 'Y') goto yy173; if (yych == 'y') goto yy186; goto yy155; -yy1457: - YYDEBUG(1457, *YYCURSOR); +yy1459: + YYDEBUG(1459, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'D') { @@ -22045,7 +22109,7 @@ yy1457: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'C') goto yy143; - goto yy1214; + goto yy1238; } } else { if (yych <= '`') { @@ -22053,13 +22117,13 @@ yy1457: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'd') goto yy1225; + if (yych == 'd') goto yy1267; if (yych <= 'z') goto yy152; goto yy3; } } -yy1458: - YYDEBUG(1458, *YYCURSOR); +yy1460: + YYDEBUG(1460, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '.') { @@ -22084,8 +22148,8 @@ yy1458: goto yy3; } } -yy1459: - YYDEBUG(1459, *YYCURSOR); +yy1461: + YYDEBUG(1461, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'T') { @@ -22096,7 +22160,7 @@ yy1459: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'S') goto yy142; - goto yy1428; + goto yy1430; } } else { if (yych <= '`') { @@ -22104,13 +22168,13 @@ yy1459: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 't') goto yy1460; + if (yych == 't') goto yy1462; if (yych <= 'z') goto yy151; goto yy3; } } -yy1460: - YYDEBUG(1460, *YYCURSOR); +yy1462: + YYDEBUG(1462, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'H') { @@ -22121,7 +22185,7 @@ yy1460: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'G') goto yy143; - goto yy1214; + goto yy1238; } } else { if (yych <= '`') { @@ -22129,37 +22193,37 @@ yy1460: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'h') goto yy1225; + if (yych == 'h') goto yy1267; if (yych <= 'z') goto yy152; goto yy3; } } -yy1461: - YYDEBUG(1461, *YYCURSOR); +yy1463: + YYDEBUG(1463, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'Y') { if (yych <= '@') { if (yych == ')') goto yy139; goto yy3; } else { - if (yych == 'R') goto yy1473; + if (yych == 'R') goto yy1475; if (yych <= 'X') goto yy141; - goto yy1474; + goto yy1476; } } else { if (yych <= 'r') { if (yych <= 'Z') goto yy141; if (yych <= '`') goto yy3; if (yych <= 'q') goto yy141; - goto yy1473; + goto yy1475; } else { - if (yych == 'y') goto yy1474; + if (yych == 'y') goto yy1476; if (yych <= 'z') goto yy141; goto yy3; } } -yy1462: - YYDEBUG(1462, *YYCURSOR); +yy1464: + YYDEBUG(1464, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'D') { if (yych <= ')') { @@ -22168,7 +22232,7 @@ yy1462: } else { if (yych <= '@') goto yy3; if (yych <= 'C') goto yy141; - goto yy1467; + goto yy1469; } } else { if (yych <= 'c') { @@ -22176,13 +22240,13 @@ yy1462: if (yych <= '`') goto yy3; goto yy141; } else { - if (yych <= 'd') goto yy1467; + if (yych <= 'd') goto yy1469; if (yych <= 'z') goto yy141; goto yy3; } } -yy1463: - YYDEBUG(1463, *YYCURSOR); +yy1465: + YYDEBUG(1465, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'N') { if (yych <= ')') { @@ -22198,13 +22262,13 @@ yy1463: if (yych <= '`') goto yy3; goto yy141; } else { - if (yych <= 'n') goto yy1464; + if (yych <= 'n') goto yy1466; if (yych <= 'z') goto yy141; goto yy3; } } -yy1464: - YYDEBUG(1464, *YYCURSOR); +yy1466: + YYDEBUG(1466, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'D') { if (yych <= ')') { @@ -22220,13 +22284,13 @@ yy1464: if (yych <= '`') goto yy167; goto yy142; } else { - if (yych <= 'd') goto yy1465; + if (yych <= 'd') goto yy1467; if (yych <= 'z') goto yy142; goto yy167; } } -yy1465: - YYDEBUG(1465, *YYCURSOR); +yy1467: + YYDEBUG(1467, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'A') { if (yych == ')') goto yy139; @@ -22236,13 +22300,13 @@ yy1465: if (yych <= 'Z') goto yy143; goto yy3; } else { - if (yych <= 'a') goto yy1466; + if (yych <= 'a') goto yy1468; if (yych <= 'z') goto yy143; goto yy3; } } -yy1466: - YYDEBUG(1466, *YYCURSOR); +yy1468: + YYDEBUG(1468, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'Y') { if (yych <= ')') { @@ -22251,7 +22315,7 @@ yy1466: } else { if (yych <= '@') goto yy3; if (yych <= 'X') goto yy144; - goto yy1233; + goto yy1235; } } else { if (yych <= 'x') { @@ -22259,13 +22323,13 @@ yy1466: if (yych <= '`') goto yy3; goto yy144; } else { - if (yych <= 'y') goto yy1233; + if (yych <= 'y') goto yy1235; if (yych <= 'z') goto yy144; goto yy3; } } -yy1467: - YYDEBUG(1467, *YYCURSOR); +yy1469: + YYDEBUG(1469, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'N') { if (yych <= ')') { @@ -22281,13 +22345,13 @@ yy1467: if (yych <= '`') goto yy3; goto yy142; } else { - if (yych <= 'n') goto yy1468; + if (yych <= 'n') goto yy1470; if (yych <= 'z') goto yy142; goto yy3; } } -yy1468: - YYDEBUG(1468, *YYCURSOR); +yy1470: + YYDEBUG(1470, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'I') { if (yych <= ')') { @@ -22303,13 +22367,13 @@ yy1468: if (yych <= '`') goto yy3; goto yy143; } else { - if (yych <= 'i') goto yy1469; + if (yych <= 'i') goto yy1471; if (yych <= 'z') goto yy143; goto yy3; } } -yy1469: - YYDEBUG(1469, *YYCURSOR); +yy1471: + YYDEBUG(1471, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'G') { if (yych <= ')') { @@ -22325,33 +22389,33 @@ yy1469: if (yych <= '`') goto yy3; goto yy144; } else { - if (yych <= 'g') goto yy1470; + if (yych <= 'g') goto yy1472; if (yych <= 'z') goto yy144; goto yy3; } } -yy1470: - YYDEBUG(1470, *YYCURSOR); +yy1472: + YYDEBUG(1472, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'G') { if (yych == ')') goto yy139; goto yy3; } else { - if (yych <= 'H') goto yy1471; + if (yych <= 'H') goto yy1473; if (yych != 'h') goto yy3; } -yy1471: - YYDEBUG(1471, *YYCURSOR); +yy1473: + YYDEBUG(1473, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy1472; + if (yych == 'T') goto yy1474; if (yych != 't') goto yy56; -yy1472: - YYDEBUG(1472, *YYCURSOR); +yy1474: + YYDEBUG(1474, *YYCURSOR); yych = *++YYCURSOR; - goto yy1418; -yy1473: - YYDEBUG(1473, *YYCURSOR); + goto yy1420; +yy1475: + YYDEBUG(1475, *YYCURSOR); yyaccept = 5; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '/') { @@ -22379,7 +22443,7 @@ yy1473: if (yych <= '9') goto yy196; goto yy194; } else { - if (yych == 'C') goto yy1475; + if (yych == 'C') goto yy1477; goto yy142; } } else { @@ -22387,14 +22451,14 @@ yy1473: if (yych <= '`') goto yy194; goto yy142; } else { - if (yych <= 'c') goto yy1475; + if (yych <= 'c') goto yy1477; if (yych <= 'z') goto yy142; goto yy194; } } } -yy1474: - YYDEBUG(1474, *YYCURSOR); +yy1476: + YYDEBUG(1476, *YYCURSOR); yyaccept = 5; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '-') { @@ -22419,8 +22483,8 @@ yy1474: goto yy194; } } -yy1475: - YYDEBUG(1475, *YYCURSOR); +yy1477: + YYDEBUG(1477, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'H') { if (yych <= ')') { @@ -22442,8 +22506,8 @@ yy1475: goto yy3; } } -yy1476: - YYDEBUG(1476, *YYCURSOR); +yy1478: + YYDEBUG(1478, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'Y') { @@ -22456,9 +22520,9 @@ yy1476: if (yych <= '@') goto yy3; goto yy141; } else { - if (yych <= 'R') goto yy1473; + if (yych <= 'R') goto yy1475; if (yych <= 'X') goto yy141; - goto yy1474; + goto yy1476; } } } else { @@ -22473,17 +22537,17 @@ yy1476: } } else { if (yych <= 'x') { - if (yych <= 'r') goto yy1488; + if (yych <= 'r') goto yy1490; goto yy146; } else { - if (yych <= 'y') goto yy1489; + if (yych <= 'y') goto yy1491; if (yych <= 'z') goto yy146; goto yy3; } } } -yy1477: - YYDEBUG(1477, *YYCURSOR); +yy1479: + YYDEBUG(1479, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'D') { @@ -22494,7 +22558,7 @@ yy1477: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'C') goto yy141; - goto yy1467; + goto yy1469; } } else { if (yych <= '`') { @@ -22502,13 +22566,13 @@ yy1477: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'd') goto yy1482; + if (yych == 'd') goto yy1484; if (yych <= 'z') goto yy146; goto yy3; } } -yy1478: - YYDEBUG(1478, *YYCURSOR); +yy1480: + YYDEBUG(1480, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'N') { @@ -22519,7 +22583,7 @@ yy1478: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'M') goto yy141; - goto yy1464; + goto yy1466; } } else { if (yych <= '`') { @@ -22527,13 +22591,13 @@ yy1478: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'n') goto yy1479; + if (yych == 'n') goto yy1481; if (yych <= 'z') goto yy146; goto yy3; } } -yy1479: - YYDEBUG(1479, *YYCURSOR); +yy1481: + YYDEBUG(1481, *YYCURSOR); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'D') { @@ -22544,7 +22608,7 @@ yy1479: if (yych <= '/') goto yy147; if (yych <= '@') goto yy167; if (yych <= 'C') goto yy142; - goto yy1465; + goto yy1467; } } else { if (yych <= '`') { @@ -22552,13 +22616,13 @@ yy1479: if (yych == '_') goto yy147; goto yy167; } else { - if (yych == 'd') goto yy1480; + if (yych == 'd') goto yy1482; if (yych <= 'z') goto yy151; goto yy167; } } -yy1480: - YYDEBUG(1480, *YYCURSOR); +yy1482: + YYDEBUG(1482, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'A') { @@ -22568,7 +22632,7 @@ yy1480: } else { if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; - goto yy1466; + goto yy1468; } } else { if (yych <= '_') { @@ -22577,13 +22641,13 @@ yy1480: goto yy147; } else { if (yych <= '`') goto yy3; - if (yych <= 'a') goto yy1481; + if (yych <= 'a') goto yy1483; if (yych <= 'z') goto yy152; goto yy3; } } -yy1481: - YYDEBUG(1481, *YYCURSOR); +yy1483: + YYDEBUG(1483, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'Y') { @@ -22594,7 +22658,7 @@ yy1481: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'X') goto yy144; - goto yy1233; + goto yy1235; } } else { if (yych <= '`') { @@ -22602,13 +22666,13 @@ yy1481: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'y') goto yy1262; + if (yych == 'y') goto yy1264; if (yych <= 'z') goto yy153; goto yy3; } } -yy1482: - YYDEBUG(1482, *YYCURSOR); +yy1484: + YYDEBUG(1484, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'N') { @@ -22619,7 +22683,7 @@ yy1482: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'M') goto yy142; - goto yy1468; + goto yy1470; } } else { if (yych <= '`') { @@ -22627,13 +22691,13 @@ yy1482: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'n') goto yy1483; + if (yych == 'n') goto yy1485; if (yych <= 'z') goto yy151; goto yy3; } } -yy1483: - YYDEBUG(1483, *YYCURSOR); +yy1485: + YYDEBUG(1485, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'I') { @@ -22644,7 +22708,7 @@ yy1483: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'H') goto yy143; - goto yy1469; + goto yy1471; } } else { if (yych <= '`') { @@ -22652,13 +22716,13 @@ yy1483: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'i') goto yy1484; + if (yych == 'i') goto yy1486; if (yych <= 'z') goto yy152; goto yy3; } } -yy1484: - YYDEBUG(1484, *YYCURSOR); +yy1486: + YYDEBUG(1486, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'G') { @@ -22669,7 +22733,7 @@ yy1484: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'F') goto yy144; - goto yy1470; + goto yy1472; } } else { if (yych <= '`') { @@ -22677,13 +22741,13 @@ yy1484: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'g') goto yy1485; + if (yych == 'g') goto yy1487; if (yych <= 'z') goto yy153; goto yy3; } } -yy1485: - YYDEBUG(1485, *YYCURSOR); +yy1487: + YYDEBUG(1487, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'H') { @@ -22693,37 +22757,37 @@ yy1485: } else { if (yych <= '/') goto yy147; if (yych <= 'G') goto yy3; - goto yy1471; + goto yy1473; } } else { if (yych <= '`') { if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'h') goto yy1486; + if (yych == 'h') goto yy1488; if (yych <= 'z') goto yy154; goto yy3; } } -yy1486: - YYDEBUG(1486, *YYCURSOR); +yy1488: + YYDEBUG(1488, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy1472; + if (yych == 'T') goto yy1474; if (yych != 't') goto yy155; - YYDEBUG(1487, *YYCURSOR); + YYDEBUG(1489, *YYCURSOR); yyaccept = 31; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '^') { if (yych == '/') goto yy147; - goto yy1418; + goto yy1420; } else { if (yych <= '_') goto yy147; - if (yych <= '`') goto yy1418; + if (yych <= '`') goto yy1420; if (yych <= 'z') goto yy154; - goto yy1418; + goto yy1420; } -yy1488: - YYDEBUG(1488, *YYCURSOR); +yy1490: + YYDEBUG(1490, *YYCURSOR); yyaccept = 5; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '9') { @@ -22751,7 +22815,7 @@ yy1488: if (yych <= '@') goto yy194; goto yy142; } else { - if (yych <= 'C') goto yy1475; + if (yych <= 'C') goto yy1477; if (yych <= 'Z') goto yy142; goto yy194; } @@ -22761,14 +22825,14 @@ yy1488: if (yych <= '`') goto yy194; goto yy151; } else { - if (yych <= 'c') goto yy1490; + if (yych <= 'c') goto yy1492; if (yych <= 'z') goto yy151; goto yy194; } } } -yy1489: - YYDEBUG(1489, *YYCURSOR); +yy1491: + YYDEBUG(1491, *YYCURSOR); yyaccept = 5; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '.') { @@ -22803,8 +22867,8 @@ yy1489: } } } -yy1490: - YYDEBUG(1490, *YYCURSOR); +yy1492: + YYDEBUG(1492, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'H') { @@ -22828,8 +22892,8 @@ yy1490: goto yy3; } } -yy1491: - YYDEBUG(1491, *YYCURSOR); +yy1493: + YYDEBUG(1493, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'W') { if (yych <= 'N') { @@ -22837,30 +22901,30 @@ yy1491: if (yych <= '@') goto yy3; goto yy141; } else { - if (yych <= 'O') goto yy1499; + if (yych <= 'O') goto yy1501; if (yych <= 'U') goto yy141; - if (yych <= 'V') goto yy1500; - goto yy1497; + if (yych <= 'V') goto yy1502; + goto yy1499; } } else { if (yych <= 'o') { if (yych <= 'Z') goto yy141; if (yych <= '`') goto yy3; if (yych <= 'n') goto yy141; - goto yy1499; + goto yy1501; } else { if (yych <= 'v') { if (yych <= 'u') goto yy141; - goto yy1500; + goto yy1502; } else { - if (yych <= 'w') goto yy1497; + if (yych <= 'w') goto yy1499; if (yych <= 'z') goto yy141; goto yy3; } } } -yy1492: - YYDEBUG(1492, *YYCURSOR); +yy1494: + YYDEBUG(1494, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'X') { if (yych <= ')') { @@ -22869,7 +22933,7 @@ yy1492: } else { if (yych <= '@') goto yy3; if (yych <= 'W') goto yy141; - goto yy1496; + goto yy1498; } } else { if (yych <= 'w') { @@ -22877,13 +22941,13 @@ yy1492: if (yych <= '`') goto yy3; goto yy141; } else { - if (yych <= 'x') goto yy1496; + if (yych <= 'x') goto yy1498; if (yych <= 'z') goto yy141; goto yy3; } } -yy1493: - YYDEBUG(1493, *YYCURSOR); +yy1495: + YYDEBUG(1495, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'N') { if (yych <= ')') { @@ -22899,13 +22963,13 @@ yy1493: if (yych <= '`') goto yy3; goto yy141; } else { - if (yych <= 'n') goto yy1494; + if (yych <= 'n') goto yy1496; if (yych <= 'z') goto yy141; goto yy3; } } -yy1494: - YYDEBUG(1494, *YYCURSOR); +yy1496: + YYDEBUG(1496, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'T') { if (yych <= ')') { @@ -22921,13 +22985,13 @@ yy1494: if (yych <= '`') goto yy3; goto yy142; } else { - if (yych <= 't') goto yy1495; + if (yych <= 't') goto yy1497; if (yych <= 'z') goto yy142; goto yy3; } } -yy1495: - YYDEBUG(1495, *YYCURSOR); +yy1497: + YYDEBUG(1497, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'H') { if (yych <= ')') { @@ -22936,7 +23000,7 @@ yy1495: } else { if (yych <= '@') goto yy3; if (yych <= 'G') goto yy143; - goto yy1214; + goto yy1238; } } else { if (yych <= 'g') { @@ -22944,13 +23008,13 @@ yy1495: if (yych <= '`') goto yy3; goto yy143; } else { - if (yych <= 'h') goto yy1214; + if (yych <= 'h') goto yy1238; if (yych <= 'z') goto yy143; goto yy3; } } -yy1496: - YYDEBUG(1496, *YYCURSOR); +yy1498: + YYDEBUG(1498, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'T') { if (yych <= ')') { @@ -22959,7 +23023,7 @@ yy1496: } else { if (yych <= '@') goto yy3; if (yych <= 'S') goto yy142; - goto yy1426; + goto yy1428; } } else { if (yych <= 's') { @@ -22967,23 +23031,23 @@ yy1496: if (yych <= '`') goto yy3; goto yy142; } else { - if (yych <= 't') goto yy1426; + if (yych <= 't') goto yy1428; if (yych <= 'z') goto yy142; goto yy3; } } -yy1497: - YYDEBUG(1497, *YYCURSOR); +yy1499: + YYDEBUG(1499, *YYCURSOR); ++YYCURSOR; if ((yych = *YYCURSOR) <= '@') { if (yych == ')') goto yy139; } else { if (yych <= 'Z') goto yy142; - if (yych <= '`') goto yy1498; + if (yych <= '`') goto yy1500; if (yych <= 'z') goto yy142; } -yy1498: - YYDEBUG(1498, *YYCURSOR); +yy1500: + YYDEBUG(1500, *YYCURSOR); { DEBUG_OUTPUT("now"); TIMELIB_INIT; @@ -22991,8 +23055,8 @@ yy1498: TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -yy1499: - YYDEBUG(1499, *YYCURSOR); +yy1501: + YYDEBUG(1501, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'N') { if (yych <= ')') { @@ -23001,7 +23065,7 @@ yy1499: } else { if (yych <= '@') goto yy3; if (yych <= 'M') goto yy142; - goto yy1505; + goto yy1507; } } else { if (yych <= 'm') { @@ -23009,13 +23073,13 @@ yy1499: if (yych <= '`') goto yy3; goto yy142; } else { - if (yych <= 'n') goto yy1505; + if (yych <= 'n') goto yy1507; if (yych <= 'z') goto yy142; goto yy3; } } -yy1500: - YYDEBUG(1500, *YYCURSOR); +yy1502: + YYDEBUG(1502, *YYCURSOR); yyaccept = 5; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '/') { @@ -23050,14 +23114,14 @@ yy1500: if (yych <= '`') goto yy194; goto yy142; } else { - if (yych <= 'e') goto yy1501; + if (yych <= 'e') goto yy1503; if (yych <= 'z') goto yy142; goto yy194; } } } -yy1501: - YYDEBUG(1501, *YYCURSOR); +yy1503: + YYDEBUG(1503, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'M') { if (yych <= ')') { @@ -23073,13 +23137,13 @@ yy1501: if (yych <= '`') goto yy3; goto yy143; } else { - if (yych <= 'm') goto yy1502; + if (yych <= 'm') goto yy1504; if (yych <= 'z') goto yy143; goto yy3; } } -yy1502: - YYDEBUG(1502, *YYCURSOR); +yy1504: + YYDEBUG(1504, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'B') { if (yych <= ')') { @@ -23095,40 +23159,40 @@ yy1502: if (yych <= '`') goto yy3; goto yy144; } else { - if (yych <= 'b') goto yy1503; + if (yych <= 'b') goto yy1505; if (yych <= 'z') goto yy144; goto yy3; } } -yy1503: - YYDEBUG(1503, *YYCURSOR); +yy1505: + YYDEBUG(1505, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'D') { if (yych == ')') goto yy139; goto yy3; } else { - if (yych <= 'E') goto yy1504; + if (yych <= 'E') goto yy1506; if (yych != 'e') goto yy3; } -yy1504: - YYDEBUG(1504, *YYCURSOR); +yy1506: + YYDEBUG(1506, *YYCURSOR); yych = *++YYCURSOR; if (yych == 'R') goto yy206; if (yych == 'r') goto yy206; goto yy56; -yy1505: - YYDEBUG(1505, *YYCURSOR); +yy1507: + YYDEBUG(1507, *YYCURSOR); ++YYCURSOR; if ((yych = *YYCURSOR) <= '@') { if (yych == ')') goto yy139; } else { if (yych <= 'Z') goto yy143; - if (yych <= '`') goto yy1506; + if (yych <= '`') goto yy1508; if (yych <= 'z') goto yy143; } -yy1506: - YYDEBUG(1506, *YYCURSOR); +yy1508: + YYDEBUG(1508, *YYCURSOR); { DEBUG_OUTPUT("noon"); TIMELIB_INIT; @@ -23139,8 +23203,8 @@ yy1506: TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -yy1507: - YYDEBUG(1507, *YYCURSOR); +yy1509: + YYDEBUG(1509, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'W') { @@ -23155,11 +23219,11 @@ yy1507: } else { if (yych <= 'O') { if (yych <= 'N') goto yy141; - goto yy1499; + goto yy1501; } else { if (yych <= 'U') goto yy141; - if (yych <= 'V') goto yy1500; - goto yy1497; + if (yych <= 'V') goto yy1502; + goto yy1499; } } } else { @@ -23174,18 +23238,18 @@ yy1507: } } else { if (yych <= 'v') { - if (yych <= 'o') goto yy1514; + if (yych <= 'o') goto yy1516; if (yych <= 'u') goto yy146; - goto yy1515; + goto yy1517; } else { - if (yych <= 'w') goto yy1513; + if (yych <= 'w') goto yy1515; if (yych <= 'z') goto yy146; goto yy3; } } } -yy1508: - YYDEBUG(1508, *YYCURSOR); +yy1510: + YYDEBUG(1510, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'X') { @@ -23196,7 +23260,7 @@ yy1508: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'W') goto yy141; - goto yy1496; + goto yy1498; } } else { if (yych <= '`') { @@ -23204,13 +23268,13 @@ yy1508: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'x') goto yy1512; + if (yych == 'x') goto yy1514; if (yych <= 'z') goto yy146; goto yy3; } } -yy1509: - YYDEBUG(1509, *YYCURSOR); +yy1511: + YYDEBUG(1511, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'N') { @@ -23221,7 +23285,7 @@ yy1509: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'M') goto yy141; - goto yy1494; + goto yy1496; } } else { if (yych <= '`') { @@ -23229,13 +23293,13 @@ yy1509: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'n') goto yy1510; + if (yych == 'n') goto yy1512; if (yych <= 'z') goto yy146; goto yy3; } } -yy1510: - YYDEBUG(1510, *YYCURSOR); +yy1512: + YYDEBUG(1512, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'T') { @@ -23246,7 +23310,7 @@ yy1510: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'S') goto yy142; - goto yy1495; + goto yy1497; } } else { if (yych <= '`') { @@ -23254,13 +23318,13 @@ yy1510: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 't') goto yy1511; + if (yych == 't') goto yy1513; if (yych <= 'z') goto yy151; goto yy3; } } -yy1511: - YYDEBUG(1511, *YYCURSOR); +yy1513: + YYDEBUG(1513, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'H') { @@ -23271,7 +23335,7 @@ yy1511: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'G') goto yy143; - goto yy1214; + goto yy1238; } } else { if (yych <= '`') { @@ -23279,13 +23343,13 @@ yy1511: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'h') goto yy1225; + if (yych == 'h') goto yy1267; if (yych <= 'z') goto yy152; goto yy3; } } -yy1512: - YYDEBUG(1512, *YYCURSOR); +yy1514: + YYDEBUG(1514, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'T') { @@ -23296,7 +23360,7 @@ yy1512: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'S') goto yy142; - goto yy1426; + goto yy1428; } } else { if (yych <= '`') { @@ -23304,36 +23368,36 @@ yy1512: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 't') goto yy1458; + if (yych == 't') goto yy1460; if (yych <= 'z') goto yy151; goto yy3; } } -yy1513: - YYDEBUG(1513, *YYCURSOR); +yy1515: + YYDEBUG(1515, *YYCURSOR); yyaccept = 32; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '@') { if (yych <= ')') { - if (yych <= '(') goto yy1498; + if (yych <= '(') goto yy1500; goto yy139; } else { if (yych == '/') goto yy147; - goto yy1498; + goto yy1500; } } else { if (yych <= '_') { if (yych <= 'Z') goto yy142; - if (yych <= '^') goto yy1498; + if (yych <= '^') goto yy1500; goto yy147; } else { - if (yych <= '`') goto yy1498; + if (yych <= '`') goto yy1500; if (yych <= 'z') goto yy151; - goto yy1498; + goto yy1500; } } -yy1514: - YYDEBUG(1514, *YYCURSOR); +yy1516: + YYDEBUG(1516, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'N') { @@ -23344,7 +23408,7 @@ yy1514: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'M') goto yy142; - goto yy1505; + goto yy1507; } } else { if (yych <= '`') { @@ -23352,13 +23416,13 @@ yy1514: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'n') goto yy1520; + if (yych == 'n') goto yy1522; if (yych <= 'z') goto yy151; goto yy3; } } -yy1515: - YYDEBUG(1515, *YYCURSOR); +yy1517: + YYDEBUG(1517, *YYCURSOR); yyaccept = 5; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '9') { @@ -23386,7 +23450,7 @@ yy1515: if (yych <= '@') goto yy194; goto yy142; } else { - if (yych <= 'E') goto yy1501; + if (yych <= 'E') goto yy1503; if (yych <= 'Z') goto yy142; goto yy194; } @@ -23396,14 +23460,14 @@ yy1515: if (yych <= '`') goto yy194; goto yy151; } else { - if (yych <= 'e') goto yy1516; + if (yych <= 'e') goto yy1518; if (yych <= 'z') goto yy151; goto yy194; } } } -yy1516: - YYDEBUG(1516, *YYCURSOR); +yy1518: + YYDEBUG(1518, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'M') { @@ -23414,7 +23478,7 @@ yy1516: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'L') goto yy143; - goto yy1502; + goto yy1504; } } else { if (yych <= '`') { @@ -23422,13 +23486,13 @@ yy1516: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'm') goto yy1517; + if (yych == 'm') goto yy1519; if (yych <= 'z') goto yy152; goto yy3; } } -yy1517: - YYDEBUG(1517, *YYCURSOR); +yy1519: + YYDEBUG(1519, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'B') { @@ -23439,7 +23503,7 @@ yy1517: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'A') goto yy144; - goto yy1503; + goto yy1505; } } else { if (yych <= '`') { @@ -23447,13 +23511,13 @@ yy1517: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'b') goto yy1518; + if (yych == 'b') goto yy1520; if (yych <= 'z') goto yy153; goto yy3; } } -yy1518: - YYDEBUG(1518, *YYCURSOR); +yy1520: + YYDEBUG(1520, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'E') { @@ -23463,49 +23527,49 @@ yy1518: } else { if (yych <= '/') goto yy147; if (yych <= 'D') goto yy3; - goto yy1504; + goto yy1506; } } else { if (yych <= '`') { if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'e') goto yy1519; + if (yych == 'e') goto yy1521; if (yych <= 'z') goto yy154; goto yy3; } } -yy1519: - YYDEBUG(1519, *YYCURSOR); +yy1521: + YYDEBUG(1521, *YYCURSOR); yych = *++YYCURSOR; if (yych == 'R') goto yy206; if (yych == 'r') goto yy377; goto yy155; -yy1520: - YYDEBUG(1520, *YYCURSOR); +yy1522: + YYDEBUG(1522, *YYCURSOR); yyaccept = 33; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '@') { if (yych <= ')') { - if (yych <= '(') goto yy1506; + if (yych <= '(') goto yy1508; goto yy139; } else { if (yych == '/') goto yy147; - goto yy1506; + goto yy1508; } } else { if (yych <= '_') { if (yych <= 'Z') goto yy143; - if (yych <= '^') goto yy1506; + if (yych <= '^') goto yy1508; goto yy147; } else { - if (yych <= '`') goto yy1506; + if (yych <= '`') goto yy1508; if (yych <= 'z') goto yy152; - goto yy1506; + goto yy1508; } } -yy1521: - YYDEBUG(1521, *YYCURSOR); +yy1523: + YYDEBUG(1523, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'S') { if (yych <= ')') { @@ -23521,13 +23585,13 @@ yy1521: if (yych <= '`') goto yy3; goto yy141; } else { - if (yych <= 's') goto yy1522; + if (yych <= 's') goto yy1524; if (yych <= 'z') goto yy141; goto yy3; } } -yy1522: - YYDEBUG(1522, *YYCURSOR); +yy1524: + YYDEBUG(1524, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'T') { if (yych <= ')') { @@ -23543,13 +23607,13 @@ yy1522: if (yych <= '`') goto yy3; goto yy142; } else { - if (yych <= 't') goto yy1523; + if (yych <= 't') goto yy1525; if (yych <= 'z') goto yy142; goto yy3; } } -yy1523: - YYDEBUG(1523, *YYCURSOR); +yy1525: + YYDEBUG(1525, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'E') { if (yych <= ')') { @@ -23565,13 +23629,13 @@ yy1523: if (yych <= '`') goto yy3; goto yy143; } else { - if (yych <= 'e') goto yy1524; + if (yych <= 'e') goto yy1526; if (yych <= 'z') goto yy143; goto yy3; } } -yy1524: - YYDEBUG(1524, *YYCURSOR); +yy1526: + YYDEBUG(1526, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'R') { if (yych <= ')') { @@ -23587,37 +23651,37 @@ yy1524: if (yych <= '`') goto yy3; goto yy144; } else { - if (yych <= 'r') goto yy1525; + if (yych <= 'r') goto yy1527; if (yych <= 'z') goto yy144; goto yy3; } } -yy1525: - YYDEBUG(1525, *YYCURSOR); +yy1527: + YYDEBUG(1527, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'C') { if (yych == ')') goto yy139; goto yy3; } else { - if (yych <= 'D') goto yy1526; + if (yych <= 'D') goto yy1528; if (yych != 'd') goto yy3; } -yy1526: - YYDEBUG(1526, *YYCURSOR); +yy1528: + YYDEBUG(1528, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy1527; + if (yych == 'A') goto yy1529; if (yych != 'a') goto yy56; -yy1527: - YYDEBUG(1527, *YYCURSOR); +yy1529: + YYDEBUG(1529, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'Y') goto yy1528; + if (yych == 'Y') goto yy1530; if (yych != 'y') goto yy56; -yy1528: - YYDEBUG(1528, *YYCURSOR); +yy1530: + YYDEBUG(1530, *YYCURSOR); ++YYCURSOR; -yy1529: - YYDEBUG(1529, *YYCURSOR); +yy1531: + YYDEBUG(1531, *YYCURSOR); { DEBUG_OUTPUT("yesterday"); TIMELIB_INIT; @@ -23628,8 +23692,8 @@ yy1529: TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -yy1530: - YYDEBUG(1530, *YYCURSOR); +yy1532: + YYDEBUG(1532, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'S') { @@ -23640,7 +23704,7 @@ yy1530: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'R') goto yy141; - goto yy1522; + goto yy1524; } } else { if (yych <= '`') { @@ -23648,13 +23712,13 @@ yy1530: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 's') goto yy1531; + if (yych == 's') goto yy1533; if (yych <= 'z') goto yy146; goto yy3; } } -yy1531: - YYDEBUG(1531, *YYCURSOR); +yy1533: + YYDEBUG(1533, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'T') { @@ -23665,7 +23729,7 @@ yy1531: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'S') goto yy142; - goto yy1523; + goto yy1525; } } else { if (yych <= '`') { @@ -23673,13 +23737,13 @@ yy1531: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 't') goto yy1532; + if (yych == 't') goto yy1534; if (yych <= 'z') goto yy151; goto yy3; } } -yy1532: - YYDEBUG(1532, *YYCURSOR); +yy1534: + YYDEBUG(1534, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'E') { @@ -23690,7 +23754,7 @@ yy1532: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'D') goto yy143; - goto yy1524; + goto yy1526; } } else { if (yych <= '`') { @@ -23698,13 +23762,13 @@ yy1532: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'e') goto yy1533; + if (yych == 'e') goto yy1535; if (yych <= 'z') goto yy152; goto yy3; } } -yy1533: - YYDEBUG(1533, *YYCURSOR); +yy1535: + YYDEBUG(1535, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'R') { @@ -23715,7 +23779,7 @@ yy1533: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'Q') goto yy144; - goto yy1525; + goto yy1527; } } else { if (yych <= '`') { @@ -23723,13 +23787,13 @@ yy1533: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'r') goto yy1534; + if (yych == 'r') goto yy1536; if (yych <= 'z') goto yy153; goto yy3; } } -yy1534: - YYDEBUG(1534, *YYCURSOR); +yy1536: + YYDEBUG(1536, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'D') { @@ -23739,38 +23803,38 @@ yy1534: } else { if (yych <= '/') goto yy147; if (yych <= 'C') goto yy3; - goto yy1526; + goto yy1528; } } else { if (yych <= '`') { if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'd') goto yy1535; + if (yych == 'd') goto yy1537; if (yych <= 'z') goto yy154; goto yy3; } } -yy1535: - YYDEBUG(1535, *YYCURSOR); +yy1537: + YYDEBUG(1537, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy1527; + if (yych == 'A') goto yy1529; if (yych != 'a') goto yy155; - YYDEBUG(1536, *YYCURSOR); + YYDEBUG(1538, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'Y') goto yy1528; + if (yych == 'Y') goto yy1530; if (yych != 'y') goto yy155; - YYDEBUG(1537, *YYCURSOR); + YYDEBUG(1539, *YYCURSOR); yyaccept = 34; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '^') { if (yych == '/') goto yy147; - goto yy1529; + goto yy1531; } else { if (yych <= '_') goto yy147; - if (yych <= '`') goto yy1529; + if (yych <= '`') goto yy1531; if (yych <= 'z') goto yy154; - goto yy1529; + goto yy1531; } } @@ -23988,7 +24052,7 @@ timelib_time *timelib_parse_from_format(char *format, char *string, int len, tim add_pbf_error(s, "A two digit second could not be found", string, begin); } break; - case 'u': /* six digit millisecond */ + case 'u': /* up to six digit millisecond */ { double f; char *tptr; diff --git a/ext/date/lib/parse_date.c.orig b/ext/date/lib/parse_date.c.orig index f1aa4702c..04dd383c6 100644 --- a/ext/date/lib/parse_date.c.orig +++ b/ext/date/lib/parse_date.c.orig @@ -1,4 +1,4 @@ -/* Generated by re2c 0.13.5 on Wed Jul 29 16:20:12 2009 */ +/* Generated by re2c 0.13.5 on Wed Feb 10 15:19:23 2010 */ #line 1 "ext/date/lib/parse_date.re" /* +----------------------------------------------------------------------+ @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: parse_date.c 286515 2009-07-29 15:34:59Z derick $ */ +/* $Id: parse_date.c 294880 2010-02-11 11:11:47Z pajoye $ */ #include "timelib.h" @@ -238,6 +238,7 @@ static timelib_lookup_table const timelib_reltext_lookup[] = { { "sixth", 0, 6 }, { "seventh", 0, 7 }, { "eight", 0, 8 }, + { "eighth", 0, 8 }, { "ninth", 0, 9 }, { "tenth", 0, 10 }, { "eleventh", 0, 11 }, @@ -839,11 +840,11 @@ static int scan(Scanner *s) std: s->tok = cursor; s->len = 0; -#line 965 "ext/date/lib/parse_date.re" +#line 966 "ext/date/lib/parse_date.re" -#line 847 "ext/date/lib/parse_date.c" +#line 848 "ext/date/lib/parse_date.c" { YYCTYPE yych; unsigned int yyaccept = 0; @@ -970,20 +971,20 @@ yy2: } else { if (yych <= '@') goto yy3; if (yych <= 'D') goto yy140; - goto yy1521; + goto yy1523; } } else { if (yych <= 'd') { if (yych <= 'Z') goto yy140; if (yych >= 'a') goto yy145; } else { - if (yych <= 'e') goto yy1530; + if (yych <= 'e') goto yy1532; if (yych <= 'z') goto yy145; } } yy3: YYDEBUG(3, *YYCURSOR); -#line 1632 "ext/date/lib/parse_date.re" +#line 1633 "ext/date/lib/parse_date.re" { int tz_not_found; DEBUG_OUTPUT("tzcorrection | tz"); @@ -996,7 +997,7 @@ yy3: TIMELIB_DEINIT; return TIMELIB_TIMEZONE; } -#line 1000 "ext/date/lib/parse_date.c" +#line 1001 "ext/date/lib/parse_date.c" yy4: YYDEBUG(4, *YYCURSOR); yych = *++YYCURSOR; @@ -1007,7 +1008,7 @@ yy4: } else { if (yych <= '@') goto yy3; if (yych <= 'D') goto yy140; - goto yy1521; + goto yy1523; } } else { if (yych <= 'd') { @@ -1015,7 +1016,7 @@ yy4: if (yych <= '`') goto yy3; goto yy140; } else { - if (yych <= 'e') goto yy1521; + if (yych <= 'e') goto yy1523; if (yych <= 'z') goto yy140; goto yy3; } @@ -1030,12 +1031,12 @@ yy5: goto yy140; } else { if (yych <= 'H') { - if (yych <= 'E') goto yy1492; + if (yych <= 'E') goto yy1494; goto yy140; } else { - if (yych <= 'I') goto yy1493; + if (yych <= 'I') goto yy1495; if (yych <= 'N') goto yy140; - goto yy1491; + goto yy1493; } } } else { @@ -1044,15 +1045,15 @@ yy5: if (yych <= 'Z') goto yy140; goto yy3; } else { - if (yych == 'e') goto yy1508; + if (yych == 'e') goto yy1510; goto yy145; } } else { if (yych <= 'n') { - if (yych <= 'i') goto yy1509; + if (yych <= 'i') goto yy1511; goto yy145; } else { - if (yych <= 'o') goto yy1507; + if (yych <= 'o') goto yy1509; if (yych <= 'z') goto yy145; goto yy3; } @@ -1068,12 +1069,12 @@ yy6: goto yy140; } else { if (yych <= 'H') { - if (yych <= 'E') goto yy1492; + if (yych <= 'E') goto yy1494; goto yy140; } else { - if (yych <= 'I') goto yy1493; + if (yych <= 'I') goto yy1495; if (yych <= 'N') goto yy140; - goto yy1491; + goto yy1493; } } } else { @@ -1082,15 +1083,15 @@ yy6: if (yych <= 'Z') goto yy140; goto yy3; } else { - if (yych == 'e') goto yy1492; + if (yych == 'e') goto yy1494; goto yy140; } } else { if (yych <= 'n') { - if (yych <= 'i') goto yy1493; + if (yych <= 'i') goto yy1495; goto yy140; } else { - if (yych <= 'o') goto yy1491; + if (yych <= 'o') goto yy1493; if (yych <= 'z') goto yy140; goto yy3; } @@ -1103,24 +1104,24 @@ yy7: if (yych <= 'A') { if (yych == ')') goto yy139; if (yych <= '@') goto yy3; - goto yy1461; + goto yy1463; } else { - if (yych == 'I') goto yy1462; + if (yych == 'I') goto yy1464; if (yych <= 'N') goto yy140; - goto yy1463; + goto yy1465; } } else { if (yych <= 'h') { if (yych <= 'Z') goto yy140; if (yych <= '`') goto yy3; - if (yych <= 'a') goto yy1476; + if (yych <= 'a') goto yy1478; goto yy145; } else { if (yych <= 'n') { - if (yych <= 'i') goto yy1477; + if (yych <= 'i') goto yy1479; goto yy145; } else { - if (yych <= 'o') goto yy1478; + if (yych <= 'o') goto yy1480; if (yych <= 'z') goto yy145; goto yy3; } @@ -1133,24 +1134,24 @@ yy8: if (yych <= 'A') { if (yych == ')') goto yy139; if (yych <= '@') goto yy3; - goto yy1461; + goto yy1463; } else { - if (yych == 'I') goto yy1462; + if (yych == 'I') goto yy1464; if (yych <= 'N') goto yy140; - goto yy1463; + goto yy1465; } } else { if (yych <= 'h') { if (yych <= 'Z') goto yy140; if (yych <= '`') goto yy3; - if (yych <= 'a') goto yy1461; + if (yych <= 'a') goto yy1463; goto yy140; } else { if (yych <= 'n') { - if (yych <= 'i') goto yy1462; + if (yych <= 'i') goto yy1464; goto yy140; } else { - if (yych <= 'o') goto yy1463; + if (yych <= 'o') goto yy1465; if (yych <= 'z') goto yy140; goto yy3; } @@ -1164,15 +1165,15 @@ yy9: switch (yych) { case ')': goto yy139; case '0': - case '1': goto yy1391; - case '2': goto yy1392; + case '1': goto yy1393; + case '2': goto yy1394; case '3': case '4': case '5': case '6': case '7': case '8': - case '9': goto yy1393; + case '9': goto yy1395; case 'A': case 'B': case 'C': @@ -1194,11 +1195,11 @@ yy9: case 'X': case 'Y': case 'Z': goto yy140; - case 'E': goto yy1386; - case 'H': goto yy1387; - case 'O': goto yy1388; - case 'U': goto yy1389; - case 'W': goto yy1390; + case 'E': goto yy1388; + case 'H': goto yy1389; + case 'O': goto yy1390; + case 'U': goto yy1391; + case 'W': goto yy1392; case 'a': case 'b': case 'c': @@ -1220,11 +1221,11 @@ yy9: case 'x': case 'y': case 'z': goto yy145; - case 'e': goto yy1429; - case 'h': goto yy1430; - case 'o': goto yy1431; - case 'u': goto yy1432; - case 'w': goto yy1433; + case 'e': goto yy1431; + case 'h': goto yy1432; + case 'o': goto yy1433; + case 'u': goto yy1434; + case 'w': goto yy1435; default: goto yy3; } yy10: @@ -1235,15 +1236,15 @@ yy10: switch (yych) { case ')': goto yy139; case '0': - case '1': goto yy1391; - case '2': goto yy1392; + case '1': goto yy1393; + case '2': goto yy1394; case '3': case '4': case '5': case '6': case '7': case '8': - case '9': goto yy1393; + case '9': goto yy1395; case 'A': case 'B': case 'C': @@ -1287,32 +1288,32 @@ yy10: case 'y': case 'z': goto yy140; case 'E': - case 'e': goto yy1386; + case 'e': goto yy1388; case 'H': - case 'h': goto yy1387; + case 'h': goto yy1389; case 'O': - case 'o': goto yy1388; + case 'o': goto yy1390; case 'U': - case 'u': goto yy1389; + case 'u': goto yy1391; case 'W': - case 'w': goto yy1390; + case 'w': goto yy1392; default: goto yy3; } yy11: YYDEBUG(11, *YYCURSOR); yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); - if (yych == '-') goto yy1382; + if (yych == '-') goto yy1384; if (yych <= '/') goto yy12; - if (yych <= '9') goto yy1383; + if (yych <= '9') goto yy1385; yy12: YYDEBUG(12, *YYCURSOR); -#line 1727 "ext/date/lib/parse_date.re" +#line 1728 "ext/date/lib/parse_date.re" { add_error(s, "Unexpected character"); goto std; } -#line 1316 "ext/date/lib/parse_date.c" +#line 1317 "ext/date/lib/parse_date.c" yy13: YYDEBUG(13, *YYCURSOR); yych = *++YYCURSOR; @@ -1324,16 +1325,16 @@ yy13: } else { if (yych <= '@') goto yy3; if (yych <= 'D') goto yy140; - goto yy1318; + goto yy1320; } } else { if (yych <= 'N') { - if (yych == 'I') goto yy1319; + if (yych == 'I') goto yy1321; goto yy140; } else { - if (yych <= 'O') goto yy1320; + if (yych <= 'O') goto yy1322; if (yych <= 'Q') goto yy140; - goto yy1321; + goto yy1323; } } } else { @@ -1343,16 +1344,16 @@ yy13: if (yych <= '`') goto yy3; goto yy145; } else { - if (yych <= 'e') goto yy1359; + if (yych <= 'e') goto yy1361; if (yych <= 'h') goto yy145; - goto yy1360; + goto yy1362; } } else { if (yych <= 'q') { - if (yych == 'o') goto yy1361; + if (yych == 'o') goto yy1363; goto yy145; } else { - if (yych <= 'r') goto yy1362; + if (yych <= 'r') goto yy1364; if (yych <= 'z') goto yy145; goto yy3; } @@ -1369,16 +1370,16 @@ yy14: } else { if (yych <= '@') goto yy3; if (yych <= 'D') goto yy140; - goto yy1318; + goto yy1320; } } else { if (yych <= 'N') { - if (yych == 'I') goto yy1319; + if (yych == 'I') goto yy1321; goto yy140; } else { - if (yych <= 'O') goto yy1320; + if (yych <= 'O') goto yy1322; if (yych <= 'Q') goto yy140; - goto yy1321; + goto yy1323; } } } else { @@ -1388,16 +1389,16 @@ yy14: if (yych <= '`') goto yy3; goto yy140; } else { - if (yych <= 'e') goto yy1318; + if (yych <= 'e') goto yy1320; if (yych <= 'h') goto yy140; - goto yy1319; + goto yy1321; } } else { if (yych <= 'q') { - if (yych == 'o') goto yy1320; + if (yych == 'o') goto yy1322; goto yy140; } else { - if (yych <= 'r') goto yy1321; + if (yych <= 'r') goto yy1323; if (yych <= 'z') goto yy140; goto yy3; } @@ -1409,13 +1410,13 @@ yy15: if (yych <= 'A') { if (yych == ')') goto yy139; if (yych <= '@') goto yy3; - goto yy1304; + goto yy1306; } else { if (yych <= '`') { if (yych <= 'Z') goto yy140; goto yy3; } else { - if (yych <= 'a') goto yy1315; + if (yych <= 'a') goto yy1317; if (yych <= 'z') goto yy145; goto yy3; } @@ -1426,13 +1427,13 @@ yy16: if (yych <= 'A') { if (yych == ')') goto yy139; if (yych <= '@') goto yy3; - goto yy1304; + goto yy1306; } else { if (yych <= '`') { if (yych <= 'Z') goto yy140; goto yy3; } else { - if (yych <= 'a') goto yy1304; + if (yych <= 'a') goto yy1306; if (yych <= 'z') goto yy140; goto yy3; } @@ -1443,13 +1444,13 @@ yy17: if (yych <= 'A') { if (yych == ')') goto yy139; if (yych <= '@') goto yy3; - goto yy1284; + goto yy1286; } else { if (yych <= '`') { if (yych <= 'Z') goto yy140; goto yy3; } else { - if (yych <= 'a') goto yy1301; + if (yych <= 'a') goto yy1303; if (yych <= 'z') goto yy145; goto yy3; } @@ -1460,13 +1461,13 @@ yy18: if (yych <= 'A') { if (yych == ')') goto yy139; if (yych <= '@') goto yy3; - goto yy1284; + goto yy1286; } else { if (yych <= '`') { if (yych <= 'Z') goto yy140; goto yy3; } else { - if (yych <= 'a') goto yy1284; + if (yych <= 'a') goto yy1286; if (yych <= 'z') goto yy140; goto yy3; } @@ -1481,17 +1482,17 @@ yy19: goto yy139; } else { if (yych <= '@') goto yy3; - if (yych <= 'A') goto yy1227; + if (yych <= 'A') goto yy1229; goto yy140; } } else { if (yych <= 'H') { - if (yych <= 'E') goto yy1226; + if (yych <= 'E') goto yy1228; goto yy140; } else { - if (yych <= 'I') goto yy1228; + if (yych <= 'I') goto yy1230; if (yych <= 'T') goto yy140; - goto yy1229; + goto yy1231; } } } else { @@ -1500,16 +1501,16 @@ yy19: if (yych <= 'Z') goto yy140; goto yy3; } else { - if (yych <= 'a') goto yy1256; + if (yych <= 'a') goto yy1258; if (yych <= 'd') goto yy145; - goto yy1255; + goto yy1257; } } else { if (yych <= 't') { - if (yych == 'i') goto yy1257; + if (yych == 'i') goto yy1259; goto yy145; } else { - if (yych <= 'u') goto yy1258; + if (yych <= 'u') goto yy1260; if (yych <= 'z') goto yy145; goto yy3; } @@ -1525,17 +1526,17 @@ yy20: goto yy139; } else { if (yych <= '@') goto yy3; - if (yych <= 'A') goto yy1227; + if (yych <= 'A') goto yy1229; goto yy140; } } else { if (yych <= 'H') { - if (yych <= 'E') goto yy1226; + if (yych <= 'E') goto yy1228; goto yy140; } else { - if (yych <= 'I') goto yy1228; + if (yych <= 'I') goto yy1230; if (yych <= 'T') goto yy140; - goto yy1229; + goto yy1231; } } } else { @@ -1544,16 +1545,16 @@ yy20: if (yych <= 'Z') goto yy140; goto yy3; } else { - if (yych <= 'a') goto yy1227; + if (yych <= 'a') goto yy1229; if (yych <= 'd') goto yy140; - goto yy1226; + goto yy1228; } } else { if (yych <= 't') { - if (yych == 'i') goto yy1228; + if (yych == 'i') goto yy1230; goto yy140; } else { - if (yych <= 'u') goto yy1229; + if (yych <= 'u') goto yy1231; if (yych <= 'z') goto yy140; goto yy3; } @@ -1576,9 +1577,9 @@ yy21: if (yych <= 'Z') goto yy140; if (yych <= '`') goto yy3; if (yych <= 'h') goto yy145; - goto yy1215; + goto yy1216; } else { - if (yych == 'l') goto yy1216; + if (yych == 'l') goto yy1217; if (yych <= 'z') goto yy145; goto yy3; } @@ -2369,11 +2370,11 @@ yy48: if (yych <= '9') goto yy54; yy49: YYDEBUG(49, *YYCURSOR); -#line 1716 "ext/date/lib/parse_date.re" +#line 1717 "ext/date/lib/parse_date.re" { goto std; } -#line 2377 "ext/date/lib/parse_date.c" +#line 2378 "ext/date/lib/parse_date.c" yy50: YYDEBUG(50, *YYCURSOR); yych = *++YYCURSOR; @@ -2382,12 +2383,12 @@ yy51: YYDEBUG(51, *YYCURSOR); ++YYCURSOR; YYDEBUG(52, *YYCURSOR); -#line 1721 "ext/date/lib/parse_date.re" +#line 1722 "ext/date/lib/parse_date.re" { s->pos = cursor; s->line++; goto std; } -#line 2391 "ext/date/lib/parse_date.c" +#line 2392 "ext/date/lib/parse_date.c" yy53: YYDEBUG(53, *YYCURSOR); yych = *++YYCURSOR; @@ -2564,27 +2565,27 @@ yy56: if (yyaccept <= 27) { goto yy1141; } else { - goto yy1292; + goto yy1294; } } else { if (yyaccept <= 29) { - goto yy1311; + goto yy1313; } else { - goto yy1415; + goto yy1417; } } } else { if (yyaccept <= 32) { if (yyaccept <= 31) { - goto yy1418; + goto yy1420; } else { - goto yy1498; + goto yy1500; } } else { if (yyaccept <= 33) { - goto yy1506; + goto yy1508; } else { - goto yy1529; + goto yy1531; } } } @@ -2778,7 +2779,7 @@ yy71: if (yych == 's') goto yy73; yy72: YYDEBUG(72, *YYCURSOR); -#line 1700 "ext/date/lib/parse_date.re" +#line 1701 "ext/date/lib/parse_date.re" { timelib_ull i; DEBUG_OUTPUT("relative"); @@ -2793,7 +2794,7 @@ yy72: TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 2797 "ext/date/lib/parse_date.c" +#line 2798 "ext/date/lib/parse_date.c" yy73: YYDEBUG(73, *YYCURSOR); yych = *++YYCURSOR; @@ -3546,7 +3547,7 @@ yy166: } yy167: YYDEBUG(167, *YYCURSOR); -#line 1563 "ext/date/lib/parse_date.re" +#line 1564 "ext/date/lib/parse_date.re" { const timelib_relunit* relunit; DEBUG_OUTPUT("daytext"); @@ -3563,7 +3564,7 @@ yy167: TIMELIB_DEINIT; return TIMELIB_WEEKDAY; } -#line 3567 "ext/date/lib/parse_date.c" +#line 3568 "ext/date/lib/parse_date.c" yy168: YYDEBUG(168, *YYCURSOR); yych = *++YYCURSOR; @@ -4040,7 +4041,7 @@ yy193: } yy194: YYDEBUG(194, *YYCURSOR); -#line 1622 "ext/date/lib/parse_date.re" +#line 1623 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("monthtext"); TIMELIB_INIT; @@ -4049,7 +4050,7 @@ yy194: TIMELIB_DEINIT; return TIMELIB_DATE_TEXT; } -#line 4053 "ext/date/lib/parse_date.c" +#line 4054 "ext/date/lib/parse_date.c" yy195: YYDEBUG(195, *YYCURSOR); ++YYCURSOR; @@ -4100,7 +4101,7 @@ yy198: } yy199: YYDEBUG(199, *YYCURSOR); -#line 1372 "ext/date/lib/parse_date.re" +#line 1373 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("datetextual | datenoyear"); TIMELIB_INIT; @@ -4112,7 +4113,7 @@ yy199: TIMELIB_DEINIT; return TIMELIB_DATE_TEXT; } -#line 4116 "ext/date/lib/parse_date.c" +#line 4117 "ext/date/lib/parse_date.c" yy200: YYDEBUG(200, *YYCURSOR); yyaccept = 6; @@ -4381,7 +4382,7 @@ yy222: } yy223: YYDEBUG(223, *YYCURSOR); -#line 1670 "ext/date/lib/parse_date.re" +#line 1671 "ext/date/lib/parse_date.re" { int tz_not_found; DEBUG_OUTPUT("dateshortwithtimeshort | dateshortwithtimelong | dateshortwithtimelongtz"); @@ -4410,7 +4411,7 @@ yy223: TIMELIB_DEINIT; return TIMELIB_SHORTDATE_WITH_TIME; } -#line 4414 "ext/date/lib/parse_date.c" +#line 4415 "ext/date/lib/parse_date.c" yy224: YYDEBUG(224, *YYCURSOR); yyaccept = 7; @@ -5087,7 +5088,7 @@ yy279: YYDEBUG(279, *YYCURSOR); ++YYCURSOR; YYDEBUG(280, *YYCURSOR); -#line 1646 "ext/date/lib/parse_date.re" +#line 1647 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("dateshortwithtimeshort12 | dateshortwithtimelong12"); TIMELIB_INIT; @@ -5110,7 +5111,7 @@ yy279: TIMELIB_DEINIT; return TIMELIB_SHORTDATE_WITH_TIME; } -#line 5114 "ext/date/lib/parse_date.c" +#line 5115 "ext/date/lib/parse_date.c" yy281: YYDEBUG(281, *YYCURSOR); yych = *++YYCURSOR; @@ -5283,7 +5284,7 @@ yy295: ++YYCURSOR; yy296: YYDEBUG(296, *YYCURSOR); -#line 1346 "ext/date/lib/parse_date.re" +#line 1347 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("datenoday"); TIMELIB_INIT; @@ -5295,7 +5296,7 @@ yy296: TIMELIB_DEINIT; return TIMELIB_DATE_NO_DAY; } -#line 5299 "ext/date/lib/parse_date.c" +#line 5300 "ext/date/lib/parse_date.c" yy297: YYDEBUG(297, *YYCURSOR); yych = *++YYCURSOR; @@ -6505,7 +6506,7 @@ yy363: if (yych <= '9') goto yy366; yy365: YYDEBUG(365, *YYCURSOR); -#line 1486 "ext/date/lib/parse_date.re" +#line 1487 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("pgtextshort"); TIMELIB_INIT; @@ -6517,7 +6518,7 @@ yy365: TIMELIB_DEINIT; return TIMELIB_PG_TEXT; } -#line 6521 "ext/date/lib/parse_date.c" +#line 6522 "ext/date/lib/parse_date.c" yy366: YYDEBUG(366, *YYCURSOR); yych = *++YYCURSOR; @@ -7101,7 +7102,7 @@ yy391: } yy392: YYDEBUG(392, *YYCURSOR); -#line 1542 "ext/date/lib/parse_date.re" +#line 1543 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("ago"); TIMELIB_INIT; @@ -7121,7 +7122,7 @@ yy392: TIMELIB_DEINIT; return TIMELIB_AGO; } -#line 7125 "ext/date/lib/parse_date.c" +#line 7126 "ext/date/lib/parse_date.c" yy393: YYDEBUG(393, *YYCURSOR); yyaccept = 5; @@ -8806,7 +8807,7 @@ yy453: ++YYCURSOR; yy454: YYDEBUG(454, *YYCURSOR); -#line 1256 "ext/date/lib/parse_date.re" +#line 1257 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("iso8601date4 | iso8601date2 | iso8601dateslash | dateslash"); TIMELIB_INIT; @@ -8817,7 +8818,7 @@ yy454: TIMELIB_DEINIT; return TIMELIB_ISO_DATE; } -#line 8821 "ext/date/lib/parse_date.c" +#line 8822 "ext/date/lib/parse_date.c" yy455: YYDEBUG(455, *YYCURSOR); yyaccept = 0; @@ -9377,7 +9378,7 @@ yy474: } yy475: YYDEBUG(475, *YYCURSOR); -#line 1385 "ext/date/lib/parse_date.re" +#line 1386 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("datenoyearrev"); TIMELIB_INIT; @@ -9388,7 +9389,7 @@ yy475: TIMELIB_DEINIT; return TIMELIB_DATE_TEXT; } -#line 9392 "ext/date/lib/parse_date.c" +#line 9393 "ext/date/lib/parse_date.c" yy476: YYDEBUG(476, *YYCURSOR); yyaccept = 10; @@ -9529,7 +9530,7 @@ yy487: YYDEBUG(487, *YYCURSOR); ++YYCURSOR; YYDEBUG(488, *YYCURSOR); -#line 1112 "ext/date/lib/parse_date.re" +#line 1113 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("timetiny12 | timeshort12 | timelong12"); TIMELIB_INIT; @@ -9545,7 +9546,7 @@ yy487: TIMELIB_DEINIT; return TIMELIB_TIME12; } -#line 9549 "ext/date/lib/parse_date.c" +#line 9550 "ext/date/lib/parse_date.c" yy489: YYDEBUG(489, *YYCURSOR); yyaccept = 11; @@ -9558,7 +9559,7 @@ yy489: } yy490: YYDEBUG(490, *YYCURSOR); -#line 1149 "ext/date/lib/parse_date.re" +#line 1150 "ext/date/lib/parse_date.re" { int tz_not_found; DEBUG_OUTPUT("timeshort24 | timelong24 | iso8601long"); @@ -9583,7 +9584,7 @@ yy490: TIMELIB_DEINIT; return TIMELIB_TIME24_WITH_ZONE; } -#line 9587 "ext/date/lib/parse_date.c" +#line 9588 "ext/date/lib/parse_date.c" yy491: YYDEBUG(491, *YYCURSOR); yyaccept = 11; @@ -9893,7 +9894,7 @@ yy522: YYDEBUG(522, *YYCURSOR); ++YYCURSOR; YYDEBUG(523, *YYCURSOR); -#line 1129 "ext/date/lib/parse_date.re" +#line 1130 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("mssqltime"); TIMELIB_INIT; @@ -9912,7 +9913,7 @@ yy522: TIMELIB_DEINIT; return TIMELIB_TIME24_WITH_ZONE; } -#line 9916 "ext/date/lib/parse_date.c" +#line 9917 "ext/date/lib/parse_date.c" yy524: YYDEBUG(524, *YYCURSOR); yyaccept = 11; @@ -10018,7 +10019,7 @@ yy533: if (yych <= '9') goto yy540; yy534: YYDEBUG(534, *YYCURSOR); -#line 1307 "ext/date/lib/parse_date.re" +#line 1308 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("datefull"); TIMELIB_INIT; @@ -10031,7 +10032,7 @@ yy534: TIMELIB_DEINIT; return TIMELIB_DATE_FULL; } -#line 10035 "ext/date/lib/parse_date.c" +#line 10036 "ext/date/lib/parse_date.c" yy535: YYDEBUG(535, *YYCURSOR); yych = *++YYCURSOR; @@ -10768,7 +10769,7 @@ yy604: YYDEBUG(605, *YYCURSOR); ++YYCURSOR; YYDEBUG(606, *YYCURSOR); -#line 1321 "ext/date/lib/parse_date.re" +#line 1322 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("pointed date YYYY"); TIMELIB_INIT; @@ -10779,7 +10780,7 @@ yy604: TIMELIB_DEINIT; return TIMELIB_DATE_FULL_POINTED; } -#line 10783 "ext/date/lib/parse_date.c" +#line 10784 "ext/date/lib/parse_date.c" yy607: YYDEBUG(607, *YYCURSOR); yyaccept = 11; @@ -10815,7 +10816,7 @@ yy610: if (yych <= '9') goto yy604; yy611: YYDEBUG(611, *YYCURSOR); -#line 1333 "ext/date/lib/parse_date.re" +#line 1334 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("pointed date YY"); TIMELIB_INIT; @@ -10827,7 +10828,7 @@ yy611: TIMELIB_DEINIT; return TIMELIB_DATE_FULL_POINTED; } -#line 10831 "ext/date/lib/parse_date.c" +#line 10832 "ext/date/lib/parse_date.c" yy612: YYDEBUG(612, *YYCURSOR); yyaccept = 11; @@ -11468,7 +11469,7 @@ yy655: } yy656: YYDEBUG(656, *YYCURSOR); -#line 1294 "ext/date/lib/parse_date.re" +#line 1295 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("gnudateshort"); TIMELIB_INIT; @@ -11480,7 +11481,7 @@ yy656: TIMELIB_DEINIT; return TIMELIB_ISO_DATE; } -#line 11484 "ext/date/lib/parse_date.c" +#line 11485 "ext/date/lib/parse_date.c" yy657: YYDEBUG(657, *YYCURSOR); yyaccept = 13; @@ -11586,7 +11587,7 @@ yy665: } yy666: YYDEBUG(666, *YYCURSOR); -#line 1241 "ext/date/lib/parse_date.re" +#line 1242 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("americanshort | american"); TIMELIB_INIT; @@ -11600,7 +11601,7 @@ yy666: TIMELIB_DEINIT; return TIMELIB_AMERICAN; } -#line 11604 "ext/date/lib/parse_date.c" +#line 11605 "ext/date/lib/parse_date.c" yy667: YYDEBUG(667, *YYCURSOR); yyaccept = 14; @@ -11833,7 +11834,7 @@ yy699: if (yych <= ':') goto yy703; yy700: YYDEBUG(700, *YYCURSOR); -#line 1512 "ext/date/lib/parse_date.re" +#line 1513 "ext/date/lib/parse_date.re" { int tz_not_found; DEBUG_OUTPUT("clf"); @@ -11853,7 +11854,7 @@ yy700: TIMELIB_DEINIT; return TIMELIB_CLF; } -#line 11857 "ext/date/lib/parse_date.c" +#line 11858 "ext/date/lib/parse_date.c" yy701: YYDEBUG(701, *YYCURSOR); yych = *++YYCURSOR; @@ -12405,7 +12406,7 @@ yy762: } yy763: YYDEBUG(763, *YYCURSOR); -#line 1268 "ext/date/lib/parse_date.re" +#line 1269 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("iso8601date2"); TIMELIB_INIT; @@ -12417,7 +12418,7 @@ yy763: TIMELIB_DEINIT; return TIMELIB_ISO_DATE; } -#line 12421 "ext/date/lib/parse_date.c" +#line 12422 "ext/date/lib/parse_date.c" yy764: YYDEBUG(764, *YYCURSOR); yych = *++YYCURSOR; @@ -12456,7 +12457,7 @@ yy770: YYDEBUG(770, *YYCURSOR); ++YYCURSOR; YYDEBUG(771, *YYCURSOR); -#line 1499 "ext/date/lib/parse_date.re" +#line 1500 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("pgtextreverse"); TIMELIB_INIT; @@ -12468,7 +12469,7 @@ yy770: TIMELIB_DEINIT; return TIMELIB_PG_TEXT; } -#line 12472 "ext/date/lib/parse_date.c" +#line 12473 "ext/date/lib/parse_date.c" yy772: YYDEBUG(772, *YYCURSOR); yych = *++YYCURSOR; @@ -12606,7 +12607,7 @@ yy782: } yy783: YYDEBUG(783, *YYCURSOR); -#line 1533 "ext/date/lib/parse_date.re" +#line 1534 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("year4"); TIMELIB_INIT; @@ -12614,7 +12615,7 @@ yy783: TIMELIB_DEINIT; return TIMELIB_CLF; } -#line 12618 "ext/date/lib/parse_date.c" +#line 12619 "ext/date/lib/parse_date.c" yy784: YYDEBUG(784, *YYCURSOR); yych = *++YYCURSOR; @@ -12765,7 +12766,7 @@ yy792: } yy793: YYDEBUG(793, *YYCURSOR); -#line 1359 "ext/date/lib/parse_date.re" +#line 1360 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("datenodayrev"); TIMELIB_INIT; @@ -12777,7 +12778,7 @@ yy793: TIMELIB_DEINIT; return TIMELIB_DATE_NO_DAY; } -#line 12781 "ext/date/lib/parse_date.c" +#line 12782 "ext/date/lib/parse_date.c" yy794: YYDEBUG(794, *YYCURSOR); yych = *++YYCURSOR; @@ -12992,7 +12993,7 @@ yy813: if (yych <= '7') goto yy816; yy814: YYDEBUG(814, *YYCURSOR); -#line 1467 "ext/date/lib/parse_date.re" +#line 1468 "ext/date/lib/parse_date.re" { timelib_sll w, d; DEBUG_OUTPUT("isoweek"); @@ -13010,7 +13011,7 @@ yy814: TIMELIB_DEINIT; return TIMELIB_ISO_WEEK; } -#line 13014 "ext/date/lib/parse_date.c" +#line 13015 "ext/date/lib/parse_date.c" yy815: YYDEBUG(815, *YYCURSOR); yych = *++YYCURSOR; @@ -13020,7 +13021,7 @@ yy816: YYDEBUG(816, *YYCURSOR); ++YYCURSOR; YYDEBUG(817, *YYCURSOR); -#line 1448 "ext/date/lib/parse_date.re" +#line 1449 "ext/date/lib/parse_date.re" { timelib_sll w, d; DEBUG_OUTPUT("isoweekday"); @@ -13038,7 +13039,7 @@ yy816: TIMELIB_DEINIT; return TIMELIB_ISO_WEEK; } -#line 13042 "ext/date/lib/parse_date.c" +#line 13043 "ext/date/lib/parse_date.c" yy818: YYDEBUG(818, *YYCURSOR); yych = *++YYCURSOR; @@ -13102,7 +13103,7 @@ yy820: } yy821: YYDEBUG(821, *YYCURSOR); -#line 1435 "ext/date/lib/parse_date.re" +#line 1436 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("pgydotd"); TIMELIB_INIT; @@ -13114,7 +13115,7 @@ yy821: TIMELIB_DEINIT; return TIMELIB_PG_YEARDAY; } -#line 13118 "ext/date/lib/parse_date.c" +#line 13119 "ext/date/lib/parse_date.c" yy822: YYDEBUG(822, *YYCURSOR); yych = *++YYCURSOR; @@ -13217,7 +13218,7 @@ yy841: ++YYCURSOR; yy842: YYDEBUG(842, *YYCURSOR); -#line 1409 "ext/date/lib/parse_date.re" +#line 1410 "ext/date/lib/parse_date.re" { int tz_not_found; DEBUG_OUTPUT("xmlrpc | xmlrpcnocolon | soap | wddx | exif"); @@ -13242,7 +13243,7 @@ yy842: TIMELIB_DEINIT; return TIMELIB_XMLRPC_SOAP; } -#line 13246 "ext/date/lib/parse_date.c" +#line 13247 "ext/date/lib/parse_date.c" yy843: YYDEBUG(843, *YYCURSOR); yych = *++YYCURSOR; @@ -13504,7 +13505,7 @@ yy847: } yy848: YYDEBUG(848, *YYCURSOR); -#line 1397 "ext/date/lib/parse_date.re" +#line 1398 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("datenocolon"); TIMELIB_INIT; @@ -13515,7 +13516,7 @@ yy848: TIMELIB_DEINIT; return TIMELIB_DATE_NOCOLON; } -#line 13519 "ext/date/lib/parse_date.c" +#line 13520 "ext/date/lib/parse_date.c" yy849: YYDEBUG(849, *YYCURSOR); yych = *++YYCURSOR; @@ -14435,7 +14436,7 @@ yy972: if (yych <= '9') goto yy995; yy973: YYDEBUG(973, *YYCURSOR); -#line 1281 "ext/date/lib/parse_date.re" +#line 1282 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("gnudateshorter"); TIMELIB_INIT; @@ -14447,7 +14448,7 @@ yy973: TIMELIB_DEINIT; return TIMELIB_ISO_DATE; } -#line 14451 "ext/date/lib/parse_date.c" +#line 14452 "ext/date/lib/parse_date.c" yy974: YYDEBUG(974, *YYCURSOR); yyaccept = 22; @@ -15456,7 +15457,7 @@ yy1065: } yy1067: YYDEBUG(1067, *YYCURSOR); -#line 1175 "ext/date/lib/parse_date.re" +#line 1176 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("gnunocolon"); TIMELIB_INIT; @@ -15478,7 +15479,7 @@ yy1067: TIMELIB_DEINIT; return TIMELIB_GNU_NOCOLON; } -#line 15482 "ext/date/lib/parse_date.c" +#line 15483 "ext/date/lib/parse_date.c" yy1068: YYDEBUG(1068, *YYCURSOR); yych = *++YYCURSOR; @@ -15570,7 +15571,7 @@ yy1074: } yy1075: YYDEBUG(1075, *YYCURSOR); -#line 1221 "ext/date/lib/parse_date.re" +#line 1222 "ext/date/lib/parse_date.re" { int tz_not_found; DEBUG_OUTPUT("iso8601nocolon"); @@ -15589,7 +15590,7 @@ yy1075: TIMELIB_DEINIT; return TIMELIB_ISO_NOCOLON; } -#line 15593 "ext/date/lib/parse_date.c" +#line 15594 "ext/date/lib/parse_date.c" yy1076: YYDEBUG(1076, *YYCURSOR); yyaccept = 25; @@ -16487,7 +16488,7 @@ yy1116: } yy1117: YYDEBUG(1117, *YYCURSOR); -#line 1605 "ext/date/lib/parse_date.re" +#line 1606 "ext/date/lib/parse_date.re" { timelib_sll i; int behavior = 0; @@ -16503,7 +16504,7 @@ yy1117: TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 16507 "ext/date/lib/parse_date.c" +#line 16508 "ext/date/lib/parse_date.c" yy1118: YYDEBUG(1118, *YYCURSOR); ++YYCURSOR; @@ -16554,7 +16555,7 @@ yy1125: YYDEBUG(1125, *YYCURSOR); ++YYCURSOR; YYDEBUG(1126, *YYCURSOR); -#line 1090 "ext/date/lib/parse_date.re" +#line 1091 "ext/date/lib/parse_date.re" { timelib_sll i; int behavior = 0; @@ -16575,7 +16576,7 @@ yy1125: TIMELIB_DEINIT; return TIMELIB_WEEK_DAY_OF_MONTH; } -#line 16579 "ext/date/lib/parse_date.c" +#line 16580 "ext/date/lib/parse_date.c" yy1127: YYDEBUG(1127, *YYCURSOR); yyaccept = 26; @@ -16683,7 +16684,7 @@ yy1140: } yy1141: YYDEBUG(1141, *YYCURSOR); -#line 1581 "ext/date/lib/parse_date.re" +#line 1582 "ext/date/lib/parse_date.re" { timelib_sll i; int behavior = 0; @@ -16706,7 +16707,7 @@ yy1141: TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 16710 "ext/date/lib/parse_date.c" +#line 16711 "ext/date/lib/parse_date.c" yy1142: YYDEBUG(1142, *YYCURSOR); yych = *++YYCURSOR; @@ -17470,21 +17471,22 @@ yy1214: YYDEBUG(1214, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '(') { - if (yych <= '\t') { - if (yych <= 0x08) goto yy3; - goto yy1206; + if (yych <= '@') { + if (yych <= 0x1F) { + if (yych == '\t') goto yy1206; + goto yy3; } else { - if (yych == ' ') goto yy1206; + if (yych <= ' ') goto yy1206; + if (yych == ')') goto yy139; goto yy3; } } else { - if (yych <= 'Z') { - if (yych <= ')') goto yy139; - if (yych <= '@') goto yy3; - goto yy144; + if (yych <= '`') { + if (yych == 'H') goto yy1215; + if (yych <= 'Z') goto yy144; + goto yy3; } else { - if (yych <= '`') goto yy3; + if (yych == 'h') goto yy1215; if (yych <= 'z') goto yy144; goto yy3; } @@ -17493,6 +17495,18 @@ yy1215: YYDEBUG(1215, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); + if (yych <= 0x1F) { + if (yych == '\t') goto yy1206; + goto yy3; + } else { + if (yych <= ' ') goto yy1206; + if (yych == ')') goto yy139; + goto yy3; + } +yy1216: + YYDEBUG(1216, *YYCURSOR); + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'G') { if (yych <= '.') { if (yych == ')') goto yy139; @@ -17509,13 +17523,13 @@ yy1215: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'g') goto yy1223; + if (yych == 'g') goto yy1224; if (yych <= 'z') goto yy146; goto yy3; } } -yy1216: - YYDEBUG(1216, *YYCURSOR); +yy1217: + YYDEBUG(1217, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'E') { @@ -17534,13 +17548,13 @@ yy1216: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'e') goto yy1217; + if (yych == 'e') goto yy1218; if (yych <= 'z') goto yy146; goto yy3; } } -yy1217: - YYDEBUG(1217, *YYCURSOR); +yy1218: + YYDEBUG(1218, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'V') { @@ -17559,13 +17573,13 @@ yy1217: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'v') goto yy1218; + if (yych == 'v') goto yy1219; if (yych <= 'z') goto yy151; goto yy3; } } -yy1218: - YYDEBUG(1218, *YYCURSOR); +yy1219: + YYDEBUG(1219, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'E') { @@ -17584,13 +17598,13 @@ yy1218: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'e') goto yy1219; + if (yych == 'e') goto yy1220; if (yych <= 'z') goto yy152; goto yy3; } } -yy1219: - YYDEBUG(1219, *YYCURSOR); +yy1220: + YYDEBUG(1220, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'N') { @@ -17609,13 +17623,13 @@ yy1219: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'n') goto yy1220; + if (yych == 'n') goto yy1221; if (yych <= 'z') goto yy153; goto yy3; } } -yy1220: - YYDEBUG(1220, *YYCURSOR); +yy1221: + YYDEBUG(1221, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'T') { @@ -17632,18 +17646,18 @@ yy1220: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 't') goto yy1221; + if (yych == 't') goto yy1222; if (yych <= 'z') goto yy154; goto yy3; } } -yy1221: - YYDEBUG(1221, *YYCURSOR); +yy1222: + YYDEBUG(1222, *YYCURSOR); yych = *++YYCURSOR; if (yych == 'H') goto yy1205; if (yych != 'h') goto yy155; -yy1222: - YYDEBUG(1222, *YYCURSOR); +yy1223: + YYDEBUG(1223, *YYCURSOR); yych = *++YYCURSOR; if (yych <= '.') { if (yych <= '\t') { @@ -17664,8 +17678,8 @@ yy1222: goto yy56; } } -yy1223: - YYDEBUG(1223, *YYCURSOR); +yy1224: + YYDEBUG(1224, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'H') { @@ -17684,13 +17698,13 @@ yy1223: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'h') goto yy1224; + if (yych == 'h') goto yy1225; if (yych <= 'z') goto yy151; goto yy3; } } -yy1224: - YYDEBUG(1224, *YYCURSOR); +yy1225: + YYDEBUG(1225, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'T') { @@ -17709,39 +17723,76 @@ yy1224: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 't') goto yy1225; + if (yych == 't') goto yy1226; if (yych <= 'z') goto yy152; goto yy3; } } -yy1225: - YYDEBUG(1225, *YYCURSOR); +yy1226: + YYDEBUG(1226, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '.') { + if (yych <= '@') { + if (yych <= ' ') { + if (yych == '\t') goto yy1206; + if (yych <= 0x1F) goto yy3; + goto yy1206; + } else { + if (yych <= ')') { + if (yych <= '(') goto yy3; + goto yy139; + } else { + if (yych == '/') goto yy147; + goto yy3; + } + } + } else { + if (yych <= '_') { + if (yych <= 'H') { + if (yych <= 'G') goto yy144; + goto yy1215; + } else { + if (yych <= 'Z') goto yy144; + if (yych <= '^') goto yy3; + goto yy147; + } + } else { + if (yych <= 'g') { + if (yych <= '`') goto yy3; + goto yy153; + } else { + if (yych <= 'h') goto yy1227; + if (yych <= 'z') goto yy153; + goto yy3; + } + } + } +yy1227: + YYDEBUG(1227, *YYCURSOR); + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= ')') { if (yych <= 0x1F) { if (yych == '\t') goto yy1206; goto yy3; } else { if (yych <= ' ') goto yy1206; - if (yych == ')') goto yy139; - goto yy3; + if (yych <= '(') goto yy3; + goto yy139; } } else { if (yych <= '^') { - if (yych <= '/') goto yy147; - if (yych <= '@') goto yy3; - if (yych <= 'Z') goto yy144; + if (yych == '/') goto yy147; goto yy3; } else { if (yych <= '_') goto yy147; if (yych <= '`') goto yy3; - if (yych <= 'z') goto yy153; + if (yych <= 'z') goto yy154; goto yy3; } } -yy1226: - YYDEBUG(1226, *YYCURSOR); +yy1228: + YYDEBUG(1228, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'V') { if (yych <= 'B') { @@ -17750,12 +17801,12 @@ yy1226: goto yy141; } else { if (yych <= 'O') { - if (yych <= 'C') goto yy1241; + if (yych <= 'C') goto yy1244; goto yy141; } else { - if (yych <= 'P') goto yy1243; + if (yych <= 'P') goto yy1246; if (yych <= 'U') goto yy141; - goto yy1242; + goto yy1245; } } } else { @@ -17764,22 +17815,22 @@ yy1226: if (yych <= 'Z') goto yy141; goto yy3; } else { - if (yych == 'c') goto yy1241; + if (yych == 'c') goto yy1244; goto yy141; } } else { if (yych <= 'u') { - if (yych <= 'p') goto yy1243; + if (yych <= 'p') goto yy1246; goto yy141; } else { - if (yych <= 'v') goto yy1242; + if (yych <= 'v') goto yy1245; if (yych <= 'z') goto yy141; goto yy3; } } } -yy1227: - YYDEBUG(1227, *YYCURSOR); +yy1229: + YYDEBUG(1229, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'T') { if (yych <= ')') { @@ -17788,7 +17839,7 @@ yy1227: } else { if (yych <= '@') goto yy3; if (yych <= 'S') goto yy141; - goto yy1236; + goto yy1239; } } else { if (yych <= 's') { @@ -17796,13 +17847,13 @@ yy1227: if (yych <= '`') goto yy3; goto yy141; } else { - if (yych <= 't') goto yy1236; + if (yych <= 't') goto yy1239; if (yych <= 'z') goto yy141; goto yy3; } } -yy1228: - YYDEBUG(1228, *YYCURSOR); +yy1230: + YYDEBUG(1230, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'X') { if (yych <= ')') { @@ -17811,7 +17862,7 @@ yy1228: } else { if (yych <= '@') goto yy3; if (yych <= 'W') goto yy141; - goto yy1234; + goto yy1236; } } else { if (yych <= 'w') { @@ -17819,13 +17870,13 @@ yy1228: if (yych <= '`') goto yy3; goto yy141; } else { - if (yych <= 'x') goto yy1234; + if (yych <= 'x') goto yy1236; if (yych <= 'z') goto yy141; goto yy3; } } -yy1229: - YYDEBUG(1229, *YYCURSOR); +yy1231: + YYDEBUG(1231, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'N') { if (yych <= ')') { @@ -17841,13 +17892,13 @@ yy1229: if (yych <= '`') goto yy3; goto yy141; } else { - if (yych <= 'n') goto yy1230; + if (yych <= 'n') goto yy1232; if (yych <= 'z') goto yy141; goto yy3; } } -yy1230: - YYDEBUG(1230, *YYCURSOR); +yy1232: + YYDEBUG(1232, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'D') { if (yych <= ')') { @@ -17863,13 +17914,13 @@ yy1230: if (yych <= '`') goto yy167; goto yy142; } else { - if (yych <= 'd') goto yy1231; + if (yych <= 'd') goto yy1233; if (yych <= 'z') goto yy142; goto yy167; } } -yy1231: - YYDEBUG(1231, *YYCURSOR); +yy1233: + YYDEBUG(1233, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'A') { if (yych == ')') goto yy139; @@ -17879,13 +17930,13 @@ yy1231: if (yych <= 'Z') goto yy143; goto yy3; } else { - if (yych <= 'a') goto yy1232; + if (yych <= 'a') goto yy1234; if (yych <= 'z') goto yy143; goto yy3; } } -yy1232: - YYDEBUG(1232, *YYCURSOR); +yy1234: + YYDEBUG(1234, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'Y') { if (yych <= ')') { @@ -17901,18 +17952,18 @@ yy1232: if (yych <= '`') goto yy3; goto yy144; } else { - if (yych <= 'y') goto yy1233; + if (yych <= 'y') goto yy1235; if (yych <= 'z') goto yy144; goto yy3; } } -yy1233: - YYDEBUG(1233, *YYCURSOR); +yy1235: + YYDEBUG(1235, *YYCURSOR); yych = *++YYCURSOR; if (yych == ')') goto yy139; goto yy167; -yy1234: - YYDEBUG(1234, *YYCURSOR); +yy1236: + YYDEBUG(1236, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'T') { if (yych <= ')') { @@ -17928,13 +17979,13 @@ yy1234: if (yych <= '`') goto yy3; goto yy142; } else { - if (yych <= 't') goto yy1235; + if (yych <= 't') goto yy1237; if (yych <= 'z') goto yy142; goto yy3; } } -yy1235: - YYDEBUG(1235, *YYCURSOR); +yy1237: + YYDEBUG(1237, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'H') { if (yych <= ')') { @@ -17943,7 +17994,6 @@ yy1235: } else { if (yych <= '@') goto yy3; if (yych <= 'G') goto yy143; - goto yy1214; } } else { if (yych <= 'g') { @@ -17951,13 +18001,36 @@ yy1235: if (yych <= '`') goto yy3; goto yy143; } else { - if (yych <= 'h') goto yy1214; + if (yych <= 'h') goto yy1238; if (yych <= 'z') goto yy143; goto yy3; } } -yy1236: - YYDEBUG(1236, *YYCURSOR); +yy1238: + YYDEBUG(1238, *YYCURSOR); + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '(') { + if (yych <= '\t') { + if (yych <= 0x08) goto yy3; + goto yy1206; + } else { + if (yych == ' ') goto yy1206; + goto yy3; + } + } else { + if (yych <= 'Z') { + if (yych <= ')') goto yy139; + if (yych <= '@') goto yy3; + goto yy144; + } else { + if (yych <= '`') goto yy3; + if (yych <= 'z') goto yy144; + goto yy3; + } + } +yy1239: + YYDEBUG(1239, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'U') { if (yych <= ')') { @@ -17973,13 +18046,13 @@ yy1236: if (yych <= '`') goto yy167; goto yy142; } else { - if (yych <= 'u') goto yy1237; + if (yych <= 'u') goto yy1240; if (yych <= 'z') goto yy142; goto yy167; } } -yy1237: - YYDEBUG(1237, *YYCURSOR); +yy1240: + YYDEBUG(1240, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'R') { if (yych <= ')') { @@ -17995,13 +18068,13 @@ yy1237: if (yych <= '`') goto yy3; goto yy143; } else { - if (yych <= 'r') goto yy1238; + if (yych <= 'r') goto yy1241; if (yych <= 'z') goto yy143; goto yy3; } } -yy1238: - YYDEBUG(1238, *YYCURSOR); +yy1241: + YYDEBUG(1241, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'D') { if (yych <= ')') { @@ -18017,30 +18090,30 @@ yy1238: if (yych <= '`') goto yy3; goto yy144; } else { - if (yych <= 'd') goto yy1239; + if (yych <= 'd') goto yy1242; if (yych <= 'z') goto yy144; goto yy3; } } -yy1239: - YYDEBUG(1239, *YYCURSOR); +yy1242: + YYDEBUG(1242, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '@') { if (yych == ')') goto yy139; goto yy3; } else { - if (yych <= 'A') goto yy1240; + if (yych <= 'A') goto yy1243; if (yych != 'a') goto yy3; } -yy1240: - YYDEBUG(1240, *YYCURSOR); +yy1243: + YYDEBUG(1243, *YYCURSOR); yych = *++YYCURSOR; if (yych == 'Y') goto yy173; if (yych == 'y') goto yy173; goto yy56; -yy1241: - YYDEBUG(1241, *YYCURSOR); +yy1244: + YYDEBUG(1244, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'O') { if (yych <= ')') { @@ -18049,7 +18122,7 @@ yy1241: } else { if (yych <= '@') goto yy3; if (yych <= 'N') goto yy142; - goto yy1252; + goto yy1255; } } else { if (yych <= 'n') { @@ -18057,13 +18130,13 @@ yy1241: if (yych <= '`') goto yy3; goto yy142; } else { - if (yych <= 'o') goto yy1252; + if (yych <= 'o') goto yy1255; if (yych <= 'z') goto yy142; goto yy3; } } -yy1242: - YYDEBUG(1242, *YYCURSOR); +yy1245: + YYDEBUG(1245, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'E') { if (yych <= ')') { @@ -18072,7 +18145,7 @@ yy1242: } else { if (yych <= '@') goto yy3; if (yych <= 'D') goto yy142; - goto yy1249; + goto yy1252; } } else { if (yych <= 'd') { @@ -18080,13 +18153,13 @@ yy1242: if (yych <= '`') goto yy3; goto yy142; } else { - if (yych <= 'e') goto yy1249; + if (yych <= 'e') goto yy1252; if (yych <= 'z') goto yy142; goto yy3; } } -yy1243: - YYDEBUG(1243, *YYCURSOR); +yy1246: + YYDEBUG(1246, *YYCURSOR); yyaccept = 5; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '/') { @@ -18121,14 +18194,14 @@ yy1243: if (yych <= '`') goto yy194; goto yy142; } else { - if (yych <= 't') goto yy1244; + if (yych <= 't') goto yy1247; if (yych <= 'z') goto yy142; goto yy194; } } } -yy1244: - YYDEBUG(1244, *YYCURSOR); +yy1247: + YYDEBUG(1247, *YYCURSOR); yyaccept = 5; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '/') { @@ -18163,14 +18236,14 @@ yy1244: if (yych <= '`') goto yy194; goto yy143; } else { - if (yych <= 'e') goto yy1245; + if (yych <= 'e') goto yy1248; if (yych <= 'z') goto yy143; goto yy194; } } } -yy1245: - YYDEBUG(1245, *YYCURSOR); +yy1248: + YYDEBUG(1248, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'M') { if (yych <= ')') { @@ -18186,35 +18259,35 @@ yy1245: if (yych <= '`') goto yy3; goto yy144; } else { - if (yych <= 'm') goto yy1246; + if (yych <= 'm') goto yy1249; if (yych <= 'z') goto yy144; goto yy3; } } -yy1246: - YYDEBUG(1246, *YYCURSOR); +yy1249: + YYDEBUG(1249, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'A') { if (yych == ')') goto yy139; goto yy3; } else { - if (yych <= 'B') goto yy1247; + if (yych <= 'B') goto yy1250; if (yych != 'b') goto yy3; } -yy1247: - YYDEBUG(1247, *YYCURSOR); +yy1250: + YYDEBUG(1250, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy1248; + if (yych == 'E') goto yy1251; if (yych != 'e') goto yy56; -yy1248: - YYDEBUG(1248, *YYCURSOR); +yy1251: + YYDEBUG(1251, *YYCURSOR); yych = *++YYCURSOR; if (yych == 'R') goto yy206; if (yych == 'r') goto yy206; goto yy56; -yy1249: - YYDEBUG(1249, *YYCURSOR); +yy1252: + YYDEBUG(1252, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'N') { if (yych <= ')') { @@ -18230,13 +18303,13 @@ yy1249: if (yych <= '`') goto yy3; goto yy143; } else { - if (yych <= 'n') goto yy1250; + if (yych <= 'n') goto yy1253; if (yych <= 'z') goto yy143; goto yy3; } } -yy1250: - YYDEBUG(1250, *YYCURSOR); +yy1253: + YYDEBUG(1253, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'T') { if (yych <= ')') { @@ -18252,13 +18325,13 @@ yy1250: if (yych <= '`') goto yy3; goto yy144; } else { - if (yych <= 't') goto yy1251; + if (yych <= 't') goto yy1254; if (yych <= 'z') goto yy144; goto yy3; } } -yy1251: - YYDEBUG(1251, *YYCURSOR); +yy1254: + YYDEBUG(1254, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'G') { @@ -18269,8 +18342,8 @@ yy1251: if (yych == 'h') goto yy1205; goto yy3; } -yy1252: - YYDEBUG(1252, *YYCURSOR); +yy1255: + YYDEBUG(1255, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'N') { if (yych <= ')') { @@ -18286,13 +18359,13 @@ yy1252: if (yych <= '`') goto yy3; goto yy143; } else { - if (yych <= 'n') goto yy1253; + if (yych <= 'n') goto yy1256; if (yych <= 'z') goto yy143; goto yy3; } } -yy1253: - YYDEBUG(1253, *YYCURSOR); +yy1256: + YYDEBUG(1256, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'D') { if (yych <= ')') { @@ -18301,6 +18374,7 @@ yy1253: } else { if (yych <= '@') goto yy3; if (yych <= 'C') goto yy144; + goto yy1215; } } else { if (yych <= 'c') { @@ -18308,25 +18382,13 @@ yy1253: if (yych <= '`') goto yy3; goto yy144; } else { - if (yych <= 'd') goto yy1254; + if (yych <= 'd') goto yy1215; if (yych <= 'z') goto yy144; goto yy3; } } -yy1254: - YYDEBUG(1254, *YYCURSOR); - yyaccept = 0; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= 0x1F) { - if (yych == '\t') goto yy1206; - goto yy3; - } else { - if (yych <= ' ') goto yy1206; - if (yych == ')') goto yy139; - goto yy3; - } -yy1255: - YYDEBUG(1255, *YYCURSOR); +yy1257: + YYDEBUG(1257, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'V') { @@ -18340,12 +18402,12 @@ yy1255: } } else { if (yych <= 'O') { - if (yych == 'C') goto yy1241; + if (yych == 'C') goto yy1244; goto yy141; } else { - if (yych <= 'P') goto yy1243; + if (yych <= 'P') goto yy1246; if (yych <= 'U') goto yy141; - goto yy1242; + goto yy1245; } } } else { @@ -18357,21 +18419,21 @@ yy1255: } else { if (yych <= '`') goto yy3; if (yych <= 'b') goto yy146; - goto yy1270; + goto yy1273; } } else { if (yych <= 'u') { - if (yych == 'p') goto yy1272; + if (yych == 'p') goto yy1275; goto yy146; } else { - if (yych <= 'v') goto yy1271; + if (yych <= 'v') goto yy1274; if (yych <= 'z') goto yy146; goto yy3; } } } -yy1256: - YYDEBUG(1256, *YYCURSOR); +yy1258: + YYDEBUG(1258, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'T') { @@ -18382,7 +18444,7 @@ yy1256: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'S') goto yy141; - goto yy1236; + goto yy1239; } } else { if (yych <= '`') { @@ -18390,13 +18452,13 @@ yy1256: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 't') goto yy1265; + if (yych == 't') goto yy1268; if (yych <= 'z') goto yy146; goto yy3; } } -yy1257: - YYDEBUG(1257, *YYCURSOR); +yy1259: + YYDEBUG(1259, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'X') { @@ -18407,7 +18469,7 @@ yy1257: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'W') goto yy141; - goto yy1234; + goto yy1236; } } else { if (yych <= '`') { @@ -18415,13 +18477,13 @@ yy1257: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'x') goto yy1263; + if (yych == 'x') goto yy1265; if (yych <= 'z') goto yy146; goto yy3; } } -yy1258: - YYDEBUG(1258, *YYCURSOR); +yy1260: + YYDEBUG(1260, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'N') { @@ -18432,7 +18494,7 @@ yy1258: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'M') goto yy141; - goto yy1230; + goto yy1232; } } else { if (yych <= '`') { @@ -18440,13 +18502,13 @@ yy1258: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'n') goto yy1259; + if (yych == 'n') goto yy1261; if (yych <= 'z') goto yy146; goto yy3; } } -yy1259: - YYDEBUG(1259, *YYCURSOR); +yy1261: + YYDEBUG(1261, *YYCURSOR); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'D') { @@ -18457,7 +18519,7 @@ yy1259: if (yych <= '/') goto yy147; if (yych <= '@') goto yy167; if (yych <= 'C') goto yy142; - goto yy1231; + goto yy1233; } } else { if (yych <= '`') { @@ -18465,13 +18527,13 @@ yy1259: if (yych == '_') goto yy147; goto yy167; } else { - if (yych == 'd') goto yy1260; + if (yych == 'd') goto yy1262; if (yych <= 'z') goto yy151; goto yy167; } } -yy1260: - YYDEBUG(1260, *YYCURSOR); +yy1262: + YYDEBUG(1262, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'A') { @@ -18481,7 +18543,7 @@ yy1260: } else { if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; - goto yy1232; + goto yy1234; } } else { if (yych <= '_') { @@ -18490,13 +18552,13 @@ yy1260: goto yy147; } else { if (yych <= '`') goto yy3; - if (yych <= 'a') goto yy1261; + if (yych <= 'a') goto yy1263; if (yych <= 'z') goto yy152; goto yy3; } } -yy1261: - YYDEBUG(1261, *YYCURSOR); +yy1263: + YYDEBUG(1263, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'Y') { @@ -18507,7 +18569,7 @@ yy1261: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'X') goto yy144; - goto yy1233; + goto yy1235; } } else { if (yych <= '`') { @@ -18515,13 +18577,13 @@ yy1261: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'y') goto yy1262; + if (yych == 'y') goto yy1264; if (yych <= 'z') goto yy153; goto yy3; } } -yy1262: - YYDEBUG(1262, *YYCURSOR); +yy1264: + YYDEBUG(1264, *YYCURSOR); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '/') { @@ -18538,8 +18600,8 @@ yy1262: goto yy167; } } -yy1263: - YYDEBUG(1263, *YYCURSOR); +yy1265: + YYDEBUG(1265, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'T') { @@ -18550,7 +18612,7 @@ yy1263: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'S') goto yy142; - goto yy1235; + goto yy1237; } } else { if (yych <= '`') { @@ -18558,13 +18620,13 @@ yy1263: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 't') goto yy1264; + if (yych == 't') goto yy1266; if (yych <= 'z') goto yy151; goto yy3; } } -yy1264: - YYDEBUG(1264, *YYCURSOR); +yy1266: + YYDEBUG(1266, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'H') { @@ -18575,7 +18637,7 @@ yy1264: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'G') goto yy143; - goto yy1214; + goto yy1238; } } else { if (yych <= '`') { @@ -18583,13 +18645,39 @@ yy1264: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'h') goto yy1225; + if (yych == 'h') goto yy1267; if (yych <= 'z') goto yy152; goto yy3; } } -yy1265: - YYDEBUG(1265, *YYCURSOR); +yy1267: + YYDEBUG(1267, *YYCURSOR); + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '.') { + if (yych <= 0x1F) { + if (yych == '\t') goto yy1206; + goto yy3; + } else { + if (yych <= ' ') goto yy1206; + if (yych == ')') goto yy139; + goto yy3; + } + } else { + if (yych <= '^') { + if (yych <= '/') goto yy147; + if (yych <= '@') goto yy3; + if (yych <= 'Z') goto yy144; + goto yy3; + } else { + if (yych <= '_') goto yy147; + if (yych <= '`') goto yy3; + if (yych <= 'z') goto yy153; + goto yy3; + } + } +yy1268: + YYDEBUG(1268, *YYCURSOR); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'U') { @@ -18600,7 +18688,7 @@ yy1265: if (yych <= '/') goto yy147; if (yych <= '@') goto yy167; if (yych <= 'T') goto yy142; - goto yy1237; + goto yy1240; } } else { if (yych <= '`') { @@ -18608,13 +18696,13 @@ yy1265: if (yych == '_') goto yy147; goto yy167; } else { - if (yych == 'u') goto yy1266; + if (yych == 'u') goto yy1269; if (yych <= 'z') goto yy151; goto yy167; } } -yy1266: - YYDEBUG(1266, *YYCURSOR); +yy1269: + YYDEBUG(1269, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'R') { @@ -18625,7 +18713,7 @@ yy1266: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'Q') goto yy143; - goto yy1238; + goto yy1241; } } else { if (yych <= '`') { @@ -18633,13 +18721,13 @@ yy1266: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'r') goto yy1267; + if (yych == 'r') goto yy1270; if (yych <= 'z') goto yy152; goto yy3; } } -yy1267: - YYDEBUG(1267, *YYCURSOR); +yy1270: + YYDEBUG(1270, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'D') { @@ -18650,7 +18738,7 @@ yy1267: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'C') goto yy144; - goto yy1239; + goto yy1242; } } else { if (yych <= '`') { @@ -18658,13 +18746,13 @@ yy1267: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'd') goto yy1268; + if (yych == 'd') goto yy1271; if (yych <= 'z') goto yy153; goto yy3; } } -yy1268: - YYDEBUG(1268, *YYCURSOR); +yy1271: + YYDEBUG(1271, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'A') { @@ -18674,26 +18762,26 @@ yy1268: } else { if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; - goto yy1240; + goto yy1243; } } else { if (yych <= '`') { if (yych == '_') goto yy147; goto yy3; } else { - if (yych <= 'a') goto yy1269; + if (yych <= 'a') goto yy1272; if (yych <= 'z') goto yy154; goto yy3; } } -yy1269: - YYDEBUG(1269, *YYCURSOR); +yy1272: + YYDEBUG(1272, *YYCURSOR); yych = *++YYCURSOR; if (yych == 'Y') goto yy173; if (yych == 'y') goto yy186; goto yy155; -yy1270: - YYDEBUG(1270, *YYCURSOR); +yy1273: + YYDEBUG(1273, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'O') { @@ -18704,7 +18792,7 @@ yy1270: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'N') goto yy142; - goto yy1252; + goto yy1255; } } else { if (yych <= '`') { @@ -18712,13 +18800,13 @@ yy1270: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'o') goto yy1281; + if (yych == 'o') goto yy1284; if (yych <= 'z') goto yy151; goto yy3; } } -yy1271: - YYDEBUG(1271, *YYCURSOR); +yy1274: + YYDEBUG(1274, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'E') { @@ -18729,7 +18817,7 @@ yy1271: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'D') goto yy142; - goto yy1249; + goto yy1252; } } else { if (yych <= '`') { @@ -18737,13 +18825,13 @@ yy1271: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'e') goto yy1278; + if (yych == 'e') goto yy1281; if (yych <= 'z') goto yy151; goto yy3; } } -yy1272: - YYDEBUG(1272, *YYCURSOR); +yy1275: + YYDEBUG(1275, *YYCURSOR); yyaccept = 5; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '9') { @@ -18771,7 +18859,7 @@ yy1272: if (yych <= '@') goto yy194; goto yy142; } else { - if (yych <= 'T') goto yy1244; + if (yych <= 'T') goto yy1247; if (yych <= 'Z') goto yy142; goto yy194; } @@ -18781,14 +18869,14 @@ yy1272: if (yych <= '`') goto yy194; goto yy151; } else { - if (yych <= 't') goto yy1273; + if (yych <= 't') goto yy1276; if (yych <= 'z') goto yy151; goto yy194; } } } -yy1273: - YYDEBUG(1273, *YYCURSOR); +yy1276: + YYDEBUG(1276, *YYCURSOR); yyaccept = 5; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '9') { @@ -18816,7 +18904,7 @@ yy1273: if (yych <= '@') goto yy194; goto yy143; } else { - if (yych <= 'E') goto yy1245; + if (yych <= 'E') goto yy1248; if (yych <= 'Z') goto yy143; goto yy194; } @@ -18826,14 +18914,14 @@ yy1273: if (yych <= '`') goto yy194; goto yy152; } else { - if (yych <= 'e') goto yy1274; + if (yych <= 'e') goto yy1277; if (yych <= 'z') goto yy152; goto yy194; } } } -yy1274: - YYDEBUG(1274, *YYCURSOR); +yy1277: + YYDEBUG(1277, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'M') { @@ -18844,7 +18932,7 @@ yy1274: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'L') goto yy144; - goto yy1246; + goto yy1249; } } else { if (yych <= '`') { @@ -18852,13 +18940,13 @@ yy1274: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'm') goto yy1275; + if (yych == 'm') goto yy1278; if (yych <= 'z') goto yy153; goto yy3; } } -yy1275: - YYDEBUG(1275, *YYCURSOR); +yy1278: + YYDEBUG(1278, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'B') { @@ -18868,30 +18956,30 @@ yy1275: } else { if (yych <= '/') goto yy147; if (yych <= 'A') goto yy3; - goto yy1247; + goto yy1250; } } else { if (yych <= '`') { if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'b') goto yy1276; + if (yych == 'b') goto yy1279; if (yych <= 'z') goto yy154; goto yy3; } } -yy1276: - YYDEBUG(1276, *YYCURSOR); +yy1279: + YYDEBUG(1279, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy1248; + if (yych == 'E') goto yy1251; if (yych != 'e') goto yy155; - YYDEBUG(1277, *YYCURSOR); + YYDEBUG(1280, *YYCURSOR); yych = *++YYCURSOR; if (yych == 'R') goto yy206; if (yych == 'r') goto yy377; goto yy155; -yy1278: - YYDEBUG(1278, *YYCURSOR); +yy1281: + YYDEBUG(1281, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'N') { @@ -18902,7 +18990,7 @@ yy1278: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'M') goto yy143; - goto yy1250; + goto yy1253; } } else { if (yych <= '`') { @@ -18910,13 +18998,13 @@ yy1278: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'n') goto yy1279; + if (yych == 'n') goto yy1282; if (yych <= 'z') goto yy152; goto yy3; } } -yy1279: - YYDEBUG(1279, *YYCURSOR); +yy1282: + YYDEBUG(1282, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'T') { @@ -18927,7 +19015,7 @@ yy1279: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'S') goto yy144; - goto yy1251; + goto yy1254; } } else { if (yych <= '`') { @@ -18935,13 +19023,13 @@ yy1279: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 't') goto yy1280; + if (yych == 't') goto yy1283; if (yych <= 'z') goto yy153; goto yy3; } } -yy1280: - YYDEBUG(1280, *YYCURSOR); +yy1283: + YYDEBUG(1283, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'H') { @@ -18958,13 +19046,13 @@ yy1280: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'h') goto yy1222; + if (yych == 'h') goto yy1223; if (yych <= 'z') goto yy154; goto yy3; } } -yy1281: - YYDEBUG(1281, *YYCURSOR); +yy1284: + YYDEBUG(1284, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'N') { @@ -18975,7 +19063,7 @@ yy1281: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'M') goto yy143; - goto yy1253; + goto yy1256; } } else { if (yych <= '`') { @@ -18983,13 +19071,13 @@ yy1281: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'n') goto yy1282; + if (yych == 'n') goto yy1285; if (yych <= 'z') goto yy152; goto yy3; } } -yy1282: - YYDEBUG(1282, *YYCURSOR); +yy1285: + YYDEBUG(1285, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'D') { @@ -19000,7 +19088,7 @@ yy1282: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'C') goto yy144; - goto yy1254; + goto yy1215; } } else { if (yych <= '`') { @@ -19008,37 +19096,13 @@ yy1282: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'd') goto yy1283; + if (yych == 'd') goto yy1227; if (yych <= 'z') goto yy153; goto yy3; } } -yy1283: - YYDEBUG(1283, *YYCURSOR); - yyaccept = 0; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= ')') { - if (yych <= 0x1F) { - if (yych == '\t') goto yy1206; - goto yy3; - } else { - if (yych <= ' ') goto yy1206; - if (yych <= '(') goto yy3; - goto yy139; - } - } else { - if (yych <= '^') { - if (yych == '/') goto yy147; - goto yy3; - } else { - if (yych <= '_') goto yy147; - if (yych <= '`') goto yy3; - if (yych <= 'z') goto yy154; - goto yy3; - } - } -yy1284: - YYDEBUG(1284, *YYCURSOR); +yy1286: + YYDEBUG(1286, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'C') { if (yych <= ')') { @@ -19054,13 +19118,13 @@ yy1284: if (yych <= '`') goto yy3; goto yy141; } else { - if (yych <= 'c') goto yy1285; + if (yych <= 'c') goto yy1287; if (yych <= 'z') goto yy141; goto yy3; } } -yy1285: - YYDEBUG(1285, *YYCURSOR); +yy1287: + YYDEBUG(1287, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'K') { if (yych <= ')') { @@ -19076,17 +19140,17 @@ yy1285: if (yych <= '`') goto yy3; goto yy142; } else { - if (yych <= 'k') goto yy1286; + if (yych <= 'k') goto yy1288; if (yych <= 'z') goto yy142; goto yy3; } } -yy1286: - YYDEBUG(1286, *YYCURSOR); +yy1288: + YYDEBUG(1288, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= ')') { - if (yych == ' ') goto yy1287; + if (yych == ' ') goto yy1289; if (yych <= '(') goto yy3; goto yy139; } else { @@ -19099,37 +19163,37 @@ yy1286: goto yy3; } } -yy1287: - YYDEBUG(1287, *YYCURSOR); +yy1289: + YYDEBUG(1289, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy1288; + if (yych == 'O') goto yy1290; if (yych != 'o') goto yy56; -yy1288: - YYDEBUG(1288, *YYCURSOR); +yy1290: + YYDEBUG(1290, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'F') goto yy1289; + if (yych == 'F') goto yy1291; if (yych != 'f') goto yy56; -yy1289: - YYDEBUG(1289, *YYCURSOR); +yy1291: + YYDEBUG(1291, *YYCURSOR); yych = *++YYCURSOR; if (yych != ' ') goto yy56; - YYDEBUG(1290, *YYCURSOR); + YYDEBUG(1292, *YYCURSOR); yych = *++YYCURSOR; if (yych <= '/') goto yy56; - if (yych <= '1') goto yy1291; - if (yych <= '2') goto yy1293; - if (yych <= '9') goto yy1294; + if (yych <= '1') goto yy1293; + if (yych <= '2') goto yy1295; + if (yych <= '9') goto yy1296; goto yy56; -yy1291: - YYDEBUG(1291, *YYCURSOR); +yy1293: + YYDEBUG(1293, *YYCURSOR); yyaccept = 28; yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '/') goto yy1295; - if (yych <= '9') goto yy1294; - goto yy1295; -yy1292: - YYDEBUG(1292, *YYCURSOR); -#line 1067 "ext/date/lib/parse_date.re" + if (yych <= '/') goto yy1297; + if (yych <= '9') goto yy1296; + goto yy1297; +yy1294: + YYDEBUG(1294, *YYCURSOR); +#line 1068 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("backof | frontof"); TIMELIB_INIT; @@ -19151,76 +19215,76 @@ yy1292: TIMELIB_DEINIT; return TIMELIB_LF_DAY_OF_MONTH; } -#line 19155 "ext/date/lib/parse_date.c" -yy1293: - YYDEBUG(1293, *YYCURSOR); +#line 19219 "ext/date/lib/parse_date.c" +yy1295: + YYDEBUG(1295, *YYCURSOR); yyaccept = 28; yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '/') goto yy1295; - if (yych >= '5') goto yy1295; -yy1294: - YYDEBUG(1294, *YYCURSOR); + if (yych <= '/') goto yy1297; + if (yych >= '5') goto yy1297; +yy1296: + YYDEBUG(1296, *YYCURSOR); yyaccept = 28; YYMARKER = ++YYCURSOR; if ((YYLIMIT - YYCURSOR) < 5) YYFILL(5); yych = *YYCURSOR; -yy1295: - YYDEBUG(1295, *YYCURSOR); +yy1297: + YYDEBUG(1297, *YYCURSOR); if (yych <= 'A') { if (yych <= 0x1F) { - if (yych == '\t') goto yy1294; - goto yy1292; + if (yych == '\t') goto yy1296; + goto yy1294; } else { - if (yych <= ' ') goto yy1294; - if (yych <= '@') goto yy1292; + if (yych <= ' ') goto yy1296; + if (yych <= '@') goto yy1294; } } else { if (yych <= '`') { - if (yych != 'P') goto yy1292; + if (yych != 'P') goto yy1294; } else { - if (yych <= 'a') goto yy1296; - if (yych != 'p') goto yy1292; + if (yych <= 'a') goto yy1298; + if (yych != 'p') goto yy1294; } } -yy1296: - YYDEBUG(1296, *YYCURSOR); +yy1298: + YYDEBUG(1298, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'L') { if (yych != '.') goto yy56; } else { - if (yych <= 'M') goto yy1298; - if (yych == 'm') goto yy1298; + if (yych <= 'M') goto yy1300; + if (yych == 'm') goto yy1300; goto yy56; } - YYDEBUG(1297, *YYCURSOR); + YYDEBUG(1299, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'M') goto yy1298; + if (yych == 'M') goto yy1300; if (yych != 'm') goto yy56; -yy1298: - YYDEBUG(1298, *YYCURSOR); +yy1300: + YYDEBUG(1300, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 0x1F) { - if (yych <= 0x00) goto yy1300; - if (yych == '\t') goto yy1300; + if (yych <= 0x00) goto yy1302; + if (yych == '\t') goto yy1302; goto yy56; } else { - if (yych <= ' ') goto yy1300; + if (yych <= ' ') goto yy1302; if (yych != '.') goto yy56; } - YYDEBUG(1299, *YYCURSOR); + YYDEBUG(1301, *YYCURSOR); yych = *++YYCURSOR; if (yych <= '\t') { - if (yych <= 0x00) goto yy1300; + if (yych <= 0x00) goto yy1302; if (yych <= 0x08) goto yy56; } else { if (yych != ' ') goto yy56; } -yy1300: - YYDEBUG(1300, *YYCURSOR); +yy1302: + YYDEBUG(1302, *YYCURSOR); yych = *++YYCURSOR; - goto yy1292; -yy1301: - YYDEBUG(1301, *YYCURSOR); + goto yy1294; +yy1303: + YYDEBUG(1303, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'C') { @@ -19231,7 +19295,7 @@ yy1301: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'B') goto yy141; - goto yy1285; + goto yy1287; } } else { if (yych <= '`') { @@ -19239,13 +19303,13 @@ yy1301: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'c') goto yy1302; + if (yych == 'c') goto yy1304; if (yych <= 'z') goto yy146; goto yy3; } } -yy1302: - YYDEBUG(1302, *YYCURSOR); +yy1304: + YYDEBUG(1304, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'K') { @@ -19256,7 +19320,7 @@ yy1302: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'J') goto yy142; - goto yy1286; + goto yy1288; } } else { if (yych <= '`') { @@ -19264,18 +19328,18 @@ yy1302: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'k') goto yy1303; + if (yych == 'k') goto yy1305; if (yych <= 'z') goto yy151; goto yy3; } } -yy1303: - YYDEBUG(1303, *YYCURSOR); +yy1305: + YYDEBUG(1305, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '/') { if (yych <= '(') { - if (yych == ' ') goto yy1287; + if (yych == ' ') goto yy1289; goto yy3; } else { if (yych <= ')') goto yy139; @@ -19294,8 +19358,8 @@ yy1303: goto yy3; } } -yy1304: - YYDEBUG(1304, *YYCURSOR); +yy1306: + YYDEBUG(1306, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'S') { if (yych <= ')') { @@ -19311,13 +19375,13 @@ yy1304: if (yych <= '`') goto yy3; goto yy141; } else { - if (yych <= 's') goto yy1305; + if (yych <= 's') goto yy1307; if (yych <= 'z') goto yy141; goto yy3; } } -yy1305: - YYDEBUG(1305, *YYCURSOR); +yy1307: + YYDEBUG(1307, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'T') { if (yych <= ')') { @@ -19333,13 +19397,13 @@ yy1305: if (yych <= '`') goto yy3; goto yy142; } else { - if (yych <= 't') goto yy1306; + if (yych <= 't') goto yy1308; if (yych <= 'z') goto yy142; goto yy3; } } -yy1306: - YYDEBUG(1306, *YYCURSOR); +yy1308: + YYDEBUG(1308, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '(') { @@ -19360,34 +19424,34 @@ yy1306: goto yy3; } } -yy1307: - YYDEBUG(1307, *YYCURSOR); +yy1309: + YYDEBUG(1309, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'D') goto yy1308; + if (yych == 'D') goto yy1310; if (yych != 'd') goto yy1105; -yy1308: - YYDEBUG(1308, *YYCURSOR); +yy1310: + YYDEBUG(1310, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy1309; + if (yych == 'A') goto yy1311; if (yych != 'a') goto yy56; -yy1309: - YYDEBUG(1309, *YYCURSOR); +yy1311: + YYDEBUG(1311, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'Y') goto yy1310; + if (yych == 'Y') goto yy1312; if (yych != 'y') goto yy56; -yy1310: - YYDEBUG(1310, *YYCURSOR); +yy1312: + YYDEBUG(1312, *YYCURSOR); yyaccept = 29; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'R') { - if (yych == ' ') goto yy1312; + if (yych == ' ') goto yy1314; } else { if (yych <= 'S') goto yy1142; if (yych == 's') goto yy1142; } -yy1311: - YYDEBUG(1311, *YYCURSOR); -#line 1050 "ext/date/lib/parse_date.re" +yy1313: + YYDEBUG(1313, *YYCURSOR); +#line 1051 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("firstdayof | lastdayof"); TIMELIB_INIT; @@ -19403,23 +19467,23 @@ yy1311: TIMELIB_DEINIT; return TIMELIB_LF_DAY_OF_MONTH; } -#line 19407 "ext/date/lib/parse_date.c" -yy1312: - YYDEBUG(1312, *YYCURSOR); +#line 19471 "ext/date/lib/parse_date.c" +yy1314: + YYDEBUG(1314, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy1313; + if (yych == 'O') goto yy1315; if (yych != 'o') goto yy56; -yy1313: - YYDEBUG(1313, *YYCURSOR); +yy1315: + YYDEBUG(1315, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'F') goto yy1314; + if (yych == 'F') goto yy1316; if (yych != 'f') goto yy56; -yy1314: - YYDEBUG(1314, *YYCURSOR); +yy1316: + YYDEBUG(1316, *YYCURSOR); yych = *++YYCURSOR; - goto yy1311; -yy1315: - YYDEBUG(1315, *YYCURSOR); + goto yy1313; +yy1317: + YYDEBUG(1317, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'S') { @@ -19430,7 +19494,7 @@ yy1315: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'R') goto yy141; - goto yy1305; + goto yy1307; } } else { if (yych <= '`') { @@ -19438,13 +19502,13 @@ yy1315: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 's') goto yy1316; + if (yych == 's') goto yy1318; if (yych <= 'z') goto yy146; goto yy3; } } -yy1316: - YYDEBUG(1316, *YYCURSOR); +yy1318: + YYDEBUG(1318, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'T') { @@ -19455,7 +19519,7 @@ yy1316: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'S') goto yy142; - goto yy1306; + goto yy1308; } } else { if (yych <= '`') { @@ -19463,13 +19527,13 @@ yy1316: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 't') goto yy1317; + if (yych == 't') goto yy1319; if (yych <= 'z') goto yy151; goto yy3; } } -yy1317: - YYDEBUG(1317, *YYCURSOR); +yy1319: + YYDEBUG(1319, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '.') { @@ -19477,7 +19541,7 @@ yy1317: if (yych == '\t') goto yy1104; goto yy3; } else { - if (yych <= ' ') goto yy1307; + if (yych <= ' ') goto yy1309; if (yych == ')') goto yy139; goto yy3; } @@ -19494,8 +19558,8 @@ yy1317: goto yy3; } } -yy1318: - YYDEBUG(1318, *YYCURSOR); +yy1320: + YYDEBUG(1320, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'B') { if (yych <= ')') { @@ -19504,7 +19568,7 @@ yy1318: } else { if (yych <= '@') goto yy3; if (yych <= 'A') goto yy141; - goto yy1354; + goto yy1356; } } else { if (yych <= 'a') { @@ -19512,37 +19576,37 @@ yy1318: if (yych <= '`') goto yy3; goto yy141; } else { - if (yych <= 'b') goto yy1354; + if (yych <= 'b') goto yy1356; if (yych <= 'z') goto yy141; goto yy3; } } -yy1319: - YYDEBUG(1319, *YYCURSOR); +yy1321: + YYDEBUG(1321, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'R') { if (yych <= '@') { if (yych == ')') goto yy139; goto yy3; } else { - if (yych == 'F') goto yy1344; + if (yych == 'F') goto yy1346; if (yych <= 'Q') goto yy141; - goto yy1343; + goto yy1345; } } else { if (yych <= 'f') { if (yych <= 'Z') goto yy141; if (yych <= '`') goto yy3; if (yych <= 'e') goto yy141; - goto yy1344; + goto yy1346; } else { - if (yych == 'r') goto yy1343; + if (yych == 'r') goto yy1345; if (yych <= 'z') goto yy141; goto yy3; } } -yy1320: - YYDEBUG(1320, *YYCURSOR); +yy1322: + YYDEBUG(1322, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'U') { if (yych <= ')') { @@ -19551,7 +19615,7 @@ yy1320: } else { if (yych <= '@') goto yy3; if (yych <= 'T') goto yy141; - goto yy1340; + goto yy1342; } } else { if (yych <= 't') { @@ -19559,20 +19623,20 @@ yy1320: if (yych <= '`') goto yy3; goto yy141; } else { - if (yych <= 'u') goto yy1340; + if (yych <= 'u') goto yy1342; if (yych <= 'z') goto yy141; goto yy3; } } -yy1321: - YYDEBUG(1321, *YYCURSOR); +yy1323: + YYDEBUG(1323, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'O') { if (yych <= '@') { if (yych == ')') goto yy139; goto yy3; } else { - if (yych == 'I') goto yy1323; + if (yych == 'I') goto yy1325; if (yych <= 'N') goto yy141; } } else { @@ -19580,15 +19644,15 @@ yy1321: if (yych <= 'Z') goto yy141; if (yych <= '`') goto yy3; if (yych <= 'h') goto yy141; - goto yy1323; + goto yy1325; } else { - if (yych == 'o') goto yy1322; + if (yych == 'o') goto yy1324; if (yych <= 'z') goto yy141; goto yy3; } } -yy1322: - YYDEBUG(1322, *YYCURSOR); +yy1324: + YYDEBUG(1324, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'N') { if (yych <= ')') { @@ -19597,7 +19661,7 @@ yy1322: } else { if (yych <= '@') goto yy3; if (yych <= 'M') goto yy142; - goto yy1326; + goto yy1328; } } else { if (yych <= 'm') { @@ -19605,13 +19669,13 @@ yy1322: if (yych <= '`') goto yy3; goto yy142; } else { - if (yych <= 'n') goto yy1326; + if (yych <= 'n') goto yy1328; if (yych <= 'z') goto yy142; goto yy3; } } -yy1323: - YYDEBUG(1323, *YYCURSOR); +yy1325: + YYDEBUG(1325, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'D') { if (yych <= ')') { @@ -19627,13 +19691,13 @@ yy1323: if (yych <= '`') goto yy167; goto yy142; } else { - if (yych <= 'd') goto yy1324; + if (yych <= 'd') goto yy1326; if (yych <= 'z') goto yy142; goto yy167; } } -yy1324: - YYDEBUG(1324, *YYCURSOR); +yy1326: + YYDEBUG(1326, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'A') { if (yych == ')') goto yy139; @@ -19643,13 +19707,13 @@ yy1324: if (yych <= 'Z') goto yy143; goto yy3; } else { - if (yych <= 'a') goto yy1325; + if (yych <= 'a') goto yy1327; if (yych <= 'z') goto yy143; goto yy3; } } -yy1325: - YYDEBUG(1325, *YYCURSOR); +yy1327: + YYDEBUG(1327, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'Y') { if (yych <= ')') { @@ -19658,7 +19722,7 @@ yy1325: } else { if (yych <= '@') goto yy3; if (yych <= 'X') goto yy144; - goto yy1233; + goto yy1235; } } else { if (yych <= 'x') { @@ -19666,13 +19730,13 @@ yy1325: if (yych <= '`') goto yy3; goto yy144; } else { - if (yych <= 'y') goto yy1233; + if (yych <= 'y') goto yy1235; if (yych <= 'z') goto yy144; goto yy3; } } -yy1326: - YYDEBUG(1326, *YYCURSOR); +yy1328: + YYDEBUG(1328, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'T') { if (yych <= ')') { @@ -19688,17 +19752,17 @@ yy1326: if (yych <= '`') goto yy3; goto yy143; } else { - if (yych <= 't') goto yy1327; + if (yych <= 't') goto yy1329; if (yych <= 'z') goto yy143; goto yy3; } } -yy1327: - YYDEBUG(1327, *YYCURSOR); +yy1329: + YYDEBUG(1329, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= ')') { - if (yych == ' ') goto yy1328; + if (yych == ' ') goto yy1330; if (yych <= '(') goto yy3; goto yy139; } else { @@ -19711,101 +19775,101 @@ yy1327: goto yy3; } } -yy1328: - YYDEBUG(1328, *YYCURSOR); +yy1330: + YYDEBUG(1330, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy1329; + if (yych == 'O') goto yy1331; if (yych != 'o') goto yy56; -yy1329: - YYDEBUG(1329, *YYCURSOR); +yy1331: + YYDEBUG(1331, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'F') goto yy1330; + if (yych == 'F') goto yy1332; if (yych != 'f') goto yy56; -yy1330: - YYDEBUG(1330, *YYCURSOR); +yy1332: + YYDEBUG(1332, *YYCURSOR); yych = *++YYCURSOR; if (yych != ' ') goto yy56; - YYDEBUG(1331, *YYCURSOR); + YYDEBUG(1333, *YYCURSOR); yych = *++YYCURSOR; if (yych <= '/') goto yy56; - if (yych <= '1') goto yy1332; - if (yych <= '2') goto yy1333; - if (yych <= '9') goto yy1334; + if (yych <= '1') goto yy1334; + if (yych <= '2') goto yy1335; + if (yych <= '9') goto yy1336; goto yy56; -yy1332: - YYDEBUG(1332, *YYCURSOR); +yy1334: + YYDEBUG(1334, *YYCURSOR); yyaccept = 28; yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '/') goto yy1335; - if (yych <= '9') goto yy1334; - goto yy1335; -yy1333: - YYDEBUG(1333, *YYCURSOR); + if (yych <= '/') goto yy1337; + if (yych <= '9') goto yy1336; + goto yy1337; +yy1335: + YYDEBUG(1335, *YYCURSOR); yyaccept = 28; yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '/') goto yy1335; - if (yych >= '5') goto yy1335; -yy1334: - YYDEBUG(1334, *YYCURSOR); + if (yych <= '/') goto yy1337; + if (yych >= '5') goto yy1337; +yy1336: + YYDEBUG(1336, *YYCURSOR); yyaccept = 28; YYMARKER = ++YYCURSOR; if ((YYLIMIT - YYCURSOR) < 5) YYFILL(5); yych = *YYCURSOR; -yy1335: - YYDEBUG(1335, *YYCURSOR); +yy1337: + YYDEBUG(1337, *YYCURSOR); if (yych <= 'A') { if (yych <= 0x1F) { - if (yych == '\t') goto yy1334; - goto yy1292; + if (yych == '\t') goto yy1336; + goto yy1294; } else { - if (yych <= ' ') goto yy1334; - if (yych <= '@') goto yy1292; + if (yych <= ' ') goto yy1336; + if (yych <= '@') goto yy1294; } } else { if (yych <= '`') { - if (yych != 'P') goto yy1292; + if (yych != 'P') goto yy1294; } else { - if (yych <= 'a') goto yy1336; - if (yych != 'p') goto yy1292; + if (yych <= 'a') goto yy1338; + if (yych != 'p') goto yy1294; } } -yy1336: - YYDEBUG(1336, *YYCURSOR); +yy1338: + YYDEBUG(1338, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'L') { if (yych != '.') goto yy56; } else { - if (yych <= 'M') goto yy1338; - if (yych == 'm') goto yy1338; + if (yych <= 'M') goto yy1340; + if (yych == 'm') goto yy1340; goto yy56; } - YYDEBUG(1337, *YYCURSOR); + YYDEBUG(1339, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'M') goto yy1338; + if (yych == 'M') goto yy1340; if (yych != 'm') goto yy56; -yy1338: - YYDEBUG(1338, *YYCURSOR); +yy1340: + YYDEBUG(1340, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 0x1F) { - if (yych <= 0x00) goto yy1300; - if (yych == '\t') goto yy1300; + if (yych <= 0x00) goto yy1302; + if (yych == '\t') goto yy1302; goto yy56; } else { - if (yych <= ' ') goto yy1300; + if (yych <= ' ') goto yy1302; if (yych != '.') goto yy56; } - YYDEBUG(1339, *YYCURSOR); + YYDEBUG(1341, *YYCURSOR); yych = *++YYCURSOR; if (yych <= '\t') { - if (yych <= 0x00) goto yy1300; + if (yych <= 0x00) goto yy1302; if (yych <= 0x08) goto yy56; - goto yy1300; + goto yy1302; } else { - if (yych == ' ') goto yy1300; + if (yych == ' ') goto yy1302; goto yy56; } -yy1340: - YYDEBUG(1340, *YYCURSOR); +yy1342: + YYDEBUG(1342, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'R') { if (yych <= ')') { @@ -19821,13 +19885,13 @@ yy1340: if (yych <= '`') goto yy3; goto yy142; } else { - if (yych <= 'r') goto yy1341; + if (yych <= 'r') goto yy1343; if (yych <= 'z') goto yy142; goto yy3; } } -yy1341: - YYDEBUG(1341, *YYCURSOR); +yy1343: + YYDEBUG(1343, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'T') { if (yych <= ')') { @@ -19843,13 +19907,13 @@ yy1341: if (yych <= '`') goto yy3; goto yy143; } else { - if (yych <= 't') goto yy1342; + if (yych <= 't') goto yy1344; if (yych <= 'z') goto yy143; goto yy3; } } -yy1342: - YYDEBUG(1342, *YYCURSOR); +yy1344: + YYDEBUG(1344, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'H') { if (yych <= ')') { @@ -19858,7 +19922,7 @@ yy1342: } else { if (yych <= '@') goto yy3; if (yych <= 'G') goto yy144; - goto yy1254; + goto yy1215; } } else { if (yych <= 'g') { @@ -19866,13 +19930,13 @@ yy1342: if (yych <= '`') goto yy3; goto yy144; } else { - if (yych <= 'h') goto yy1254; + if (yych <= 'h') goto yy1215; if (yych <= 'z') goto yy144; goto yy3; } } -yy1343: - YYDEBUG(1343, *YYCURSOR); +yy1345: + YYDEBUG(1345, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'S') { if (yych <= ')') { @@ -19881,7 +19945,7 @@ yy1343: } else { if (yych <= '@') goto yy3; if (yych <= 'R') goto yy142; - goto yy1346; + goto yy1348; } } else { if (yych <= 'r') { @@ -19889,13 +19953,13 @@ yy1343: if (yych <= '`') goto yy3; goto yy142; } else { - if (yych <= 's') goto yy1346; + if (yych <= 's') goto yy1348; if (yych <= 'z') goto yy142; goto yy3; } } -yy1344: - YYDEBUG(1344, *YYCURSOR); +yy1346: + YYDEBUG(1346, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'T') { if (yych <= ')') { @@ -19911,13 +19975,13 @@ yy1344: if (yych <= '`') goto yy3; goto yy142; } else { - if (yych <= 't') goto yy1345; + if (yych <= 't') goto yy1347; if (yych <= 'z') goto yy142; goto yy3; } } -yy1345: - YYDEBUG(1345, *YYCURSOR); +yy1347: + YYDEBUG(1347, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'H') { if (yych <= ')') { @@ -19926,7 +19990,7 @@ yy1345: } else { if (yych <= '@') goto yy3; if (yych <= 'G') goto yy143; - goto yy1214; + goto yy1238; } } else { if (yych <= 'g') { @@ -19934,13 +19998,13 @@ yy1345: if (yych <= '`') goto yy3; goto yy143; } else { - if (yych <= 'h') goto yy1214; + if (yych <= 'h') goto yy1238; if (yych <= 'z') goto yy143; goto yy3; } } -yy1346: - YYDEBUG(1346, *YYCURSOR); +yy1348: + YYDEBUG(1348, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'T') { if (yych <= ')') { @@ -19956,13 +20020,13 @@ yy1346: if (yych <= '`') goto yy3; goto yy143; } else { - if (yych <= 't') goto yy1347; + if (yych <= 't') goto yy1349; if (yych <= 'z') goto yy143; goto yy3; } } -yy1347: - YYDEBUG(1347, *YYCURSOR); +yy1349: + YYDEBUG(1349, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '(') { @@ -19983,44 +20047,44 @@ yy1347: goto yy3; } } -yy1348: - YYDEBUG(1348, *YYCURSOR); +yy1350: + YYDEBUG(1350, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'D') goto yy1349; + if (yych == 'D') goto yy1351; if (yych != 'd') goto yy1207; -yy1349: - YYDEBUG(1349, *YYCURSOR); +yy1351: + YYDEBUG(1351, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy1350; + if (yych == 'A') goto yy1352; if (yych != 'a') goto yy56; -yy1350: - YYDEBUG(1350, *YYCURSOR); +yy1352: + YYDEBUG(1352, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'Y') goto yy1351; + if (yych == 'Y') goto yy1353; if (yych != 'y') goto yy56; -yy1351: - YYDEBUG(1351, *YYCURSOR); +yy1353: + YYDEBUG(1353, *YYCURSOR); yyaccept = 29; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'R') { - if (yych != ' ') goto yy1311; + if (yych != ' ') goto yy1313; } else { if (yych <= 'S') goto yy1142; if (yych == 's') goto yy1142; - goto yy1311; + goto yy1313; } - YYDEBUG(1352, *YYCURSOR); + YYDEBUG(1354, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy1353; + if (yych == 'O') goto yy1355; if (yych != 'o') goto yy56; -yy1353: - YYDEBUG(1353, *YYCURSOR); +yy1355: + YYDEBUG(1355, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'F') goto yy1314; - if (yych == 'f') goto yy1314; + if (yych == 'F') goto yy1316; + if (yych == 'f') goto yy1316; goto yy56; -yy1354: - YYDEBUG(1354, *YYCURSOR); +yy1356: + YYDEBUG(1356, *YYCURSOR); yyaccept = 5; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '/') { @@ -20055,14 +20119,14 @@ yy1354: if (yych <= '`') goto yy194; goto yy142; } else { - if (yych <= 'r') goto yy1355; + if (yych <= 'r') goto yy1357; if (yych <= 'z') goto yy142; goto yy194; } } } -yy1355: - YYDEBUG(1355, *YYCURSOR); +yy1357: + YYDEBUG(1357, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'U') { if (yych <= ')') { @@ -20078,13 +20142,13 @@ yy1355: if (yych <= '`') goto yy3; goto yy143; } else { - if (yych <= 'u') goto yy1356; + if (yych <= 'u') goto yy1358; if (yych <= 'z') goto yy143; goto yy3; } } -yy1356: - YYDEBUG(1356, *YYCURSOR); +yy1358: + YYDEBUG(1358, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'A') { if (yych == ')') goto yy139; @@ -20094,30 +20158,30 @@ yy1356: if (yych <= 'Z') goto yy144; goto yy3; } else { - if (yych <= 'a') goto yy1357; + if (yych <= 'a') goto yy1359; if (yych <= 'z') goto yy144; goto yy3; } } -yy1357: - YYDEBUG(1357, *YYCURSOR); +yy1359: + YYDEBUG(1359, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'Q') { if (yych == ')') goto yy139; goto yy3; } else { - if (yych <= 'R') goto yy1358; + if (yych <= 'R') goto yy1360; if (yych != 'r') goto yy3; } -yy1358: - YYDEBUG(1358, *YYCURSOR); +yy1360: + YYDEBUG(1360, *YYCURSOR); yych = *++YYCURSOR; if (yych == 'Y') goto yy206; if (yych == 'y') goto yy206; goto yy56; -yy1359: - YYDEBUG(1359, *YYCURSOR); +yy1361: + YYDEBUG(1361, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'B') { @@ -20128,7 +20192,7 @@ yy1359: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'A') goto yy141; - goto yy1354; + goto yy1356; } } else { if (yych <= '`') { @@ -20136,13 +20200,13 @@ yy1359: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'b') goto yy1377; + if (yych == 'b') goto yy1379; if (yych <= 'z') goto yy146; goto yy3; } } -yy1360: - YYDEBUG(1360, *YYCURSOR); +yy1362: + YYDEBUG(1362, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'R') { @@ -20155,9 +20219,9 @@ yy1360: if (yych <= '@') goto yy3; goto yy141; } else { - if (yych <= 'F') goto yy1344; + if (yych <= 'F') goto yy1346; if (yych <= 'Q') goto yy141; - goto yy1343; + goto yy1345; } } } else { @@ -20172,17 +20236,17 @@ yy1360: } } else { if (yych <= 'q') { - if (yych <= 'f') goto yy1373; + if (yych <= 'f') goto yy1375; goto yy146; } else { - if (yych <= 'r') goto yy1372; + if (yych <= 'r') goto yy1374; if (yych <= 'z') goto yy146; goto yy3; } } } -yy1361: - YYDEBUG(1361, *YYCURSOR); +yy1363: + YYDEBUG(1363, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'U') { @@ -20193,7 +20257,7 @@ yy1361: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'T') goto yy141; - goto yy1340; + goto yy1342; } } else { if (yych <= '`') { @@ -20201,13 +20265,13 @@ yy1361: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'u') goto yy1369; + if (yych == 'u') goto yy1371; if (yych <= 'z') goto yy146; goto yy3; } } -yy1362: - YYDEBUG(1362, *YYCURSOR); +yy1364: + YYDEBUG(1364, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'O') { @@ -20220,9 +20284,9 @@ yy1362: if (yych <= '@') goto yy3; goto yy141; } else { - if (yych <= 'I') goto yy1323; + if (yych <= 'I') goto yy1325; if (yych <= 'N') goto yy141; - goto yy1322; + goto yy1324; } } } else { @@ -20237,17 +20301,17 @@ yy1362: } } else { if (yych <= 'n') { - if (yych <= 'i') goto yy1364; + if (yych <= 'i') goto yy1366; goto yy146; } else { - if (yych <= 'o') goto yy1363; + if (yych <= 'o') goto yy1365; if (yych <= 'z') goto yy146; goto yy3; } } } -yy1363: - YYDEBUG(1363, *YYCURSOR); +yy1365: + YYDEBUG(1365, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'N') { @@ -20258,7 +20322,7 @@ yy1363: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'M') goto yy142; - goto yy1326; + goto yy1328; } } else { if (yych <= '`') { @@ -20266,13 +20330,13 @@ yy1363: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'n') goto yy1367; + if (yych == 'n') goto yy1369; if (yych <= 'z') goto yy151; goto yy3; } } -yy1364: - YYDEBUG(1364, *YYCURSOR); +yy1366: + YYDEBUG(1366, *YYCURSOR); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'D') { @@ -20283,7 +20347,7 @@ yy1364: if (yych <= '/') goto yy147; if (yych <= '@') goto yy167; if (yych <= 'C') goto yy142; - goto yy1324; + goto yy1326; } } else { if (yych <= '`') { @@ -20291,13 +20355,13 @@ yy1364: if (yych == '_') goto yy147; goto yy167; } else { - if (yych == 'd') goto yy1365; + if (yych == 'd') goto yy1367; if (yych <= 'z') goto yy151; goto yy167; } } -yy1365: - YYDEBUG(1365, *YYCURSOR); +yy1367: + YYDEBUG(1367, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'A') { @@ -20307,7 +20371,7 @@ yy1365: } else { if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; - goto yy1325; + goto yy1327; } } else { if (yych <= '_') { @@ -20316,13 +20380,13 @@ yy1365: goto yy147; } else { if (yych <= '`') goto yy3; - if (yych <= 'a') goto yy1366; + if (yych <= 'a') goto yy1368; if (yych <= 'z') goto yy152; goto yy3; } } -yy1366: - YYDEBUG(1366, *YYCURSOR); +yy1368: + YYDEBUG(1368, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'Y') { @@ -20333,7 +20397,7 @@ yy1366: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'X') goto yy144; - goto yy1233; + goto yy1235; } } else { if (yych <= '`') { @@ -20341,13 +20405,13 @@ yy1366: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'y') goto yy1262; + if (yych == 'y') goto yy1264; if (yych <= 'z') goto yy153; goto yy3; } } -yy1367: - YYDEBUG(1367, *YYCURSOR); +yy1369: + YYDEBUG(1369, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'T') { @@ -20358,7 +20422,7 @@ yy1367: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'S') goto yy143; - goto yy1327; + goto yy1329; } } else { if (yych <= '`') { @@ -20366,18 +20430,18 @@ yy1367: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 't') goto yy1368; + if (yych == 't') goto yy1370; if (yych <= 'z') goto yy152; goto yy3; } } -yy1368: - YYDEBUG(1368, *YYCURSOR); +yy1370: + YYDEBUG(1370, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '/') { if (yych <= '(') { - if (yych == ' ') goto yy1328; + if (yych == ' ') goto yy1330; goto yy3; } else { if (yych <= ')') goto yy139; @@ -20396,8 +20460,8 @@ yy1368: goto yy3; } } -yy1369: - YYDEBUG(1369, *YYCURSOR); +yy1371: + YYDEBUG(1371, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'R') { @@ -20408,7 +20472,7 @@ yy1369: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'Q') goto yy142; - goto yy1341; + goto yy1343; } } else { if (yych <= '`') { @@ -20416,13 +20480,13 @@ yy1369: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'r') goto yy1370; + if (yych == 'r') goto yy1372; if (yych <= 'z') goto yy151; goto yy3; } } -yy1370: - YYDEBUG(1370, *YYCURSOR); +yy1372: + YYDEBUG(1372, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'T') { @@ -20433,7 +20497,7 @@ yy1370: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'S') goto yy143; - goto yy1342; + goto yy1344; } } else { if (yych <= '`') { @@ -20441,13 +20505,13 @@ yy1370: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 't') goto yy1371; + if (yych == 't') goto yy1373; if (yych <= 'z') goto yy152; goto yy3; } } -yy1371: - YYDEBUG(1371, *YYCURSOR); +yy1373: + YYDEBUG(1373, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'H') { @@ -20458,7 +20522,7 @@ yy1371: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'G') goto yy144; - goto yy1254; + goto yy1215; } } else { if (yych <= '`') { @@ -20466,13 +20530,13 @@ yy1371: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'h') goto yy1283; + if (yych == 'h') goto yy1227; if (yych <= 'z') goto yy153; goto yy3; } } -yy1372: - YYDEBUG(1372, *YYCURSOR); +yy1374: + YYDEBUG(1374, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'S') { @@ -20483,7 +20547,7 @@ yy1372: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'R') goto yy142; - goto yy1346; + goto yy1348; } } else { if (yych <= '`') { @@ -20491,13 +20555,13 @@ yy1372: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 's') goto yy1375; + if (yych == 's') goto yy1377; if (yych <= 'z') goto yy151; goto yy3; } } -yy1373: - YYDEBUG(1373, *YYCURSOR); +yy1375: + YYDEBUG(1375, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'T') { @@ -20508,7 +20572,7 @@ yy1373: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'S') goto yy142; - goto yy1345; + goto yy1347; } } else { if (yych <= '`') { @@ -20516,13 +20580,13 @@ yy1373: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 't') goto yy1374; + if (yych == 't') goto yy1376; if (yych <= 'z') goto yy151; goto yy3; } } -yy1374: - YYDEBUG(1374, *YYCURSOR); +yy1376: + YYDEBUG(1376, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'H') { @@ -20533,7 +20597,7 @@ yy1374: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'G') goto yy143; - goto yy1214; + goto yy1238; } } else { if (yych <= '`') { @@ -20541,13 +20605,13 @@ yy1374: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'h') goto yy1225; + if (yych == 'h') goto yy1267; if (yych <= 'z') goto yy152; goto yy3; } } -yy1375: - YYDEBUG(1375, *YYCURSOR); +yy1377: + YYDEBUG(1377, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'T') { @@ -20558,7 +20622,7 @@ yy1375: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'S') goto yy143; - goto yy1347; + goto yy1349; } } else { if (yych <= '`') { @@ -20566,13 +20630,13 @@ yy1375: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 't') goto yy1376; + if (yych == 't') goto yy1378; if (yych <= 'z') goto yy152; goto yy3; } } -yy1376: - YYDEBUG(1376, *YYCURSOR); +yy1378: + YYDEBUG(1378, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '.') { @@ -20580,7 +20644,7 @@ yy1376: if (yych == '\t') goto yy1206; goto yy3; } else { - if (yych <= ' ') goto yy1348; + if (yych <= ' ') goto yy1350; if (yych == ')') goto yy139; goto yy3; } @@ -20597,8 +20661,8 @@ yy1376: goto yy3; } } -yy1377: - YYDEBUG(1377, *YYCURSOR); +yy1379: + YYDEBUG(1379, *YYCURSOR); yyaccept = 5; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '9') { @@ -20626,7 +20690,7 @@ yy1377: if (yych <= '@') goto yy194; goto yy142; } else { - if (yych <= 'R') goto yy1355; + if (yych <= 'R') goto yy1357; if (yych <= 'Z') goto yy142; goto yy194; } @@ -20636,14 +20700,14 @@ yy1377: if (yych <= '`') goto yy194; goto yy151; } else { - if (yych <= 'r') goto yy1378; + if (yych <= 'r') goto yy1380; if (yych <= 'z') goto yy151; goto yy194; } } } -yy1378: - YYDEBUG(1378, *YYCURSOR); +yy1380: + YYDEBUG(1380, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'U') { @@ -20654,7 +20718,7 @@ yy1378: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'T') goto yy143; - goto yy1356; + goto yy1358; } } else { if (yych <= '`') { @@ -20662,13 +20726,13 @@ yy1378: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'u') goto yy1379; + if (yych == 'u') goto yy1381; if (yych <= 'z') goto yy152; goto yy3; } } -yy1379: - YYDEBUG(1379, *YYCURSOR); +yy1381: + YYDEBUG(1381, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'A') { @@ -20678,7 +20742,7 @@ yy1379: } else { if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; - goto yy1357; + goto yy1359; } } else { if (yych <= '_') { @@ -20687,13 +20751,13 @@ yy1379: goto yy147; } else { if (yych <= '`') goto yy3; - if (yych <= 'a') goto yy1380; + if (yych <= 'a') goto yy1382; if (yych <= 'z') goto yy153; goto yy3; } } -yy1380: - YYDEBUG(1380, *YYCURSOR); +yy1382: + YYDEBUG(1382, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'R') { @@ -20703,40 +20767,40 @@ yy1380: } else { if (yych <= '/') goto yy147; if (yych <= 'Q') goto yy3; - goto yy1358; + goto yy1360; } } else { if (yych <= '`') { if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'r') goto yy1381; + if (yych == 'r') goto yy1383; if (yych <= 'z') goto yy154; goto yy3; } } -yy1381: - YYDEBUG(1381, *YYCURSOR); +yy1383: + YYDEBUG(1383, *YYCURSOR); yych = *++YYCURSOR; if (yych == 'Y') goto yy206; if (yych == 'y') goto yy377; goto yy155; -yy1382: - YYDEBUG(1382, *YYCURSOR); +yy1384: + YYDEBUG(1384, *YYCURSOR); yych = *++YYCURSOR; if (yych <= '/') goto yy56; if (yych >= ':') goto yy56; -yy1383: - YYDEBUG(1383, *YYCURSOR); +yy1385: + YYDEBUG(1385, *YYCURSOR); ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); yych = *YYCURSOR; - YYDEBUG(1384, *YYCURSOR); - if (yych <= '/') goto yy1385; - if (yych <= '9') goto yy1383; -yy1385: - YYDEBUG(1385, *YYCURSOR); -#line 1025 "ext/date/lib/parse_date.re" + YYDEBUG(1386, *YYCURSOR); + if (yych <= '/') goto yy1387; + if (yych <= '9') goto yy1385; +yy1387: + YYDEBUG(1387, *YYCURSOR); +#line 1026 "ext/date/lib/parse_date.re" { timelib_ull i; @@ -20760,9 +20824,9 @@ yy1385: TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 20764 "ext/date/lib/parse_date.c" -yy1386: - YYDEBUG(1386, *YYCURSOR); +#line 20828 "ext/date/lib/parse_date.c" +yy1388: + YYDEBUG(1388, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'N') { if (yych <= ')') { @@ -20771,7 +20835,7 @@ yy1386: } else { if (yych <= '@') goto yy3; if (yych <= 'M') goto yy141; - goto yy1427; + goto yy1429; } } else { if (yych <= 'm') { @@ -20779,61 +20843,61 @@ yy1386: if (yych <= '`') goto yy3; goto yy141; } else { - if (yych <= 'n') goto yy1427; + if (yych <= 'n') goto yy1429; if (yych <= 'z') goto yy141; goto yy3; } } -yy1387: - YYDEBUG(1387, *YYCURSOR); +yy1389: + YYDEBUG(1389, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'U') { if (yych <= '@') { if (yych == ')') goto yy139; goto yy3; } else { - if (yych == 'I') goto yy1419; + if (yych == 'I') goto yy1421; if (yych <= 'T') goto yy141; - goto yy1420; + goto yy1422; } } else { if (yych <= 'i') { if (yych <= 'Z') goto yy141; if (yych <= '`') goto yy3; if (yych <= 'h') goto yy141; - goto yy1419; + goto yy1421; } else { - if (yych == 'u') goto yy1420; + if (yych == 'u') goto yy1422; if (yych <= 'z') goto yy141; goto yy3; } } -yy1388: - YYDEBUG(1388, *YYCURSOR); +yy1390: + YYDEBUG(1390, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'M') { if (yych <= '@') { if (yych == ')') goto yy139; goto yy3; } else { - if (yych == 'D') goto yy1408; + if (yych == 'D') goto yy1410; if (yych <= 'L') goto yy141; - goto yy1409; + goto yy1411; } } else { if (yych <= 'd') { if (yych <= 'Z') goto yy141; if (yych <= '`') goto yy3; if (yych <= 'c') goto yy141; - goto yy1408; + goto yy1410; } else { - if (yych == 'm') goto yy1409; + if (yych == 'm') goto yy1411; if (yych <= 'z') goto yy141; goto yy3; } } -yy1389: - YYDEBUG(1389, *YYCURSOR); +yy1391: + YYDEBUG(1391, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'E') { if (yych <= ')') { @@ -20842,7 +20906,7 @@ yy1389: } else { if (yych <= '@') goto yy3; if (yych <= 'D') goto yy141; - goto yy1404; + goto yy1406; } } else { if (yych <= 'd') { @@ -20850,13 +20914,13 @@ yy1389: if (yych <= '`') goto yy3; goto yy141; } else { - if (yych <= 'e') goto yy1404; + if (yych <= 'e') goto yy1406; if (yych <= 'z') goto yy141; goto yy3; } } -yy1390: - YYDEBUG(1390, *YYCURSOR); +yy1392: + YYDEBUG(1392, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'E') { if (yych <= ')') { @@ -20865,7 +20929,7 @@ yy1390: } else { if (yych <= '@') goto yy3; if (yych <= 'D') goto yy141; - goto yy1400; + goto yy1402; } } else { if (yych <= 'd') { @@ -20873,78 +20937,78 @@ yy1390: if (yych <= '`') goto yy3; goto yy141; } else { - if (yych <= 'e') goto yy1400; + if (yych <= 'e') goto yy1402; if (yych <= 'z') goto yy141; goto yy3; } } -yy1391: - YYDEBUG(1391, *YYCURSOR); +yy1393: + YYDEBUG(1393, *YYCURSOR); yych = *++YYCURSOR; if (yych <= '/') { if (yych == '.') goto yy1064; goto yy56; } else { - if (yych <= '9') goto yy1394; + if (yych <= '9') goto yy1396; if (yych <= ':') goto yy1064; goto yy56; } -yy1392: - YYDEBUG(1392, *YYCURSOR); +yy1394: + YYDEBUG(1394, *YYCURSOR); yych = *++YYCURSOR; if (yych <= '/') { if (yych == '.') goto yy1064; goto yy56; } else { - if (yych <= '4') goto yy1394; + if (yych <= '4') goto yy1396; if (yych == ':') goto yy1064; goto yy56; } -yy1393: - YYDEBUG(1393, *YYCURSOR); +yy1395: + YYDEBUG(1395, *YYCURSOR); yych = *++YYCURSOR; if (yych == '.') goto yy1064; if (yych == ':') goto yy1064; goto yy56; -yy1394: - YYDEBUG(1394, *YYCURSOR); +yy1396: + YYDEBUG(1396, *YYCURSOR); yych = *++YYCURSOR; if (yych <= '/') { if (yych == '.') goto yy1064; goto yy56; } else { - if (yych <= '5') goto yy1395; + if (yych <= '5') goto yy1397; if (yych == ':') goto yy1064; goto yy56; } -yy1395: - YYDEBUG(1395, *YYCURSOR); +yy1397: + YYDEBUG(1397, *YYCURSOR); yych = *++YYCURSOR; if (yych <= '/') goto yy56; if (yych >= ':') goto yy56; - YYDEBUG(1396, *YYCURSOR); + YYDEBUG(1398, *YYCURSOR); yyaccept = 24; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '/') goto yy1067; - if (yych <= '5') goto yy1397; - if (yych <= '6') goto yy1398; + if (yych <= '5') goto yy1399; + if (yych <= '6') goto yy1400; goto yy1067; -yy1397: - YYDEBUG(1397, *YYCURSOR); +yy1399: + YYDEBUG(1399, *YYCURSOR); yych = *++YYCURSOR; if (yych <= '/') goto yy56; - if (yych <= '9') goto yy1399; + if (yych <= '9') goto yy1401; goto yy56; -yy1398: - YYDEBUG(1398, *YYCURSOR); +yy1400: + YYDEBUG(1400, *YYCURSOR); yych = *++YYCURSOR; if (yych != '0') goto yy56; -yy1399: - YYDEBUG(1399, *YYCURSOR); +yy1401: + YYDEBUG(1401, *YYCURSOR); yych = *++YYCURSOR; goto yy1075; -yy1400: - YYDEBUG(1400, *YYCURSOR); +yy1402: + YYDEBUG(1402, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'L') { if (yych <= ')') { @@ -20960,13 +21024,13 @@ yy1400: if (yych <= '`') goto yy3; goto yy142; } else { - if (yych <= 'l') goto yy1401; + if (yych <= 'l') goto yy1403; if (yych <= 'z') goto yy142; goto yy3; } } -yy1401: - YYDEBUG(1401, *YYCURSOR); +yy1403: + YYDEBUG(1403, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'F') { if (yych <= ')') { @@ -20982,13 +21046,13 @@ yy1401: if (yych <= '`') goto yy3; goto yy143; } else { - if (yych <= 'f') goto yy1402; + if (yych <= 'f') goto yy1404; if (yych <= 'z') goto yy143; goto yy3; } } -yy1402: - YYDEBUG(1402, *YYCURSOR); +yy1404: + YYDEBUG(1404, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'T') { if (yych <= ')') { @@ -21004,13 +21068,13 @@ yy1402: if (yych <= '`') goto yy3; goto yy144; } else { - if (yych <= 't') goto yy1403; + if (yych <= 't') goto yy1405; if (yych <= 'z') goto yy144; goto yy3; } } -yy1403: - YYDEBUG(1403, *YYCURSOR); +yy1405: + YYDEBUG(1405, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'G') { @@ -21021,8 +21085,8 @@ yy1403: if (yych == 'h') goto yy1205; goto yy3; } -yy1404: - YYDEBUG(1404, *YYCURSOR); +yy1406: + YYDEBUG(1406, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'S') { if (yych <= ')') { @@ -21038,13 +21102,13 @@ yy1404: if (yych <= '`') goto yy167; goto yy142; } else { - if (yych <= 's') goto yy1405; + if (yych <= 's') goto yy1407; if (yych <= 'z') goto yy142; goto yy167; } } -yy1405: - YYDEBUG(1405, *YYCURSOR); +yy1407: + YYDEBUG(1407, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'D') { if (yych <= ')') { @@ -21060,13 +21124,13 @@ yy1405: if (yych <= '`') goto yy3; goto yy143; } else { - if (yych <= 'd') goto yy1406; + if (yych <= 'd') goto yy1408; if (yych <= 'z') goto yy143; goto yy3; } } -yy1406: - YYDEBUG(1406, *YYCURSOR); +yy1408: + YYDEBUG(1408, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'A') { if (yych == ')') goto yy139; @@ -21076,13 +21140,13 @@ yy1406: if (yych <= 'Z') goto yy144; goto yy3; } else { - if (yych <= 'a') goto yy1407; + if (yych <= 'a') goto yy1409; if (yych <= 'z') goto yy144; goto yy3; } } -yy1407: - YYDEBUG(1407, *YYCURSOR); +yy1409: + YYDEBUG(1409, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'X') { if (yych == ')') goto yy139; @@ -21092,25 +21156,25 @@ yy1407: if (yych == 'y') goto yy173; goto yy3; } -yy1408: - YYDEBUG(1408, *YYCURSOR); +yy1410: + YYDEBUG(1410, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'A') { if (yych == ')') goto yy139; if (yych <= '@') goto yy3; - goto yy1416; + goto yy1418; } else { if (yych <= '`') { if (yych <= 'Z') goto yy142; goto yy3; } else { - if (yych <= 'a') goto yy1416; + if (yych <= 'a') goto yy1418; if (yych <= 'z') goto yy142; goto yy3; } } -yy1409: - YYDEBUG(1409, *YYCURSOR); +yy1411: + YYDEBUG(1411, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'O') { if (yych <= ')') { @@ -21126,13 +21190,13 @@ yy1409: if (yych <= '`') goto yy3; goto yy142; } else { - if (yych <= 'o') goto yy1410; + if (yych <= 'o') goto yy1412; if (yych <= 'z') goto yy142; goto yy3; } } -yy1410: - YYDEBUG(1410, *YYCURSOR); +yy1412: + YYDEBUG(1412, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'R') { if (yych <= ')') { @@ -21148,13 +21212,13 @@ yy1410: if (yych <= '`') goto yy3; goto yy143; } else { - if (yych <= 'r') goto yy1411; + if (yych <= 'r') goto yy1413; if (yych <= 'z') goto yy143; goto yy3; } } -yy1411: - YYDEBUG(1411, *YYCURSOR); +yy1413: + YYDEBUG(1413, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'R') { if (yych <= ')') { @@ -21170,33 +21234,33 @@ yy1411: if (yych <= '`') goto yy3; goto yy144; } else { - if (yych <= 'r') goto yy1412; + if (yych <= 'r') goto yy1414; if (yych <= 'z') goto yy144; goto yy3; } } -yy1412: - YYDEBUG(1412, *YYCURSOR); +yy1414: + YYDEBUG(1414, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'N') { if (yych == ')') goto yy139; goto yy3; } else { - if (yych <= 'O') goto yy1413; + if (yych <= 'O') goto yy1415; if (yych != 'o') goto yy3; } -yy1413: - YYDEBUG(1413, *YYCURSOR); +yy1415: + YYDEBUG(1415, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'W') goto yy1414; + if (yych == 'W') goto yy1416; if (yych != 'w') goto yy56; -yy1414: - YYDEBUG(1414, *YYCURSOR); +yy1416: + YYDEBUG(1416, *YYCURSOR); ++YYCURSOR; -yy1415: - YYDEBUG(1415, *YYCURSOR); -#line 1013 "ext/date/lib/parse_date.re" +yy1417: + YYDEBUG(1417, *YYCURSOR); +#line 1014 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("tomorrow"); TIMELIB_INIT; @@ -21207,9 +21271,9 @@ yy1415: TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 21211 "ext/date/lib/parse_date.c" -yy1416: - YYDEBUG(1416, *YYCURSOR); +#line 21275 "ext/date/lib/parse_date.c" +yy1418: + YYDEBUG(1418, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'Y') { if (yych <= ')') { @@ -21225,24 +21289,24 @@ yy1416: if (yych <= '`') goto yy3; goto yy143; } else { - if (yych <= 'y') goto yy1417; + if (yych <= 'y') goto yy1419; if (yych <= 'z') goto yy143; goto yy3; } } -yy1417: - YYDEBUG(1417, *YYCURSOR); +yy1419: + YYDEBUG(1419, *YYCURSOR); ++YYCURSOR; if ((yych = *YYCURSOR) <= '@') { if (yych == ')') goto yy139; } else { if (yych <= 'Z') goto yy144; - if (yych <= '`') goto yy1418; + if (yych <= '`') goto yy1420; if (yych <= 'z') goto yy144; } -yy1418: - YYDEBUG(1418, *YYCURSOR); -#line 1003 "ext/date/lib/parse_date.re" +yy1420: + YYDEBUG(1420, *YYCURSOR); +#line 1004 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("midnight | today"); TIMELIB_INIT; @@ -21251,9 +21315,9 @@ yy1418: TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 21255 "ext/date/lib/parse_date.c" -yy1419: - YYDEBUG(1419, *YYCURSOR); +#line 21319 "ext/date/lib/parse_date.c" +yy1421: + YYDEBUG(1421, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'S') { if (yych <= '@') { @@ -21261,8 +21325,8 @@ yy1419: goto yy3; } else { if (yych <= 'Q') goto yy142; - if (yych <= 'R') goto yy1425; - goto yy1426; + if (yych <= 'R') goto yy1427; + goto yy1428; } } else { if (yych <= 'q') { @@ -21270,14 +21334,14 @@ yy1419: if (yych <= '`') goto yy3; goto yy142; } else { - if (yych <= 'r') goto yy1425; - if (yych <= 's') goto yy1426; + if (yych <= 'r') goto yy1427; + if (yych <= 's') goto yy1428; if (yych <= 'z') goto yy142; goto yy3; } } -yy1420: - YYDEBUG(1420, *YYCURSOR); +yy1422: + YYDEBUG(1422, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'R') { if (yych <= ')') { @@ -21293,13 +21357,13 @@ yy1420: if (yych <= '`') goto yy167; goto yy142; } else { - if (yych <= 'r') goto yy1421; + if (yych <= 'r') goto yy1423; if (yych <= 'z') goto yy142; goto yy167; } } -yy1421: - YYDEBUG(1421, *YYCURSOR); +yy1423: + YYDEBUG(1423, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'S') { if (yych <= ')') { @@ -21315,13 +21379,13 @@ yy1421: if (yych <= '`') goto yy3; goto yy143; } else { - if (yych <= 's') goto yy1422; + if (yych <= 's') goto yy1424; if (yych <= 'z') goto yy143; goto yy3; } } -yy1422: - YYDEBUG(1422, *YYCURSOR); +yy1424: + YYDEBUG(1424, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'D') { if (yych <= ')') { @@ -21337,30 +21401,30 @@ yy1422: if (yych <= '`') goto yy3; goto yy144; } else { - if (yych <= 'd') goto yy1423; + if (yych <= 'd') goto yy1425; if (yych <= 'z') goto yy144; goto yy3; } } -yy1423: - YYDEBUG(1423, *YYCURSOR); +yy1425: + YYDEBUG(1425, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '@') { if (yych == ')') goto yy139; goto yy3; } else { - if (yych <= 'A') goto yy1424; + if (yych <= 'A') goto yy1426; if (yych != 'a') goto yy3; } -yy1424: - YYDEBUG(1424, *YYCURSOR); +yy1426: + YYDEBUG(1426, *YYCURSOR); yych = *++YYCURSOR; if (yych == 'Y') goto yy173; if (yych == 'y') goto yy173; goto yy56; -yy1425: - YYDEBUG(1425, *YYCURSOR); +yy1427: + YYDEBUG(1427, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'D') { if (yych <= ')') { @@ -21369,7 +21433,7 @@ yy1425: } else { if (yych <= '@') goto yy3; if (yych <= 'C') goto yy143; - goto yy1214; + goto yy1238; } } else { if (yych <= 'c') { @@ -21377,13 +21441,13 @@ yy1425: if (yych <= '`') goto yy3; goto yy143; } else { - if (yych <= 'd') goto yy1214; + if (yych <= 'd') goto yy1238; if (yych <= 'z') goto yy143; goto yy3; } } -yy1426: - YYDEBUG(1426, *YYCURSOR); +yy1428: + YYDEBUG(1428, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '(') { @@ -21405,8 +21469,8 @@ yy1426: goto yy3; } } -yy1427: - YYDEBUG(1427, *YYCURSOR); +yy1429: + YYDEBUG(1429, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'T') { if (yych <= ')') { @@ -21422,13 +21486,13 @@ yy1427: if (yych <= '`') goto yy3; goto yy142; } else { - if (yych <= 't') goto yy1428; + if (yych <= 't') goto yy1430; if (yych <= 'z') goto yy142; goto yy3; } } -yy1428: - YYDEBUG(1428, *YYCURSOR); +yy1430: + YYDEBUG(1430, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'H') { if (yych <= ')') { @@ -21437,7 +21501,7 @@ yy1428: } else { if (yych <= '@') goto yy3; if (yych <= 'G') goto yy143; - goto yy1214; + goto yy1238; } } else { if (yych <= 'g') { @@ -21445,13 +21509,13 @@ yy1428: if (yych <= '`') goto yy3; goto yy143; } else { - if (yych <= 'h') goto yy1214; + if (yych <= 'h') goto yy1238; if (yych <= 'z') goto yy143; goto yy3; } } -yy1429: - YYDEBUG(1429, *YYCURSOR); +yy1431: + YYDEBUG(1431, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'N') { @@ -21462,7 +21526,7 @@ yy1429: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'M') goto yy141; - goto yy1427; + goto yy1429; } } else { if (yych <= '`') { @@ -21470,13 +21534,13 @@ yy1429: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'n') goto yy1459; + if (yych == 'n') goto yy1461; if (yych <= 'z') goto yy146; goto yy3; } } -yy1430: - YYDEBUG(1430, *YYCURSOR); +yy1432: + YYDEBUG(1432, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'U') { @@ -21489,9 +21553,9 @@ yy1430: if (yych <= '@') goto yy3; goto yy141; } else { - if (yych <= 'I') goto yy1419; + if (yych <= 'I') goto yy1421; if (yych <= 'T') goto yy141; - goto yy1420; + goto yy1422; } } } else { @@ -21506,17 +21570,17 @@ yy1430: } } else { if (yych <= 't') { - if (yych <= 'i') goto yy1451; + if (yych <= 'i') goto yy1453; goto yy146; } else { - if (yych <= 'u') goto yy1452; + if (yych <= 'u') goto yy1454; if (yych <= 'z') goto yy146; goto yy3; } } } -yy1431: - YYDEBUG(1431, *YYCURSOR); +yy1433: + YYDEBUG(1433, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'M') { @@ -21529,9 +21593,9 @@ yy1431: if (yych <= '@') goto yy3; goto yy141; } else { - if (yych <= 'D') goto yy1408; + if (yych <= 'D') goto yy1410; if (yych <= 'L') goto yy141; - goto yy1409; + goto yy1411; } } } else { @@ -21546,17 +21610,17 @@ yy1431: } } else { if (yych <= 'l') { - if (yych <= 'd') goto yy1442; + if (yych <= 'd') goto yy1444; goto yy146; } else { - if (yych <= 'm') goto yy1443; + if (yych <= 'm') goto yy1445; if (yych <= 'z') goto yy146; goto yy3; } } } -yy1432: - YYDEBUG(1432, *YYCURSOR); +yy1434: + YYDEBUG(1434, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'E') { @@ -21567,7 +21631,7 @@ yy1432: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'D') goto yy141; - goto yy1404; + goto yy1406; } } else { if (yych <= '`') { @@ -21575,13 +21639,13 @@ yy1432: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'e') goto yy1438; + if (yych == 'e') goto yy1440; if (yych <= 'z') goto yy146; goto yy3; } } -yy1433: - YYDEBUG(1433, *YYCURSOR); +yy1435: + YYDEBUG(1435, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'E') { @@ -21592,7 +21656,7 @@ yy1433: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'D') goto yy141; - goto yy1400; + goto yy1402; } } else { if (yych <= '`') { @@ -21600,13 +21664,13 @@ yy1433: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'e') goto yy1434; + if (yych == 'e') goto yy1436; if (yych <= 'z') goto yy146; goto yy3; } } -yy1434: - YYDEBUG(1434, *YYCURSOR); +yy1436: + YYDEBUG(1436, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'L') { @@ -21617,7 +21681,7 @@ yy1434: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'K') goto yy142; - goto yy1401; + goto yy1403; } } else { if (yych <= '`') { @@ -21625,13 +21689,13 @@ yy1434: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'l') goto yy1435; + if (yych == 'l') goto yy1437; if (yych <= 'z') goto yy151; goto yy3; } } -yy1435: - YYDEBUG(1435, *YYCURSOR); +yy1437: + YYDEBUG(1437, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'F') { @@ -21642,7 +21706,7 @@ yy1435: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'E') goto yy143; - goto yy1402; + goto yy1404; } } else { if (yych <= '`') { @@ -21650,13 +21714,13 @@ yy1435: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'f') goto yy1436; + if (yych == 'f') goto yy1438; if (yych <= 'z') goto yy152; goto yy3; } } -yy1436: - YYDEBUG(1436, *YYCURSOR); +yy1438: + YYDEBUG(1438, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'T') { @@ -21667,7 +21731,7 @@ yy1436: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'S') goto yy144; - goto yy1403; + goto yy1405; } } else { if (yych <= '`') { @@ -21675,13 +21739,13 @@ yy1436: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 't') goto yy1437; + if (yych == 't') goto yy1439; if (yych <= 'z') goto yy153; goto yy3; } } -yy1437: - YYDEBUG(1437, *YYCURSOR); +yy1439: + YYDEBUG(1439, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'H') { @@ -21698,13 +21762,13 @@ yy1437: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'h') goto yy1222; + if (yych == 'h') goto yy1223; if (yych <= 'z') goto yy154; goto yy3; } } -yy1438: - YYDEBUG(1438, *YYCURSOR); +yy1440: + YYDEBUG(1440, *YYCURSOR); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'S') { @@ -21715,7 +21779,7 @@ yy1438: if (yych <= '/') goto yy147; if (yych <= '@') goto yy167; if (yych <= 'R') goto yy142; - goto yy1405; + goto yy1407; } } else { if (yych <= '`') { @@ -21723,13 +21787,13 @@ yy1438: if (yych == '_') goto yy147; goto yy167; } else { - if (yych == 's') goto yy1439; + if (yych == 's') goto yy1441; if (yych <= 'z') goto yy151; goto yy167; } } -yy1439: - YYDEBUG(1439, *YYCURSOR); +yy1441: + YYDEBUG(1441, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'D') { @@ -21740,7 +21804,7 @@ yy1439: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'C') goto yy143; - goto yy1406; + goto yy1408; } } else { if (yych <= '`') { @@ -21748,13 +21812,13 @@ yy1439: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'd') goto yy1440; + if (yych == 'd') goto yy1442; if (yych <= 'z') goto yy152; goto yy3; } } -yy1440: - YYDEBUG(1440, *YYCURSOR); +yy1442: + YYDEBUG(1442, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'A') { @@ -21764,7 +21828,7 @@ yy1440: } else { if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; - goto yy1407; + goto yy1409; } } else { if (yych <= '_') { @@ -21773,13 +21837,13 @@ yy1440: goto yy147; } else { if (yych <= '`') goto yy3; - if (yych <= 'a') goto yy1441; + if (yych <= 'a') goto yy1443; if (yych <= 'z') goto yy153; goto yy3; } } -yy1441: - YYDEBUG(1441, *YYCURSOR); +yy1443: + YYDEBUG(1443, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'Y') { @@ -21801,8 +21865,8 @@ yy1441: goto yy3; } } -yy1442: - YYDEBUG(1442, *YYCURSOR); +yy1444: + YYDEBUG(1444, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'A') { @@ -21812,7 +21876,7 @@ yy1442: } else { if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; - goto yy1416; + goto yy1418; } } else { if (yych <= '_') { @@ -21821,13 +21885,13 @@ yy1442: goto yy147; } else { if (yych <= '`') goto yy3; - if (yych <= 'a') goto yy1449; + if (yych <= 'a') goto yy1451; if (yych <= 'z') goto yy151; goto yy3; } } -yy1443: - YYDEBUG(1443, *YYCURSOR); +yy1445: + YYDEBUG(1445, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'O') { @@ -21838,7 +21902,7 @@ yy1443: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'N') goto yy142; - goto yy1410; + goto yy1412; } } else { if (yych <= '`') { @@ -21846,13 +21910,13 @@ yy1443: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'o') goto yy1444; + if (yych == 'o') goto yy1446; if (yych <= 'z') goto yy151; goto yy3; } } -yy1444: - YYDEBUG(1444, *YYCURSOR); +yy1446: + YYDEBUG(1446, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'R') { @@ -21863,7 +21927,7 @@ yy1444: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'Q') goto yy143; - goto yy1411; + goto yy1413; } } else { if (yych <= '`') { @@ -21871,13 +21935,13 @@ yy1444: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'r') goto yy1445; + if (yych == 'r') goto yy1447; if (yych <= 'z') goto yy152; goto yy3; } } -yy1445: - YYDEBUG(1445, *YYCURSOR); +yy1447: + YYDEBUG(1447, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'R') { @@ -21888,7 +21952,7 @@ yy1445: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'Q') goto yy144; - goto yy1412; + goto yy1414; } } else { if (yych <= '`') { @@ -21896,13 +21960,13 @@ yy1445: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'r') goto yy1446; + if (yych == 'r') goto yy1448; if (yych <= 'z') goto yy153; goto yy3; } } -yy1446: - YYDEBUG(1446, *YYCURSOR); +yy1448: + YYDEBUG(1448, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'O') { @@ -21912,37 +21976,37 @@ yy1446: } else { if (yych <= '/') goto yy147; if (yych <= 'N') goto yy3; - goto yy1413; + goto yy1415; } } else { if (yych <= '`') { if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'o') goto yy1447; + if (yych == 'o') goto yy1449; if (yych <= 'z') goto yy154; goto yy3; } } -yy1447: - YYDEBUG(1447, *YYCURSOR); +yy1449: + YYDEBUG(1449, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'W') goto yy1414; + if (yych == 'W') goto yy1416; if (yych != 'w') goto yy155; - YYDEBUG(1448, *YYCURSOR); + YYDEBUG(1450, *YYCURSOR); yyaccept = 30; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '^') { if (yych == '/') goto yy147; - goto yy1415; + goto yy1417; } else { if (yych <= '_') goto yy147; - if (yych <= '`') goto yy1415; + if (yych <= '`') goto yy1417; if (yych <= 'z') goto yy154; - goto yy1415; + goto yy1417; } -yy1449: - YYDEBUG(1449, *YYCURSOR); +yy1451: + YYDEBUG(1451, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'Y') { @@ -21953,7 +22017,7 @@ yy1449: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'X') goto yy143; - goto yy1417; + goto yy1419; } } else { if (yych <= '`') { @@ -21961,36 +22025,36 @@ yy1449: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'y') goto yy1450; + if (yych == 'y') goto yy1452; if (yych <= 'z') goto yy152; goto yy3; } } -yy1450: - YYDEBUG(1450, *YYCURSOR); +yy1452: + YYDEBUG(1452, *YYCURSOR); yyaccept = 31; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '@') { if (yych <= ')') { - if (yych <= '(') goto yy1418; + if (yych <= '(') goto yy1420; goto yy139; } else { if (yych == '/') goto yy147; - goto yy1418; + goto yy1420; } } else { if (yych <= '_') { if (yych <= 'Z') goto yy144; - if (yych <= '^') goto yy1418; + if (yych <= '^') goto yy1420; goto yy147; } else { - if (yych <= '`') goto yy1418; + if (yych <= '`') goto yy1420; if (yych <= 'z') goto yy153; - goto yy1418; + goto yy1420; } } -yy1451: - YYDEBUG(1451, *YYCURSOR); +yy1453: + YYDEBUG(1453, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'S') { @@ -22001,8 +22065,8 @@ yy1451: } else { if (yych <= '@') goto yy3; if (yych <= 'Q') goto yy142; - if (yych <= 'R') goto yy1425; - goto yy1426; + if (yych <= 'R') goto yy1427; + goto yy1428; } } else { if (yych <= '`') { @@ -22012,16 +22076,16 @@ yy1451: } else { if (yych <= 'r') { if (yych <= 'q') goto yy151; - goto yy1457; + goto yy1459; } else { - if (yych <= 's') goto yy1458; + if (yych <= 's') goto yy1460; if (yych <= 'z') goto yy151; goto yy3; } } } -yy1452: - YYDEBUG(1452, *YYCURSOR); +yy1454: + YYDEBUG(1454, *YYCURSOR); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'R') { @@ -22032,7 +22096,7 @@ yy1452: if (yych <= '/') goto yy147; if (yych <= '@') goto yy167; if (yych <= 'Q') goto yy142; - goto yy1421; + goto yy1423; } } else { if (yych <= '`') { @@ -22040,13 +22104,13 @@ yy1452: if (yych == '_') goto yy147; goto yy167; } else { - if (yych == 'r') goto yy1453; + if (yych == 'r') goto yy1455; if (yych <= 'z') goto yy151; goto yy167; } } -yy1453: - YYDEBUG(1453, *YYCURSOR); +yy1455: + YYDEBUG(1455, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'S') { @@ -22057,7 +22121,7 @@ yy1453: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'R') goto yy143; - goto yy1422; + goto yy1424; } } else { if (yych <= '`') { @@ -22065,13 +22129,13 @@ yy1453: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 's') goto yy1454; + if (yych == 's') goto yy1456; if (yych <= 'z') goto yy152; goto yy3; } } -yy1454: - YYDEBUG(1454, *YYCURSOR); +yy1456: + YYDEBUG(1456, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'D') { @@ -22082,7 +22146,7 @@ yy1454: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'C') goto yy144; - goto yy1423; + goto yy1425; } } else { if (yych <= '`') { @@ -22090,13 +22154,13 @@ yy1454: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'd') goto yy1455; + if (yych == 'd') goto yy1457; if (yych <= 'z') goto yy153; goto yy3; } } -yy1455: - YYDEBUG(1455, *YYCURSOR); +yy1457: + YYDEBUG(1457, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'A') { @@ -22106,26 +22170,26 @@ yy1455: } else { if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; - goto yy1424; + goto yy1426; } } else { if (yych <= '`') { if (yych == '_') goto yy147; goto yy3; } else { - if (yych <= 'a') goto yy1456; + if (yych <= 'a') goto yy1458; if (yych <= 'z') goto yy154; goto yy3; } } -yy1456: - YYDEBUG(1456, *YYCURSOR); +yy1458: + YYDEBUG(1458, *YYCURSOR); yych = *++YYCURSOR; if (yych == 'Y') goto yy173; if (yych == 'y') goto yy186; goto yy155; -yy1457: - YYDEBUG(1457, *YYCURSOR); +yy1459: + YYDEBUG(1459, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'D') { @@ -22136,7 +22200,7 @@ yy1457: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'C') goto yy143; - goto yy1214; + goto yy1238; } } else { if (yych <= '`') { @@ -22144,13 +22208,13 @@ yy1457: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'd') goto yy1225; + if (yych == 'd') goto yy1267; if (yych <= 'z') goto yy152; goto yy3; } } -yy1458: - YYDEBUG(1458, *YYCURSOR); +yy1460: + YYDEBUG(1460, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '.') { @@ -22175,8 +22239,8 @@ yy1458: goto yy3; } } -yy1459: - YYDEBUG(1459, *YYCURSOR); +yy1461: + YYDEBUG(1461, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'T') { @@ -22187,7 +22251,7 @@ yy1459: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'S') goto yy142; - goto yy1428; + goto yy1430; } } else { if (yych <= '`') { @@ -22195,13 +22259,13 @@ yy1459: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 't') goto yy1460; + if (yych == 't') goto yy1462; if (yych <= 'z') goto yy151; goto yy3; } } -yy1460: - YYDEBUG(1460, *YYCURSOR); +yy1462: + YYDEBUG(1462, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'H') { @@ -22212,7 +22276,7 @@ yy1460: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'G') goto yy143; - goto yy1214; + goto yy1238; } } else { if (yych <= '`') { @@ -22220,37 +22284,37 @@ yy1460: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'h') goto yy1225; + if (yych == 'h') goto yy1267; if (yych <= 'z') goto yy152; goto yy3; } } -yy1461: - YYDEBUG(1461, *YYCURSOR); +yy1463: + YYDEBUG(1463, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'Y') { if (yych <= '@') { if (yych == ')') goto yy139; goto yy3; } else { - if (yych == 'R') goto yy1473; + if (yych == 'R') goto yy1475; if (yych <= 'X') goto yy141; - goto yy1474; + goto yy1476; } } else { if (yych <= 'r') { if (yych <= 'Z') goto yy141; if (yych <= '`') goto yy3; if (yych <= 'q') goto yy141; - goto yy1473; + goto yy1475; } else { - if (yych == 'y') goto yy1474; + if (yych == 'y') goto yy1476; if (yych <= 'z') goto yy141; goto yy3; } } -yy1462: - YYDEBUG(1462, *YYCURSOR); +yy1464: + YYDEBUG(1464, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'D') { if (yych <= ')') { @@ -22259,7 +22323,7 @@ yy1462: } else { if (yych <= '@') goto yy3; if (yych <= 'C') goto yy141; - goto yy1467; + goto yy1469; } } else { if (yych <= 'c') { @@ -22267,13 +22331,13 @@ yy1462: if (yych <= '`') goto yy3; goto yy141; } else { - if (yych <= 'd') goto yy1467; + if (yych <= 'd') goto yy1469; if (yych <= 'z') goto yy141; goto yy3; } } -yy1463: - YYDEBUG(1463, *YYCURSOR); +yy1465: + YYDEBUG(1465, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'N') { if (yych <= ')') { @@ -22289,13 +22353,13 @@ yy1463: if (yych <= '`') goto yy3; goto yy141; } else { - if (yych <= 'n') goto yy1464; + if (yych <= 'n') goto yy1466; if (yych <= 'z') goto yy141; goto yy3; } } -yy1464: - YYDEBUG(1464, *YYCURSOR); +yy1466: + YYDEBUG(1466, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'D') { if (yych <= ')') { @@ -22311,13 +22375,13 @@ yy1464: if (yych <= '`') goto yy167; goto yy142; } else { - if (yych <= 'd') goto yy1465; + if (yych <= 'd') goto yy1467; if (yych <= 'z') goto yy142; goto yy167; } } -yy1465: - YYDEBUG(1465, *YYCURSOR); +yy1467: + YYDEBUG(1467, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'A') { if (yych == ')') goto yy139; @@ -22327,13 +22391,13 @@ yy1465: if (yych <= 'Z') goto yy143; goto yy3; } else { - if (yych <= 'a') goto yy1466; + if (yych <= 'a') goto yy1468; if (yych <= 'z') goto yy143; goto yy3; } } -yy1466: - YYDEBUG(1466, *YYCURSOR); +yy1468: + YYDEBUG(1468, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'Y') { if (yych <= ')') { @@ -22342,7 +22406,7 @@ yy1466: } else { if (yych <= '@') goto yy3; if (yych <= 'X') goto yy144; - goto yy1233; + goto yy1235; } } else { if (yych <= 'x') { @@ -22350,13 +22414,13 @@ yy1466: if (yych <= '`') goto yy3; goto yy144; } else { - if (yych <= 'y') goto yy1233; + if (yych <= 'y') goto yy1235; if (yych <= 'z') goto yy144; goto yy3; } } -yy1467: - YYDEBUG(1467, *YYCURSOR); +yy1469: + YYDEBUG(1469, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'N') { if (yych <= ')') { @@ -22372,13 +22436,13 @@ yy1467: if (yych <= '`') goto yy3; goto yy142; } else { - if (yych <= 'n') goto yy1468; + if (yych <= 'n') goto yy1470; if (yych <= 'z') goto yy142; goto yy3; } } -yy1468: - YYDEBUG(1468, *YYCURSOR); +yy1470: + YYDEBUG(1470, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'I') { if (yych <= ')') { @@ -22394,13 +22458,13 @@ yy1468: if (yych <= '`') goto yy3; goto yy143; } else { - if (yych <= 'i') goto yy1469; + if (yych <= 'i') goto yy1471; if (yych <= 'z') goto yy143; goto yy3; } } -yy1469: - YYDEBUG(1469, *YYCURSOR); +yy1471: + YYDEBUG(1471, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'G') { if (yych <= ')') { @@ -22416,33 +22480,33 @@ yy1469: if (yych <= '`') goto yy3; goto yy144; } else { - if (yych <= 'g') goto yy1470; + if (yych <= 'g') goto yy1472; if (yych <= 'z') goto yy144; goto yy3; } } -yy1470: - YYDEBUG(1470, *YYCURSOR); +yy1472: + YYDEBUG(1472, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'G') { if (yych == ')') goto yy139; goto yy3; } else { - if (yych <= 'H') goto yy1471; + if (yych <= 'H') goto yy1473; if (yych != 'h') goto yy3; } -yy1471: - YYDEBUG(1471, *YYCURSOR); +yy1473: + YYDEBUG(1473, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy1472; + if (yych == 'T') goto yy1474; if (yych != 't') goto yy56; -yy1472: - YYDEBUG(1472, *YYCURSOR); +yy1474: + YYDEBUG(1474, *YYCURSOR); yych = *++YYCURSOR; - goto yy1418; -yy1473: - YYDEBUG(1473, *YYCURSOR); + goto yy1420; +yy1475: + YYDEBUG(1475, *YYCURSOR); yyaccept = 5; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '/') { @@ -22470,7 +22534,7 @@ yy1473: if (yych <= '9') goto yy196; goto yy194; } else { - if (yych == 'C') goto yy1475; + if (yych == 'C') goto yy1477; goto yy142; } } else { @@ -22478,14 +22542,14 @@ yy1473: if (yych <= '`') goto yy194; goto yy142; } else { - if (yych <= 'c') goto yy1475; + if (yych <= 'c') goto yy1477; if (yych <= 'z') goto yy142; goto yy194; } } } -yy1474: - YYDEBUG(1474, *YYCURSOR); +yy1476: + YYDEBUG(1476, *YYCURSOR); yyaccept = 5; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '-') { @@ -22510,8 +22574,8 @@ yy1474: goto yy194; } } -yy1475: - YYDEBUG(1475, *YYCURSOR); +yy1477: + YYDEBUG(1477, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'H') { if (yych <= ')') { @@ -22533,8 +22597,8 @@ yy1475: goto yy3; } } -yy1476: - YYDEBUG(1476, *YYCURSOR); +yy1478: + YYDEBUG(1478, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'Y') { @@ -22547,9 +22611,9 @@ yy1476: if (yych <= '@') goto yy3; goto yy141; } else { - if (yych <= 'R') goto yy1473; + if (yych <= 'R') goto yy1475; if (yych <= 'X') goto yy141; - goto yy1474; + goto yy1476; } } } else { @@ -22564,17 +22628,17 @@ yy1476: } } else { if (yych <= 'x') { - if (yych <= 'r') goto yy1488; + if (yych <= 'r') goto yy1490; goto yy146; } else { - if (yych <= 'y') goto yy1489; + if (yych <= 'y') goto yy1491; if (yych <= 'z') goto yy146; goto yy3; } } } -yy1477: - YYDEBUG(1477, *YYCURSOR); +yy1479: + YYDEBUG(1479, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'D') { @@ -22585,7 +22649,7 @@ yy1477: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'C') goto yy141; - goto yy1467; + goto yy1469; } } else { if (yych <= '`') { @@ -22593,13 +22657,13 @@ yy1477: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'd') goto yy1482; + if (yych == 'd') goto yy1484; if (yych <= 'z') goto yy146; goto yy3; } } -yy1478: - YYDEBUG(1478, *YYCURSOR); +yy1480: + YYDEBUG(1480, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'N') { @@ -22610,7 +22674,7 @@ yy1478: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'M') goto yy141; - goto yy1464; + goto yy1466; } } else { if (yych <= '`') { @@ -22618,13 +22682,13 @@ yy1478: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'n') goto yy1479; + if (yych == 'n') goto yy1481; if (yych <= 'z') goto yy146; goto yy3; } } -yy1479: - YYDEBUG(1479, *YYCURSOR); +yy1481: + YYDEBUG(1481, *YYCURSOR); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'D') { @@ -22635,7 +22699,7 @@ yy1479: if (yych <= '/') goto yy147; if (yych <= '@') goto yy167; if (yych <= 'C') goto yy142; - goto yy1465; + goto yy1467; } } else { if (yych <= '`') { @@ -22643,13 +22707,13 @@ yy1479: if (yych == '_') goto yy147; goto yy167; } else { - if (yych == 'd') goto yy1480; + if (yych == 'd') goto yy1482; if (yych <= 'z') goto yy151; goto yy167; } } -yy1480: - YYDEBUG(1480, *YYCURSOR); +yy1482: + YYDEBUG(1482, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'A') { @@ -22659,7 +22723,7 @@ yy1480: } else { if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; - goto yy1466; + goto yy1468; } } else { if (yych <= '_') { @@ -22668,13 +22732,13 @@ yy1480: goto yy147; } else { if (yych <= '`') goto yy3; - if (yych <= 'a') goto yy1481; + if (yych <= 'a') goto yy1483; if (yych <= 'z') goto yy152; goto yy3; } } -yy1481: - YYDEBUG(1481, *YYCURSOR); +yy1483: + YYDEBUG(1483, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'Y') { @@ -22685,7 +22749,7 @@ yy1481: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'X') goto yy144; - goto yy1233; + goto yy1235; } } else { if (yych <= '`') { @@ -22693,13 +22757,13 @@ yy1481: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'y') goto yy1262; + if (yych == 'y') goto yy1264; if (yych <= 'z') goto yy153; goto yy3; } } -yy1482: - YYDEBUG(1482, *YYCURSOR); +yy1484: + YYDEBUG(1484, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'N') { @@ -22710,7 +22774,7 @@ yy1482: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'M') goto yy142; - goto yy1468; + goto yy1470; } } else { if (yych <= '`') { @@ -22718,13 +22782,13 @@ yy1482: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'n') goto yy1483; + if (yych == 'n') goto yy1485; if (yych <= 'z') goto yy151; goto yy3; } } -yy1483: - YYDEBUG(1483, *YYCURSOR); +yy1485: + YYDEBUG(1485, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'I') { @@ -22735,7 +22799,7 @@ yy1483: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'H') goto yy143; - goto yy1469; + goto yy1471; } } else { if (yych <= '`') { @@ -22743,13 +22807,13 @@ yy1483: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'i') goto yy1484; + if (yych == 'i') goto yy1486; if (yych <= 'z') goto yy152; goto yy3; } } -yy1484: - YYDEBUG(1484, *YYCURSOR); +yy1486: + YYDEBUG(1486, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'G') { @@ -22760,7 +22824,7 @@ yy1484: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'F') goto yy144; - goto yy1470; + goto yy1472; } } else { if (yych <= '`') { @@ -22768,13 +22832,13 @@ yy1484: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'g') goto yy1485; + if (yych == 'g') goto yy1487; if (yych <= 'z') goto yy153; goto yy3; } } -yy1485: - YYDEBUG(1485, *YYCURSOR); +yy1487: + YYDEBUG(1487, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'H') { @@ -22784,37 +22848,37 @@ yy1485: } else { if (yych <= '/') goto yy147; if (yych <= 'G') goto yy3; - goto yy1471; + goto yy1473; } } else { if (yych <= '`') { if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'h') goto yy1486; + if (yych == 'h') goto yy1488; if (yych <= 'z') goto yy154; goto yy3; } } -yy1486: - YYDEBUG(1486, *YYCURSOR); +yy1488: + YYDEBUG(1488, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy1472; + if (yych == 'T') goto yy1474; if (yych != 't') goto yy155; - YYDEBUG(1487, *YYCURSOR); + YYDEBUG(1489, *YYCURSOR); yyaccept = 31; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '^') { if (yych == '/') goto yy147; - goto yy1418; + goto yy1420; } else { if (yych <= '_') goto yy147; - if (yych <= '`') goto yy1418; + if (yych <= '`') goto yy1420; if (yych <= 'z') goto yy154; - goto yy1418; + goto yy1420; } -yy1488: - YYDEBUG(1488, *YYCURSOR); +yy1490: + YYDEBUG(1490, *YYCURSOR); yyaccept = 5; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '9') { @@ -22842,7 +22906,7 @@ yy1488: if (yych <= '@') goto yy194; goto yy142; } else { - if (yych <= 'C') goto yy1475; + if (yych <= 'C') goto yy1477; if (yych <= 'Z') goto yy142; goto yy194; } @@ -22852,14 +22916,14 @@ yy1488: if (yych <= '`') goto yy194; goto yy151; } else { - if (yych <= 'c') goto yy1490; + if (yych <= 'c') goto yy1492; if (yych <= 'z') goto yy151; goto yy194; } } } -yy1489: - YYDEBUG(1489, *YYCURSOR); +yy1491: + YYDEBUG(1491, *YYCURSOR); yyaccept = 5; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '.') { @@ -22894,8 +22958,8 @@ yy1489: } } } -yy1490: - YYDEBUG(1490, *YYCURSOR); +yy1492: + YYDEBUG(1492, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'H') { @@ -22919,8 +22983,8 @@ yy1490: goto yy3; } } -yy1491: - YYDEBUG(1491, *YYCURSOR); +yy1493: + YYDEBUG(1493, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'W') { if (yych <= 'N') { @@ -22928,30 +22992,30 @@ yy1491: if (yych <= '@') goto yy3; goto yy141; } else { - if (yych <= 'O') goto yy1499; + if (yych <= 'O') goto yy1501; if (yych <= 'U') goto yy141; - if (yych <= 'V') goto yy1500; - goto yy1497; + if (yych <= 'V') goto yy1502; + goto yy1499; } } else { if (yych <= 'o') { if (yych <= 'Z') goto yy141; if (yych <= '`') goto yy3; if (yych <= 'n') goto yy141; - goto yy1499; + goto yy1501; } else { if (yych <= 'v') { if (yych <= 'u') goto yy141; - goto yy1500; + goto yy1502; } else { - if (yych <= 'w') goto yy1497; + if (yych <= 'w') goto yy1499; if (yych <= 'z') goto yy141; goto yy3; } } } -yy1492: - YYDEBUG(1492, *YYCURSOR); +yy1494: + YYDEBUG(1494, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'X') { if (yych <= ')') { @@ -22960,7 +23024,7 @@ yy1492: } else { if (yych <= '@') goto yy3; if (yych <= 'W') goto yy141; - goto yy1496; + goto yy1498; } } else { if (yych <= 'w') { @@ -22968,13 +23032,13 @@ yy1492: if (yych <= '`') goto yy3; goto yy141; } else { - if (yych <= 'x') goto yy1496; + if (yych <= 'x') goto yy1498; if (yych <= 'z') goto yy141; goto yy3; } } -yy1493: - YYDEBUG(1493, *YYCURSOR); +yy1495: + YYDEBUG(1495, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'N') { if (yych <= ')') { @@ -22990,13 +23054,13 @@ yy1493: if (yych <= '`') goto yy3; goto yy141; } else { - if (yych <= 'n') goto yy1494; + if (yych <= 'n') goto yy1496; if (yych <= 'z') goto yy141; goto yy3; } } -yy1494: - YYDEBUG(1494, *YYCURSOR); +yy1496: + YYDEBUG(1496, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'T') { if (yych <= ')') { @@ -23012,13 +23076,13 @@ yy1494: if (yych <= '`') goto yy3; goto yy142; } else { - if (yych <= 't') goto yy1495; + if (yych <= 't') goto yy1497; if (yych <= 'z') goto yy142; goto yy3; } } -yy1495: - YYDEBUG(1495, *YYCURSOR); +yy1497: + YYDEBUG(1497, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'H') { if (yych <= ')') { @@ -23027,7 +23091,7 @@ yy1495: } else { if (yych <= '@') goto yy3; if (yych <= 'G') goto yy143; - goto yy1214; + goto yy1238; } } else { if (yych <= 'g') { @@ -23035,13 +23099,13 @@ yy1495: if (yych <= '`') goto yy3; goto yy143; } else { - if (yych <= 'h') goto yy1214; + if (yych <= 'h') goto yy1238; if (yych <= 'z') goto yy143; goto yy3; } } -yy1496: - YYDEBUG(1496, *YYCURSOR); +yy1498: + YYDEBUG(1498, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'T') { if (yych <= ')') { @@ -23050,7 +23114,7 @@ yy1496: } else { if (yych <= '@') goto yy3; if (yych <= 'S') goto yy142; - goto yy1426; + goto yy1428; } } else { if (yych <= 's') { @@ -23058,24 +23122,24 @@ yy1496: if (yych <= '`') goto yy3; goto yy142; } else { - if (yych <= 't') goto yy1426; + if (yych <= 't') goto yy1428; if (yych <= 'z') goto yy142; goto yy3; } } -yy1497: - YYDEBUG(1497, *YYCURSOR); +yy1499: + YYDEBUG(1499, *YYCURSOR); ++YYCURSOR; if ((yych = *YYCURSOR) <= '@') { if (yych == ')') goto yy139; } else { if (yych <= 'Z') goto yy142; - if (yych <= '`') goto yy1498; + if (yych <= '`') goto yy1500; if (yych <= 'z') goto yy142; } -yy1498: - YYDEBUG(1498, *YYCURSOR); -#line 982 "ext/date/lib/parse_date.re" +yy1500: + YYDEBUG(1500, *YYCURSOR); +#line 983 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("now"); TIMELIB_INIT; @@ -23083,9 +23147,9 @@ yy1498: TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 23087 "ext/date/lib/parse_date.c" -yy1499: - YYDEBUG(1499, *YYCURSOR); +#line 23151 "ext/date/lib/parse_date.c" +yy1501: + YYDEBUG(1501, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'N') { if (yych <= ')') { @@ -23094,7 +23158,7 @@ yy1499: } else { if (yych <= '@') goto yy3; if (yych <= 'M') goto yy142; - goto yy1505; + goto yy1507; } } else { if (yych <= 'm') { @@ -23102,13 +23166,13 @@ yy1499: if (yych <= '`') goto yy3; goto yy142; } else { - if (yych <= 'n') goto yy1505; + if (yych <= 'n') goto yy1507; if (yych <= 'z') goto yy142; goto yy3; } } -yy1500: - YYDEBUG(1500, *YYCURSOR); +yy1502: + YYDEBUG(1502, *YYCURSOR); yyaccept = 5; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '/') { @@ -23143,14 +23207,14 @@ yy1500: if (yych <= '`') goto yy194; goto yy142; } else { - if (yych <= 'e') goto yy1501; + if (yych <= 'e') goto yy1503; if (yych <= 'z') goto yy142; goto yy194; } } } -yy1501: - YYDEBUG(1501, *YYCURSOR); +yy1503: + YYDEBUG(1503, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'M') { if (yych <= ')') { @@ -23166,13 +23230,13 @@ yy1501: if (yych <= '`') goto yy3; goto yy143; } else { - if (yych <= 'm') goto yy1502; + if (yych <= 'm') goto yy1504; if (yych <= 'z') goto yy143; goto yy3; } } -yy1502: - YYDEBUG(1502, *YYCURSOR); +yy1504: + YYDEBUG(1504, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'B') { if (yych <= ')') { @@ -23188,41 +23252,41 @@ yy1502: if (yych <= '`') goto yy3; goto yy144; } else { - if (yych <= 'b') goto yy1503; + if (yych <= 'b') goto yy1505; if (yych <= 'z') goto yy144; goto yy3; } } -yy1503: - YYDEBUG(1503, *YYCURSOR); +yy1505: + YYDEBUG(1505, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'D') { if (yych == ')') goto yy139; goto yy3; } else { - if (yych <= 'E') goto yy1504; + if (yych <= 'E') goto yy1506; if (yych != 'e') goto yy3; } -yy1504: - YYDEBUG(1504, *YYCURSOR); +yy1506: + YYDEBUG(1506, *YYCURSOR); yych = *++YYCURSOR; if (yych == 'R') goto yy206; if (yych == 'r') goto yy206; goto yy56; -yy1505: - YYDEBUG(1505, *YYCURSOR); +yy1507: + YYDEBUG(1507, *YYCURSOR); ++YYCURSOR; if ((yych = *YYCURSOR) <= '@') { if (yych == ')') goto yy139; } else { if (yych <= 'Z') goto yy143; - if (yych <= '`') goto yy1506; + if (yych <= '`') goto yy1508; if (yych <= 'z') goto yy143; } -yy1506: - YYDEBUG(1506, *YYCURSOR); -#line 991 "ext/date/lib/parse_date.re" +yy1508: + YYDEBUG(1508, *YYCURSOR); +#line 992 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("noon"); TIMELIB_INIT; @@ -23233,9 +23297,9 @@ yy1506: TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 23237 "ext/date/lib/parse_date.c" -yy1507: - YYDEBUG(1507, *YYCURSOR); +#line 23301 "ext/date/lib/parse_date.c" +yy1509: + YYDEBUG(1509, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'W') { @@ -23250,11 +23314,11 @@ yy1507: } else { if (yych <= 'O') { if (yych <= 'N') goto yy141; - goto yy1499; + goto yy1501; } else { if (yych <= 'U') goto yy141; - if (yych <= 'V') goto yy1500; - goto yy1497; + if (yych <= 'V') goto yy1502; + goto yy1499; } } } else { @@ -23269,18 +23333,18 @@ yy1507: } } else { if (yych <= 'v') { - if (yych <= 'o') goto yy1514; + if (yych <= 'o') goto yy1516; if (yych <= 'u') goto yy146; - goto yy1515; + goto yy1517; } else { - if (yych <= 'w') goto yy1513; + if (yych <= 'w') goto yy1515; if (yych <= 'z') goto yy146; goto yy3; } } } -yy1508: - YYDEBUG(1508, *YYCURSOR); +yy1510: + YYDEBUG(1510, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'X') { @@ -23291,7 +23355,7 @@ yy1508: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'W') goto yy141; - goto yy1496; + goto yy1498; } } else { if (yych <= '`') { @@ -23299,13 +23363,13 @@ yy1508: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'x') goto yy1512; + if (yych == 'x') goto yy1514; if (yych <= 'z') goto yy146; goto yy3; } } -yy1509: - YYDEBUG(1509, *YYCURSOR); +yy1511: + YYDEBUG(1511, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'N') { @@ -23316,7 +23380,7 @@ yy1509: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'M') goto yy141; - goto yy1494; + goto yy1496; } } else { if (yych <= '`') { @@ -23324,13 +23388,13 @@ yy1509: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'n') goto yy1510; + if (yych == 'n') goto yy1512; if (yych <= 'z') goto yy146; goto yy3; } } -yy1510: - YYDEBUG(1510, *YYCURSOR); +yy1512: + YYDEBUG(1512, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'T') { @@ -23341,7 +23405,7 @@ yy1510: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'S') goto yy142; - goto yy1495; + goto yy1497; } } else { if (yych <= '`') { @@ -23349,13 +23413,13 @@ yy1510: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 't') goto yy1511; + if (yych == 't') goto yy1513; if (yych <= 'z') goto yy151; goto yy3; } } -yy1511: - YYDEBUG(1511, *YYCURSOR); +yy1513: + YYDEBUG(1513, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'H') { @@ -23366,7 +23430,7 @@ yy1511: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'G') goto yy143; - goto yy1214; + goto yy1238; } } else { if (yych <= '`') { @@ -23374,13 +23438,13 @@ yy1511: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'h') goto yy1225; + if (yych == 'h') goto yy1267; if (yych <= 'z') goto yy152; goto yy3; } } -yy1512: - YYDEBUG(1512, *YYCURSOR); +yy1514: + YYDEBUG(1514, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'T') { @@ -23391,7 +23455,7 @@ yy1512: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'S') goto yy142; - goto yy1426; + goto yy1428; } } else { if (yych <= '`') { @@ -23399,36 +23463,36 @@ yy1512: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 't') goto yy1458; + if (yych == 't') goto yy1460; if (yych <= 'z') goto yy151; goto yy3; } } -yy1513: - YYDEBUG(1513, *YYCURSOR); +yy1515: + YYDEBUG(1515, *YYCURSOR); yyaccept = 32; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '@') { if (yych <= ')') { - if (yych <= '(') goto yy1498; + if (yych <= '(') goto yy1500; goto yy139; } else { if (yych == '/') goto yy147; - goto yy1498; + goto yy1500; } } else { if (yych <= '_') { if (yych <= 'Z') goto yy142; - if (yych <= '^') goto yy1498; + if (yych <= '^') goto yy1500; goto yy147; } else { - if (yych <= '`') goto yy1498; + if (yych <= '`') goto yy1500; if (yych <= 'z') goto yy151; - goto yy1498; + goto yy1500; } } -yy1514: - YYDEBUG(1514, *YYCURSOR); +yy1516: + YYDEBUG(1516, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'N') { @@ -23439,7 +23503,7 @@ yy1514: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'M') goto yy142; - goto yy1505; + goto yy1507; } } else { if (yych <= '`') { @@ -23447,13 +23511,13 @@ yy1514: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'n') goto yy1520; + if (yych == 'n') goto yy1522; if (yych <= 'z') goto yy151; goto yy3; } } -yy1515: - YYDEBUG(1515, *YYCURSOR); +yy1517: + YYDEBUG(1517, *YYCURSOR); yyaccept = 5; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '9') { @@ -23481,7 +23545,7 @@ yy1515: if (yych <= '@') goto yy194; goto yy142; } else { - if (yych <= 'E') goto yy1501; + if (yych <= 'E') goto yy1503; if (yych <= 'Z') goto yy142; goto yy194; } @@ -23491,14 +23555,14 @@ yy1515: if (yych <= '`') goto yy194; goto yy151; } else { - if (yych <= 'e') goto yy1516; + if (yych <= 'e') goto yy1518; if (yych <= 'z') goto yy151; goto yy194; } } } -yy1516: - YYDEBUG(1516, *YYCURSOR); +yy1518: + YYDEBUG(1518, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'M') { @@ -23509,7 +23573,7 @@ yy1516: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'L') goto yy143; - goto yy1502; + goto yy1504; } } else { if (yych <= '`') { @@ -23517,13 +23581,13 @@ yy1516: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'm') goto yy1517; + if (yych == 'm') goto yy1519; if (yych <= 'z') goto yy152; goto yy3; } } -yy1517: - YYDEBUG(1517, *YYCURSOR); +yy1519: + YYDEBUG(1519, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'B') { @@ -23534,7 +23598,7 @@ yy1517: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'A') goto yy144; - goto yy1503; + goto yy1505; } } else { if (yych <= '`') { @@ -23542,13 +23606,13 @@ yy1517: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'b') goto yy1518; + if (yych == 'b') goto yy1520; if (yych <= 'z') goto yy153; goto yy3; } } -yy1518: - YYDEBUG(1518, *YYCURSOR); +yy1520: + YYDEBUG(1520, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'E') { @@ -23558,49 +23622,49 @@ yy1518: } else { if (yych <= '/') goto yy147; if (yych <= 'D') goto yy3; - goto yy1504; + goto yy1506; } } else { if (yych <= '`') { if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'e') goto yy1519; + if (yych == 'e') goto yy1521; if (yych <= 'z') goto yy154; goto yy3; } } -yy1519: - YYDEBUG(1519, *YYCURSOR); +yy1521: + YYDEBUG(1521, *YYCURSOR); yych = *++YYCURSOR; if (yych == 'R') goto yy206; if (yych == 'r') goto yy377; goto yy155; -yy1520: - YYDEBUG(1520, *YYCURSOR); +yy1522: + YYDEBUG(1522, *YYCURSOR); yyaccept = 33; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '@') { if (yych <= ')') { - if (yych <= '(') goto yy1506; + if (yych <= '(') goto yy1508; goto yy139; } else { if (yych == '/') goto yy147; - goto yy1506; + goto yy1508; } } else { if (yych <= '_') { if (yych <= 'Z') goto yy143; - if (yych <= '^') goto yy1506; + if (yych <= '^') goto yy1508; goto yy147; } else { - if (yych <= '`') goto yy1506; + if (yych <= '`') goto yy1508; if (yych <= 'z') goto yy152; - goto yy1506; + goto yy1508; } } -yy1521: - YYDEBUG(1521, *YYCURSOR); +yy1523: + YYDEBUG(1523, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'S') { if (yych <= ')') { @@ -23616,13 +23680,13 @@ yy1521: if (yych <= '`') goto yy3; goto yy141; } else { - if (yych <= 's') goto yy1522; + if (yych <= 's') goto yy1524; if (yych <= 'z') goto yy141; goto yy3; } } -yy1522: - YYDEBUG(1522, *YYCURSOR); +yy1524: + YYDEBUG(1524, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'T') { if (yych <= ')') { @@ -23638,13 +23702,13 @@ yy1522: if (yych <= '`') goto yy3; goto yy142; } else { - if (yych <= 't') goto yy1523; + if (yych <= 't') goto yy1525; if (yych <= 'z') goto yy142; goto yy3; } } -yy1523: - YYDEBUG(1523, *YYCURSOR); +yy1525: + YYDEBUG(1525, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'E') { if (yych <= ')') { @@ -23660,13 +23724,13 @@ yy1523: if (yych <= '`') goto yy3; goto yy143; } else { - if (yych <= 'e') goto yy1524; + if (yych <= 'e') goto yy1526; if (yych <= 'z') goto yy143; goto yy3; } } -yy1524: - YYDEBUG(1524, *YYCURSOR); +yy1526: + YYDEBUG(1526, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'R') { if (yych <= ')') { @@ -23682,38 +23746,38 @@ yy1524: if (yych <= '`') goto yy3; goto yy144; } else { - if (yych <= 'r') goto yy1525; + if (yych <= 'r') goto yy1527; if (yych <= 'z') goto yy144; goto yy3; } } -yy1525: - YYDEBUG(1525, *YYCURSOR); +yy1527: + YYDEBUG(1527, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'C') { if (yych == ')') goto yy139; goto yy3; } else { - if (yych <= 'D') goto yy1526; + if (yych <= 'D') goto yy1528; if (yych != 'd') goto yy3; } -yy1526: - YYDEBUG(1526, *YYCURSOR); +yy1528: + YYDEBUG(1528, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy1527; + if (yych == 'A') goto yy1529; if (yych != 'a') goto yy56; -yy1527: - YYDEBUG(1527, *YYCURSOR); +yy1529: + YYDEBUG(1529, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'Y') goto yy1528; + if (yych == 'Y') goto yy1530; if (yych != 'y') goto yy56; -yy1528: - YYDEBUG(1528, *YYCURSOR); +yy1530: + YYDEBUG(1530, *YYCURSOR); ++YYCURSOR; -yy1529: - YYDEBUG(1529, *YYCURSOR); -#line 970 "ext/date/lib/parse_date.re" +yy1531: + YYDEBUG(1531, *YYCURSOR); +#line 971 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("yesterday"); TIMELIB_INIT; @@ -23724,9 +23788,9 @@ yy1529: TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 23728 "ext/date/lib/parse_date.c" -yy1530: - YYDEBUG(1530, *YYCURSOR); +#line 23792 "ext/date/lib/parse_date.c" +yy1532: + YYDEBUG(1532, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'S') { @@ -23737,7 +23801,7 @@ yy1530: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'R') goto yy141; - goto yy1522; + goto yy1524; } } else { if (yych <= '`') { @@ -23745,13 +23809,13 @@ yy1530: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 's') goto yy1531; + if (yych == 's') goto yy1533; if (yych <= 'z') goto yy146; goto yy3; } } -yy1531: - YYDEBUG(1531, *YYCURSOR); +yy1533: + YYDEBUG(1533, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'T') { @@ -23762,7 +23826,7 @@ yy1531: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'S') goto yy142; - goto yy1523; + goto yy1525; } } else { if (yych <= '`') { @@ -23770,13 +23834,13 @@ yy1531: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 't') goto yy1532; + if (yych == 't') goto yy1534; if (yych <= 'z') goto yy151; goto yy3; } } -yy1532: - YYDEBUG(1532, *YYCURSOR); +yy1534: + YYDEBUG(1534, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'E') { @@ -23787,7 +23851,7 @@ yy1532: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'D') goto yy143; - goto yy1524; + goto yy1526; } } else { if (yych <= '`') { @@ -23795,13 +23859,13 @@ yy1532: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'e') goto yy1533; + if (yych == 'e') goto yy1535; if (yych <= 'z') goto yy152; goto yy3; } } -yy1533: - YYDEBUG(1533, *YYCURSOR); +yy1535: + YYDEBUG(1535, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'R') { @@ -23812,7 +23876,7 @@ yy1533: if (yych <= '/') goto yy147; if (yych <= '@') goto yy3; if (yych <= 'Q') goto yy144; - goto yy1525; + goto yy1527; } } else { if (yych <= '`') { @@ -23820,13 +23884,13 @@ yy1533: if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'r') goto yy1534; + if (yych == 'r') goto yy1536; if (yych <= 'z') goto yy153; goto yy3; } } -yy1534: - YYDEBUG(1534, *YYCURSOR); +yy1536: + YYDEBUG(1536, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'D') { @@ -23836,41 +23900,41 @@ yy1534: } else { if (yych <= '/') goto yy147; if (yych <= 'C') goto yy3; - goto yy1526; + goto yy1528; } } else { if (yych <= '`') { if (yych == '_') goto yy147; goto yy3; } else { - if (yych == 'd') goto yy1535; + if (yych == 'd') goto yy1537; if (yych <= 'z') goto yy154; goto yy3; } } -yy1535: - YYDEBUG(1535, *YYCURSOR); +yy1537: + YYDEBUG(1537, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy1527; + if (yych == 'A') goto yy1529; if (yych != 'a') goto yy155; - YYDEBUG(1536, *YYCURSOR); + YYDEBUG(1538, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'Y') goto yy1528; + if (yych == 'Y') goto yy1530; if (yych != 'y') goto yy155; - YYDEBUG(1537, *YYCURSOR); + YYDEBUG(1539, *YYCURSOR); yyaccept = 34; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '^') { if (yych == '/') goto yy147; - goto yy1529; + goto yy1531; } else { if (yych <= '_') goto yy147; - if (yych <= '`') goto yy1529; + if (yych <= '`') goto yy1531; if (yych <= 'z') goto yy154; - goto yy1529; + goto yy1531; } } -#line 1731 "ext/date/lib/parse_date.re" +#line 1732 "ext/date/lib/parse_date.re" } @@ -24086,7 +24150,7 @@ timelib_time *timelib_parse_from_format(char *format, char *string, int len, tim add_pbf_error(s, "A two digit second could not be found", string, begin); } break; - case 'u': /* six digit millisecond */ + case 'u': /* up to six digit millisecond */ { double f; char *tptr; diff --git a/ext/date/lib/parse_date.re b/ext/date/lib/parse_date.re index 53966d898..dd3ac7b48 100644 --- a/ext/date/lib/parse_date.re +++ b/ext/date/lib/parse_date.re @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: parse_date.re 286515 2009-07-29 15:34:59Z derick $ */ +/* $Id: parse_date.re 294880 2010-02-11 11:11:47Z pajoye $ */ #include "timelib.h" @@ -236,6 +236,7 @@ static timelib_lookup_table const timelib_reltext_lookup[] = { { "sixth", 0, 6 }, { "seventh", 0, 7 }, { "eight", 0, 8 }, + { "eighth", 0, 8 }, { "ninth", 0, 9 }, { "tenth", 0, 10 }, { "eleventh", 0, 11 }, @@ -951,7 +952,7 @@ dateshortwithtimelongtz = datenoyear iso8601normtz; /* * Relative regexps */ -reltextnumber = 'first'|'second'|'third'|'fourth'|'fifth'|'sixth'|'seventh'|'eight'|'ninth'|'tenth'|'eleventh'|'twelfth'; +reltextnumber = 'first'|'second'|'third'|'fourth'|'fifth'|'sixth'|'seventh'|'eight'|'eighth'|'ninth'|'tenth'|'eleventh'|'twelfth'; reltexttext = 'next'|'last'|'previous'|'this'; reltextunit = (('sec'|'second'|'min'|'minute'|'hour'|'day'|'fortnight'|'forthnight'|'month'|'year') 's'?) | 'weeks' | daytext; @@ -1943,7 +1944,7 @@ timelib_time *timelib_parse_from_format(char *format, char *string, int len, tim add_pbf_error(s, "A two digit second could not be found", string, begin); } break; - case 'u': /* six digit millisecond */ + case 'u': /* up to six digit millisecond */ { double f; char *tptr; diff --git a/ext/date/lib/parse_tz.c b/ext/date/lib/parse_tz.c index ca7acea9f..6239f9e8d 100644 --- a/ext/date/lib/parse_tz.c +++ b/ext/date/lib/parse_tz.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: parse_tz.c 279320 2009-04-25 16:33:41Z nlopess $ */ +/* $Id: parse_tz.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "timelib.h" diff --git a/ext/date/lib/timelib.c b/ext/date/lib/timelib.c index 3b233dda9..84001d364 100644 --- a/ext/date/lib/timelib.c +++ b/ext/date/lib/timelib.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: timelib.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: timelib.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "timelib.h" #include diff --git a/ext/date/lib/timelib.h b/ext/date/lib/timelib.h index acf7f70b3..33eb6ebd9 100644 --- a/ext/date/lib/timelib.h +++ b/ext/date/lib/timelib.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: timelib.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: timelib.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef __TIMELIB_H__ #define __TIMELIB_H__ diff --git a/ext/date/lib/timelib_structs.h b/ext/date/lib/timelib_structs.h index 733b8150c..15622e7af 100644 --- a/ext/date/lib/timelib_structs.h +++ b/ext/date/lib/timelib_structs.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: timelib_structs.h 282169 2009-06-15 15:08:12Z pajoye $ */ +/* $Id: timelib_structs.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef __TIMELIB_STRUCTS_H__ #define __TIMELIB_STRUCTS_H__ diff --git a/ext/date/lib/timezonedb.h b/ext/date/lib/timezonedb.h index c6c8abf53..27f1889e9 100644 --- a/ext/date/lib/timezonedb.h +++ b/ext/date/lib/timezonedb.h @@ -1,4 +1,4 @@ -const timelib_tzdb_index_entry timezonedb_idx_builtin[561] = { +const timelib_tzdb_index_entry timezonedb_idx_builtin[564] = { { "Africa/Abidjan" , 0x000000 }, { "Africa/Accra" , 0x000055 }, { "Africa/Addis_Ababa" , 0x0000FD }, @@ -92,477 +92,480 @@ const timelib_tzdb_index_entry timezonedb_idx_builtin[561] = { { "America/Cayman" , 0x005FBE }, { "America/Chicago" , 0x006013 }, { "America/Chihuahua" , 0x00652A }, - { "America/Coral_Harbour" , 0x006779 }, - { "America/Cordoba" , 0x00680B }, - { "America/Costa_Rica" , 0x0069B1 }, - { "America/Cuiaba" , 0x006A3B }, - { "America/Curacao" , 0x006D19 }, - { "America/Danmarkshavn" , 0x006D7F }, - { "America/Dawson" , 0x006EC3 }, - { "America/Dawson_Creek" , 0x0071E0 }, - { "America/Denver" , 0x0073BA }, - { "America/Detroit" , 0x007740 }, - { "America/Dominica" , 0x007A9F }, - { "America/Edmonton" , 0x007AF4 }, - { "America/Eirunepe" , 0x007EAC }, - { "America/El_Salvador" , 0x007FBF }, - { "America/Ensenada" , 0x008034 }, - { "America/Fort_Wayne" , 0x0084DB }, - { "America/Fortaleza" , 0x00839D }, - { "America/Glace_Bay" , 0x008745 }, - { "America/Godthab" , 0x008ABC }, - { "America/Goose_Bay" , 0x008D80 }, - { "America/Grand_Turk" , 0x00923D }, - { "America/Grenada" , 0x0094EC }, - { "America/Guadeloupe" , 0x009541 }, - { "America/Guatemala" , 0x009596 }, - { "America/Guayaquil" , 0x00961F }, - { "America/Guyana" , 0x00967C }, - { "America/Halifax" , 0x0096FD }, - { "America/Havana" , 0x009C13 }, - { "America/Hermosillo" , 0x009F86 }, - { "America/Indiana/Indianapolis" , 0x00A064 }, - { "America/Indiana/Knox" , 0x00A2F5 }, - { "America/Indiana/Marengo" , 0x00A68C }, - { "America/Indiana/Petersburg" , 0x00A932 }, - { "America/Indiana/Tell_City" , 0x00AE7F }, - { "America/Indiana/Vevay" , 0x00B118 }, - { "America/Indiana/Vincennes" , 0x00B353 }, - { "America/Indiana/Winamac" , 0x00B607 }, - { "America/Indianapolis" , 0x00AC15 }, - { "America/Inuvik" , 0x00B8C0 }, - { "America/Iqaluit" , 0x00BBB7 }, - { "America/Jamaica" , 0x00BED9 }, - { "America/Jujuy" , 0x00BF9E }, - { "America/Juneau" , 0x00C148 }, - { "America/Kentucky/Louisville" , 0x00C4C6 }, - { "America/Kentucky/Monticello" , 0x00C8E4 }, - { "America/Knox_IN" , 0x00CC69 }, - { "America/La_Paz" , 0x00CFDA }, - { "America/Lima" , 0x00D041 }, - { "America/Los_Angeles" , 0x00D0E9 }, - { "America/Louisville" , 0x00D4FA }, - { "America/Maceio" , 0x00D8EF }, - { "America/Managua" , 0x00DA29 }, - { "America/Manaus" , 0x00DADC }, - { "America/Marigot" , 0x00DBDE }, - { "America/Martinique" , 0x00DC33 }, - { "America/Mazatlan" , 0x00DC9F }, - { "America/Mendoza" , 0x00DF0C }, - { "America/Menominee" , 0x00E0C0 }, - { "America/Merida" , 0x00E441 }, - { "America/Mexico_City" , 0x00E67C }, - { "America/Miquelon" , 0x00E8F7 }, - { "America/Moncton" , 0x00EB69 }, - { "America/Monterrey" , 0x00F000 }, - { "America/Montevideo" , 0x00F247 }, - { "America/Montreal" , 0x00F559 }, - { "America/Montserrat" , 0x00FA6F }, - { "America/Nassau" , 0x00FAC4 }, - { "America/New_York" , 0x00FE09 }, - { "America/Nipigon" , 0x010314 }, - { "America/Nome" , 0x010665 }, - { "America/Noronha" , 0x0109E3 }, - { "America/North_Dakota/Center" , 0x010B13 }, - { "America/North_Dakota/New_Salem" , 0x010EA7 }, - { "America/Panama" , 0x011250 }, - { "America/Pangnirtung" , 0x0112A5 }, - { "America/Paramaribo" , 0x0115DB }, - { "America/Phoenix" , 0x01166D }, - { "America/Port-au-Prince" , 0x01171B }, - { "America/Port_of_Spain" , 0x011936 }, - { "America/Porto_Acre" , 0x011837 }, - { "America/Porto_Velho" , 0x01198B }, - { "America/Puerto_Rico" , 0x011A81 }, - { "America/Rainy_River" , 0x011AEC }, - { "America/Rankin_Inlet" , 0x011E24 }, - { "America/Recife" , 0x01210A }, - { "America/Regina" , 0x012234 }, - { "America/Resolute" , 0x0123F2 }, - { "America/Rio_Branco" , 0x0126EB }, - { "America/Rosario" , 0x0127EE }, - { "America/Santarem" , 0x012994 }, - { "America/Santiago" , 0x012A99 }, - { "America/Santo_Domingo" , 0x012E42 }, - { "America/Sao_Paulo" , 0x012F08 }, - { "America/Scoresbysund" , 0x013217 }, - { "America/Shiprock" , 0x013505 }, - { "America/St_Barthelemy" , 0x013894 }, - { "America/St_Johns" , 0x0138E9 }, - { "America/St_Kitts" , 0x013E3C }, - { "America/St_Lucia" , 0x013E91 }, - { "America/St_Thomas" , 0x013EE6 }, - { "America/St_Vincent" , 0x013F3B }, - { "America/Swift_Current" , 0x013F90 }, - { "America/Tegucigalpa" , 0x0140B1 }, - { "America/Thule" , 0x014130 }, - { "America/Thunder_Bay" , 0x014377 }, - { "America/Tijuana" , 0x0146C0 }, - { "America/Toronto" , 0x014A35 }, - { "America/Tortola" , 0x014F4C }, - { "America/Vancouver" , 0x014FA1 }, - { "America/Virgin" , 0x0153DE }, - { "America/Whitehorse" , 0x015433 }, - { "America/Winnipeg" , 0x015750 }, - { "America/Yakutat" , 0x015B90 }, - { "America/Yellowknife" , 0x015EFB }, - { "Antarctica/Casey" , 0x01620B }, - { "Antarctica/Davis" , 0x016291 }, - { "Antarctica/DumontDUrville" , 0x01631B }, - { "Antarctica/Mawson" , 0x0163AD }, - { "Antarctica/McMurdo" , 0x016429 }, - { "Antarctica/Palmer" , 0x01672B }, - { "Antarctica/Rothera" , 0x016A47 }, - { "Antarctica/South_Pole" , 0x016ABD }, - { "Antarctica/Syowa" , 0x016DC5 }, - { "Antarctica/Vostok" , 0x016E33 }, - { "Arctic/Longyearbyen" , 0x016EA8 }, - { "Asia/Aden" , 0x0171DA }, - { "Asia/Almaty" , 0x01722F }, - { "Asia/Amman" , 0x0173AE }, - { "Asia/Anadyr" , 0x01766E }, - { "Asia/Aqtau" , 0x01795C }, - { "Asia/Aqtobe" , 0x017B5B }, - { "Asia/Ashgabat" , 0x017D13 }, - { "Asia/Ashkhabad" , 0x017E30 }, - { "Asia/Baghdad" , 0x017F4D }, - { "Asia/Bahrain" , 0x0180C2 }, - { "Asia/Baku" , 0x018128 }, - { "Asia/Bangkok" , 0x018410 }, - { "Asia/Beirut" , 0x018465 }, - { "Asia/Bishkek" , 0x018772 }, - { "Asia/Brunei" , 0x01891E }, - { "Asia/Calcutta" , 0x018980 }, - { "Asia/Choibalsan" , 0x0189F9 }, - { "Asia/Chongqing" , 0x018B72 }, - { "Asia/Chungking" , 0x018C61 }, - { "Asia/Colombo" , 0x018D10 }, - { "Asia/Dacca" , 0x018DAC }, - { "Asia/Damascus" , 0x018E4D }, - { "Asia/Dhaka" , 0x01919D }, - { "Asia/Dili" , 0x01923E }, - { "Asia/Dubai" , 0x0192C7 }, - { "Asia/Dushanbe" , 0x01931C }, - { "Asia/Gaza" , 0x01941F }, - { "Asia/Harbin" , 0x019768 }, - { "Asia/Ho_Chi_Minh" , 0x01984F }, - { "Asia/Hong_Kong" , 0x0198C7 }, - { "Asia/Hovd" , 0x019A93 }, - { "Asia/Irkutsk" , 0x019C0B }, - { "Asia/Istanbul" , 0x019EF2 }, - { "Asia/Jakarta" , 0x01A2DF }, - { "Asia/Jayapura" , 0x01A389 }, - { "Asia/Jerusalem" , 0x01A40D }, - { "Asia/Kabul" , 0x01A73C }, - { "Asia/Kamchatka" , 0x01A78D }, - { "Asia/Karachi" , 0x01AA72 }, - { "Asia/Kashgar" , 0x01AC3F }, - { "Asia/Kathmandu" , 0x01AD10 }, - { "Asia/Katmandu" , 0x01AD76 }, - { "Asia/Kolkata" , 0x01ADDC }, - { "Asia/Krasnoyarsk" , 0x01AE55 }, - { "Asia/Kuala_Lumpur" , 0x01B13E }, - { "Asia/Kuching" , 0x01B1FB }, - { "Asia/Kuwait" , 0x01B2E9 }, - { "Asia/Macao" , 0x01B33E }, - { "Asia/Macau" , 0x01B479 }, - { "Asia/Magadan" , 0x01B5B4 }, - { "Asia/Makassar" , 0x01B897 }, - { "Asia/Manila" , 0x01B950 }, - { "Asia/Muscat" , 0x01B9D5 }, - { "Asia/Nicosia" , 0x01BA2A }, - { "Asia/Novokuznetsk" , 0x01BD12 }, - { "Asia/Novosibirsk" , 0x01C015 }, - { "Asia/Omsk" , 0x01C309 }, - { "Asia/Oral" , 0x01C5F1 }, - { "Asia/Phnom_Penh" , 0x01C7C1 }, - { "Asia/Pontianak" , 0x01C839 }, - { "Asia/Pyongyang" , 0x01C8FA }, - { "Asia/Qatar" , 0x01C967 }, - { "Asia/Qyzylorda" , 0x01C9CD }, - { "Asia/Rangoon" , 0x01CBA3 }, - { "Asia/Riyadh" , 0x01CC1B }, - { "Asia/Saigon" , 0x01CC70 }, - { "Asia/Sakhalin" , 0x01CCE8 }, - { "Asia/Samarkand" , 0x01CFE8 }, - { "Asia/Seoul" , 0x01D11E }, - { "Asia/Shanghai" , 0x01D1C2 }, - { "Asia/Singapore" , 0x01D2A2 }, - { "Asia/Taipei" , 0x01D359 }, - { "Asia/Tashkent" , 0x01D471 }, - { "Asia/Tbilisi" , 0x01D5A2 }, - { "Asia/Tehran" , 0x01D75C }, - { "Asia/Tel_Aviv" , 0x01D9CA }, - { "Asia/Thimbu" , 0x01DCF9 }, - { "Asia/Thimphu" , 0x01DD5F }, - { "Asia/Tokyo" , 0x01DDC5 }, - { "Asia/Ujung_Pandang" , 0x01DE4E }, - { "Asia/Ulaanbaatar" , 0x01DECA }, - { "Asia/Ulan_Bator" , 0x01E025 }, - { "Asia/Urumqi" , 0x01E172 }, - { "Asia/Vientiane" , 0x01E239 }, - { "Asia/Vladivostok" , 0x01E2B1 }, - { "Asia/Yakutsk" , 0x01E59E }, - { "Asia/Yekaterinburg" , 0x01E884 }, - { "Asia/Yerevan" , 0x01EB90 }, - { "Atlantic/Azores" , 0x01EE94 }, - { "Atlantic/Bermuda" , 0x01F397 }, - { "Atlantic/Canary" , 0x01F678 }, - { "Atlantic/Cape_Verde" , 0x01F94E }, - { "Atlantic/Faeroe" , 0x01F9C7 }, - { "Atlantic/Faroe" , 0x01FC6B }, - { "Atlantic/Jan_Mayen" , 0x01FF0F }, - { "Atlantic/Madeira" , 0x020241 }, - { "Atlantic/Reykjavik" , 0x02074A }, - { "Atlantic/South_Georgia" , 0x020903 }, - { "Atlantic/St_Helena" , 0x020C1B }, - { "Atlantic/Stanley" , 0x020947 }, - { "Australia/ACT" , 0x020C70 }, - { "Australia/Adelaide" , 0x020F8D }, - { "Australia/Brisbane" , 0x0212B9 }, - { "Australia/Broken_Hill" , 0x021380 }, - { "Australia/Canberra" , 0x0216BE }, - { "Australia/Currie" , 0x0219DB }, - { "Australia/Darwin" , 0x021D0E }, - { "Australia/Eucla" , 0x021D94 }, - { "Australia/Hobart" , 0x021E69 }, - { "Australia/LHI" , 0x0221C7 }, - { "Australia/Lindeman" , 0x022462 }, - { "Australia/Lord_Howe" , 0x022543 }, - { "Australia/Melbourne" , 0x0227EE }, - { "Australia/North" , 0x022B13 }, - { "Australia/NSW" , 0x022B87 }, - { "Australia/Perth" , 0x022EA4 }, - { "Australia/Queensland" , 0x022F7C }, - { "Australia/South" , 0x023028 }, - { "Australia/Sydney" , 0x023345 }, - { "Australia/Tasmania" , 0x023682 }, - { "Australia/Victoria" , 0x0239C7 }, - { "Australia/West" , 0x023CE4 }, - { "Australia/Yancowinna" , 0x023D9A }, - { "Brazil/Acre" , 0x0240BC }, - { "Brazil/DeNoronha" , 0x0241BB }, - { "Brazil/East" , 0x0242DB }, - { "Brazil/West" , 0x0245B8 }, - { "Canada/Atlantic" , 0x0246B0 }, - { "Canada/Central" , 0x024B98 }, - { "Canada/East-Saskatchewan" , 0x0254A2 }, - { "Canada/Eastern" , 0x024FB2 }, - { "Canada/Mountain" , 0x02562B }, - { "Canada/Newfoundland" , 0x0259A1 }, - { "Canada/Pacific" , 0x025ECC }, - { "Canada/Saskatchewan" , 0x0262E5 }, - { "Canada/Yukon" , 0x02646E }, - { "CET" , 0x026771 }, - { "Chile/Continental" , 0x026A7A }, - { "Chile/EasterIsland" , 0x026E15 }, - { "CST6CDT" , 0x027157 }, - { "Cuba" , 0x0274A8 }, - { "EET" , 0x02781B }, - { "Egypt" , 0x027ACE }, - { "Eire" , 0x027E95 }, - { "EST" , 0x0283A6 }, - { "EST5EDT" , 0x0283EA }, - { "Etc/GMT" , 0x02873B }, - { "Etc/GMT+0" , 0x028807 }, - { "Etc/GMT+1" , 0x028891 }, - { "Etc/GMT+10" , 0x02891E }, - { "Etc/GMT+11" , 0x0289AC }, - { "Etc/GMT+12" , 0x028A3A }, - { "Etc/GMT+2" , 0x028B55 }, - { "Etc/GMT+3" , 0x028BE1 }, - { "Etc/GMT+4" , 0x028C6D }, - { "Etc/GMT+5" , 0x028CF9 }, - { "Etc/GMT+6" , 0x028D85 }, - { "Etc/GMT+7" , 0x028E11 }, - { "Etc/GMT+8" , 0x028E9D }, - { "Etc/GMT+9" , 0x028F29 }, - { "Etc/GMT-0" , 0x0287C3 }, - { "Etc/GMT-1" , 0x02884B }, - { "Etc/GMT-10" , 0x0288D7 }, - { "Etc/GMT-11" , 0x028965 }, - { "Etc/GMT-12" , 0x0289F3 }, - { "Etc/GMT-13" , 0x028A81 }, - { "Etc/GMT-14" , 0x028AC8 }, - { "Etc/GMT-2" , 0x028B0F }, - { "Etc/GMT-3" , 0x028B9B }, - { "Etc/GMT-4" , 0x028C27 }, - { "Etc/GMT-5" , 0x028CB3 }, - { "Etc/GMT-6" , 0x028D3F }, - { "Etc/GMT-7" , 0x028DCB }, - { "Etc/GMT-8" , 0x028E57 }, - { "Etc/GMT-9" , 0x028EE3 }, - { "Etc/GMT0" , 0x02877F }, - { "Etc/Greenwich" , 0x028F6F }, - { "Etc/UCT" , 0x028FB3 }, - { "Etc/Universal" , 0x028FF7 }, - { "Etc/UTC" , 0x02903B }, - { "Etc/Zulu" , 0x02907F }, - { "Europe/Amsterdam" , 0x0290C3 }, - { "Europe/Andorra" , 0x029501 }, - { "Europe/Athens" , 0x02977D }, - { "Europe/Belfast" , 0x029AC0 }, - { "Europe/Belgrade" , 0x029FF7 }, - { "Europe/Berlin" , 0x02A2C0 }, - { "Europe/Bratislava" , 0x02A616 }, - { "Europe/Brussels" , 0x02A948 }, - { "Europe/Bucharest" , 0x02AD7F }, - { "Europe/Budapest" , 0x02B0A9 }, - { "Europe/Chisinau" , 0x02B41C }, - { "Europe/Copenhagen" , 0x02B7AA }, - { "Europe/Dublin" , 0x02BAB4 }, - { "Europe/Gibraltar" , 0x02BFC5 }, - { "Europe/Guernsey" , 0x02C41C }, - { "Europe/Helsinki" , 0x02C953 }, - { "Europe/Isle_of_Man" , 0x02CC09 }, - { "Europe/Istanbul" , 0x02D140 }, - { "Europe/Jersey" , 0x02D52D }, - { "Europe/Kaliningrad" , 0x02DA64 }, - { "Europe/Kiev" , 0x02DDC7 }, - { "Europe/Lisbon" , 0x02E0DE }, - { "Europe/Ljubljana" , 0x02E5E2 }, - { "Europe/London" , 0x02E8AB }, - { "Europe/Luxembourg" , 0x02EDE2 }, - { "Europe/Madrid" , 0x02F238 }, - { "Europe/Malta" , 0x02F5FE }, - { "Europe/Mariehamn" , 0x02F9B7 }, - { "Europe/Minsk" , 0x02FC6D }, - { "Europe/Monaco" , 0x02FF78 }, - { "Europe/Moscow" , 0x0303B3 }, - { "Europe/Nicosia" , 0x030705 }, - { "Europe/Oslo" , 0x0309ED }, - { "Europe/Paris" , 0x030D1F }, - { "Europe/Podgorica" , 0x031165 }, - { "Europe/Prague" , 0x03142E }, - { "Europe/Riga" , 0x031760 }, - { "Europe/Rome" , 0x031AA5 }, - { "Europe/Samara" , 0x031E68 }, - { "Europe/San_Marino" , 0x032194 }, - { "Europe/Sarajevo" , 0x032557 }, - { "Europe/Simferopol" , 0x032820 }, - { "Europe/Skopje" , 0x032B4B }, - { "Europe/Sofia" , 0x032E14 }, - { "Europe/Stockholm" , 0x03311C }, - { "Europe/Tallinn" , 0x0333CB }, - { "Europe/Tirane" , 0x033705 }, - { "Europe/Tiraspol" , 0x033A0B }, - { "Europe/Uzhgorod" , 0x033D99 }, - { "Europe/Vaduz" , 0x0340B0 }, - { "Europe/Vatican" , 0x034343 }, - { "Europe/Vienna" , 0x034706 }, - { "Europe/Vilnius" , 0x034A33 }, - { "Europe/Volgograd" , 0x034D72 }, - { "Europe/Warsaw" , 0x03507B }, - { "Europe/Zagreb" , 0x03545C }, - { "Europe/Zaporozhye" , 0x035725 }, - { "Europe/Zurich" , 0x035A66 }, - { "Factory" , 0x035D15 }, - { "GB" , 0x035D86 }, - { "GB-Eire" , 0x0362BD }, - { "GMT" , 0x0367F4 }, - { "GMT+0" , 0x0368C0 }, - { "GMT-0" , 0x03687C }, - { "GMT0" , 0x036838 }, - { "Greenwich" , 0x036904 }, - { "Hongkong" , 0x036948 }, - { "HST" , 0x036B14 }, - { "Iceland" , 0x036B58 }, - { "Indian/Antananarivo" , 0x036D11 }, - { "Indian/Chagos" , 0x036D85 }, - { "Indian/Christmas" , 0x036DE7 }, - { "Indian/Cocos" , 0x036E2B }, - { "Indian/Comoro" , 0x036E6F }, - { "Indian/Kerguelen" , 0x036EC4 }, - { "Indian/Mahe" , 0x036F19 }, - { "Indian/Maldives" , 0x036F6E }, - { "Indian/Mauritius" , 0x036FC3 }, - { "Indian/Mayotte" , 0x037039 }, - { "Indian/Reunion" , 0x03708E }, - { "Iran" , 0x0370E3 }, - { "Israel" , 0x037351 }, - { "Jamaica" , 0x037680 }, - { "Japan" , 0x037745 }, - { "Kwajalein" , 0x0377CE }, - { "Libya" , 0x037831 }, - { "MET" , 0x03792B }, - { "Mexico/BajaNorte" , 0x037C34 }, - { "Mexico/BajaSur" , 0x037F9D }, - { "Mexico/General" , 0x0381E2 }, - { "MST" , 0x038440 }, - { "MST7MDT" , 0x038484 }, - { "Navajo" , 0x0387D5 }, - { "NZ" , 0x038B4E }, - { "NZ-CHAT" , 0x038ECC }, - { "Pacific/Apia" , 0x0391B4 }, - { "Pacific/Auckland" , 0x039232 }, - { "Pacific/Chatham" , 0x0395BE }, - { "Pacific/Easter" , 0x0398B5 }, - { "Pacific/Efate" , 0x039C13 }, - { "Pacific/Enderbury" , 0x039CD9 }, - { "Pacific/Fakaofo" , 0x039D47 }, - { "Pacific/Fiji" , 0x039D8B }, - { "Pacific/Funafuti" , 0x039E01 }, - { "Pacific/Galapagos" , 0x039E45 }, - { "Pacific/Gambier" , 0x039EBD }, - { "Pacific/Guadalcanal" , 0x039F22 }, - { "Pacific/Guam" , 0x039F77 }, - { "Pacific/Honolulu" , 0x039FCD }, - { "Pacific/Johnston" , 0x03A061 }, - { "Pacific/Kiritimati" , 0x03A0B3 }, - { "Pacific/Kosrae" , 0x03A11E }, - { "Pacific/Kwajalein" , 0x03A17B }, - { "Pacific/Majuro" , 0x03A1E7 }, - { "Pacific/Marquesas" , 0x03A246 }, - { "Pacific/Midway" , 0x03A2AD }, - { "Pacific/Nauru" , 0x03A337 }, - { "Pacific/Niue" , 0x03A3AF }, - { "Pacific/Norfolk" , 0x03A40D }, - { "Pacific/Noumea" , 0x03A462 }, - { "Pacific/Pago_Pago" , 0x03A4F2 }, - { "Pacific/Palau" , 0x03A57B }, - { "Pacific/Pitcairn" , 0x03A5BF }, - { "Pacific/Ponape" , 0x03A614 }, - { "Pacific/Port_Moresby" , 0x03A669 }, - { "Pacific/Rarotonga" , 0x03A6AD }, - { "Pacific/Saipan" , 0x03A789 }, - { "Pacific/Samoa" , 0x03A7EC }, - { "Pacific/Tahiti" , 0x03A875 }, - { "Pacific/Tarawa" , 0x03A8DA }, - { "Pacific/Tongatapu" , 0x03A92E }, - { "Pacific/Truk" , 0x03A9BA }, - { "Pacific/Wake" , 0x03AA13 }, - { "Pacific/Wallis" , 0x03AA63 }, - { "Pacific/Yap" , 0x03AAA7 }, - { "Poland" , 0x03AAEC }, - { "Portugal" , 0x03AECD }, - { "PRC" , 0x03B3C9 }, - { "PST8PDT" , 0x03B47A }, - { "ROC" , 0x03B7CB }, - { "ROK" , 0x03B8E3 }, - { "Singapore" , 0x03B987 }, - { "Turkey" , 0x03BA3E }, - { "UCT" , 0x03BE2B }, - { "Universal" , 0x03BE6F }, - { "US/Alaska" , 0x03BEB3 }, - { "US/Aleutian" , 0x03C21C }, - { "US/Arizona" , 0x03C582 }, - { "US/Central" , 0x03C610 }, - { "US/East-Indiana" , 0x03D01A }, - { "US/Eastern" , 0x03CB1B }, - { "US/Hawaii" , 0x03D284 }, - { "US/Indiana-Starke" , 0x03D312 }, - { "US/Michigan" , 0x03D683 }, - { "US/Mountain" , 0x03D9BA }, - { "US/Pacific" , 0x03DD33 }, - { "US/Pacific-New" , 0x03E138 }, - { "US/Samoa" , 0x03E53D }, - { "UTC" , 0x03E5C6 }, - { "W-SU" , 0x03E8BD }, - { "WET" , 0x03E60A }, - { "Zulu" , 0x03EBF8 }, + { "America/Coral_Harbour" , 0x006795 }, + { "America/Cordoba" , 0x006827 }, + { "America/Costa_Rica" , 0x0069CD }, + { "America/Cuiaba" , 0x006A57 }, + { "America/Curacao" , 0x006D35 }, + { "America/Danmarkshavn" , 0x006D9B }, + { "America/Dawson" , 0x006EDF }, + { "America/Dawson_Creek" , 0x0071FC }, + { "America/Denver" , 0x0073D6 }, + { "America/Detroit" , 0x00775C }, + { "America/Dominica" , 0x007ABB }, + { "America/Edmonton" , 0x007B10 }, + { "America/Eirunepe" , 0x007EC8 }, + { "America/El_Salvador" , 0x007FDB }, + { "America/Ensenada" , 0x008050 }, + { "America/Fort_Wayne" , 0x0084F7 }, + { "America/Fortaleza" , 0x0083B9 }, + { "America/Glace_Bay" , 0x008761 }, + { "America/Godthab" , 0x008AD8 }, + { "America/Goose_Bay" , 0x008D9C }, + { "America/Grand_Turk" , 0x009259 }, + { "America/Grenada" , 0x009508 }, + { "America/Guadeloupe" , 0x00955D }, + { "America/Guatemala" , 0x0095B2 }, + { "America/Guayaquil" , 0x00963B }, + { "America/Guyana" , 0x009698 }, + { "America/Halifax" , 0x009719 }, + { "America/Havana" , 0x009C2F }, + { "America/Hermosillo" , 0x009FA2 }, + { "America/Indiana/Indianapolis" , 0x00A080 }, + { "America/Indiana/Knox" , 0x00A311 }, + { "America/Indiana/Marengo" , 0x00A6A8 }, + { "America/Indiana/Petersburg" , 0x00A94E }, + { "America/Indiana/Tell_City" , 0x00AE9B }, + { "America/Indiana/Vevay" , 0x00B134 }, + { "America/Indiana/Vincennes" , 0x00B36F }, + { "America/Indiana/Winamac" , 0x00B623 }, + { "America/Indianapolis" , 0x00AC31 }, + { "America/Inuvik" , 0x00B8DC }, + { "America/Iqaluit" , 0x00BBD3 }, + { "America/Jamaica" , 0x00BEF5 }, + { "America/Jujuy" , 0x00BFBA }, + { "America/Juneau" , 0x00C164 }, + { "America/Kentucky/Louisville" , 0x00C4E2 }, + { "America/Kentucky/Monticello" , 0x00C900 }, + { "America/Knox_IN" , 0x00CC85 }, + { "America/La_Paz" , 0x00CFF6 }, + { "America/Lima" , 0x00D05D }, + { "America/Los_Angeles" , 0x00D105 }, + { "America/Louisville" , 0x00D516 }, + { "America/Maceio" , 0x00D90B }, + { "America/Managua" , 0x00DA45 }, + { "America/Manaus" , 0x00DAF8 }, + { "America/Marigot" , 0x00DBFA }, + { "America/Martinique" , 0x00DC4F }, + { "America/Matamoros" , 0x00DCBB }, + { "America/Mazatlan" , 0x00DF14 }, + { "America/Mendoza" , 0x00E181 }, + { "America/Menominee" , 0x00E335 }, + { "America/Merida" , 0x00E6B6 }, + { "America/Mexico_City" , 0x00E8F1 }, + { "America/Miquelon" , 0x00EB6C }, + { "America/Moncton" , 0x00EDDE }, + { "America/Monterrey" , 0x00F275 }, + { "America/Montevideo" , 0x00F4D8 }, + { "America/Montreal" , 0x00F7EA }, + { "America/Montserrat" , 0x00FD00 }, + { "America/Nassau" , 0x00FD55 }, + { "America/New_York" , 0x01009A }, + { "America/Nipigon" , 0x0105A5 }, + { "America/Nome" , 0x0108F6 }, + { "America/Noronha" , 0x010C74 }, + { "America/North_Dakota/Center" , 0x010DA4 }, + { "America/North_Dakota/New_Salem" , 0x011138 }, + { "America/Ojinaga" , 0x0114E1 }, + { "America/Panama" , 0x011742 }, + { "America/Pangnirtung" , 0x011797 }, + { "America/Paramaribo" , 0x011ACD }, + { "America/Phoenix" , 0x011B5F }, + { "America/Port-au-Prince" , 0x011C0D }, + { "America/Port_of_Spain" , 0x011E28 }, + { "America/Porto_Acre" , 0x011D29 }, + { "America/Porto_Velho" , 0x011E7D }, + { "America/Puerto_Rico" , 0x011F73 }, + { "America/Rainy_River" , 0x011FDE }, + { "America/Rankin_Inlet" , 0x012316 }, + { "America/Recife" , 0x0125FC }, + { "America/Regina" , 0x012726 }, + { "America/Resolute" , 0x0128E4 }, + { "America/Rio_Branco" , 0x012BDD }, + { "America/Rosario" , 0x012CE0 }, + { "America/Santa_Isabel" , 0x012E86 }, + { "America/Santarem" , 0x013229 }, + { "America/Santiago" , 0x01332E }, + { "America/Santo_Domingo" , 0x0136D7 }, + { "America/Sao_Paulo" , 0x01379D }, + { "America/Scoresbysund" , 0x013AAC }, + { "America/Shiprock" , 0x013D9A }, + { "America/St_Barthelemy" , 0x014129 }, + { "America/St_Johns" , 0x01417E }, + { "America/St_Kitts" , 0x0146D1 }, + { "America/St_Lucia" , 0x014726 }, + { "America/St_Thomas" , 0x01477B }, + { "America/St_Vincent" , 0x0147D0 }, + { "America/Swift_Current" , 0x014825 }, + { "America/Tegucigalpa" , 0x014946 }, + { "America/Thule" , 0x0149C5 }, + { "America/Thunder_Bay" , 0x014C0C }, + { "America/Tijuana" , 0x014F55 }, + { "America/Toronto" , 0x0152EE }, + { "America/Tortola" , 0x015805 }, + { "America/Vancouver" , 0x01585A }, + { "America/Virgin" , 0x015C97 }, + { "America/Whitehorse" , 0x015CEC }, + { "America/Winnipeg" , 0x016009 }, + { "America/Yakutat" , 0x016449 }, + { "America/Yellowknife" , 0x0167B4 }, + { "Antarctica/Casey" , 0x016AC4 }, + { "Antarctica/Davis" , 0x016B4A }, + { "Antarctica/DumontDUrville" , 0x016BD4 }, + { "Antarctica/Mawson" , 0x016C66 }, + { "Antarctica/McMurdo" , 0x016CE2 }, + { "Antarctica/Palmer" , 0x016FE4 }, + { "Antarctica/Rothera" , 0x017300 }, + { "Antarctica/South_Pole" , 0x017376 }, + { "Antarctica/Syowa" , 0x01767E }, + { "Antarctica/Vostok" , 0x0176EC }, + { "Arctic/Longyearbyen" , 0x017761 }, + { "Asia/Aden" , 0x017A93 }, + { "Asia/Almaty" , 0x017AE8 }, + { "Asia/Amman" , 0x017C67 }, + { "Asia/Anadyr" , 0x017F27 }, + { "Asia/Aqtau" , 0x018215 }, + { "Asia/Aqtobe" , 0x018414 }, + { "Asia/Ashgabat" , 0x0185CC }, + { "Asia/Ashkhabad" , 0x0186E9 }, + { "Asia/Baghdad" , 0x018806 }, + { "Asia/Bahrain" , 0x01897B }, + { "Asia/Baku" , 0x0189E1 }, + { "Asia/Bangkok" , 0x018CC9 }, + { "Asia/Beirut" , 0x018D1E }, + { "Asia/Bishkek" , 0x01902B }, + { "Asia/Brunei" , 0x0191D7 }, + { "Asia/Calcutta" , 0x019239 }, + { "Asia/Choibalsan" , 0x0192B2 }, + { "Asia/Chongqing" , 0x01942B }, + { "Asia/Chungking" , 0x01951A }, + { "Asia/Colombo" , 0x0195C9 }, + { "Asia/Dacca" , 0x019665 }, + { "Asia/Damascus" , 0x019823 }, + { "Asia/Dhaka" , 0x019B73 }, + { "Asia/Dili" , 0x019D31 }, + { "Asia/Dubai" , 0x019DBA }, + { "Asia/Dushanbe" , 0x019E0F }, + { "Asia/Gaza" , 0x019F12 }, + { "Asia/Harbin" , 0x01A25B }, + { "Asia/Ho_Chi_Minh" , 0x01A342 }, + { "Asia/Hong_Kong" , 0x01A3BA }, + { "Asia/Hovd" , 0x01A586 }, + { "Asia/Irkutsk" , 0x01A6FE }, + { "Asia/Istanbul" , 0x01A9E5 }, + { "Asia/Jakarta" , 0x01ADD2 }, + { "Asia/Jayapura" , 0x01AE7C }, + { "Asia/Jerusalem" , 0x01AF00 }, + { "Asia/Kabul" , 0x01B22F }, + { "Asia/Kamchatka" , 0x01B280 }, + { "Asia/Karachi" , 0x01B565 }, + { "Asia/Kashgar" , 0x01B732 }, + { "Asia/Kathmandu" , 0x01B803 }, + { "Asia/Katmandu" , 0x01B869 }, + { "Asia/Kolkata" , 0x01B8CF }, + { "Asia/Krasnoyarsk" , 0x01B948 }, + { "Asia/Kuala_Lumpur" , 0x01BC31 }, + { "Asia/Kuching" , 0x01BCEE }, + { "Asia/Kuwait" , 0x01BDDC }, + { "Asia/Macao" , 0x01BE31 }, + { "Asia/Macau" , 0x01BF6C }, + { "Asia/Magadan" , 0x01C0A7 }, + { "Asia/Makassar" , 0x01C38A }, + { "Asia/Manila" , 0x01C443 }, + { "Asia/Muscat" , 0x01C4C8 }, + { "Asia/Nicosia" , 0x01C51D }, + { "Asia/Novokuznetsk" , 0x01C805 }, + { "Asia/Novosibirsk" , 0x01CB08 }, + { "Asia/Omsk" , 0x01CDFC }, + { "Asia/Oral" , 0x01D0E4 }, + { "Asia/Phnom_Penh" , 0x01D2B4 }, + { "Asia/Pontianak" , 0x01D32C }, + { "Asia/Pyongyang" , 0x01D3ED }, + { "Asia/Qatar" , 0x01D45A }, + { "Asia/Qyzylorda" , 0x01D4C0 }, + { "Asia/Rangoon" , 0x01D696 }, + { "Asia/Riyadh" , 0x01D70E }, + { "Asia/Saigon" , 0x01D763 }, + { "Asia/Sakhalin" , 0x01D7DB }, + { "Asia/Samarkand" , 0x01DADB }, + { "Asia/Seoul" , 0x01DC11 }, + { "Asia/Shanghai" , 0x01DCB5 }, + { "Asia/Singapore" , 0x01DD95 }, + { "Asia/Taipei" , 0x01DE4C }, + { "Asia/Tashkent" , 0x01DF64 }, + { "Asia/Tbilisi" , 0x01E095 }, + { "Asia/Tehran" , 0x01E24F }, + { "Asia/Tel_Aviv" , 0x01E4BD }, + { "Asia/Thimbu" , 0x01E7EC }, + { "Asia/Thimphu" , 0x01E852 }, + { "Asia/Tokyo" , 0x01E8B8 }, + { "Asia/Ujung_Pandang" , 0x01E941 }, + { "Asia/Ulaanbaatar" , 0x01E9BD }, + { "Asia/Ulan_Bator" , 0x01EB18 }, + { "Asia/Urumqi" , 0x01EC65 }, + { "Asia/Vientiane" , 0x01ED2C }, + { "Asia/Vladivostok" , 0x01EDA4 }, + { "Asia/Yakutsk" , 0x01F091 }, + { "Asia/Yekaterinburg" , 0x01F377 }, + { "Asia/Yerevan" , 0x01F683 }, + { "Atlantic/Azores" , 0x01F987 }, + { "Atlantic/Bermuda" , 0x01FE8A }, + { "Atlantic/Canary" , 0x02016B }, + { "Atlantic/Cape_Verde" , 0x020441 }, + { "Atlantic/Faeroe" , 0x0204BA }, + { "Atlantic/Faroe" , 0x02075E }, + { "Atlantic/Jan_Mayen" , 0x020A02 }, + { "Atlantic/Madeira" , 0x020D34 }, + { "Atlantic/Reykjavik" , 0x02123D }, + { "Atlantic/South_Georgia" , 0x0213F6 }, + { "Atlantic/St_Helena" , 0x02170E }, + { "Atlantic/Stanley" , 0x02143A }, + { "Australia/ACT" , 0x021763 }, + { "Australia/Adelaide" , 0x021A80 }, + { "Australia/Brisbane" , 0x021DAC }, + { "Australia/Broken_Hill" , 0x021E73 }, + { "Australia/Canberra" , 0x0221B1 }, + { "Australia/Currie" , 0x0224CE }, + { "Australia/Darwin" , 0x022801 }, + { "Australia/Eucla" , 0x022887 }, + { "Australia/Hobart" , 0x02295C }, + { "Australia/LHI" , 0x022CBA }, + { "Australia/Lindeman" , 0x022F55 }, + { "Australia/Lord_Howe" , 0x023036 }, + { "Australia/Melbourne" , 0x0232E1 }, + { "Australia/North" , 0x023606 }, + { "Australia/NSW" , 0x02367A }, + { "Australia/Perth" , 0x023997 }, + { "Australia/Queensland" , 0x023A6F }, + { "Australia/South" , 0x023B1B }, + { "Australia/Sydney" , 0x023E38 }, + { "Australia/Tasmania" , 0x024175 }, + { "Australia/Victoria" , 0x0244BA }, + { "Australia/West" , 0x0247D7 }, + { "Australia/Yancowinna" , 0x02488D }, + { "Brazil/Acre" , 0x024BAF }, + { "Brazil/DeNoronha" , 0x024CAE }, + { "Brazil/East" , 0x024DCE }, + { "Brazil/West" , 0x0250AB }, + { "Canada/Atlantic" , 0x0251A3 }, + { "Canada/Central" , 0x02568B }, + { "Canada/East-Saskatchewan" , 0x025F95 }, + { "Canada/Eastern" , 0x025AA5 }, + { "Canada/Mountain" , 0x02611E }, + { "Canada/Newfoundland" , 0x026494 }, + { "Canada/Pacific" , 0x0269BF }, + { "Canada/Saskatchewan" , 0x026DD8 }, + { "Canada/Yukon" , 0x026F61 }, + { "CET" , 0x027264 }, + { "Chile/Continental" , 0x02756D }, + { "Chile/EasterIsland" , 0x027908 }, + { "CST6CDT" , 0x027C4A }, + { "Cuba" , 0x027F9B }, + { "EET" , 0x02830E }, + { "Egypt" , 0x0285C1 }, + { "Eire" , 0x028988 }, + { "EST" , 0x028E99 }, + { "EST5EDT" , 0x028EDD }, + { "Etc/GMT" , 0x02922E }, + { "Etc/GMT+0" , 0x0292FA }, + { "Etc/GMT+1" , 0x029384 }, + { "Etc/GMT+10" , 0x029411 }, + { "Etc/GMT+11" , 0x02949F }, + { "Etc/GMT+12" , 0x02952D }, + { "Etc/GMT+2" , 0x029648 }, + { "Etc/GMT+3" , 0x0296D4 }, + { "Etc/GMT+4" , 0x029760 }, + { "Etc/GMT+5" , 0x0297EC }, + { "Etc/GMT+6" , 0x029878 }, + { "Etc/GMT+7" , 0x029904 }, + { "Etc/GMT+8" , 0x029990 }, + { "Etc/GMT+9" , 0x029A1C }, + { "Etc/GMT-0" , 0x0292B6 }, + { "Etc/GMT-1" , 0x02933E }, + { "Etc/GMT-10" , 0x0293CA }, + { "Etc/GMT-11" , 0x029458 }, + { "Etc/GMT-12" , 0x0294E6 }, + { "Etc/GMT-13" , 0x029574 }, + { "Etc/GMT-14" , 0x0295BB }, + { "Etc/GMT-2" , 0x029602 }, + { "Etc/GMT-3" , 0x02968E }, + { "Etc/GMT-4" , 0x02971A }, + { "Etc/GMT-5" , 0x0297A6 }, + { "Etc/GMT-6" , 0x029832 }, + { "Etc/GMT-7" , 0x0298BE }, + { "Etc/GMT-8" , 0x02994A }, + { "Etc/GMT-9" , 0x0299D6 }, + { "Etc/GMT0" , 0x029272 }, + { "Etc/Greenwich" , 0x029A62 }, + { "Etc/UCT" , 0x029AA6 }, + { "Etc/Universal" , 0x029AEA }, + { "Etc/UTC" , 0x029B2E }, + { "Etc/Zulu" , 0x029B72 }, + { "Europe/Amsterdam" , 0x029BB6 }, + { "Europe/Andorra" , 0x029FF4 }, + { "Europe/Athens" , 0x02A270 }, + { "Europe/Belfast" , 0x02A5B3 }, + { "Europe/Belgrade" , 0x02AAEA }, + { "Europe/Berlin" , 0x02ADB3 }, + { "Europe/Bratislava" , 0x02B109 }, + { "Europe/Brussels" , 0x02B43B }, + { "Europe/Bucharest" , 0x02B872 }, + { "Europe/Budapest" , 0x02BB9C }, + { "Europe/Chisinau" , 0x02BF0F }, + { "Europe/Copenhagen" , 0x02C29D }, + { "Europe/Dublin" , 0x02C5A7 }, + { "Europe/Gibraltar" , 0x02CAB8 }, + { "Europe/Guernsey" , 0x02CF0F }, + { "Europe/Helsinki" , 0x02D446 }, + { "Europe/Isle_of_Man" , 0x02D6FC }, + { "Europe/Istanbul" , 0x02DC33 }, + { "Europe/Jersey" , 0x02E020 }, + { "Europe/Kaliningrad" , 0x02E557 }, + { "Europe/Kiev" , 0x02E8BA }, + { "Europe/Lisbon" , 0x02EBD1 }, + { "Europe/Ljubljana" , 0x02F0D5 }, + { "Europe/London" , 0x02F39E }, + { "Europe/Luxembourg" , 0x02F8D5 }, + { "Europe/Madrid" , 0x02FD2B }, + { "Europe/Malta" , 0x0300F1 }, + { "Europe/Mariehamn" , 0x0304AA }, + { "Europe/Minsk" , 0x030760 }, + { "Europe/Monaco" , 0x030A6B }, + { "Europe/Moscow" , 0x030EA6 }, + { "Europe/Nicosia" , 0x0311F8 }, + { "Europe/Oslo" , 0x0314E0 }, + { "Europe/Paris" , 0x031812 }, + { "Europe/Podgorica" , 0x031C58 }, + { "Europe/Prague" , 0x031F21 }, + { "Europe/Riga" , 0x032253 }, + { "Europe/Rome" , 0x032598 }, + { "Europe/Samara" , 0x03295B }, + { "Europe/San_Marino" , 0x032C87 }, + { "Europe/Sarajevo" , 0x03304A }, + { "Europe/Simferopol" , 0x033313 }, + { "Europe/Skopje" , 0x03363E }, + { "Europe/Sofia" , 0x033907 }, + { "Europe/Stockholm" , 0x033C0F }, + { "Europe/Tallinn" , 0x033EBE }, + { "Europe/Tirane" , 0x0341F8 }, + { "Europe/Tiraspol" , 0x0344FE }, + { "Europe/Uzhgorod" , 0x03488C }, + { "Europe/Vaduz" , 0x034BA3 }, + { "Europe/Vatican" , 0x034E36 }, + { "Europe/Vienna" , 0x0351F9 }, + { "Europe/Vilnius" , 0x035526 }, + { "Europe/Volgograd" , 0x035865 }, + { "Europe/Warsaw" , 0x035B6E }, + { "Europe/Zagreb" , 0x035F4F }, + { "Europe/Zaporozhye" , 0x036218 }, + { "Europe/Zurich" , 0x036559 }, + { "Factory" , 0x036808 }, + { "GB" , 0x036879 }, + { "GB-Eire" , 0x036DB0 }, + { "GMT" , 0x0372E7 }, + { "GMT+0" , 0x0373B3 }, + { "GMT-0" , 0x03736F }, + { "GMT0" , 0x03732B }, + { "Greenwich" , 0x0373F7 }, + { "Hongkong" , 0x03743B }, + { "HST" , 0x037607 }, + { "Iceland" , 0x03764B }, + { "Indian/Antananarivo" , 0x037804 }, + { "Indian/Chagos" , 0x037878 }, + { "Indian/Christmas" , 0x0378DA }, + { "Indian/Cocos" , 0x03791E }, + { "Indian/Comoro" , 0x037962 }, + { "Indian/Kerguelen" , 0x0379B7 }, + { "Indian/Mahe" , 0x037A0C }, + { "Indian/Maldives" , 0x037A61 }, + { "Indian/Mauritius" , 0x037AB6 }, + { "Indian/Mayotte" , 0x037B2C }, + { "Indian/Reunion" , 0x037B81 }, + { "Iran" , 0x037BD6 }, + { "Israel" , 0x037E44 }, + { "Jamaica" , 0x038173 }, + { "Japan" , 0x038238 }, + { "Kwajalein" , 0x0382C1 }, + { "Libya" , 0x038324 }, + { "MET" , 0x03841E }, + { "Mexico/BajaNorte" , 0x038727 }, + { "Mexico/BajaSur" , 0x038A90 }, + { "Mexico/General" , 0x038CD5 }, + { "MST" , 0x038F33 }, + { "MST7MDT" , 0x038F77 }, + { "Navajo" , 0x0392C8 }, + { "NZ" , 0x039641 }, + { "NZ-CHAT" , 0x0399BF }, + { "Pacific/Apia" , 0x039CA7 }, + { "Pacific/Auckland" , 0x039D25 }, + { "Pacific/Chatham" , 0x03A0B1 }, + { "Pacific/Easter" , 0x03A3A8 }, + { "Pacific/Efate" , 0x03A706 }, + { "Pacific/Enderbury" , 0x03A7CC }, + { "Pacific/Fakaofo" , 0x03A83A }, + { "Pacific/Fiji" , 0x03A87E }, + { "Pacific/Funafuti" , 0x03A8FE }, + { "Pacific/Galapagos" , 0x03A942 }, + { "Pacific/Gambier" , 0x03A9BA }, + { "Pacific/Guadalcanal" , 0x03AA1F }, + { "Pacific/Guam" , 0x03AA74 }, + { "Pacific/Honolulu" , 0x03AACA }, + { "Pacific/Johnston" , 0x03AB5E }, + { "Pacific/Kiritimati" , 0x03ABB0 }, + { "Pacific/Kosrae" , 0x03AC1B }, + { "Pacific/Kwajalein" , 0x03AC78 }, + { "Pacific/Majuro" , 0x03ACE4 }, + { "Pacific/Marquesas" , 0x03AD43 }, + { "Pacific/Midway" , 0x03ADAA }, + { "Pacific/Nauru" , 0x03AE34 }, + { "Pacific/Niue" , 0x03AEAC }, + { "Pacific/Norfolk" , 0x03AF0A }, + { "Pacific/Noumea" , 0x03AF5F }, + { "Pacific/Pago_Pago" , 0x03AFEF }, + { "Pacific/Palau" , 0x03B078 }, + { "Pacific/Pitcairn" , 0x03B0BC }, + { "Pacific/Ponape" , 0x03B111 }, + { "Pacific/Port_Moresby" , 0x03B166 }, + { "Pacific/Rarotonga" , 0x03B1AA }, + { "Pacific/Saipan" , 0x03B286 }, + { "Pacific/Samoa" , 0x03B2E9 }, + { "Pacific/Tahiti" , 0x03B372 }, + { "Pacific/Tarawa" , 0x03B3D7 }, + { "Pacific/Tongatapu" , 0x03B42B }, + { "Pacific/Truk" , 0x03B4B7 }, + { "Pacific/Wake" , 0x03B510 }, + { "Pacific/Wallis" , 0x03B560 }, + { "Pacific/Yap" , 0x03B5A4 }, + { "Poland" , 0x03B5E9 }, + { "Portugal" , 0x03B9CA }, + { "PRC" , 0x03BEC6 }, + { "PST8PDT" , 0x03BF77 }, + { "ROC" , 0x03C2C8 }, + { "ROK" , 0x03C3E0 }, + { "Singapore" , 0x03C484 }, + { "Turkey" , 0x03C53B }, + { "UCT" , 0x03C928 }, + { "Universal" , 0x03C96C }, + { "US/Alaska" , 0x03C9B0 }, + { "US/Aleutian" , 0x03CD19 }, + { "US/Arizona" , 0x03D07F }, + { "US/Central" , 0x03D10D }, + { "US/East-Indiana" , 0x03DB17 }, + { "US/Eastern" , 0x03D618 }, + { "US/Hawaii" , 0x03DD81 }, + { "US/Indiana-Starke" , 0x03DE0F }, + { "US/Michigan" , 0x03E180 }, + { "US/Mountain" , 0x03E4B7 }, + { "US/Pacific" , 0x03E830 }, + { "US/Pacific-New" , 0x03EC35 }, + { "US/Samoa" , 0x03F03A }, + { "UTC" , 0x03F0C3 }, + { "W-SU" , 0x03F3BA }, + { "WET" , 0x03F107 }, + { "Zulu" , 0x03F6F5 }, }; /* This is a generated file, do not modify */ -const unsigned char timelib_timezone_db_data_builtin[257084] = { +const unsigned char timelib_timezone_db_data_builtin[259897] = { /* Africa/Abidjan */ @@ -1822,21 +1825,21 @@ const unsigned char timelib_timezone_db_data_builtin[257084] = { 0x3D, 0x71, 0x90, 0xC0, 0x3E, 0x8F, 0x98, 0x30, 0x3F, 0x5A, 0xAD, 0x40, 0x40, 0x6F, 0x7A, 0x30, 0x41, 0x71, 0xEE, 0x40, 0x42, 0x33, 0xAC, 0xB0, 0x43, 0x51, 0xD0, 0x40, 0x44, 0x13, 0x8E, 0xB0, 0x45, 0x31, 0xB2, 0x40, 0x45, 0xF3, 0x70, 0xB0, 0x47, 0x1A, 0xCE, 0xC0, 0x47, 0xD3, 0x52, 0xB0, -0x48, 0xFA, 0xB0, 0xC0, 0x49, 0xB3, 0x34, 0xB0, 0x4A, 0xDA, 0x92, 0xC0, 0x4B, 0x9C, 0x51, 0x30, -0x4C, 0xBA, 0x74, 0xC0, 0x4D, 0x7C, 0x33, 0x30, 0x4E, 0x9A, 0x56, 0xC0, 0x4F, 0x5C, 0x15, 0x30, -0x50, 0x83, 0x73, 0x40, 0x51, 0x3B, 0xF7, 0x30, 0x52, 0x63, 0x55, 0x40, 0x53, 0x1B, 0xD9, 0x30, -0x54, 0x43, 0x37, 0x40, 0x54, 0xFB, 0xBB, 0x30, 0x56, 0x23, 0x19, 0x40, 0x56, 0xE4, 0xD7, 0xB0, -0x58, 0x02, 0xFB, 0x40, 0x58, 0xC4, 0xB9, 0xB0, 0x59, 0xE2, 0xDD, 0x40, 0x5A, 0xA4, 0x9B, 0xB0, -0x5B, 0xCB, 0xF9, 0xC0, 0x5C, 0x84, 0x7D, 0xB0, 0x5D, 0xAB, 0xDB, 0xC0, 0x5E, 0x64, 0x5F, 0xB0, -0x5F, 0x8B, 0xBD, 0xC0, 0x60, 0x4D, 0x7C, 0x30, 0x61, 0x6B, 0x9F, 0xC0, 0x62, 0x2D, 0x5E, 0x30, -0x63, 0x4B, 0x81, 0xC0, 0x64, 0x0D, 0x40, 0x30, 0x65, 0x2B, 0x63, 0xC0, 0x65, 0xED, 0x22, 0x30, -0x67, 0x14, 0x80, 0x40, 0x67, 0xCD, 0x04, 0x30, 0x68, 0xF4, 0x62, 0x40, 0x69, 0xAC, 0xE6, 0x30, -0x6A, 0xD4, 0x44, 0x40, 0x6B, 0x96, 0x02, 0xB0, 0x6C, 0xB4, 0x26, 0x40, 0x6D, 0x75, 0xE4, 0xB0, -0x6E, 0x94, 0x08, 0x40, 0x6F, 0x55, 0xC6, 0xB0, 0x70, 0x7D, 0x24, 0xC0, 0x71, 0x35, 0xA8, 0xB0, -0x72, 0x5D, 0x06, 0xC0, 0x73, 0x15, 0x8A, 0xB0, 0x74, 0x3C, 0xE8, 0xC0, 0x74, 0xFE, 0xA7, 0x30, -0x76, 0x1C, 0xCA, 0xC0, 0x76, 0xDE, 0x89, 0x30, 0x77, 0xFC, 0xAC, 0xC0, 0x78, 0xBE, 0x6B, 0x30, -0x79, 0xDC, 0x8E, 0xC0, 0x7A, 0x9E, 0x4D, 0x30, 0x7B, 0xC5, 0xAB, 0x40, 0x7C, 0x7E, 0x2F, 0x30, -0x7D, 0xA5, 0x8D, 0x40, 0x7E, 0x5E, 0x11, 0x30, 0x7F, 0x85, 0x6F, 0x40, 0x01, 0x02, 0x01, 0x03, +0x48, 0xFA, 0xB0, 0xC0, 0x49, 0xB3, 0x34, 0xB0, 0x4A, 0xDA, 0x92, 0xC0, 0x4B, 0xC1, 0x3B, 0x30, +0x4C, 0xA7, 0xFF, 0xC0, 0x4D, 0xA1, 0x1D, 0x30, 0x4E, 0x87, 0xE1, 0xC0, 0x4F, 0x80, 0xFF, 0x30, +0x50, 0x70, 0xFE, 0x40, 0x51, 0x6A, 0x1B, 0xB0, 0x52, 0x50, 0xE0, 0x40, 0x53, 0x49, 0xFD, 0xB0, +0x54, 0x30, 0xC2, 0x40, 0x55, 0x29, 0xDF, 0xB0, 0x56, 0x10, 0xA4, 0x40, 0x57, 0x09, 0xC1, 0xB0, +0x57, 0xF0, 0x86, 0x40, 0x58, 0xE9, 0xA3, 0xB0, 0x59, 0xD0, 0x68, 0x40, 0x5A, 0xC9, 0x85, 0xB0, +0x5B, 0xB9, 0x84, 0xC0, 0x5C, 0xB2, 0xA2, 0x30, 0x5D, 0x99, 0x66, 0xC0, 0x5E, 0x92, 0x84, 0x30, +0x5F, 0x79, 0x48, 0xC0, 0x60, 0x72, 0x66, 0x30, 0x61, 0x59, 0x2A, 0xC0, 0x62, 0x52, 0x48, 0x30, +0x63, 0x39, 0x0C, 0xC0, 0x64, 0x32, 0x2A, 0x30, 0x65, 0x18, 0xEE, 0xC0, 0x66, 0x1B, 0x46, 0xB0, +0x67, 0x02, 0x0B, 0x40, 0x67, 0xFB, 0x28, 0xB0, 0x68, 0xE1, 0xED, 0x40, 0x69, 0xDB, 0x0A, 0xB0, +0x6A, 0xC1, 0xCF, 0x40, 0x6B, 0xBA, 0xEC, 0xB0, 0x6C, 0xA1, 0xB1, 0x40, 0x6D, 0x9A, 0xCE, 0xB0, +0x6E, 0x81, 0x93, 0x40, 0x6F, 0x7A, 0xB0, 0xB0, 0x70, 0x6A, 0xAF, 0xC0, 0x71, 0x63, 0xCD, 0x30, +0x72, 0x4A, 0x91, 0xC0, 0x73, 0x43, 0xAF, 0x30, 0x74, 0x2A, 0x73, 0xC0, 0x75, 0x23, 0x91, 0x30, +0x76, 0x0A, 0x55, 0xC0, 0x77, 0x03, 0x73, 0x30, 0x77, 0xEA, 0x37, 0xC0, 0x78, 0xE3, 0x55, 0x30, +0x79, 0xCA, 0x19, 0xC0, 0x7A, 0xC3, 0x37, 0x30, 0x7B, 0xB3, 0x36, 0x40, 0x7C, 0xAC, 0x53, 0xB0, +0x7D, 0x93, 0x18, 0x40, 0x7E, 0x8C, 0x35, 0xB0, 0x7F, 0x72, 0xFA, 0x40, 0x01, 0x02, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, @@ -2452,8 +2455,10 @@ const unsigned char timelib_timezone_db_data_builtin[257084] = { 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x0C, 0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x10, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x53, 0x54, 0x00, 0x43, 0x53, 0x54, 0x00, 0x43, 0x44, 0x54, 0x00, 0x4D, 0x44, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB5, 0x05, 0x25, 0x00, 0x70, -0xC9, 0xB2, 0x00, 0x00, 0x00, 0x19, 0x4D, 0x6F, 0x75, 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x20, 0x54, -0x69, 0x6D, 0x65, 0x20, 0x2D, 0x20, 0x43, 0x68, 0x69, 0x68, 0x75, 0x61, 0x68, 0x75, 0x61, +0xC9, 0xB2, 0x00, 0x00, 0x00, 0x35, 0x4D, 0x65, 0x78, 0x69, 0x63, 0x61, 0x6E, 0x20, 0x4D, 0x6F, +0x75, 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x20, 0x54, 0x69, 0x6D, 0x65, 0x20, 0x2D, 0x20, 0x43, 0x68, +0x69, 0x68, 0x75, 0x61, 0x68, 0x75, 0x61, 0x20, 0x61, 0x77, 0x61, 0x79, 0x20, 0x66, 0x72, 0x6F, +0x6D, 0x20, 0x55, 0x53, 0x20, 0x62, 0x6F, 0x72, 0x64, 0x65, 0x72, /* America/Coral_Harbour */ 0x50, 0x48, 0x50, 0x31, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -2913,20 +2918,20 @@ const unsigned char timelib_timezone_db_data_builtin[257084] = { 0x40, 0x6F, 0xDC, 0xA0, 0x41, 0x84, 0xA9, 0x90, 0x42, 0x4F, 0xBE, 0xA0, 0x43, 0x64, 0x8B, 0x90, 0x44, 0x2F, 0xA0, 0xA0, 0x45, 0x44, 0x6D, 0x90, 0x46, 0x0F, 0x82, 0xA0, 0x47, 0x24, 0x4F, 0x90, 0x47, 0xF8, 0x9F, 0x20, 0x49, 0x04, 0x31, 0x90, 0x49, 0xD8, 0x81, 0x20, 0x4A, 0xE4, 0x13, 0x90, -0x4B, 0xB8, 0x63, 0x20, 0x4C, 0xCD, 0x30, 0x10, 0x4D, 0x98, 0x45, 0x20, 0x4E, 0xAD, 0x12, 0x10, -0x4F, 0x78, 0x27, 0x20, 0x50, 0x8C, 0xF4, 0x10, 0x51, 0x61, 0x43, 0xA0, 0x52, 0x6C, 0xD6, 0x10, -0x53, 0x41, 0x25, 0xA0, 0x54, 0x4C, 0xB8, 0x10, 0x55, 0x21, 0x07, 0xA0, 0x56, 0x2C, 0x9A, 0x10, -0x57, 0x00, 0xE9, 0xA0, 0x58, 0x15, 0xB6, 0x90, 0x58, 0xE0, 0xCB, 0xA0, 0x59, 0xF5, 0x98, 0x90, -0x5A, 0xC0, 0xAD, 0xA0, 0x5B, 0xD5, 0x7A, 0x90, 0x5C, 0xA9, 0xCA, 0x20, 0x5D, 0xB5, 0x5C, 0x90, -0x5E, 0x89, 0xAC, 0x20, 0x5F, 0x95, 0x3E, 0x90, 0x60, 0x69, 0x8E, 0x20, 0x61, 0x7E, 0x5B, 0x10, -0x62, 0x49, 0x70, 0x20, 0x63, 0x5E, 0x3D, 0x10, 0x64, 0x29, 0x52, 0x20, 0x65, 0x3E, 0x1F, 0x10, -0x66, 0x12, 0x6E, 0xA0, 0x67, 0x1E, 0x01, 0x10, 0x67, 0xF2, 0x50, 0xA0, 0x68, 0xFD, 0xE3, 0x10, -0x69, 0xD2, 0x32, 0xA0, 0x6A, 0xDD, 0xC5, 0x10, 0x6B, 0xB2, 0x14, 0xA0, 0x6C, 0xC6, 0xE1, 0x90, -0x6D, 0x91, 0xF6, 0xA0, 0x6E, 0xA6, 0xC3, 0x90, 0x6F, 0x71, 0xD8, 0xA0, 0x70, 0x86, 0xA5, 0x90, -0x71, 0x5A, 0xF5, 0x20, 0x72, 0x66, 0x87, 0x90, 0x73, 0x3A, 0xD7, 0x20, 0x74, 0x46, 0x69, 0x90, -0x75, 0x1A, 0xB9, 0x20, 0x76, 0x2F, 0x86, 0x10, 0x76, 0xFA, 0x9B, 0x20, 0x78, 0x0F, 0x68, 0x10, -0x78, 0xDA, 0x7D, 0x20, 0x79, 0xEF, 0x4A, 0x10, 0x7A, 0xBA, 0x5F, 0x20, 0x7B, 0xCF, 0x2C, 0x10, -0x7C, 0xA3, 0x7B, 0xA0, 0x7D, 0xAF, 0x0E, 0x10, 0x7E, 0x83, 0x5D, 0xA0, 0x7F, 0x8E, 0xF0, 0x10, +0x4B, 0x9C, 0xB3, 0xA0, 0x4C, 0xD6, 0x6A, 0x90, 0x4D, 0x7C, 0x95, 0xA0, 0x4E, 0xB6, 0x4C, 0x90, +0x4F, 0x5C, 0x77, 0xA0, 0x50, 0x96, 0x2E, 0x90, 0x51, 0x3C, 0x59, 0xA0, 0x52, 0x76, 0x10, 0x90, +0x53, 0x1C, 0x3B, 0xA0, 0x54, 0x55, 0xF2, 0x90, 0x54, 0xFC, 0x1D, 0xA0, 0x56, 0x35, 0xD4, 0x90, +0x56, 0xE5, 0x3A, 0x20, 0x58, 0x1E, 0xF1, 0x10, 0x58, 0xC5, 0x1C, 0x20, 0x59, 0xFE, 0xD3, 0x10, +0x5A, 0xA4, 0xFE, 0x20, 0x5B, 0xDE, 0xB5, 0x10, 0x5C, 0x84, 0xE0, 0x20, 0x5D, 0xBE, 0x97, 0x10, +0x5E, 0x64, 0xC2, 0x20, 0x5F, 0x9E, 0x79, 0x10, 0x60, 0x4D, 0xDE, 0xA0, 0x61, 0x87, 0x95, 0x90, +0x62, 0x2D, 0xC0, 0xA0, 0x63, 0x67, 0x77, 0x90, 0x64, 0x0D, 0xA2, 0xA0, 0x65, 0x47, 0x59, 0x90, +0x65, 0xED, 0x84, 0xA0, 0x67, 0x27, 0x3B, 0x90, 0x67, 0xCD, 0x66, 0xA0, 0x69, 0x07, 0x1D, 0x90, +0x69, 0xAD, 0x48, 0xA0, 0x6A, 0xE6, 0xFF, 0x90, 0x6B, 0x96, 0x65, 0x20, 0x6C, 0xD0, 0x1C, 0x10, +0x6D, 0x76, 0x47, 0x20, 0x6E, 0xAF, 0xFE, 0x10, 0x6F, 0x56, 0x29, 0x20, 0x70, 0x8F, 0xE0, 0x10, +0x71, 0x36, 0x0B, 0x20, 0x72, 0x6F, 0xC2, 0x10, 0x73, 0x15, 0xED, 0x20, 0x74, 0x4F, 0xA4, 0x10, +0x74, 0xFF, 0x09, 0xA0, 0x76, 0x38, 0xC0, 0x90, 0x76, 0xDE, 0xEB, 0xA0, 0x78, 0x18, 0xA2, 0x90, +0x78, 0xBE, 0xCD, 0xA0, 0x79, 0xF8, 0x84, 0x90, 0x7A, 0x9E, 0xAF, 0xA0, 0x7B, 0xD8, 0x66, 0x90, +0x7C, 0x7E, 0x91, 0xA0, 0x7D, 0xB8, 0x48, 0x90, 0x7E, 0x5E, 0x73, 0xA0, 0x7F, 0x98, 0x2A, 0x90, 0x01, 0x02, 0x01, 0x02, 0x03, 0x02, 0x04, 0x05, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, @@ -4469,6 +4474,46 @@ const unsigned char timelib_timezone_db_data_builtin[257084] = { 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x41, 0x44, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9F, 0x9B, 0x60, 0x00, 0xB5, 0x73, 0xD2, 0x00, 0x00, 0x00, 0x00, +/* America/Matamoros */ +0x50, 0x48, 0x50, 0x31, 0x01, 0x4D, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0xA5, 0xB6, 0xDA, 0x60, +0x22, 0x55, 0xF1, 0x00, 0x23, 0x6A, 0xBD, 0xF0, 0x31, 0x67, 0x76, 0x00, 0x32, 0x73, 0x08, 0x70, +0x33, 0x47, 0x58, 0x00, 0x34, 0x52, 0xEA, 0x70, 0x35, 0x27, 0x3A, 0x00, 0x36, 0x32, 0xCC, 0x70, +0x37, 0x07, 0x1C, 0x00, 0x38, 0x1B, 0xE8, 0xF0, 0x38, 0xE6, 0xFE, 0x00, 0x39, 0xFB, 0xCA, 0xF0, +0x3A, 0xF5, 0x04, 0x80, 0x3B, 0xB6, 0xC2, 0xF0, 0x3C, 0xAF, 0xFC, 0x80, 0x3D, 0xBB, 0x8E, 0xF0, +0x3E, 0x8F, 0xDE, 0x80, 0x3F, 0x9B, 0x70, 0xF0, 0x40, 0x6F, 0xC0, 0x80, 0x41, 0x84, 0x8D, 0x70, +0x42, 0x4F, 0xA2, 0x80, 0x43, 0x64, 0x6F, 0x70, 0x44, 0x2F, 0x84, 0x80, 0x45, 0x44, 0x51, 0x70, +0x46, 0x0F, 0x66, 0x80, 0x47, 0x24, 0x33, 0x70, 0x47, 0xF8, 0x83, 0x00, 0x49, 0x04, 0x15, 0x70, +0x49, 0xD8, 0x65, 0x00, 0x4A, 0xE3, 0xF7, 0x70, 0x4B, 0x9C, 0x97, 0x80, 0x4C, 0xD6, 0x4E, 0x70, +0x4D, 0x7C, 0x79, 0x80, 0x4E, 0xB6, 0x30, 0x70, 0x4F, 0x5C, 0x5B, 0x80, 0x50, 0x96, 0x12, 0x70, +0x51, 0x3C, 0x3D, 0x80, 0x52, 0x75, 0xF4, 0x70, 0x53, 0x1C, 0x1F, 0x80, 0x54, 0x55, 0xD6, 0x70, +0x54, 0xFC, 0x01, 0x80, 0x56, 0x35, 0xB8, 0x70, 0x56, 0xE5, 0x1E, 0x00, 0x58, 0x1E, 0xD4, 0xF0, +0x58, 0xC5, 0x00, 0x00, 0x59, 0xFE, 0xB6, 0xF0, 0x5A, 0xA4, 0xE2, 0x00, 0x5B, 0xDE, 0x98, 0xF0, +0x5C, 0x84, 0xC4, 0x00, 0x5D, 0xBE, 0x7A, 0xF0, 0x5E, 0x64, 0xA6, 0x00, 0x5F, 0x9E, 0x5C, 0xF0, +0x60, 0x4D, 0xC2, 0x80, 0x61, 0x87, 0x79, 0x70, 0x62, 0x2D, 0xA4, 0x80, 0x63, 0x67, 0x5B, 0x70, +0x64, 0x0D, 0x86, 0x80, 0x65, 0x47, 0x3D, 0x70, 0x65, 0xED, 0x68, 0x80, 0x67, 0x27, 0x1F, 0x70, +0x67, 0xCD, 0x4A, 0x80, 0x69, 0x07, 0x01, 0x70, 0x69, 0xAD, 0x2C, 0x80, 0x6A, 0xE6, 0xE3, 0x70, +0x6B, 0x96, 0x49, 0x00, 0x6C, 0xCF, 0xFF, 0xF0, 0x6D, 0x76, 0x2B, 0x00, 0x6E, 0xAF, 0xE1, 0xF0, +0x6F, 0x56, 0x0D, 0x00, 0x70, 0x8F, 0xC3, 0xF0, 0x71, 0x35, 0xEF, 0x00, 0x72, 0x6F, 0xA5, 0xF0, +0x73, 0x15, 0xD1, 0x00, 0x74, 0x4F, 0x87, 0xF0, 0x74, 0xFE, 0xED, 0x80, 0x76, 0x38, 0xA4, 0x70, +0x76, 0xDE, 0xCF, 0x80, 0x78, 0x18, 0x86, 0x70, 0x78, 0xBE, 0xB1, 0x80, 0x79, 0xF8, 0x68, 0x70, +0x7A, 0x9E, 0x93, 0x80, 0x7B, 0xD8, 0x4A, 0x70, 0x7C, 0x7E, 0x75, 0x80, 0x7D, 0xB8, 0x2C, 0x70, +0x7E, 0x5E, 0x57, 0x80, 0x7F, 0x98, 0x0E, 0x70, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0xFF, +0xFF, 0xA2, 0x40, 0x00, 0x00, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, +0x08, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x53, 0x54, 0x00, 0x43, 0x44, 0x54, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xB0, 0xBF, 0x65, 0x00, 0x7D, 0xE2, 0x90, 0x00, 0x00, 0x00, 0x4A, 0x55, +0x53, 0x20, 0x43, 0x65, 0x6E, 0x74, 0x72, 0x61, 0x6C, 0x20, 0x54, 0x69, 0x6D, 0x65, 0x20, 0x2D, +0x20, 0x43, 0x6F, 0x61, 0x68, 0x75, 0x69, 0x6C, 0x61, 0x2C, 0x20, 0x44, 0x75, 0x72, 0x61, 0x6E, +0x67, 0x6F, 0x2C, 0x20, 0x4E, 0x75, 0x65, 0x76, 0x6F, 0x20, 0x4C, 0x65, 0x6F, 0x6E, 0x2C, 0x20, +0x54, 0x61, 0x6D, 0x61, 0x75, 0x6C, 0x69, 0x70, 0x61, 0x73, 0x20, 0x6E, 0x65, 0x61, 0x72, 0x20, +0x55, 0x53, 0x20, 0x62, 0x6F, 0x72, 0x64, 0x65, 0x72, + /* America/Mazatlan */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x4D, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, @@ -4830,11 +4875,13 @@ const unsigned char timelib_timezone_db_data_builtin[257084] = { 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0xFF, 0xFF, 0xA1, 0xF4, 0x00, 0x00, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x53, 0x54, 0x00, 0x43, 0x44, 0x54, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0xB0, 0x7E, 0x4A, 0x00, 0x79, 0x96, 0x4D, 0x00, 0x00, 0x00, 0x38, 0x43, -0x65, 0x6E, 0x74, 0x72, 0x61, 0x6C, 0x20, 0x54, 0x69, 0x6D, 0x65, 0x20, 0x2D, 0x20, 0x43, 0x6F, -0x61, 0x68, 0x75, 0x69, 0x6C, 0x61, 0x2C, 0x20, 0x44, 0x75, 0x72, 0x61, 0x6E, 0x67, 0x6F, 0x2C, -0x20, 0x4E, 0x75, 0x65, 0x76, 0x6F, 0x20, 0x4C, 0x65, 0x6F, 0x6E, 0x2C, 0x20, 0x54, 0x61, 0x6D, -0x61, 0x75, 0x6C, 0x69, 0x70, 0x61, 0x73, +0x00, 0x00, 0x00, 0x00, 0xB0, 0x7E, 0x4A, 0x00, 0x79, 0x96, 0x4D, 0x00, 0x00, 0x00, 0x54, 0x4D, +0x65, 0x78, 0x69, 0x63, 0x61, 0x6E, 0x20, 0x43, 0x65, 0x6E, 0x74, 0x72, 0x61, 0x6C, 0x20, 0x54, +0x69, 0x6D, 0x65, 0x20, 0x2D, 0x20, 0x43, 0x6F, 0x61, 0x68, 0x75, 0x69, 0x6C, 0x61, 0x2C, 0x20, +0x44, 0x75, 0x72, 0x61, 0x6E, 0x67, 0x6F, 0x2C, 0x20, 0x4E, 0x75, 0x65, 0x76, 0x6F, 0x20, 0x4C, +0x65, 0x6F, 0x6E, 0x2C, 0x20, 0x54, 0x61, 0x6D, 0x61, 0x75, 0x6C, 0x69, 0x70, 0x61, 0x73, 0x20, +0x61, 0x77, 0x61, 0x79, 0x20, 0x66, 0x72, 0x6F, 0x6D, 0x20, 0x55, 0x53, 0x20, 0x62, 0x6F, 0x72, +0x64, 0x65, 0x72, /* America/Montevideo */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x55, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -5375,6 +5422,47 @@ const unsigned char timelib_timezone_db_data_builtin[257084] = { 0x75, 0x6E, 0x74, 0x79, 0x20, 0x28, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x20, 0x4D, 0x61, 0x6E, 0x64, 0x61, 0x6E, 0x20, 0x61, 0x72, 0x65, 0x61, 0x29, +/* America/Ojinaga */ +0x50, 0x48, 0x50, 0x31, 0x01, 0x4D, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x5A, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x14, 0xA5, 0xB6, 0xE8, 0x70, +0xAF, 0xF2, 0x6E, 0xE0, 0xB6, 0x66, 0x56, 0x60, 0xB7, 0x43, 0xD2, 0x60, 0xB8, 0x0C, 0x36, 0x60, +0xB8, 0xFD, 0x86, 0xF0, 0x31, 0x67, 0x76, 0x00, 0x32, 0x73, 0x08, 0x70, 0x33, 0x47, 0x58, 0x00, +0x34, 0x52, 0xEA, 0x70, 0x35, 0x27, 0x48, 0x10, 0x36, 0x32, 0xDA, 0x80, 0x37, 0x07, 0x2A, 0x10, +0x38, 0x1B, 0xF7, 0x00, 0x38, 0xE7, 0x0C, 0x10, 0x39, 0xFB, 0xD9, 0x00, 0x3A, 0xF5, 0x12, 0x90, +0x3B, 0xB6, 0xD1, 0x00, 0x3C, 0xB0, 0x0A, 0x90, 0x3D, 0xBB, 0x9D, 0x00, 0x3E, 0x8F, 0xEC, 0x90, +0x3F, 0x9B, 0x7F, 0x00, 0x40, 0x6F, 0xCE, 0x90, 0x41, 0x84, 0x9B, 0x80, 0x42, 0x4F, 0xB0, 0x90, +0x43, 0x64, 0x7D, 0x80, 0x44, 0x2F, 0x92, 0x90, 0x45, 0x44, 0x5F, 0x80, 0x46, 0x0F, 0x74, 0x90, +0x47, 0x24, 0x41, 0x80, 0x47, 0xF8, 0x91, 0x10, 0x49, 0x04, 0x23, 0x80, 0x49, 0xD8, 0x73, 0x10, +0x4A, 0xE4, 0x05, 0x80, 0x4B, 0x9C, 0xA5, 0x90, 0x4C, 0xD6, 0x5C, 0x80, 0x4D, 0x7C, 0x87, 0x90, +0x4E, 0xB6, 0x3E, 0x80, 0x4F, 0x5C, 0x69, 0x90, 0x50, 0x96, 0x20, 0x80, 0x51, 0x3C, 0x4B, 0x90, +0x52, 0x76, 0x02, 0x80, 0x53, 0x1C, 0x2D, 0x90, 0x54, 0x55, 0xE4, 0x80, 0x54, 0xFC, 0x0F, 0x90, +0x56, 0x35, 0xC6, 0x80, 0x56, 0xE5, 0x2C, 0x10, 0x58, 0x1E, 0xE3, 0x00, 0x58, 0xC5, 0x0E, 0x10, +0x59, 0xFE, 0xC5, 0x00, 0x5A, 0xA4, 0xF0, 0x10, 0x5B, 0xDE, 0xA7, 0x00, 0x5C, 0x84, 0xD2, 0x10, +0x5D, 0xBE, 0x89, 0x00, 0x5E, 0x64, 0xB4, 0x10, 0x5F, 0x9E, 0x6B, 0x00, 0x60, 0x4D, 0xD0, 0x90, +0x61, 0x87, 0x87, 0x80, 0x62, 0x2D, 0xB2, 0x90, 0x63, 0x67, 0x69, 0x80, 0x64, 0x0D, 0x94, 0x90, +0x65, 0x47, 0x4B, 0x80, 0x65, 0xED, 0x76, 0x90, 0x67, 0x27, 0x2D, 0x80, 0x67, 0xCD, 0x58, 0x90, +0x69, 0x07, 0x0F, 0x80, 0x69, 0xAD, 0x3A, 0x90, 0x6A, 0xE6, 0xF1, 0x80, 0x6B, 0x96, 0x57, 0x10, +0x6C, 0xD0, 0x0E, 0x00, 0x6D, 0x76, 0x39, 0x10, 0x6E, 0xAF, 0xF0, 0x00, 0x6F, 0x56, 0x1B, 0x10, +0x70, 0x8F, 0xD2, 0x00, 0x71, 0x35, 0xFD, 0x10, 0x72, 0x6F, 0xB4, 0x00, 0x73, 0x15, 0xDF, 0x10, +0x74, 0x4F, 0x96, 0x00, 0x74, 0xFE, 0xFB, 0x90, 0x76, 0x38, 0xB2, 0x80, 0x76, 0xDE, 0xDD, 0x90, +0x78, 0x18, 0x94, 0x80, 0x78, 0xBE, 0xBF, 0x90, 0x79, 0xF8, 0x76, 0x80, 0x7A, 0x9E, 0xA1, 0x90, +0x7B, 0xD8, 0x58, 0x80, 0x7C, 0x7E, 0x83, 0x90, 0x7D, 0xB8, 0x3A, 0x80, 0x7E, 0x5E, 0x65, 0x90, +0x7F, 0x98, 0x1C, 0x80, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x01, +0x04, 0x01, 0x04, 0x01, 0x04, 0x01, 0x04, 0x01, 0x04, 0x01, 0x04, 0x01, 0x04, 0x01, 0x04, 0x01, +0x04, 0x01, 0x04, 0x01, 0x04, 0x01, 0x04, 0x01, 0x04, 0x01, 0x04, 0x01, 0x04, 0x01, 0x04, 0x01, +0x04, 0x01, 0x04, 0x01, 0x04, 0x01, 0x04, 0x01, 0x04, 0x01, 0x04, 0x01, 0x04, 0x01, 0x04, 0x01, +0x04, 0x01, 0x04, 0x01, 0x04, 0x01, 0x04, 0x01, 0x04, 0x01, 0x04, 0x01, 0x04, 0x01, 0x04, 0x01, +0x04, 0x01, 0x04, 0x01, 0x04, 0x01, 0x04, 0x01, 0x04, 0x01, 0x04, 0x01, 0x04, 0x01, 0xFF, 0xFF, +0x9E, 0x1C, 0x00, 0x00, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, +0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x0C, 0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x10, 0x4C, 0x4D, 0x54, 0x00, +0x4D, 0x53, 0x54, 0x00, 0x43, 0x53, 0x54, 0x00, 0x43, 0x44, 0x54, 0x00, 0x4D, 0x44, 0x54, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x71, 0xBA, 0x00, 0x73, +0x54, 0xBD, 0x00, 0x00, 0x00, 0x2B, 0x55, 0x53, 0x20, 0x4D, 0x6F, 0x75, 0x6E, 0x74, 0x61, 0x69, +0x6E, 0x20, 0x54, 0x69, 0x6D, 0x65, 0x20, 0x2D, 0x20, 0x43, 0x68, 0x69, 0x68, 0x75, 0x61, 0x68, +0x75, 0x61, 0x20, 0x6E, 0x65, 0x61, 0x72, 0x20, 0x55, 0x53, 0x20, 0x62, 0x6F, 0x72, 0x64, 0x65, +0x72, + /* America/Panama */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x50, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, @@ -5787,6 +5875,67 @@ const unsigned char timelib_timezone_db_data_builtin[257084] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x89, 0x54, 0x40, 0x01, 0x12, 0xA8, 0x80, 0x00, 0x00, 0x00, 0x00, +/* America/Santa_Isabel */ +0x50, 0x48, 0x50, 0x31, 0x01, 0x4D, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x95, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x18, 0xA5, 0xB6, 0xF6, 0x80, +0xA9, 0x79, 0x4F, 0x70, 0xAF, 0xF2, 0x7C, 0xF0, 0xB6, 0x66, 0x64, 0x70, 0xB7, 0x1B, 0x10, 0x00, +0xB8, 0x0A, 0xF2, 0xF0, 0xCB, 0xEA, 0x8D, 0x80, 0xD2, 0x23, 0xF4, 0x70, 0xD2, 0x99, 0xBA, 0x70, +0xD7, 0x1B, 0x59, 0x00, 0xD8, 0x91, 0xB4, 0xF0, 0xE2, 0x7E, 0x59, 0xA0, 0xE3, 0x49, 0x52, 0x90, +0xE4, 0x5E, 0x3B, 0xA0, 0xE5, 0x29, 0x34, 0x90, 0xE6, 0x47, 0x58, 0x20, 0xE7, 0x12, 0x51, 0x10, +0xE8, 0x27, 0x3A, 0x20, 0xE8, 0xF2, 0x33, 0x10, 0xEA, 0x07, 0x1C, 0x20, 0xEA, 0xD2, 0x15, 0x10, +0xEB, 0xE6, 0xFE, 0x20, 0xEC, 0xB1, 0xF7, 0x10, 0xED, 0xC6, 0xE0, 0x20, 0xEE, 0x91, 0xD9, 0x10, +0x0B, 0xE0, 0xAF, 0xA0, 0x0C, 0xD9, 0xCD, 0x10, 0x0D, 0xC0, 0x91, 0xA0, 0x0E, 0xB9, 0xAF, 0x10, +0x0F, 0xA9, 0xAE, 0x20, 0x10, 0x99, 0x91, 0x10, 0x11, 0x89, 0x90, 0x20, 0x12, 0x79, 0x73, 0x10, +0x13, 0x69, 0x72, 0x20, 0x14, 0x59, 0x55, 0x10, 0x15, 0x49, 0x54, 0x20, 0x16, 0x39, 0x37, 0x10, +0x17, 0x29, 0x36, 0x20, 0x18, 0x22, 0x53, 0x90, 0x19, 0x09, 0x18, 0x20, 0x1A, 0x02, 0x35, 0x90, +0x1A, 0xF2, 0x34, 0xA0, 0x1B, 0xE2, 0x17, 0x90, 0x1C, 0xD2, 0x16, 0xA0, 0x1D, 0xC1, 0xF9, 0x90, +0x1E, 0xB1, 0xF8, 0xA0, 0x1F, 0xA1, 0xDB, 0x90, 0x20, 0x76, 0x2B, 0x20, 0x21, 0x81, 0xBD, 0x90, +0x22, 0x56, 0x0D, 0x20, 0x23, 0x6A, 0xDA, 0x10, 0x24, 0x35, 0xEF, 0x20, 0x25, 0x4A, 0xBC, 0x10, +0x26, 0x15, 0xD1, 0x20, 0x27, 0x2A, 0x9E, 0x10, 0x27, 0xFE, 0xED, 0xA0, 0x29, 0x0A, 0x80, 0x10, +0x29, 0xDE, 0xCF, 0xA0, 0x2A, 0xEA, 0x62, 0x10, 0x2B, 0xBE, 0xB1, 0xA0, 0x2C, 0xD3, 0x7E, 0x90, +0x2D, 0x9E, 0x93, 0xA0, 0x2E, 0xB3, 0x60, 0x90, 0x2F, 0x7E, 0x75, 0xA0, 0x30, 0x93, 0x42, 0x90, +0x31, 0x67, 0x92, 0x20, 0x32, 0x73, 0x24, 0x90, 0x33, 0x47, 0x74, 0x20, 0x34, 0x53, 0x06, 0x90, +0x35, 0x27, 0x56, 0x20, 0x36, 0x32, 0xE8, 0x90, 0x37, 0x07, 0x38, 0x20, 0x38, 0x1C, 0x05, 0x10, +0x38, 0xE7, 0x1A, 0x20, 0x39, 0xFB, 0xE7, 0x10, 0x3A, 0xC6, 0xFC, 0x20, 0x3B, 0xDB, 0xC9, 0x10, +0x3C, 0xB0, 0x18, 0xA0, 0x3D, 0xBB, 0xAB, 0x10, 0x3E, 0x8F, 0xFA, 0xA0, 0x3F, 0x9B, 0x8D, 0x10, +0x40, 0x6F, 0xDC, 0xA0, 0x41, 0x84, 0xA9, 0x90, 0x42, 0x4F, 0xBE, 0xA0, 0x43, 0x64, 0x8B, 0x90, +0x44, 0x2F, 0xA0, 0xA0, 0x45, 0x44, 0x6D, 0x90, 0x46, 0x0F, 0x82, 0xA0, 0x47, 0x24, 0x4F, 0x90, +0x47, 0xF8, 0x9F, 0x20, 0x49, 0x04, 0x31, 0x90, 0x49, 0xD8, 0x81, 0x20, 0x4A, 0xE4, 0x13, 0x90, +0x4B, 0xB8, 0x63, 0x20, 0x4C, 0xCD, 0x30, 0x10, 0x4D, 0x98, 0x45, 0x20, 0x4E, 0xAD, 0x12, 0x10, +0x4F, 0x78, 0x27, 0x20, 0x50, 0x8C, 0xF4, 0x10, 0x51, 0x61, 0x43, 0xA0, 0x52, 0x6C, 0xD6, 0x10, +0x53, 0x41, 0x25, 0xA0, 0x54, 0x4C, 0xB8, 0x10, 0x55, 0x21, 0x07, 0xA0, 0x56, 0x2C, 0x9A, 0x10, +0x57, 0x00, 0xE9, 0xA0, 0x58, 0x15, 0xB6, 0x90, 0x58, 0xE0, 0xCB, 0xA0, 0x59, 0xF5, 0x98, 0x90, +0x5A, 0xC0, 0xAD, 0xA0, 0x5B, 0xD5, 0x7A, 0x90, 0x5C, 0xA9, 0xCA, 0x20, 0x5D, 0xB5, 0x5C, 0x90, +0x5E, 0x89, 0xAC, 0x20, 0x5F, 0x95, 0x3E, 0x90, 0x60, 0x69, 0x8E, 0x20, 0x61, 0x7E, 0x5B, 0x10, +0x62, 0x49, 0x70, 0x20, 0x63, 0x5E, 0x3D, 0x10, 0x64, 0x29, 0x52, 0x20, 0x65, 0x3E, 0x1F, 0x10, +0x66, 0x12, 0x6E, 0xA0, 0x67, 0x1E, 0x01, 0x10, 0x67, 0xF2, 0x50, 0xA0, 0x68, 0xFD, 0xE3, 0x10, +0x69, 0xD2, 0x32, 0xA0, 0x6A, 0xDD, 0xC5, 0x10, 0x6B, 0xB2, 0x14, 0xA0, 0x6C, 0xC6, 0xE1, 0x90, +0x6D, 0x91, 0xF6, 0xA0, 0x6E, 0xA6, 0xC3, 0x90, 0x6F, 0x71, 0xD8, 0xA0, 0x70, 0x86, 0xA5, 0x90, +0x71, 0x5A, 0xF5, 0x20, 0x72, 0x66, 0x87, 0x90, 0x73, 0x3A, 0xD7, 0x20, 0x74, 0x46, 0x69, 0x90, +0x75, 0x1A, 0xB9, 0x20, 0x76, 0x2F, 0x86, 0x10, 0x76, 0xFA, 0x9B, 0x20, 0x78, 0x0F, 0x68, 0x10, +0x78, 0xDA, 0x7D, 0x20, 0x79, 0xEF, 0x4A, 0x10, 0x7A, 0xBA, 0x5F, 0x20, 0x7B, 0xCF, 0x2C, 0x10, +0x7C, 0xA3, 0x7B, 0xA0, 0x7D, 0xAF, 0x0E, 0x10, 0x7E, 0x83, 0x5D, 0xA0, 0x7F, 0x8E, 0xF0, 0x10, +0x01, 0x02, 0x01, 0x02, 0x03, 0x02, 0x04, 0x05, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0xFF, 0xFF, 0x94, 0x50, 0x00, 0x00, 0xFF, 0xFF, 0x9D, 0x90, 0x00, +0x04, 0xFF, 0xFF, 0x8F, 0x80, 0x00, 0x08, 0xFF, 0xFF, 0x9D, 0x90, 0x01, 0x0C, 0xFF, 0xFF, 0x9D, +0x90, 0x01, 0x10, 0xFF, 0xFF, 0x9D, 0x90, 0x01, 0x14, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x53, 0x54, +0x00, 0x50, 0x53, 0x54, 0x00, 0x50, 0x44, 0x54, 0x00, 0x50, 0x57, 0x54, 0x00, 0x50, 0x50, 0x54, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xB7, 0x90, +0x30, 0x00, 0x63, 0x62, 0xB5, 0x00, 0x00, 0x00, 0x3A, 0x4D, 0x65, 0x78, 0x69, 0x63, 0x61, 0x6E, +0x20, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, 0x54, 0x69, 0x6D, 0x65, 0x20, 0x2D, 0x20, +0x42, 0x61, 0x6A, 0x61, 0x20, 0x43, 0x61, 0x6C, 0x69, 0x66, 0x6F, 0x72, 0x6E, 0x69, 0x61, 0x20, +0x61, 0x77, 0x61, 0x79, 0x20, 0x66, 0x72, 0x6F, 0x6D, 0x20, 0x55, 0x53, 0x20, 0x62, 0x6F, 0x72, +0x64, 0x65, 0x72, + /* America/Santarem */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x42, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, @@ -6321,20 +6470,20 @@ const unsigned char timelib_timezone_db_data_builtin[257084] = { 0x40, 0x6F, 0xDC, 0xA0, 0x41, 0x84, 0xA9, 0x90, 0x42, 0x4F, 0xBE, 0xA0, 0x43, 0x64, 0x8B, 0x90, 0x44, 0x2F, 0xA0, 0xA0, 0x45, 0x44, 0x6D, 0x90, 0x46, 0x0F, 0x82, 0xA0, 0x47, 0x24, 0x4F, 0x90, 0x47, 0xF8, 0x9F, 0x20, 0x49, 0x04, 0x31, 0x90, 0x49, 0xD8, 0x81, 0x20, 0x4A, 0xE4, 0x13, 0x90, -0x4B, 0xB8, 0x63, 0x20, 0x4C, 0xCD, 0x30, 0x10, 0x4D, 0x98, 0x45, 0x20, 0x4E, 0xAD, 0x12, 0x10, -0x4F, 0x78, 0x27, 0x20, 0x50, 0x8C, 0xF4, 0x10, 0x51, 0x61, 0x43, 0xA0, 0x52, 0x6C, 0xD6, 0x10, -0x53, 0x41, 0x25, 0xA0, 0x54, 0x4C, 0xB8, 0x10, 0x55, 0x21, 0x07, 0xA0, 0x56, 0x2C, 0x9A, 0x10, -0x57, 0x00, 0xE9, 0xA0, 0x58, 0x15, 0xB6, 0x90, 0x58, 0xE0, 0xCB, 0xA0, 0x59, 0xF5, 0x98, 0x90, -0x5A, 0xC0, 0xAD, 0xA0, 0x5B, 0xD5, 0x7A, 0x90, 0x5C, 0xA9, 0xCA, 0x20, 0x5D, 0xB5, 0x5C, 0x90, -0x5E, 0x89, 0xAC, 0x20, 0x5F, 0x95, 0x3E, 0x90, 0x60, 0x69, 0x8E, 0x20, 0x61, 0x7E, 0x5B, 0x10, -0x62, 0x49, 0x70, 0x20, 0x63, 0x5E, 0x3D, 0x10, 0x64, 0x29, 0x52, 0x20, 0x65, 0x3E, 0x1F, 0x10, -0x66, 0x12, 0x6E, 0xA0, 0x67, 0x1E, 0x01, 0x10, 0x67, 0xF2, 0x50, 0xA0, 0x68, 0xFD, 0xE3, 0x10, -0x69, 0xD2, 0x32, 0xA0, 0x6A, 0xDD, 0xC5, 0x10, 0x6B, 0xB2, 0x14, 0xA0, 0x6C, 0xC6, 0xE1, 0x90, -0x6D, 0x91, 0xF6, 0xA0, 0x6E, 0xA6, 0xC3, 0x90, 0x6F, 0x71, 0xD8, 0xA0, 0x70, 0x86, 0xA5, 0x90, -0x71, 0x5A, 0xF5, 0x20, 0x72, 0x66, 0x87, 0x90, 0x73, 0x3A, 0xD7, 0x20, 0x74, 0x46, 0x69, 0x90, -0x75, 0x1A, 0xB9, 0x20, 0x76, 0x2F, 0x86, 0x10, 0x76, 0xFA, 0x9B, 0x20, 0x78, 0x0F, 0x68, 0x10, -0x78, 0xDA, 0x7D, 0x20, 0x79, 0xEF, 0x4A, 0x10, 0x7A, 0xBA, 0x5F, 0x20, 0x7B, 0xCF, 0x2C, 0x10, -0x7C, 0xA3, 0x7B, 0xA0, 0x7D, 0xAF, 0x0E, 0x10, 0x7E, 0x83, 0x5D, 0xA0, 0x7F, 0x8E, 0xF0, 0x10, +0x4B, 0x9C, 0xB3, 0xA0, 0x4C, 0xD6, 0x6A, 0x90, 0x4D, 0x7C, 0x95, 0xA0, 0x4E, 0xB6, 0x4C, 0x90, +0x4F, 0x5C, 0x77, 0xA0, 0x50, 0x96, 0x2E, 0x90, 0x51, 0x3C, 0x59, 0xA0, 0x52, 0x76, 0x10, 0x90, +0x53, 0x1C, 0x3B, 0xA0, 0x54, 0x55, 0xF2, 0x90, 0x54, 0xFC, 0x1D, 0xA0, 0x56, 0x35, 0xD4, 0x90, +0x56, 0xE5, 0x3A, 0x20, 0x58, 0x1E, 0xF1, 0x10, 0x58, 0xC5, 0x1C, 0x20, 0x59, 0xFE, 0xD3, 0x10, +0x5A, 0xA4, 0xFE, 0x20, 0x5B, 0xDE, 0xB5, 0x10, 0x5C, 0x84, 0xE0, 0x20, 0x5D, 0xBE, 0x97, 0x10, +0x5E, 0x64, 0xC2, 0x20, 0x5F, 0x9E, 0x79, 0x10, 0x60, 0x4D, 0xDE, 0xA0, 0x61, 0x87, 0x95, 0x90, +0x62, 0x2D, 0xC0, 0xA0, 0x63, 0x67, 0x77, 0x90, 0x64, 0x0D, 0xA2, 0xA0, 0x65, 0x47, 0x59, 0x90, +0x65, 0xED, 0x84, 0xA0, 0x67, 0x27, 0x3B, 0x90, 0x67, 0xCD, 0x66, 0xA0, 0x69, 0x07, 0x1D, 0x90, +0x69, 0xAD, 0x48, 0xA0, 0x6A, 0xE6, 0xFF, 0x90, 0x6B, 0x96, 0x65, 0x20, 0x6C, 0xD0, 0x1C, 0x10, +0x6D, 0x76, 0x47, 0x20, 0x6E, 0xAF, 0xFE, 0x10, 0x6F, 0x56, 0x29, 0x20, 0x70, 0x8F, 0xE0, 0x10, +0x71, 0x36, 0x0B, 0x20, 0x72, 0x6F, 0xC2, 0x10, 0x73, 0x15, 0xED, 0x20, 0x74, 0x4F, 0xA4, 0x10, +0x74, 0xFF, 0x09, 0xA0, 0x76, 0x38, 0xC0, 0x90, 0x76, 0xDE, 0xEB, 0xA0, 0x78, 0x18, 0xA2, 0x90, +0x78, 0xBE, 0xCD, 0xA0, 0x79, 0xF8, 0x84, 0x90, 0x7A, 0x9E, 0xAF, 0xA0, 0x7B, 0xD8, 0x66, 0x90, +0x7C, 0x7E, 0x91, 0xA0, 0x7D, 0xB8, 0x48, 0x90, 0x7E, 0x5E, 0x73, 0xA0, 0x7F, 0x98, 0x2A, 0x90, 0x01, 0x02, 0x01, 0x02, 0x03, 0x02, 0x04, 0x05, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, @@ -6349,8 +6498,10 @@ const unsigned char timelib_timezone_db_data_builtin[257084] = { 0x90, 0x01, 0x10, 0xFF, 0xFF, 0x9D, 0x90, 0x01, 0x14, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x53, 0x54, 0x00, 0x50, 0x53, 0x54, 0x00, 0x50, 0x44, 0x54, 0x00, 0x50, 0x57, 0x54, 0x00, 0x50, 0x50, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xBA, 0xF8, -0x95, 0x00, 0x60, 0x1A, 0xDD, 0x00, 0x00, 0x00, 0x0C, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, -0x20, 0x54, 0x69, 0x6D, 0x65, +0x95, 0x00, 0x60, 0x1A, 0xDD, 0x00, 0x00, 0x00, 0x30, 0x55, 0x53, 0x20, 0x50, 0x61, 0x63, 0x69, +0x66, 0x69, 0x63, 0x20, 0x54, 0x69, 0x6D, 0x65, 0x20, 0x2D, 0x20, 0x42, 0x61, 0x6A, 0x61, 0x20, +0x43, 0x61, 0x6C, 0x69, 0x66, 0x6F, 0x72, 0x6E, 0x69, 0x61, 0x20, 0x6E, 0x65, 0x61, 0x72, 0x20, +0x55, 0x53, 0x20, 0x62, 0x6F, 0x72, 0x64, 0x65, 0x72, /* America/Toronto */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x43, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -7531,15 +7682,32 @@ const unsigned char timelib_timezone_db_data_builtin[257084] = { /* Asia/Dacca */ 0x50, 0x48, 0x50, 0x31, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x1B, 0xCA, 0xDB, 0x86, 0xB0, +0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x1B, 0xCA, 0xDB, 0x86, 0xB0, 0xCC, 0x05, 0x71, 0x18, 0xCC, 0x95, 0x32, 0xA8, 0xDD, 0xA8, 0xD2, 0x98, 0x02, 0x4F, 0x9D, 0x20, -0x4A, 0x3B, 0xC4, 0x10, 0x01, 0x02, 0x01, 0x03, 0x04, 0x05, 0x00, 0x00, 0x52, 0xD0, 0x00, 0x00, -0x00, 0x00, 0x5B, 0x68, 0x00, 0x04, 0x00, 0x00, 0x4D, 0x58, 0x00, 0x09, 0x00, 0x00, 0x54, 0x60, -0x00, 0x0D, 0x00, 0x00, 0x54, 0x60, 0x00, 0x12, 0x00, 0x00, 0x62, 0x70, 0x01, 0x16, 0x48, 0x4D, -0x54, 0x00, 0x42, 0x55, 0x52, 0x54, 0x00, 0x49, 0x53, 0x54, 0x00, 0x44, 0x41, 0x43, 0x54, 0x00, -0x42, 0x44, 0x54, 0x00, 0x42, 0x44, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x89, 0x54, 0x40, 0x01, 0x12, 0xA8, 0x80, 0x00, 0x00, 0x00, -0x00, +0x4A, 0x3B, 0xC4, 0x10, 0x4B, 0x3C, 0xD8, 0x90, 0x4B, 0xB3, 0x7F, 0x90, 0x4C, 0xCD, 0xA0, 0x90, +0x4D, 0x94, 0xB3, 0x10, 0x4E, 0xAE, 0xD4, 0x10, 0x4F, 0x77, 0x38, 0x10, 0x50, 0x91, 0x59, 0x10, +0x51, 0x58, 0x6B, 0x90, 0x52, 0x72, 0x8C, 0x90, 0x53, 0x39, 0x9F, 0x10, 0x54, 0x53, 0xC0, 0x10, +0x55, 0x1A, 0xD2, 0x90, 0x56, 0x34, 0xF3, 0x90, 0x56, 0xFD, 0x57, 0x90, 0x58, 0x17, 0x78, 0x90, +0x58, 0xDE, 0x8B, 0x10, 0x59, 0xF8, 0xAC, 0x10, 0x5A, 0xBF, 0xBE, 0x90, 0x5B, 0xD9, 0xDF, 0x90, +0x5C, 0xA0, 0xF2, 0x10, 0x5D, 0xBB, 0x13, 0x10, 0x5E, 0x83, 0x77, 0x10, 0x5F, 0x9D, 0x98, 0x10, +0x60, 0x64, 0xAA, 0x90, 0x61, 0x7E, 0xCB, 0x90, 0x62, 0x45, 0xDE, 0x10, 0x63, 0x5F, 0xFF, 0x10, +0x64, 0x27, 0x11, 0x90, 0x65, 0x41, 0x32, 0x90, 0x66, 0x09, 0x96, 0x90, 0x67, 0x23, 0xB7, 0x90, +0x67, 0xEA, 0xCA, 0x10, 0x69, 0x04, 0xEB, 0x10, 0x69, 0xCB, 0xFD, 0x90, 0x6A, 0xE6, 0x1E, 0x90, +0x6B, 0xAD, 0x31, 0x10, 0x6C, 0xC7, 0x52, 0x10, 0x6D, 0x8F, 0xB6, 0x10, 0x6E, 0xA9, 0xD7, 0x10, +0x6F, 0x70, 0xE9, 0x90, 0x70, 0x8B, 0x0A, 0x90, 0x71, 0x52, 0x1D, 0x10, 0x72, 0x6C, 0x3E, 0x10, +0x73, 0x33, 0x50, 0x90, 0x74, 0x4D, 0x71, 0x90, 0x75, 0x15, 0xD5, 0x90, 0x76, 0x2F, 0xF6, 0x90, +0x76, 0xF7, 0x09, 0x10, 0x78, 0x11, 0x2A, 0x10, 0x78, 0xD8, 0x3C, 0x90, 0x79, 0xF2, 0x5D, 0x90, +0x7A, 0xB9, 0x70, 0x10, 0x7B, 0xD3, 0x91, 0x10, 0x7C, 0x9B, 0xF5, 0x10, 0x7D, 0xB6, 0x16, 0x10, +0x7E, 0x7D, 0x28, 0x90, 0x7F, 0x97, 0x49, 0x90, 0x01, 0x02, 0x01, 0x03, 0x04, 0x05, 0x04, 0x05, +0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, +0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, +0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, +0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x00, 0x00, 0x52, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x5B, +0x68, 0x00, 0x04, 0x00, 0x00, 0x4D, 0x58, 0x00, 0x09, 0x00, 0x00, 0x54, 0x60, 0x00, 0x0D, 0x00, +0x00, 0x54, 0x60, 0x00, 0x12, 0x00, 0x00, 0x62, 0x70, 0x01, 0x16, 0x48, 0x4D, 0x54, 0x00, 0x42, +0x55, 0x52, 0x54, 0x00, 0x49, 0x53, 0x54, 0x00, 0x44, 0x41, 0x43, 0x54, 0x00, 0x42, 0x44, 0x54, +0x00, 0x42, 0x44, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x89, 0x54, 0x40, 0x01, 0x12, 0xA8, 0x80, 0x00, 0x00, 0x00, 0x00, /* Asia/Damascus */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x53, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -7600,15 +7768,32 @@ const unsigned char timelib_timezone_db_data_builtin[257084] = { /* Asia/Dhaka */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x42, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x1B, 0xCA, 0xDB, 0x86, 0xB0, +0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x1B, 0xCA, 0xDB, 0x86, 0xB0, 0xCC, 0x05, 0x71, 0x18, 0xCC, 0x95, 0x32, 0xA8, 0xDD, 0xA8, 0xD2, 0x98, 0x02, 0x4F, 0x9D, 0x20, -0x4A, 0x3B, 0xC4, 0x10, 0x01, 0x02, 0x01, 0x03, 0x04, 0x05, 0x00, 0x00, 0x52, 0xD0, 0x00, 0x00, -0x00, 0x00, 0x5B, 0x68, 0x00, 0x04, 0x00, 0x00, 0x4D, 0x58, 0x00, 0x09, 0x00, 0x00, 0x54, 0x60, -0x00, 0x0D, 0x00, 0x00, 0x54, 0x60, 0x00, 0x12, 0x00, 0x00, 0x62, 0x70, 0x01, 0x16, 0x48, 0x4D, -0x54, 0x00, 0x42, 0x55, 0x52, 0x54, 0x00, 0x49, 0x53, 0x54, 0x00, 0x44, 0x41, 0x43, 0x54, 0x00, -0x42, 0x44, 0x54, 0x00, 0x42, 0x44, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAD, 0x84, 0x92, 0x01, 0x9C, 0x9F, 0x82, 0x00, 0x00, 0x00, -0x00, +0x4A, 0x3B, 0xC4, 0x10, 0x4B, 0x3C, 0xD8, 0x90, 0x4B, 0xB3, 0x7F, 0x90, 0x4C, 0xCD, 0xA0, 0x90, +0x4D, 0x94, 0xB3, 0x10, 0x4E, 0xAE, 0xD4, 0x10, 0x4F, 0x77, 0x38, 0x10, 0x50, 0x91, 0x59, 0x10, +0x51, 0x58, 0x6B, 0x90, 0x52, 0x72, 0x8C, 0x90, 0x53, 0x39, 0x9F, 0x10, 0x54, 0x53, 0xC0, 0x10, +0x55, 0x1A, 0xD2, 0x90, 0x56, 0x34, 0xF3, 0x90, 0x56, 0xFD, 0x57, 0x90, 0x58, 0x17, 0x78, 0x90, +0x58, 0xDE, 0x8B, 0x10, 0x59, 0xF8, 0xAC, 0x10, 0x5A, 0xBF, 0xBE, 0x90, 0x5B, 0xD9, 0xDF, 0x90, +0x5C, 0xA0, 0xF2, 0x10, 0x5D, 0xBB, 0x13, 0x10, 0x5E, 0x83, 0x77, 0x10, 0x5F, 0x9D, 0x98, 0x10, +0x60, 0x64, 0xAA, 0x90, 0x61, 0x7E, 0xCB, 0x90, 0x62, 0x45, 0xDE, 0x10, 0x63, 0x5F, 0xFF, 0x10, +0x64, 0x27, 0x11, 0x90, 0x65, 0x41, 0x32, 0x90, 0x66, 0x09, 0x96, 0x90, 0x67, 0x23, 0xB7, 0x90, +0x67, 0xEA, 0xCA, 0x10, 0x69, 0x04, 0xEB, 0x10, 0x69, 0xCB, 0xFD, 0x90, 0x6A, 0xE6, 0x1E, 0x90, +0x6B, 0xAD, 0x31, 0x10, 0x6C, 0xC7, 0x52, 0x10, 0x6D, 0x8F, 0xB6, 0x10, 0x6E, 0xA9, 0xD7, 0x10, +0x6F, 0x70, 0xE9, 0x90, 0x70, 0x8B, 0x0A, 0x90, 0x71, 0x52, 0x1D, 0x10, 0x72, 0x6C, 0x3E, 0x10, +0x73, 0x33, 0x50, 0x90, 0x74, 0x4D, 0x71, 0x90, 0x75, 0x15, 0xD5, 0x90, 0x76, 0x2F, 0xF6, 0x90, +0x76, 0xF7, 0x09, 0x10, 0x78, 0x11, 0x2A, 0x10, 0x78, 0xD8, 0x3C, 0x90, 0x79, 0xF2, 0x5D, 0x90, +0x7A, 0xB9, 0x70, 0x10, 0x7B, 0xD3, 0x91, 0x10, 0x7C, 0x9B, 0xF5, 0x10, 0x7D, 0xB6, 0x16, 0x10, +0x7E, 0x7D, 0x28, 0x90, 0x7F, 0x97, 0x49, 0x90, 0x01, 0x02, 0x01, 0x03, 0x04, 0x05, 0x04, 0x05, +0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, +0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, +0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, +0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x00, 0x00, 0x52, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x5B, +0x68, 0x00, 0x04, 0x00, 0x00, 0x4D, 0x58, 0x00, 0x09, 0x00, 0x00, 0x54, 0x60, 0x00, 0x0D, 0x00, +0x00, 0x54, 0x60, 0x00, 0x12, 0x00, 0x00, 0x62, 0x70, 0x01, 0x16, 0x48, 0x4D, 0x54, 0x00, 0x42, +0x55, 0x52, 0x54, 0x00, 0x49, 0x53, 0x54, 0x00, 0x44, 0x41, 0x43, 0x54, 0x00, 0x42, 0x44, 0x54, +0x00, 0x42, 0x44, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0xAD, 0x84, 0x92, 0x01, 0x9C, 0x9F, 0x82, 0x00, 0x00, 0x00, 0x00, /* Asia/Dili */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x54, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -16105,20 +16290,20 @@ const unsigned char timelib_timezone_db_data_builtin[257084] = { 0x40, 0x6F, 0xDC, 0xA0, 0x41, 0x84, 0xA9, 0x90, 0x42, 0x4F, 0xBE, 0xA0, 0x43, 0x64, 0x8B, 0x90, 0x44, 0x2F, 0xA0, 0xA0, 0x45, 0x44, 0x6D, 0x90, 0x46, 0x0F, 0x82, 0xA0, 0x47, 0x24, 0x4F, 0x90, 0x47, 0xF8, 0x9F, 0x20, 0x49, 0x04, 0x31, 0x90, 0x49, 0xD8, 0x81, 0x20, 0x4A, 0xE4, 0x13, 0x90, -0x4B, 0xB8, 0x63, 0x20, 0x4C, 0xCD, 0x30, 0x10, 0x4D, 0x98, 0x45, 0x20, 0x4E, 0xAD, 0x12, 0x10, -0x4F, 0x78, 0x27, 0x20, 0x50, 0x8C, 0xF4, 0x10, 0x51, 0x61, 0x43, 0xA0, 0x52, 0x6C, 0xD6, 0x10, -0x53, 0x41, 0x25, 0xA0, 0x54, 0x4C, 0xB8, 0x10, 0x55, 0x21, 0x07, 0xA0, 0x56, 0x2C, 0x9A, 0x10, -0x57, 0x00, 0xE9, 0xA0, 0x58, 0x15, 0xB6, 0x90, 0x58, 0xE0, 0xCB, 0xA0, 0x59, 0xF5, 0x98, 0x90, -0x5A, 0xC0, 0xAD, 0xA0, 0x5B, 0xD5, 0x7A, 0x90, 0x5C, 0xA9, 0xCA, 0x20, 0x5D, 0xB5, 0x5C, 0x90, -0x5E, 0x89, 0xAC, 0x20, 0x5F, 0x95, 0x3E, 0x90, 0x60, 0x69, 0x8E, 0x20, 0x61, 0x7E, 0x5B, 0x10, -0x62, 0x49, 0x70, 0x20, 0x63, 0x5E, 0x3D, 0x10, 0x64, 0x29, 0x52, 0x20, 0x65, 0x3E, 0x1F, 0x10, -0x66, 0x12, 0x6E, 0xA0, 0x67, 0x1E, 0x01, 0x10, 0x67, 0xF2, 0x50, 0xA0, 0x68, 0xFD, 0xE3, 0x10, -0x69, 0xD2, 0x32, 0xA0, 0x6A, 0xDD, 0xC5, 0x10, 0x6B, 0xB2, 0x14, 0xA0, 0x6C, 0xC6, 0xE1, 0x90, -0x6D, 0x91, 0xF6, 0xA0, 0x6E, 0xA6, 0xC3, 0x90, 0x6F, 0x71, 0xD8, 0xA0, 0x70, 0x86, 0xA5, 0x90, -0x71, 0x5A, 0xF5, 0x20, 0x72, 0x66, 0x87, 0x90, 0x73, 0x3A, 0xD7, 0x20, 0x74, 0x46, 0x69, 0x90, -0x75, 0x1A, 0xB9, 0x20, 0x76, 0x2F, 0x86, 0x10, 0x76, 0xFA, 0x9B, 0x20, 0x78, 0x0F, 0x68, 0x10, -0x78, 0xDA, 0x7D, 0x20, 0x79, 0xEF, 0x4A, 0x10, 0x7A, 0xBA, 0x5F, 0x20, 0x7B, 0xCF, 0x2C, 0x10, -0x7C, 0xA3, 0x7B, 0xA0, 0x7D, 0xAF, 0x0E, 0x10, 0x7E, 0x83, 0x5D, 0xA0, 0x7F, 0x8E, 0xF0, 0x10, +0x4B, 0x9C, 0xB3, 0xA0, 0x4C, 0xD6, 0x6A, 0x90, 0x4D, 0x7C, 0x95, 0xA0, 0x4E, 0xB6, 0x4C, 0x90, +0x4F, 0x5C, 0x77, 0xA0, 0x50, 0x96, 0x2E, 0x90, 0x51, 0x3C, 0x59, 0xA0, 0x52, 0x76, 0x10, 0x90, +0x53, 0x1C, 0x3B, 0xA0, 0x54, 0x55, 0xF2, 0x90, 0x54, 0xFC, 0x1D, 0xA0, 0x56, 0x35, 0xD4, 0x90, +0x56, 0xE5, 0x3A, 0x20, 0x58, 0x1E, 0xF1, 0x10, 0x58, 0xC5, 0x1C, 0x20, 0x59, 0xFE, 0xD3, 0x10, +0x5A, 0xA4, 0xFE, 0x20, 0x5B, 0xDE, 0xB5, 0x10, 0x5C, 0x84, 0xE0, 0x20, 0x5D, 0xBE, 0x97, 0x10, +0x5E, 0x64, 0xC2, 0x20, 0x5F, 0x9E, 0x79, 0x10, 0x60, 0x4D, 0xDE, 0xA0, 0x61, 0x87, 0x95, 0x90, +0x62, 0x2D, 0xC0, 0xA0, 0x63, 0x67, 0x77, 0x90, 0x64, 0x0D, 0xA2, 0xA0, 0x65, 0x47, 0x59, 0x90, +0x65, 0xED, 0x84, 0xA0, 0x67, 0x27, 0x3B, 0x90, 0x67, 0xCD, 0x66, 0xA0, 0x69, 0x07, 0x1D, 0x90, +0x69, 0xAD, 0x48, 0xA0, 0x6A, 0xE6, 0xFF, 0x90, 0x6B, 0x96, 0x65, 0x20, 0x6C, 0xD0, 0x1C, 0x10, +0x6D, 0x76, 0x47, 0x20, 0x6E, 0xAF, 0xFE, 0x10, 0x6F, 0x56, 0x29, 0x20, 0x70, 0x8F, 0xE0, 0x10, +0x71, 0x36, 0x0B, 0x20, 0x72, 0x6F, 0xC2, 0x10, 0x73, 0x15, 0xED, 0x20, 0x74, 0x4F, 0xA4, 0x10, +0x74, 0xFF, 0x09, 0xA0, 0x76, 0x38, 0xC0, 0x90, 0x76, 0xDE, 0xEB, 0xA0, 0x78, 0x18, 0xA2, 0x90, +0x78, 0xBE, 0xCD, 0xA0, 0x79, 0xF8, 0x84, 0x90, 0x7A, 0x9E, 0xAF, 0xA0, 0x7B, 0xD8, 0x66, 0x90, +0x7C, 0x7E, 0x91, 0xA0, 0x7D, 0xB8, 0x48, 0x90, 0x7E, 0x5E, 0x73, 0xA0, 0x7F, 0x98, 0x2A, 0x90, 0x01, 0x02, 0x01, 0x02, 0x03, 0x02, 0x04, 0x05, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, @@ -16651,12 +16836,13 @@ const unsigned char timelib_timezone_db_data_builtin[257084] = { /* Pacific/Fiji */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x46, 0x4A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0D, 0x9A, 0x13, 0xB2, 0x3C, +0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0D, 0x9A, 0x13, 0xB2, 0x3C, 0x36, 0x3B, 0x17, 0xE0, 0x36, 0xD7, 0xFA, 0x60, 0x38, 0x24, 0x34, 0x60, 0x38, 0xB7, 0xDC, 0x60, -0x02, 0x01, 0x02, 0x01, 0x02, 0x00, 0x00, 0xA7, 0x44, 0x00, 0x00, 0x00, 0x00, 0xB6, 0xD0, 0x01, -0x04, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x09, 0x4C, 0x4D, 0x54, 0x00, 0x46, 0x4A, 0x53, 0x54, 0x00, -0x46, 0x4A, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6D, 0xA8, 0xEA, 0x02, 0x22, -0xE6, 0x82, 0x00, 0x00, 0x00, 0x00, +0x4B, 0x11, 0x2C, 0xE0, 0x4B, 0xD2, 0xF9, 0x60, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x00, +0x00, 0xA7, 0x44, 0x00, 0x00, 0x00, 0x00, 0xB6, 0xD0, 0x01, 0x04, 0x00, 0x00, 0xA8, 0xC0, 0x00, +0x09, 0x4C, 0x4D, 0x54, 0x00, 0x46, 0x4A, 0x53, 0x54, 0x00, 0x46, 0x4A, 0x54, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x6D, 0xA8, 0xEA, 0x02, 0x22, 0xE6, 0x82, 0x00, 0x00, 0x00, 0x00, + /* Pacific/Funafuti */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x54, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -18061,4 +18247,4 @@ const unsigned char timelib_timezone_db_data_builtin[257084] = { 0x00, 0x00, 0x55, 0x54, 0x43, 0x00, 0x00, 0x00, 0x00, 0x89, 0x54, 0x40, 0x01, 0x12, 0xA8, 0x80, 0x00, 0x00, 0x00, 0x00, }; -const timelib_tzdb timezonedb_builtin = { "2009.18", 561, timezonedb_idx_builtin, timelib_timezone_db_data_builtin }; +const timelib_tzdb timezonedb_builtin = { "2010.3", 564, timezonedb_idx_builtin, timelib_timezone_db_data_builtin }; diff --git a/ext/date/lib/tm2unixtime.c b/ext/date/lib/tm2unixtime.c index b013882b4..e2fa02b69 100644 --- a/ext/date/lib/tm2unixtime.c +++ b/ext/date/lib/tm2unixtime.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: tm2unixtime.c 279799 2009-05-03 18:22:40Z derick $ */ +/* $Id: tm2unixtime.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "timelib.h" diff --git a/ext/date/lib/unixtime2tm.c b/ext/date/lib/unixtime2tm.c index 465e8bf72..416de9b5b 100644 --- a/ext/date/lib/unixtime2tm.c +++ b/ext/date/lib/unixtime2tm.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: unixtime2tm.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: unixtime2tm.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "timelib.h" diff --git a/ext/date/php_date.c b/ext/date/php_date.c index 5b84dbdbb..7a5185b8f 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_date.c 289981 2009-10-27 10:41:45Z pajoye $ */ +/* $Id: php_date.c 294906 2010-02-11 22:37:50Z pajoye $ */ #include "php.h" #include "php_streams.h" @@ -32,15 +32,11 @@ #include #ifdef PHP_WIN32 -# include "win32/php_stdint.h" -#endif - -#if defined(__GNUC__) && __GNUC__ < 3 -static __inline __int64_t llabs( __int64_t i ) { return i >= 0 ? i : -i; } -#endif - -#if defined(NETWARE) && defined(__MWERKS__) -static __inline long long llabs( long long i ) { return i >= 0 ? i : -i; } +static __inline __int64 php_date_llabs( __int64 i ) { return i >= 0? i: -i; } +#elif defined(__GNUC__) && __GNUC__ < 3 +static __inline __int64_t php_date_llabs( __int64_t i ) { return i >= 0 ? i : -i; } +#else +static __inline long long php_date_llabs( long long i ) { return i >= 0 ? i : -i; } #endif /* {{{ arginfo */ @@ -1011,7 +1007,7 @@ static char *date_format(char *format, int format_len, timelib_time *t, int loca { smart_str string = {0}; int i, length; - char buffer[33]; + char buffer[97]; timelib_time_offset *offset = NULL; timelib_sll isoweek, isoyear; int rfc_colon; @@ -1070,7 +1066,7 @@ static char *date_format(char *format, int format_len, timelib_time *t, int loca /* year */ case 'L': length = slprintf(buffer, 32, "%d", timelib_is_leap((int) t->y)); break; case 'y': length = slprintf(buffer, 32, "%02d", (int) t->y % 100); break; - case 'Y': length = slprintf(buffer, 32, "%s%04lld", t->y < 0 ? "-" : "", llabs((timelib_sll) t->y)); break; + case 'Y': length = slprintf(buffer, 32, "%s%04lld", t->y < 0 ? "-" : "", php_date_llabs((timelib_sll) t->y)); break; /* time */ case 'a': length = slprintf(buffer, 32, "%s", t->h >= 12 ? "pm" : "am"); break; @@ -1126,7 +1122,7 @@ static char *date_format(char *format, int format_len, timelib_time *t, int loca case 'Z': length = slprintf(buffer, 32, "%d", localtime ? offset->offset : 0); break; /* full date/time */ - case 'c': length = slprintf(buffer, 32, "%04d-%02d-%02dT%02d:%02d:%02d%c%02d:%02d", + case 'c': length = slprintf(buffer, 96, "%04d-%02d-%02dT%02d:%02d:%02d%c%02d:%02d", (int) t->y, (int) t->m, (int) t->d, (int) t->h, (int) t->i, (int) t->s, localtime ? ((offset->offset < 0) ? '-' : '+') : '+', @@ -1134,7 +1130,7 @@ static char *date_format(char *format, int format_len, timelib_time *t, int loca localtime ? abs((offset->offset % 3600) / 60) : 0 ); break; - case 'r': length = slprintf(buffer, 32, "%3s, %02d %3s %04d %02d:%02d:%02d %c%02d%02d", + case 'r': length = slprintf(buffer, 96, "%3s, %02d %3s %04d %02d:%02d:%02d %c%02d%02d", php_date_short_day_name(t->y, t->m, t->d), (int) t->d, mon_short_names[t->m - 1], (int) t->y, (int) t->h, (int) t->i, (int) t->s, @@ -2759,6 +2755,7 @@ PHP_FUNCTION(date_modify) char *modify; int modify_len; timelib_time *tmp_time; + timelib_error_container *err = NULL; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &object, date_ce_date, &modify, &modify_len) == FAILURE) { RETURN_FALSE; @@ -2766,7 +2763,18 @@ PHP_FUNCTION(date_modify) dateobj = (php_date_obj *) zend_object_store_get_object(object TSRMLS_CC); DATE_CHECK_INITIALIZED(dateobj->time, DateTime); - tmp_time = timelib_strtotime(modify, modify_len, NULL, DATE_TIMEZONEDB); + tmp_time = timelib_strtotime(modify, modify_len, &err, DATE_TIMEZONEDB); + + /* update last errors and warnings */ + update_errors_warnings(err TSRMLS_CC); + if (err && err->error_count) { + /* spit out the first library error message, at least */ + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to parse time string (%s) at position %d (%c): %s", modify, + err->error_messages[0].position, err->error_messages[0].character, err->error_messages[0].message); + timelib_time_dtor(tmp_time); + RETURN_FALSE; + } + memcpy(&dateobj->time->relative, &tmp_time->relative, sizeof(struct timelib_rel_time)); dateobj->time->have_relative = tmp_time->have_relative; dateobj->time->sse_uptodate = 0; diff --git a/ext/date/php_date.h b/ext/date/php_date.h index 37b0af936..e26e96ab2 100644 --- a/ext/date/php_date.h +++ b/ext/date/php_date.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_date.h 281478 2009-05-31 21:28:38Z stas $ */ +/* $Id: php_date.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_DATE_H #define PHP_DATE_H diff --git a/ext/date/tests/DateTimeZone_listIdentifiers_basic1.phpt b/ext/date/tests/DateTimeZone_listIdentifiers_basic1.phpt index c1ab2f99b..7eebfa8fe 100644 --- a/ext/date/tests/DateTimeZone_listIdentifiers_basic1.phpt +++ b/ext/date/tests/DateTimeZone_listIdentifiers_basic1.phpt @@ -13,816 +13,24 @@ echo "*** Testing DateTimeZone::listIdentifiers() : basic functionality ***\n"; //Set the default time zone date_default_timezone_set("GMT"); -var_dump( DateTimeZone::listIdentifiers() ); +$zones = DateTimeZone::listIdentifiers(); +echo "Check return tpe is ARRAY\n"; +var_dump(is_array($zones)); + +echo "Check array contains some common timezones\n"; +var_dump(in_array("Europe/London", $zones)); +var_dump(in_array("America/New_York", $zones)); +var_dump(in_array("UTC", $zones)); ?> ===DONE=== --EXPECT-- *** Testing DateTimeZone::listIdentifiers() : basic functionality *** -array(402) { - [0]=> - string(14) "Africa/Abidjan" - [1]=> - string(12) "Africa/Accra" - [2]=> - string(18) "Africa/Addis_Ababa" - [3]=> - string(14) "Africa/Algiers" - [4]=> - string(13) "Africa/Asmara" - [5]=> - string(13) "Africa/Bamako" - [6]=> - string(13) "Africa/Bangui" - [7]=> - string(13) "Africa/Banjul" - [8]=> - string(13) "Africa/Bissau" - [9]=> - string(15) "Africa/Blantyre" - [10]=> - string(18) "Africa/Brazzaville" - [11]=> - string(16) "Africa/Bujumbura" - [12]=> - string(12) "Africa/Cairo" - [13]=> - string(17) "Africa/Casablanca" - [14]=> - string(12) "Africa/Ceuta" - [15]=> - string(14) "Africa/Conakry" - [16]=> - string(12) "Africa/Dakar" - [17]=> - string(20) "Africa/Dar_es_Salaam" - [18]=> - string(15) "Africa/Djibouti" - [19]=> - string(13) "Africa/Douala" - [20]=> - string(15) "Africa/El_Aaiun" - [21]=> - string(15) "Africa/Freetown" - [22]=> - string(15) "Africa/Gaborone" - [23]=> - string(13) "Africa/Harare" - [24]=> - string(19) "Africa/Johannesburg" - [25]=> - string(14) "Africa/Kampala" - [26]=> - string(15) "Africa/Khartoum" - [27]=> - string(13) "Africa/Kigali" - [28]=> - string(15) "Africa/Kinshasa" - [29]=> - string(12) "Africa/Lagos" - [30]=> - string(17) "Africa/Libreville" - [31]=> - string(11) "Africa/Lome" - [32]=> - string(13) "Africa/Luanda" - [33]=> - string(17) "Africa/Lubumbashi" - [34]=> - string(13) "Africa/Lusaka" - [35]=> - string(13) "Africa/Malabo" - [36]=> - string(13) "Africa/Maputo" - [37]=> - string(13) "Africa/Maseru" - [38]=> - string(14) "Africa/Mbabane" - [39]=> - string(16) "Africa/Mogadishu" - [40]=> - string(15) "Africa/Monrovia" - [41]=> - string(14) "Africa/Nairobi" - [42]=> - string(15) "Africa/Ndjamena" - [43]=> - string(13) "Africa/Niamey" - [44]=> - string(17) "Africa/Nouakchott" - [45]=> - string(18) "Africa/Ouagadougou" - [46]=> - string(17) "Africa/Porto-Novo" - [47]=> - string(15) "Africa/Sao_Tome" - [48]=> - string(14) "Africa/Tripoli" - [49]=> - string(12) "Africa/Tunis" - [50]=> - string(15) "Africa/Windhoek" - [51]=> - string(12) "America/Adak" - [52]=> - string(17) "America/Anchorage" - [53]=> - string(16) "America/Anguilla" - [54]=> - string(15) "America/Antigua" - [55]=> - string(17) "America/Araguaina" - [56]=> - string(30) "America/Argentina/Buenos_Aires" - [57]=> - string(27) "America/Argentina/Catamarca" - [58]=> - string(25) "America/Argentina/Cordoba" - [59]=> - string(23) "America/Argentina/Jujuy" - [60]=> - string(26) "America/Argentina/La_Rioja" - [61]=> - string(25) "America/Argentina/Mendoza" - [62]=> - string(30) "America/Argentina/Rio_Gallegos" - [63]=> - string(23) "America/Argentina/Salta" - [64]=> - string(26) "America/Argentina/San_Juan" - [65]=> - string(26) "America/Argentina/San_Luis" - [66]=> - string(25) "America/Argentina/Tucuman" - [67]=> - string(25) "America/Argentina/Ushuaia" - [68]=> - string(13) "America/Aruba" - [69]=> - string(16) "America/Asuncion" - [70]=> - string(16) "America/Atikokan" - [71]=> - string(13) "America/Bahia" - [72]=> - string(16) "America/Barbados" - [73]=> - string(13) "America/Belem" - [74]=> - string(14) "America/Belize" - [75]=> - string(20) "America/Blanc-Sablon" - [76]=> - string(17) "America/Boa_Vista" - [77]=> - string(14) "America/Bogota" - [78]=> - string(13) "America/Boise" - [79]=> - string(21) "America/Cambridge_Bay" - [80]=> - string(20) "America/Campo_Grande" - [81]=> - string(14) "America/Cancun" - [82]=> - string(15) "America/Caracas" - [83]=> - string(15) "America/Cayenne" - [84]=> - string(14) "America/Cayman" - [85]=> - string(15) "America/Chicago" - [86]=> - string(17) "America/Chihuahua" - [87]=> - string(18) "America/Costa_Rica" - [88]=> - string(14) "America/Cuiaba" - [89]=> - string(15) "America/Curacao" - [90]=> - string(20) "America/Danmarkshavn" - [91]=> - string(14) "America/Dawson" - [92]=> - string(20) "America/Dawson_Creek" - [93]=> - string(14) "America/Denver" - [94]=> - string(15) "America/Detroit" - [95]=> - string(16) "America/Dominica" - [96]=> - string(16) "America/Edmonton" - [97]=> - string(16) "America/Eirunepe" - [98]=> - string(19) "America/El_Salvador" - [99]=> - string(17) "America/Fortaleza" - [100]=> - string(17) "America/Glace_Bay" - [101]=> - string(15) "America/Godthab" - [102]=> - string(17) "America/Goose_Bay" - [103]=> - string(18) "America/Grand_Turk" - [104]=> - string(15) "America/Grenada" - [105]=> - string(18) "America/Guadeloupe" - [106]=> - string(17) "America/Guatemala" - [107]=> - string(17) "America/Guayaquil" - [108]=> - string(14) "America/Guyana" - [109]=> - string(15) "America/Halifax" - [110]=> - string(14) "America/Havana" - [111]=> - string(18) "America/Hermosillo" - [112]=> - string(28) "America/Indiana/Indianapolis" - [113]=> - string(20) "America/Indiana/Knox" - [114]=> - string(23) "America/Indiana/Marengo" - [115]=> - string(26) "America/Indiana/Petersburg" - [116]=> - string(25) "America/Indiana/Tell_City" - [117]=> - string(21) "America/Indiana/Vevay" - [118]=> - string(25) "America/Indiana/Vincennes" - [119]=> - string(23) "America/Indiana/Winamac" - [120]=> - string(14) "America/Inuvik" - [121]=> - string(15) "America/Iqaluit" - [122]=> - string(15) "America/Jamaica" - [123]=> - string(14) "America/Juneau" - [124]=> - string(27) "America/Kentucky/Louisville" - [125]=> - string(27) "America/Kentucky/Monticello" - [126]=> - string(14) "America/La_Paz" - [127]=> - string(12) "America/Lima" - [128]=> - string(19) "America/Los_Angeles" - [129]=> - string(14) "America/Maceio" - [130]=> - string(15) "America/Managua" - [131]=> - string(14) "America/Manaus" - [132]=> - string(15) "America/Marigot" - [133]=> - string(18) "America/Martinique" - [134]=> - string(16) "America/Mazatlan" - [135]=> - string(17) "America/Menominee" - [136]=> - string(14) "America/Merida" - [137]=> - string(19) "America/Mexico_City" - [138]=> - string(16) "America/Miquelon" - [139]=> - string(15) "America/Moncton" - [140]=> - string(17) "America/Monterrey" - [141]=> - string(18) "America/Montevideo" - [142]=> - string(16) "America/Montreal" - [143]=> - string(18) "America/Montserrat" - [144]=> - string(14) "America/Nassau" - [145]=> - string(16) "America/New_York" - [146]=> - string(15) "America/Nipigon" - [147]=> - string(12) "America/Nome" - [148]=> - string(15) "America/Noronha" - [149]=> - string(27) "America/North_Dakota/Center" - [150]=> - string(30) "America/North_Dakota/New_Salem" - [151]=> - string(14) "America/Panama" - [152]=> - string(19) "America/Pangnirtung" - [153]=> - string(18) "America/Paramaribo" - [154]=> - string(15) "America/Phoenix" - [155]=> - string(22) "America/Port-au-Prince" - [156]=> - string(21) "America/Port_of_Spain" - [157]=> - string(19) "America/Porto_Velho" - [158]=> - string(19) "America/Puerto_Rico" - [159]=> - string(19) "America/Rainy_River" - [160]=> - string(20) "America/Rankin_Inlet" - [161]=> - string(14) "America/Recife" - [162]=> - string(14) "America/Regina" - [163]=> - string(16) "America/Resolute" - [164]=> - string(18) "America/Rio_Branco" - [165]=> - string(16) "America/Santarem" - [166]=> - string(16) "America/Santiago" - [167]=> - string(21) "America/Santo_Domingo" - [168]=> - string(17) "America/Sao_Paulo" - [169]=> - string(20) "America/Scoresbysund" - [170]=> - string(16) "America/Shiprock" - [171]=> - string(21) "America/St_Barthelemy" - [172]=> - string(16) "America/St_Johns" - [173]=> - string(16) "America/St_Kitts" - [174]=> - string(16) "America/St_Lucia" - [175]=> - string(17) "America/St_Thomas" - [176]=> - string(18) "America/St_Vincent" - [177]=> - string(21) "America/Swift_Current" - [178]=> - string(19) "America/Tegucigalpa" - [179]=> - string(13) "America/Thule" - [180]=> - string(19) "America/Thunder_Bay" - [181]=> - string(15) "America/Tijuana" - [182]=> - string(15) "America/Toronto" - [183]=> - string(15) "America/Tortola" - [184]=> - string(17) "America/Vancouver" - [185]=> - string(18) "America/Whitehorse" - [186]=> - string(16) "America/Winnipeg" - [187]=> - string(15) "America/Yakutat" - [188]=> - string(19) "America/Yellowknife" - [189]=> - string(16) "Antarctica/Casey" - [190]=> - string(16) "Antarctica/Davis" - [191]=> - string(25) "Antarctica/DumontDUrville" - [192]=> - string(17) "Antarctica/Mawson" - [193]=> - string(18) "Antarctica/McMurdo" - [194]=> - string(17) "Antarctica/Palmer" - [195]=> - string(18) "Antarctica/Rothera" - [196]=> - string(21) "Antarctica/South_Pole" - [197]=> - string(16) "Antarctica/Syowa" - [198]=> - string(17) "Antarctica/Vostok" - [199]=> - string(19) "Arctic/Longyearbyen" - [200]=> - string(9) "Asia/Aden" - [201]=> - string(11) "Asia/Almaty" - [202]=> - string(10) "Asia/Amman" - [203]=> - string(11) "Asia/Anadyr" - [204]=> - string(10) "Asia/Aqtau" - [205]=> - string(11) "Asia/Aqtobe" - [206]=> - string(13) "Asia/Ashgabat" - [207]=> - string(12) "Asia/Baghdad" - [208]=> - string(12) "Asia/Bahrain" - [209]=> - string(9) "Asia/Baku" - [210]=> - string(12) "Asia/Bangkok" - [211]=> - string(11) "Asia/Beirut" - [212]=> - string(12) "Asia/Bishkek" - [213]=> - string(11) "Asia/Brunei" - [214]=> - string(15) "Asia/Choibalsan" - [215]=> - string(14) "Asia/Chongqing" - [216]=> - string(12) "Asia/Colombo" - [217]=> - string(13) "Asia/Damascus" - [218]=> - string(10) "Asia/Dhaka" - [219]=> - string(9) "Asia/Dili" - [220]=> - string(10) "Asia/Dubai" - [221]=> - string(13) "Asia/Dushanbe" - [222]=> - string(9) "Asia/Gaza" - [223]=> - string(11) "Asia/Harbin" - [224]=> - string(16) "Asia/Ho_Chi_Minh" - [225]=> - string(14) "Asia/Hong_Kong" - [226]=> - string(9) "Asia/Hovd" - [227]=> - string(12) "Asia/Irkutsk" - [228]=> - string(12) "Asia/Jakarta" - [229]=> - string(13) "Asia/Jayapura" - [230]=> - string(14) "Asia/Jerusalem" - [231]=> - string(10) "Asia/Kabul" - [232]=> - string(14) "Asia/Kamchatka" - [233]=> - string(12) "Asia/Karachi" - [234]=> - string(12) "Asia/Kashgar" - [235]=> - string(14) "Asia/Kathmandu" - [236]=> - string(12) "Asia/Kolkata" - [237]=> - string(16) "Asia/Krasnoyarsk" - [238]=> - string(17) "Asia/Kuala_Lumpur" - [239]=> - string(12) "Asia/Kuching" - [240]=> - string(11) "Asia/Kuwait" - [241]=> - string(10) "Asia/Macau" - [242]=> - string(12) "Asia/Magadan" - [243]=> - string(13) "Asia/Makassar" - [244]=> - string(11) "Asia/Manila" - [245]=> - string(11) "Asia/Muscat" - [246]=> - string(12) "Asia/Nicosia" - [247]=> - string(16) "Asia/Novosibirsk" - [248]=> - string(9) "Asia/Omsk" - [249]=> - string(9) "Asia/Oral" - [250]=> - string(15) "Asia/Phnom_Penh" - [251]=> - string(14) "Asia/Pontianak" - [252]=> - string(14) "Asia/Pyongyang" - [253]=> - string(10) "Asia/Qatar" - [254]=> - string(14) "Asia/Qyzylorda" - [255]=> - string(12) "Asia/Rangoon" - [256]=> - string(11) "Asia/Riyadh" - [257]=> - string(13) "Asia/Sakhalin" - [258]=> - string(14) "Asia/Samarkand" - [259]=> - string(10) "Asia/Seoul" - [260]=> - string(13) "Asia/Shanghai" - [261]=> - string(14) "Asia/Singapore" - [262]=> - string(11) "Asia/Taipei" - [263]=> - string(13) "Asia/Tashkent" - [264]=> - string(12) "Asia/Tbilisi" - [265]=> - string(11) "Asia/Tehran" - [266]=> - string(12) "Asia/Thimphu" - [267]=> - string(10) "Asia/Tokyo" - [268]=> - string(16) "Asia/Ulaanbaatar" - [269]=> - string(11) "Asia/Urumqi" - [270]=> - string(14) "Asia/Vientiane" - [271]=> - string(16) "Asia/Vladivostok" - [272]=> - string(12) "Asia/Yakutsk" - [273]=> - string(18) "Asia/Yekaterinburg" - [274]=> - string(12) "Asia/Yerevan" - [275]=> - string(15) "Atlantic/Azores" - [276]=> - string(16) "Atlantic/Bermuda" - [277]=> - string(15) "Atlantic/Canary" - [278]=> - string(19) "Atlantic/Cape_Verde" - [279]=> - string(14) "Atlantic/Faroe" - [280]=> - string(16) "Atlantic/Madeira" - [281]=> - string(18) "Atlantic/Reykjavik" - [282]=> - string(22) "Atlantic/South_Georgia" - [283]=> - string(18) "Atlantic/St_Helena" - [284]=> - string(16) "Atlantic/Stanley" - [285]=> - string(18) "Australia/Adelaide" - [286]=> - string(18) "Australia/Brisbane" - [287]=> - string(21) "Australia/Broken_Hill" - [288]=> - string(16) "Australia/Currie" - [289]=> - string(16) "Australia/Darwin" - [290]=> - string(15) "Australia/Eucla" - [291]=> - string(16) "Australia/Hobart" - [292]=> - string(18) "Australia/Lindeman" - [293]=> - string(19) "Australia/Lord_Howe" - [294]=> - string(19) "Australia/Melbourne" - [295]=> - string(15) "Australia/Perth" - [296]=> - string(16) "Australia/Sydney" - [297]=> - string(16) "Europe/Amsterdam" - [298]=> - string(14) "Europe/Andorra" - [299]=> - string(13) "Europe/Athens" - [300]=> - string(15) "Europe/Belgrade" - [301]=> - string(13) "Europe/Berlin" - [302]=> - string(17) "Europe/Bratislava" - [303]=> - string(15) "Europe/Brussels" - [304]=> - string(16) "Europe/Bucharest" - [305]=> - string(15) "Europe/Budapest" - [306]=> - string(15) "Europe/Chisinau" - [307]=> - string(17) "Europe/Copenhagen" - [308]=> - string(13) "Europe/Dublin" - [309]=> - string(16) "Europe/Gibraltar" - [310]=> - string(15) "Europe/Guernsey" - [311]=> - string(15) "Europe/Helsinki" - [312]=> - string(18) "Europe/Isle_of_Man" - [313]=> - string(15) "Europe/Istanbul" - [314]=> - string(13) "Europe/Jersey" - [315]=> - string(18) "Europe/Kaliningrad" - [316]=> - string(11) "Europe/Kiev" - [317]=> - string(13) "Europe/Lisbon" - [318]=> - string(16) "Europe/Ljubljana" - [319]=> - string(13) "Europe/London" - [320]=> - string(17) "Europe/Luxembourg" - [321]=> - string(13) "Europe/Madrid" - [322]=> - string(12) "Europe/Malta" - [323]=> - string(16) "Europe/Mariehamn" - [324]=> - string(12) "Europe/Minsk" - [325]=> - string(13) "Europe/Monaco" - [326]=> - string(13) "Europe/Moscow" - [327]=> - string(11) "Europe/Oslo" - [328]=> - string(12) "Europe/Paris" - [329]=> - string(16) "Europe/Podgorica" - [330]=> - string(13) "Europe/Prague" - [331]=> - string(11) "Europe/Riga" - [332]=> - string(11) "Europe/Rome" - [333]=> - string(13) "Europe/Samara" - [334]=> - string(17) "Europe/San_Marino" - [335]=> - string(15) "Europe/Sarajevo" - [336]=> - string(17) "Europe/Simferopol" - [337]=> - string(13) "Europe/Skopje" - [338]=> - string(12) "Europe/Sofia" - [339]=> - string(16) "Europe/Stockholm" - [340]=> - string(14) "Europe/Tallinn" - [341]=> - string(13) "Europe/Tirane" - [342]=> - string(15) "Europe/Uzhgorod" - [343]=> - string(12) "Europe/Vaduz" - [344]=> - string(14) "Europe/Vatican" - [345]=> - string(13) "Europe/Vienna" - [346]=> - string(14) "Europe/Vilnius" - [347]=> - string(16) "Europe/Volgograd" - [348]=> - string(13) "Europe/Warsaw" - [349]=> - string(13) "Europe/Zagreb" - [350]=> - string(17) "Europe/Zaporozhye" - [351]=> - string(13) "Europe/Zurich" - [352]=> - string(19) "Indian/Antananarivo" - [353]=> - string(13) "Indian/Chagos" - [354]=> - string(16) "Indian/Christmas" - [355]=> - string(12) "Indian/Cocos" - [356]=> - string(13) "Indian/Comoro" - [357]=> - string(16) "Indian/Kerguelen" - [358]=> - string(11) "Indian/Mahe" - [359]=> - string(15) "Indian/Maldives" - [360]=> - string(16) "Indian/Mauritius" - [361]=> - string(14) "Indian/Mayotte" - [362]=> - string(14) "Indian/Reunion" - [363]=> - string(12) "Pacific/Apia" - [364]=> - string(16) "Pacific/Auckland" - [365]=> - string(15) "Pacific/Chatham" - [366]=> - string(14) "Pacific/Easter" - [367]=> - string(13) "Pacific/Efate" - [368]=> - string(17) "Pacific/Enderbury" - [369]=> - string(15) "Pacific/Fakaofo" - [370]=> - string(12) "Pacific/Fiji" - [371]=> - string(16) "Pacific/Funafuti" - [372]=> - string(17) "Pacific/Galapagos" - [373]=> - string(15) "Pacific/Gambier" - [374]=> - string(19) "Pacific/Guadalcanal" - [375]=> - string(12) "Pacific/Guam" - [376]=> - string(16) "Pacific/Honolulu" - [377]=> - string(16) "Pacific/Johnston" - [378]=> - string(18) "Pacific/Kiritimati" - [379]=> - string(14) "Pacific/Kosrae" - [380]=> - string(17) "Pacific/Kwajalein" - [381]=> - string(14) "Pacific/Majuro" - [382]=> - string(17) "Pacific/Marquesas" - [383]=> - string(14) "Pacific/Midway" - [384]=> - string(13) "Pacific/Nauru" - [385]=> - string(12) "Pacific/Niue" - [386]=> - string(15) "Pacific/Norfolk" - [387]=> - string(14) "Pacific/Noumea" - [388]=> - string(17) "Pacific/Pago_Pago" - [389]=> - string(13) "Pacific/Palau" - [390]=> - string(16) "Pacific/Pitcairn" - [391]=> - string(14) "Pacific/Ponape" - [392]=> - string(20) "Pacific/Port_Moresby" - [393]=> - string(17) "Pacific/Rarotonga" - [394]=> - string(14) "Pacific/Saipan" - [395]=> - string(14) "Pacific/Tahiti" - [396]=> - string(14) "Pacific/Tarawa" - [397]=> - string(17) "Pacific/Tongatapu" - [398]=> - string(12) "Pacific/Truk" - [399]=> - string(12) "Pacific/Wake" - [400]=> - string(14) "Pacific/Wallis" - [401]=> - string(3) "UTC" -} -===DONE=== \ No newline at end of file +Check return tpe is ARRAY +bool(true) +Check array contains some common timezones +bool(true) +bool(true) +bool(true) +===DONE=== + \ No newline at end of file diff --git a/ext/date/tests/bug45866.phpt b/ext/date/tests/bug45866.phpt new file mode 100644 index 000000000..a8407a634 --- /dev/null +++ b/ext/date/tests/bug45866.phpt @@ -0,0 +1,24 @@ +--TEST-- +Bug #45866 (decimal values fed to DateTime->modify() causes long execution times) +--INI-- +date.timezone=UTC +--FILE-- +modify( "+1.61538461538 day" ); +echo $date->format( 'r' ), "\n"; + +$date = new DateTime( '2009-07-29 16:44:23 Europe/London' ); +$date->modify( "61538461538 day" ); +echo $date->format( 'r' ), "\n"; + +$date = new DateTime( '2009-07-29 16:44:23 Europe/London' ); +$date->modify( "£61538461538 day" ); +echo $date->format( 'r' ), "\n"; +?> +--EXPECTF-- +Thu, 14 Aug 168488594 16:44:23 +0000 +Thu, 14 Aug 168488594 16:44:23 +0000 + +Warning: DateTime::modify(): Failed to parse time string (£61538461538 day) at position 0 (%s): Unexpected character in %sbug45866.php on line 11 +Wed, 29 Jul 2009 16:44:23 +0100 diff --git a/ext/date/tests/bug46268.phpt b/ext/date/tests/bug46268.phpt index dd2d4a3ca..808fd856a 100644 --- a/ext/date/tests/bug46268.phpt +++ b/ext/date/tests/bug46268.phpt @@ -7,10 +7,10 @@ date_default_timezone_set('Asia/Tokyo'); $now = new DateTime('2008-10-10 01:02:03'); echo $now->format("Y-m-d H:i:s") . PHP_EOL; -$now->modify("1 day after"); +$now->modify("1 day"); echo $now->format("Y-m-d H:i:s") . PHP_EOL; -$now->modify("1 hour after"); +$now->modify("1 hour"); echo $now->format("Y-m-d H:i:s") . PHP_EOL; $now->setTime(0, 0, 0); diff --git a/ext/date/tests/bug49585.phpt b/ext/date/tests/bug49585.phpt new file mode 100644 index 000000000..2ec14245e --- /dev/null +++ b/ext/date/tests/bug49585.phpt @@ -0,0 +1,16 @@ +--TEST-- +Bug #49585 (date_format buffer not long enough for >4 digit years) +--FILE-- +format('r')); + +$date->setDate(-2147483648, 1, 1); +var_dump($date->format('r')); +var_dump($date->format('c')); +--EXPECT-- +string(32) "Sat, 01 Jan -1500 00:00:00 +0000" +string(42) "Unknown, 01 Jan -2147483648 00:00:00 +0000" +string(32) "-2147483648-01-01T00:00:00+00:00" diff --git a/ext/date/tests/bug50392.phpt b/ext/date/tests/bug50392.phpt new file mode 100644 index 000000000..8d10923e0 --- /dev/null +++ b/ext/date/tests/bug50392.phpt @@ -0,0 +1,63 @@ +--TEST-- +Bug #50392 date_create_from_format enforces 6 digits for 'u' format character +--FILE-- + +--EXPECT-- +bool(false) +object(DateTime)#2 (3) { + ["date"]=> + string(19) "2009-03-01 18:00:00" + ["timezone_type"]=> + int(3) + ["timezone"]=> + string(17) "Europe/Bratislava" +} +object(DateTime)#2 (3) { + ["date"]=> + string(19) "2009-03-01 18:00:00" + ["timezone_type"]=> + int(3) + ["timezone"]=> + string(17) "Europe/Bratislava" +} +object(DateTime)#2 (3) { + ["date"]=> + string(19) "2009-03-01 18:00:00" + ["timezone_type"]=> + int(3) + ["timezone"]=> + string(17) "Europe/Bratislava" +} +object(DateTime)#2 (3) { + ["date"]=> + string(19) "2009-03-01 18:00:00" + ["timezone_type"]=> + int(3) + ["timezone"]=> + string(17) "Europe/Bratislava" +} +object(DateTime)#2 (3) { + ["date"]=> + string(19) "2009-03-01 18:00:00" + ["timezone_type"]=> + int(3) + ["timezone"]=> + string(17) "Europe/Bratislava" +} +object(DateTime)#2 (3) { + ["date"]=> + string(19) "2009-03-01 18:00:00" + ["timezone_type"]=> + int(3) + ["timezone"]=> + string(17) "Europe/Bratislava" +} +bool(false) diff --git a/ext/date/tests/bug50680.phpt b/ext/date/tests/bug50680.phpt new file mode 100644 index 000000000..99b138146 --- /dev/null +++ b/ext/date/tests/bug50680.phpt @@ -0,0 +1,9 @@ +--TEST-- +Bug #50680 ("eighth" quantifier is not understood) +--INI-- +date.timezone=UTC +--FILE-- +format(DateTime::RFC822)); $c = clone $d; var_dump($c->format(DateTime::RFC822)); -$d->modify("1 hour after"); +$d->modify("1 hour"); $c->modify("1 second ago"); var_dump($d->format(DateTime::RFC822)); var_dump($c->format(DateTime::RFC822)); diff --git a/ext/date/tests/sunfuncts.phpt b/ext/date/tests/sunfuncts.phpt new file mode 100644 index 000000000..59acb122c --- /dev/null +++ b/ext/date/tests/sunfuncts.phpt @@ -0,0 +1,42 @@ +--TEST-- +date_sunrise() and date_sunset() functions +--INI-- +precision=13 +--FILE-- + +--EXPECTF-- +1041395864 06:37 6.6290131458%d +1041432452 16:47 16.792451114%d +1044073855 06:30 6.5154089279%d +1044112463 17:14 17.239870289%d +1046491495 06:04 6.0822145033%d +1046533075 17:37 17.632011035%d +1049167581 05:26 5.4394438111%d +1049212774 17:59 17.993035729%d +1051757532 04:52 4.8701934126%d +1051806007 18:20 18.335390508%d +1054434776 04:32 4.5489827182%d +1054485647 18:40 18.679812949%d +1057026949 04:35 4.5971956372%d +1057078197 18:49 18.832563396%d +1059706409 04:53 4.8916575089%d +1059755837 18:37 18.621440704%d +1062385999 05:13 5.2220951121%d +1062432291 18:04 18.080957168%d +1064979098 05:31 5.5273199215%d +1065021952 17:25 17.431339135%d +1067658845 05:54 5.9016292870%d +1067698274 16:51 16.853902453%d +1070252387 06:19 6.3299242689%d +1070289382 16:36 16.606312600%d diff --git a/ext/date/tests/timezone_identifiers_list_basic1.phpt b/ext/date/tests/timezone_identifiers_list_basic1.phpt index 80bee6d7a..4476da20d 100644 --- a/ext/date/tests/timezone_identifiers_list_basic1.phpt +++ b/ext/date/tests/timezone_identifiers_list_basic1.phpt @@ -13,816 +13,24 @@ echo "*** Testing timezone_identifiers_list() : basic functionality ***\n"; //Set the default time zone date_default_timezone_set("GMT"); -var_dump (timezone_identifiers_list() ); +$zones = timezone_identifiers_list(); +echo "Check return tpe is ARRAY\n"; +var_dump(is_array($zones)); + +echo "Check array contains some common timezones\n"; +var_dump(in_array("Europe/London", $zones)); +var_dump(in_array("America/New_York", $zones)); +var_dump(in_array("UTC", $zones)); ?> ===DONE=== --EXPECTF-- *** Testing timezone_identifiers_list() : basic functionality *** -array(402) { - [0]=> - string(14) "Africa/Abidjan" - [1]=> - string(12) "Africa/Accra" - [2]=> - string(18) "Africa/Addis_Ababa" - [3]=> - string(14) "Africa/Algiers" - [4]=> - string(13) "Africa/Asmara" - [5]=> - string(13) "Africa/Bamako" - [6]=> - string(13) "Africa/Bangui" - [7]=> - string(13) "Africa/Banjul" - [8]=> - string(13) "Africa/Bissau" - [9]=> - string(15) "Africa/Blantyre" - [10]=> - string(18) "Africa/Brazzaville" - [11]=> - string(16) "Africa/Bujumbura" - [12]=> - string(12) "Africa/Cairo" - [13]=> - string(17) "Africa/Casablanca" - [14]=> - string(12) "Africa/Ceuta" - [15]=> - string(14) "Africa/Conakry" - [16]=> - string(12) "Africa/Dakar" - [17]=> - string(20) "Africa/Dar_es_Salaam" - [18]=> - string(15) "Africa/Djibouti" - [19]=> - string(13) "Africa/Douala" - [20]=> - string(15) "Africa/El_Aaiun" - [21]=> - string(15) "Africa/Freetown" - [22]=> - string(15) "Africa/Gaborone" - [23]=> - string(13) "Africa/Harare" - [24]=> - string(19) "Africa/Johannesburg" - [25]=> - string(14) "Africa/Kampala" - [26]=> - string(15) "Africa/Khartoum" - [27]=> - string(13) "Africa/Kigali" - [28]=> - string(15) "Africa/Kinshasa" - [29]=> - string(12) "Africa/Lagos" - [30]=> - string(17) "Africa/Libreville" - [31]=> - string(11) "Africa/Lome" - [32]=> - string(13) "Africa/Luanda" - [33]=> - string(17) "Africa/Lubumbashi" - [34]=> - string(13) "Africa/Lusaka" - [35]=> - string(13) "Africa/Malabo" - [36]=> - string(13) "Africa/Maputo" - [37]=> - string(13) "Africa/Maseru" - [38]=> - string(14) "Africa/Mbabane" - [39]=> - string(16) "Africa/Mogadishu" - [40]=> - string(15) "Africa/Monrovia" - [41]=> - string(14) "Africa/Nairobi" - [42]=> - string(15) "Africa/Ndjamena" - [43]=> - string(13) "Africa/Niamey" - [44]=> - string(17) "Africa/Nouakchott" - [45]=> - string(18) "Africa/Ouagadougou" - [46]=> - string(17) "Africa/Porto-Novo" - [47]=> - string(15) "Africa/Sao_Tome" - [48]=> - string(14) "Africa/Tripoli" - [49]=> - string(12) "Africa/Tunis" - [50]=> - string(15) "Africa/Windhoek" - [51]=> - string(12) "America/Adak" - [52]=> - string(17) "America/Anchorage" - [53]=> - string(16) "America/Anguilla" - [54]=> - string(15) "America/Antigua" - [55]=> - string(17) "America/Araguaina" - [56]=> - string(30) "America/Argentina/Buenos_Aires" - [57]=> - string(27) "America/Argentina/Catamarca" - [58]=> - string(25) "America/Argentina/Cordoba" - [59]=> - string(23) "America/Argentina/Jujuy" - [60]=> - string(26) "America/Argentina/La_Rioja" - [61]=> - string(25) "America/Argentina/Mendoza" - [62]=> - string(30) "America/Argentina/Rio_Gallegos" - [63]=> - string(23) "America/Argentina/Salta" - [64]=> - string(26) "America/Argentina/San_Juan" - [65]=> - string(26) "America/Argentina/San_Luis" - [66]=> - string(25) "America/Argentina/Tucuman" - [67]=> - string(25) "America/Argentina/Ushuaia" - [68]=> - string(13) "America/Aruba" - [69]=> - string(16) "America/Asuncion" - [70]=> - string(16) "America/Atikokan" - [71]=> - string(13) "America/Bahia" - [72]=> - string(16) "America/Barbados" - [73]=> - string(13) "America/Belem" - [74]=> - string(14) "America/Belize" - [75]=> - string(20) "America/Blanc-Sablon" - [76]=> - string(17) "America/Boa_Vista" - [77]=> - string(14) "America/Bogota" - [78]=> - string(13) "America/Boise" - [79]=> - string(21) "America/Cambridge_Bay" - [80]=> - string(20) "America/Campo_Grande" - [81]=> - string(14) "America/Cancun" - [82]=> - string(15) "America/Caracas" - [83]=> - string(15) "America/Cayenne" - [84]=> - string(14) "America/Cayman" - [85]=> - string(15) "America/Chicago" - [86]=> - string(17) "America/Chihuahua" - [87]=> - string(18) "America/Costa_Rica" - [88]=> - string(14) "America/Cuiaba" - [89]=> - string(15) "America/Curacao" - [90]=> - string(20) "America/Danmarkshavn" - [91]=> - string(14) "America/Dawson" - [92]=> - string(20) "America/Dawson_Creek" - [93]=> - string(14) "America/Denver" - [94]=> - string(15) "America/Detroit" - [95]=> - string(16) "America/Dominica" - [96]=> - string(16) "America/Edmonton" - [97]=> - string(16) "America/Eirunepe" - [98]=> - string(19) "America/El_Salvador" - [99]=> - string(17) "America/Fortaleza" - [100]=> - string(17) "America/Glace_Bay" - [101]=> - string(15) "America/Godthab" - [102]=> - string(17) "America/Goose_Bay" - [103]=> - string(18) "America/Grand_Turk" - [104]=> - string(15) "America/Grenada" - [105]=> - string(18) "America/Guadeloupe" - [106]=> - string(17) "America/Guatemala" - [107]=> - string(17) "America/Guayaquil" - [108]=> - string(14) "America/Guyana" - [109]=> - string(15) "America/Halifax" - [110]=> - string(14) "America/Havana" - [111]=> - string(18) "America/Hermosillo" - [112]=> - string(28) "America/Indiana/Indianapolis" - [113]=> - string(20) "America/Indiana/Knox" - [114]=> - string(23) "America/Indiana/Marengo" - [115]=> - string(26) "America/Indiana/Petersburg" - [116]=> - string(25) "America/Indiana/Tell_City" - [117]=> - string(21) "America/Indiana/Vevay" - [118]=> - string(25) "America/Indiana/Vincennes" - [119]=> - string(23) "America/Indiana/Winamac" - [120]=> - string(14) "America/Inuvik" - [121]=> - string(15) "America/Iqaluit" - [122]=> - string(15) "America/Jamaica" - [123]=> - string(14) "America/Juneau" - [124]=> - string(27) "America/Kentucky/Louisville" - [125]=> - string(27) "America/Kentucky/Monticello" - [126]=> - string(14) "America/La_Paz" - [127]=> - string(12) "America/Lima" - [128]=> - string(19) "America/Los_Angeles" - [129]=> - string(14) "America/Maceio" - [130]=> - string(15) "America/Managua" - [131]=> - string(14) "America/Manaus" - [132]=> - string(15) "America/Marigot" - [133]=> - string(18) "America/Martinique" - [134]=> - string(16) "America/Mazatlan" - [135]=> - string(17) "America/Menominee" - [136]=> - string(14) "America/Merida" - [137]=> - string(19) "America/Mexico_City" - [138]=> - string(16) "America/Miquelon" - [139]=> - string(15) "America/Moncton" - [140]=> - string(17) "America/Monterrey" - [141]=> - string(18) "America/Montevideo" - [142]=> - string(16) "America/Montreal" - [143]=> - string(18) "America/Montserrat" - [144]=> - string(14) "America/Nassau" - [145]=> - string(16) "America/New_York" - [146]=> - string(15) "America/Nipigon" - [147]=> - string(12) "America/Nome" - [148]=> - string(15) "America/Noronha" - [149]=> - string(27) "America/North_Dakota/Center" - [150]=> - string(30) "America/North_Dakota/New_Salem" - [151]=> - string(14) "America/Panama" - [152]=> - string(19) "America/Pangnirtung" - [153]=> - string(18) "America/Paramaribo" - [154]=> - string(15) "America/Phoenix" - [155]=> - string(22) "America/Port-au-Prince" - [156]=> - string(21) "America/Port_of_Spain" - [157]=> - string(19) "America/Porto_Velho" - [158]=> - string(19) "America/Puerto_Rico" - [159]=> - string(19) "America/Rainy_River" - [160]=> - string(20) "America/Rankin_Inlet" - [161]=> - string(14) "America/Recife" - [162]=> - string(14) "America/Regina" - [163]=> - string(16) "America/Resolute" - [164]=> - string(18) "America/Rio_Branco" - [165]=> - string(16) "America/Santarem" - [166]=> - string(16) "America/Santiago" - [167]=> - string(21) "America/Santo_Domingo" - [168]=> - string(17) "America/Sao_Paulo" - [169]=> - string(20) "America/Scoresbysund" - [170]=> - string(16) "America/Shiprock" - [171]=> - string(21) "America/St_Barthelemy" - [172]=> - string(16) "America/St_Johns" - [173]=> - string(16) "America/St_Kitts" - [174]=> - string(16) "America/St_Lucia" - [175]=> - string(17) "America/St_Thomas" - [176]=> - string(18) "America/St_Vincent" - [177]=> - string(21) "America/Swift_Current" - [178]=> - string(19) "America/Tegucigalpa" - [179]=> - string(13) "America/Thule" - [180]=> - string(19) "America/Thunder_Bay" - [181]=> - string(15) "America/Tijuana" - [182]=> - string(15) "America/Toronto" - [183]=> - string(15) "America/Tortola" - [184]=> - string(17) "America/Vancouver" - [185]=> - string(18) "America/Whitehorse" - [186]=> - string(16) "America/Winnipeg" - [187]=> - string(15) "America/Yakutat" - [188]=> - string(19) "America/Yellowknife" - [189]=> - string(16) "Antarctica/Casey" - [190]=> - string(16) "Antarctica/Davis" - [191]=> - string(25) "Antarctica/DumontDUrville" - [192]=> - string(17) "Antarctica/Mawson" - [193]=> - string(18) "Antarctica/McMurdo" - [194]=> - string(17) "Antarctica/Palmer" - [195]=> - string(18) "Antarctica/Rothera" - [196]=> - string(21) "Antarctica/South_Pole" - [197]=> - string(16) "Antarctica/Syowa" - [198]=> - string(17) "Antarctica/Vostok" - [199]=> - string(19) "Arctic/Longyearbyen" - [200]=> - string(9) "Asia/Aden" - [201]=> - string(11) "Asia/Almaty" - [202]=> - string(10) "Asia/Amman" - [203]=> - string(11) "Asia/Anadyr" - [204]=> - string(10) "Asia/Aqtau" - [205]=> - string(11) "Asia/Aqtobe" - [206]=> - string(13) "Asia/Ashgabat" - [207]=> - string(12) "Asia/Baghdad" - [208]=> - string(12) "Asia/Bahrain" - [209]=> - string(9) "Asia/Baku" - [210]=> - string(12) "Asia/Bangkok" - [211]=> - string(11) "Asia/Beirut" - [212]=> - string(12) "Asia/Bishkek" - [213]=> - string(11) "Asia/Brunei" - [214]=> - string(15) "Asia/Choibalsan" - [215]=> - string(14) "Asia/Chongqing" - [216]=> - string(12) "Asia/Colombo" - [217]=> - string(13) "Asia/Damascus" - [218]=> - string(10) "Asia/Dhaka" - [219]=> - string(9) "Asia/Dili" - [220]=> - string(10) "Asia/Dubai" - [221]=> - string(13) "Asia/Dushanbe" - [222]=> - string(9) "Asia/Gaza" - [223]=> - string(11) "Asia/Harbin" - [224]=> - string(16) "Asia/Ho_Chi_Minh" - [225]=> - string(14) "Asia/Hong_Kong" - [226]=> - string(9) "Asia/Hovd" - [227]=> - string(12) "Asia/Irkutsk" - [228]=> - string(12) "Asia/Jakarta" - [229]=> - string(13) "Asia/Jayapura" - [230]=> - string(14) "Asia/Jerusalem" - [231]=> - string(10) "Asia/Kabul" - [232]=> - string(14) "Asia/Kamchatka" - [233]=> - string(12) "Asia/Karachi" - [234]=> - string(12) "Asia/Kashgar" - [235]=> - string(14) "Asia/Kathmandu" - [236]=> - string(12) "Asia/Kolkata" - [237]=> - string(16) "Asia/Krasnoyarsk" - [238]=> - string(17) "Asia/Kuala_Lumpur" - [239]=> - string(12) "Asia/Kuching" - [240]=> - string(11) "Asia/Kuwait" - [241]=> - string(10) "Asia/Macau" - [242]=> - string(12) "Asia/Magadan" - [243]=> - string(13) "Asia/Makassar" - [244]=> - string(11) "Asia/Manila" - [245]=> - string(11) "Asia/Muscat" - [246]=> - string(12) "Asia/Nicosia" - [247]=> - string(16) "Asia/Novosibirsk" - [248]=> - string(9) "Asia/Omsk" - [249]=> - string(9) "Asia/Oral" - [250]=> - string(15) "Asia/Phnom_Penh" - [251]=> - string(14) "Asia/Pontianak" - [252]=> - string(14) "Asia/Pyongyang" - [253]=> - string(10) "Asia/Qatar" - [254]=> - string(14) "Asia/Qyzylorda" - [255]=> - string(12) "Asia/Rangoon" - [256]=> - string(11) "Asia/Riyadh" - [257]=> - string(13) "Asia/Sakhalin" - [258]=> - string(14) "Asia/Samarkand" - [259]=> - string(10) "Asia/Seoul" - [260]=> - string(13) "Asia/Shanghai" - [261]=> - string(14) "Asia/Singapore" - [262]=> - string(11) "Asia/Taipei" - [263]=> - string(13) "Asia/Tashkent" - [264]=> - string(12) "Asia/Tbilisi" - [265]=> - string(11) "Asia/Tehran" - [266]=> - string(12) "Asia/Thimphu" - [267]=> - string(10) "Asia/Tokyo" - [268]=> - string(16) "Asia/Ulaanbaatar" - [269]=> - string(11) "Asia/Urumqi" - [270]=> - string(14) "Asia/Vientiane" - [271]=> - string(16) "Asia/Vladivostok" - [272]=> - string(12) "Asia/Yakutsk" - [273]=> - string(18) "Asia/Yekaterinburg" - [274]=> - string(12) "Asia/Yerevan" - [275]=> - string(15) "Atlantic/Azores" - [276]=> - string(16) "Atlantic/Bermuda" - [277]=> - string(15) "Atlantic/Canary" - [278]=> - string(19) "Atlantic/Cape_Verde" - [279]=> - string(14) "Atlantic/Faroe" - [280]=> - string(16) "Atlantic/Madeira" - [281]=> - string(18) "Atlantic/Reykjavik" - [282]=> - string(22) "Atlantic/South_Georgia" - [283]=> - string(18) "Atlantic/St_Helena" - [284]=> - string(16) "Atlantic/Stanley" - [285]=> - string(18) "Australia/Adelaide" - [286]=> - string(18) "Australia/Brisbane" - [287]=> - string(21) "Australia/Broken_Hill" - [288]=> - string(16) "Australia/Currie" - [289]=> - string(16) "Australia/Darwin" - [290]=> - string(15) "Australia/Eucla" - [291]=> - string(16) "Australia/Hobart" - [292]=> - string(18) "Australia/Lindeman" - [293]=> - string(19) "Australia/Lord_Howe" - [294]=> - string(19) "Australia/Melbourne" - [295]=> - string(15) "Australia/Perth" - [296]=> - string(16) "Australia/Sydney" - [297]=> - string(16) "Europe/Amsterdam" - [298]=> - string(14) "Europe/Andorra" - [299]=> - string(13) "Europe/Athens" - [300]=> - string(15) "Europe/Belgrade" - [301]=> - string(13) "Europe/Berlin" - [302]=> - string(17) "Europe/Bratislava" - [303]=> - string(15) "Europe/Brussels" - [304]=> - string(16) "Europe/Bucharest" - [305]=> - string(15) "Europe/Budapest" - [306]=> - string(15) "Europe/Chisinau" - [307]=> - string(17) "Europe/Copenhagen" - [308]=> - string(13) "Europe/Dublin" - [309]=> - string(16) "Europe/Gibraltar" - [310]=> - string(15) "Europe/Guernsey" - [311]=> - string(15) "Europe/Helsinki" - [312]=> - string(18) "Europe/Isle_of_Man" - [313]=> - string(15) "Europe/Istanbul" - [314]=> - string(13) "Europe/Jersey" - [315]=> - string(18) "Europe/Kaliningrad" - [316]=> - string(11) "Europe/Kiev" - [317]=> - string(13) "Europe/Lisbon" - [318]=> - string(16) "Europe/Ljubljana" - [319]=> - string(13) "Europe/London" - [320]=> - string(17) "Europe/Luxembourg" - [321]=> - string(13) "Europe/Madrid" - [322]=> - string(12) "Europe/Malta" - [323]=> - string(16) "Europe/Mariehamn" - [324]=> - string(12) "Europe/Minsk" - [325]=> - string(13) "Europe/Monaco" - [326]=> - string(13) "Europe/Moscow" - [327]=> - string(11) "Europe/Oslo" - [328]=> - string(12) "Europe/Paris" - [329]=> - string(16) "Europe/Podgorica" - [330]=> - string(13) "Europe/Prague" - [331]=> - string(11) "Europe/Riga" - [332]=> - string(11) "Europe/Rome" - [333]=> - string(13) "Europe/Samara" - [334]=> - string(17) "Europe/San_Marino" - [335]=> - string(15) "Europe/Sarajevo" - [336]=> - string(17) "Europe/Simferopol" - [337]=> - string(13) "Europe/Skopje" - [338]=> - string(12) "Europe/Sofia" - [339]=> - string(16) "Europe/Stockholm" - [340]=> - string(14) "Europe/Tallinn" - [341]=> - string(13) "Europe/Tirane" - [342]=> - string(15) "Europe/Uzhgorod" - [343]=> - string(12) "Europe/Vaduz" - [344]=> - string(14) "Europe/Vatican" - [345]=> - string(13) "Europe/Vienna" - [346]=> - string(14) "Europe/Vilnius" - [347]=> - string(16) "Europe/Volgograd" - [348]=> - string(13) "Europe/Warsaw" - [349]=> - string(13) "Europe/Zagreb" - [350]=> - string(17) "Europe/Zaporozhye" - [351]=> - string(13) "Europe/Zurich" - [352]=> - string(19) "Indian/Antananarivo" - [353]=> - string(13) "Indian/Chagos" - [354]=> - string(16) "Indian/Christmas" - [355]=> - string(12) "Indian/Cocos" - [356]=> - string(13) "Indian/Comoro" - [357]=> - string(16) "Indian/Kerguelen" - [358]=> - string(11) "Indian/Mahe" - [359]=> - string(15) "Indian/Maldives" - [360]=> - string(16) "Indian/Mauritius" - [361]=> - string(14) "Indian/Mayotte" - [362]=> - string(14) "Indian/Reunion" - [363]=> - string(12) "Pacific/Apia" - [364]=> - string(16) "Pacific/Auckland" - [365]=> - string(15) "Pacific/Chatham" - [366]=> - string(14) "Pacific/Easter" - [367]=> - string(13) "Pacific/Efate" - [368]=> - string(17) "Pacific/Enderbury" - [369]=> - string(15) "Pacific/Fakaofo" - [370]=> - string(12) "Pacific/Fiji" - [371]=> - string(16) "Pacific/Funafuti" - [372]=> - string(17) "Pacific/Galapagos" - [373]=> - string(15) "Pacific/Gambier" - [374]=> - string(19) "Pacific/Guadalcanal" - [375]=> - string(12) "Pacific/Guam" - [376]=> - string(16) "Pacific/Honolulu" - [377]=> - string(16) "Pacific/Johnston" - [378]=> - string(18) "Pacific/Kiritimati" - [379]=> - string(14) "Pacific/Kosrae" - [380]=> - string(17) "Pacific/Kwajalein" - [381]=> - string(14) "Pacific/Majuro" - [382]=> - string(17) "Pacific/Marquesas" - [383]=> - string(14) "Pacific/Midway" - [384]=> - string(13) "Pacific/Nauru" - [385]=> - string(12) "Pacific/Niue" - [386]=> - string(15) "Pacific/Norfolk" - [387]=> - string(14) "Pacific/Noumea" - [388]=> - string(17) "Pacific/Pago_Pago" - [389]=> - string(13) "Pacific/Palau" - [390]=> - string(16) "Pacific/Pitcairn" - [391]=> - string(14) "Pacific/Ponape" - [392]=> - string(20) "Pacific/Port_Moresby" - [393]=> - string(17) "Pacific/Rarotonga" - [394]=> - string(14) "Pacific/Saipan" - [395]=> - string(14) "Pacific/Tahiti" - [396]=> - string(14) "Pacific/Tarawa" - [397]=> - string(17) "Pacific/Tongatapu" - [398]=> - string(12) "Pacific/Truk" - [399]=> - string(12) "Pacific/Wake" - [400]=> - string(14) "Pacific/Wallis" - [401]=> - string(3) "UTC" -} +Check return tpe is ARRAY +bool(true) +Check array contains some common timezones +bool(true) +bool(true) +bool(true) ===DONE=== + \ No newline at end of file diff --git a/ext/dba/dba.c b/ext/dba/dba.c index d59b1f2b1..dca6ac65e 100644 --- a/ext/dba/dba.c +++ b/ext/dba/dba.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: dba.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: dba.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/dba/dba_cdb.c b/ext/dba/dba_cdb.c index 61c1df5bf..525fa4a96 100644 --- a/ext/dba/dba_cdb.c +++ b/ext/dba/dba_cdb.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: dba_cdb.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: dba_cdb.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/dba/dba_db1.c b/ext/dba/dba_db1.c index 202ef6918..125dbc17f 100755 --- a/ext/dba/dba_db1.c +++ b/ext/dba/dba_db1.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: dba_db1.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: dba_db1.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/dba/dba_db2.c b/ext/dba/dba_db2.c index 6b3111146..9688deb0c 100644 --- a/ext/dba/dba_db2.c +++ b/ext/dba/dba_db2.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: dba_db2.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: dba_db2.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/dba/dba_db3.c b/ext/dba/dba_db3.c index 3b090ca60..d1986eaef 100644 --- a/ext/dba/dba_db3.c +++ b/ext/dba/dba_db3.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: dba_db3.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: dba_db3.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/dba/dba_db4.c b/ext/dba/dba_db4.c index bdf9cdfbd..7e500e09b 100644 --- a/ext/dba/dba_db4.c +++ b/ext/dba/dba_db4.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: dba_db4.c 286636 2009-08-01 23:10:11Z felipe $ */ +/* $Id: dba_db4.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/dba/dba_dbm.c b/ext/dba/dba_dbm.c index 9e323694e..701918120 100644 --- a/ext/dba/dba_dbm.c +++ b/ext/dba/dba_dbm.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: dba_dbm.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: dba_dbm.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/dba/dba_flatfile.c b/ext/dba/dba_flatfile.c index 849ce3ace..3bcfd5825 100644 --- a/ext/dba/dba_flatfile.c +++ b/ext/dba/dba_flatfile.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: dba_flatfile.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: dba_flatfile.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/dba/dba_gdbm.c b/ext/dba/dba_gdbm.c index d7a0c929f..0e1d4625f 100644 --- a/ext/dba/dba_gdbm.c +++ b/ext/dba/dba_gdbm.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: dba_gdbm.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: dba_gdbm.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/dba/dba_inifile.c b/ext/dba/dba_inifile.c index 0cd2f28c9..f8e618860 100644 --- a/ext/dba/dba_inifile.c +++ b/ext/dba/dba_inifile.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: dba_inifile.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: dba_inifile.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/dba/dba_ndbm.c b/ext/dba/dba_ndbm.c index 3860039b4..a35965c40 100644 --- a/ext/dba/dba_ndbm.c +++ b/ext/dba/dba_ndbm.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: dba_ndbm.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: dba_ndbm.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/dba/dba_qdbm.c b/ext/dba/dba_qdbm.c index b3a9c35c4..8f67bc327 100755 --- a/ext/dba/dba_qdbm.c +++ b/ext/dba/dba_qdbm.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: dba_qdbm.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: dba_qdbm.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/dba/libcdb/cdb.c b/ext/dba/libcdb/cdb.c index 6d5f3aaf8..95c4df69c 100644 --- a/ext/dba/libcdb/cdb.c +++ b/ext/dba/libcdb/cdb.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: cdb.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: cdb.c 293036 2010-01-03 09:23:27Z sebastian $ */ /* incorporated from D.J.Bernstein's cdb-0.75 (http://cr.yp.to/cdb.html)*/ @@ -189,6 +189,6 @@ int cdb_find(struct cdb *c, char *key, unsigned int len TSRMLS_DC) /* {{{ cdb_version */ char *cdb_version() { - return "0.75, $Revision: 272370 $"; + return "0.75, $Revision: 293036 $"; } /* }}} */ diff --git a/ext/dba/libcdb/cdb.h b/ext/dba/libcdb/cdb.h index 858e9a36c..6d1276130 100644 --- a/ext/dba/libcdb/cdb.h +++ b/ext/dba/libcdb/cdb.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: cdb.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: cdb.h 293036 2010-01-03 09:23:27Z sebastian $ */ /* incorporated from D.J.Bernstein's cdb-0.75 (http://cr.yp.to/cdb.html)*/ diff --git a/ext/dba/libcdb/cdb_make.c b/ext/dba/libcdb/cdb_make.c index 180d192c4..29f8b29c2 100644 --- a/ext/dba/libcdb/cdb_make.c +++ b/ext/dba/libcdb/cdb_make.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: cdb_make.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: cdb_make.c 293036 2010-01-03 09:23:27Z sebastian $ */ /* incorporated from D.J.Bernstein's cdb-0.75 (http://cr.yp.to/cdb.html)*/ @@ -240,5 +240,5 @@ int cdb_make_finish(struct cdb_make *c TSRMLS_DC) /* {{{ cdb_make_version */ char *cdb_make_version() { - return "0.75, $Revision: 272370 $"; + return "0.75, $Revision: 293036 $"; } diff --git a/ext/dba/libcdb/cdb_make.h b/ext/dba/libcdb/cdb_make.h index a0fea70ce..492b09832 100644 --- a/ext/dba/libcdb/cdb_make.h +++ b/ext/dba/libcdb/cdb_make.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: cdb_make.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: cdb_make.h 293036 2010-01-03 09:23:27Z sebastian $ */ /* incorporated from D.J.Bernstein's cdb-0.75 (http://cr.yp.to/cdb.html)*/ diff --git a/ext/dba/libcdb/uint32.c b/ext/dba/libcdb/uint32.c index 29df68c4c..f9e7d380f 100644 --- a/ext/dba/libcdb/uint32.c +++ b/ext/dba/libcdb/uint32.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: uint32.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: uint32.c 293036 2010-01-03 09:23:27Z sebastian $ */ /* incorporated from D.J.Bernstein's cdb-0.75 (http://cr.yp.to/cdb.html)*/ diff --git a/ext/dba/libcdb/uint32.h b/ext/dba/libcdb/uint32.h index df31e4c24..63bc3825f 100644 --- a/ext/dba/libcdb/uint32.h +++ b/ext/dba/libcdb/uint32.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: uint32.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: uint32.h 293036 2010-01-03 09:23:27Z sebastian $ */ /* incorporated from D.J.Bernstein's cdb-0.75 (http://cr.yp.to/cdb.html)*/ diff --git a/ext/dba/libflatfile/flatfile.c b/ext/dba/libflatfile/flatfile.c index 16216b4fe..a01ed637d 100644 --- a/ext/dba/libflatfile/flatfile.c +++ b/ext/dba/libflatfile/flatfile.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -19,7 +19,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: flatfile.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: flatfile.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -307,7 +307,7 @@ datum flatfile_nextkey(flatfile *dba TSRMLS_DC) { /* {{{ flatfile_version */ char *flatfile_version() { - return "1.0, $Revision: 272370 $"; + return "1.0, $Revision: 293036 $"; } /* }}} */ diff --git a/ext/dba/libflatfile/flatfile.h b/ext/dba/libflatfile/flatfile.h index 3de35871d..4172c7b11 100644 --- a/ext/dba/libflatfile/flatfile.h +++ b/ext/dba/libflatfile/flatfile.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: flatfile.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: flatfile.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_LIB_FLATFILE_H #define PHP_LIB_FLATFILE_H diff --git a/ext/dba/libinifile/inifile.c b/ext/dba/libinifile/inifile.c index acc479248..5d492c838 100644 --- a/ext/dba/libinifile/inifile.c +++ b/ext/dba/libinifile/inifile.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: inifile.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: inifile.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -43,7 +43,7 @@ /* {{{ inifile_version */ char *inifile_version() { - return "1.0, $Revision: 272370 $"; + return "1.0, $Revision: 293036 $"; } /* }}} */ diff --git a/ext/dba/libinifile/inifile.h b/ext/dba/libinifile/inifile.h index 81806f1cb..801bb2732 100644 --- a/ext/dba/libinifile/inifile.h +++ b/ext/dba/libinifile/inifile.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: inifile.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: inifile.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_LIB_INIFILE_H #define PHP_LIB_INIFILE_H diff --git a/ext/dba/php_dba.h b/ext/dba/php_dba.h index fccb2ee6d..4e6dccb85 100644 --- a/ext/dba/php_dba.h +++ b/ext/dba/php_dba.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_dba.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_dba.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_DBA_H #define PHP_DBA_H diff --git a/ext/dba/tests/dba_cdb_make.phpt b/ext/dba/tests/dba_cdb_make.phpt index b7311f1dd..6691d0a28 100644 --- a/ext/dba/tests/dba_cdb_make.phpt +++ b/ext/dba/tests/dba_cdb_make.phpt @@ -33,7 +33,7 @@ magic_quotes_runtime=1 } ?> --EXPECT-- -PHP Warning: Directive 'magic_quotes_runtime' is deprecated in PHP 5.3 and greater in Unknown on line 0 +Warning: Directive 'magic_quotes_runtime' is deprecated in PHP 5.3 and greater in Unknown on line 0 database handler: cdb_make string(32) "12fc5ba2b9dcfef2480e5324eeb5f3e5" string(32) "12fc5ba2b9dcfef2480e5324eeb5f3e5" diff --git a/ext/dom/attr.c b/ext/dom/attr.c index f6f57afb0..fbec6dc60 100644 --- a/ext/dom/attr.c +++ b/ext/dom/attr.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: attr.c 277102 2009-03-13 13:43:29Z rrichards $ */ +/* $Id: attr.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/dom/cdatasection.c b/ext/dom/cdatasection.c index f57e3c4f0..142b35bac 100644 --- a/ext/dom/cdatasection.c +++ b/ext/dom/cdatasection.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: cdatasection.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: cdatasection.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/dom/characterdata.c b/ext/dom/characterdata.c index 9af73a187..cc79760aa 100644 --- a/ext/dom/characterdata.c +++ b/ext/dom/characterdata.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: characterdata.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: characterdata.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/dom/comment.c b/ext/dom/comment.c index c3888a8bc..18badf375 100644 --- a/ext/dom/comment.c +++ b/ext/dom/comment.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: comment.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: comment.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/dom/document.c b/ext/dom/document.c index 9fc6290d1..4728e66b1 100644 --- a/ext/dom/document.c +++ b/ext/dom/document.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: document.c 282119 2009-06-14 13:13:35Z iliaa $ */ +/* $Id: document.c 294436 2010-02-03 18:41:27Z pajoye $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -1203,7 +1203,18 @@ PHP_FUNCTION(dom_document_import_node) if (!retnodep) { RETURN_FALSE; } - + + if ((retnodep->type == XML_ATTRIBUTE_NODE) && (nodep->ns != NULL)) { + xmlNsPtr nsptr = NULL; + xmlNodePtr root = xmlDocGetRootElement(docp); + + nsptr = xmlSearchNsByHref (nodep->doc, root, nodep->ns->href); + if (nsptr == NULL) { + int errorcode; + nsptr = dom_get_ns(root, nodep->ns->href, &errorcode, nodep->ns->prefix); + } + xmlSetNs(retnodep, nsptr); + } } DOM_RET_OBJ(rv, (xmlNodePtr) retnodep, &ret, intern); @@ -1531,7 +1542,7 @@ char *_dom_get_valid_file_path(char *source, char *resolved_path, int resolved_p } /* }}} */ -static xmlDocPtr dom_document_parser(zval *id, int mode, char *source, int options TSRMLS_DC) /* {{{ */ +static xmlDocPtr dom_document_parser(zval *id, int mode, char *source, int source_len, int options TSRMLS_DC) /* {{{ */ { xmlDocPtr ret; xmlParserCtxtPtr ctxt = NULL; @@ -1568,7 +1579,7 @@ static xmlDocPtr dom_document_parser(zval *id, int mode, char *source, int optio } } else { - ctxt = xmlCreateDocParserCtxt(source); + ctxt = xmlCreateMemoryParserCtxt(source, source_len); } if (ctxt == NULL) { @@ -1671,7 +1682,7 @@ static void dom_parse_document(INTERNAL_FUNCTION_PARAMETERS, int mode) { RETURN_FALSE; } - newdoc = dom_document_parser(id, mode, source, options TSRMLS_CC); + newdoc = dom_document_parser(id, mode, source, source_len, options TSRMLS_CC); if (!newdoc) RETURN_FALSE; diff --git a/ext/dom/documentfragment.c b/ext/dom/documentfragment.c index c1b3b6490..e3769bd99 100644 --- a/ext/dom/documentfragment.c +++ b/ext/dom/documentfragment.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: documentfragment.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: documentfragment.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/dom/documenttype.c b/ext/dom/documenttype.c index fcb938f97..08be3fc41 100644 --- a/ext/dom/documenttype.c +++ b/ext/dom/documenttype.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: documenttype.c 289439 2009-10-09 18:52:59Z pajoye $ */ +/* $Id: documenttype.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/dom/dom_ce.h b/ext/dom/dom_ce.h index d14b3103e..196286b6e 100644 --- a/ext/dom/dom_ce.h +++ b/ext/dom/dom_ce.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: dom_ce.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: dom_ce.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef DOM_CE_H #define DOM_CE_H diff --git a/ext/dom/dom_fe.h b/ext/dom/dom_fe.h index 3a052f2ee..ed87cd0d2 100644 --- a/ext/dom/dom_fe.h +++ b/ext/dom/dom_fe.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: dom_fe.h 273468 2009-01-13 18:06:48Z rrichards $ */ +/* $Id: dom_fe.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef DOM_FE_H #define DOM_FE_H diff --git a/ext/dom/dom_iterators.c b/ext/dom/dom_iterators.c index e76b4ac79..b91f2a040 100644 --- a/ext/dom/dom_iterators.c +++ b/ext/dom/dom_iterators.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: dom_iterators.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: dom_iterators.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/dom/dom_properties.h b/ext/dom/dom_properties.h index 6fd1bcc3b..4179985e7 100644 --- a/ext/dom/dom_properties.h +++ b/ext/dom/dom_properties.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: dom_properties.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: dom_properties.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef DOM_PROPERTIES_H #define DOM_PROPERTIES_H diff --git a/ext/dom/domconfiguration.c b/ext/dom/domconfiguration.c index 5ae0421ac..62f353d98 100644 --- a/ext/dom/domconfiguration.c +++ b/ext/dom/domconfiguration.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: domconfiguration.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: domconfiguration.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/dom/domerror.c b/ext/dom/domerror.c index 330d4af75..4c846f0be 100644 --- a/ext/dom/domerror.c +++ b/ext/dom/domerror.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: domerror.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: domerror.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/dom/domerrorhandler.c b/ext/dom/domerrorhandler.c index a161428e7..2091776d8 100644 --- a/ext/dom/domerrorhandler.c +++ b/ext/dom/domerrorhandler.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: domerrorhandler.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: domerrorhandler.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/dom/domexception.c b/ext/dom/domexception.c index 9301c11fa..cfb2a768f 100644 --- a/ext/dom/domexception.c +++ b/ext/dom/domexception.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: domexception.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: domexception.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/dom/domimplementation.c b/ext/dom/domimplementation.c index 6ec0e6534..29a808b30 100644 --- a/ext/dom/domimplementation.c +++ b/ext/dom/domimplementation.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: domimplementation.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: domimplementation.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/dom/domimplementationlist.c b/ext/dom/domimplementationlist.c index 144e58af8..c25b81a41 100644 --- a/ext/dom/domimplementationlist.c +++ b/ext/dom/domimplementationlist.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: domimplementationlist.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: domimplementationlist.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/dom/domimplementationsource.c b/ext/dom/domimplementationsource.c index 66248e3ca..5ade26b5a 100644 --- a/ext/dom/domimplementationsource.c +++ b/ext/dom/domimplementationsource.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: domimplementationsource.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: domimplementationsource.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/dom/domlocator.c b/ext/dom/domlocator.c index f40d47d2c..5629e15e9 100644 --- a/ext/dom/domlocator.c +++ b/ext/dom/domlocator.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: domlocator.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: domlocator.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/dom/domstringlist.c b/ext/dom/domstringlist.c index d2d787944..c618135a6 100644 --- a/ext/dom/domstringlist.c +++ b/ext/dom/domstringlist.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: domstringlist.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: domstringlist.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/dom/element.c b/ext/dom/element.c index 69d780fa0..d0b7cd488 100644 --- a/ext/dom/element.c +++ b/ext/dom/element.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: element.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: element.c 294446 2010-02-03 20:04:38Z pajoye $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -777,9 +777,15 @@ PHP_FUNCTION(dom_element_set_attribute_ns) node_list_unlink(nodep->children TSRMLS_CC); } - if (xmlStrEqual((xmlChar *) prefix, (xmlChar *)"xmlns") && xmlStrEqual((xmlChar *) uri, (xmlChar *)DOM_XMLNS_NAMESPACE)) { + if ((xmlStrEqual((xmlChar *) prefix, (xmlChar *)"xmlns") || + (prefix == NULL && xmlStrEqual((xmlChar *) localname, (xmlChar *)"xmlns"))) && + xmlStrEqual((xmlChar *) uri, (xmlChar *)DOM_XMLNS_NAMESPACE)) { is_xmlns = 1; - nsptr = dom_get_nsdecl(elemp, (xmlChar *)localname); + if (prefix == NULL) { + nsptr = dom_get_nsdecl(elemp, NULL); + } else { + nsptr = dom_get_nsdecl(elemp, (xmlChar *)localname); + } } else { nsptr = xmlSearchNsByHref(elemp->doc, elemp, (xmlChar *)uri); if (nsptr && nsptr->prefix == NULL) { @@ -802,7 +808,12 @@ PHP_FUNCTION(dom_element_set_attribute_ns) if (nsptr == NULL) { if (prefix == NULL) { - errorcode = NAMESPACE_ERR; + if (is_xmlns == 1) { + xmlNewNs(elemp, (xmlChar *)value, NULL); + xmlReconciliateNs(elemp->doc, elemp); + } else { + errorcode = NAMESPACE_ERR; + } } else { if (is_xmlns == 1) { xmlNewNs(elemp, (xmlChar *)value, (xmlChar *)localname); diff --git a/ext/dom/entity.c b/ext/dom/entity.c index 7caaab00f..d28e13126 100644 --- a/ext/dom/entity.c +++ b/ext/dom/entity.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: entity.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: entity.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/dom/entityreference.c b/ext/dom/entityreference.c index 762fc3fd5..8b0164a30 100644 --- a/ext/dom/entityreference.c +++ b/ext/dom/entityreference.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: entityreference.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: entityreference.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/dom/namednodemap.c b/ext/dom/namednodemap.c index 2ea88f6ca..122806209 100644 --- a/ext/dom/namednodemap.c +++ b/ext/dom/namednodemap.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: namednodemap.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: namednodemap.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/dom/namelist.c b/ext/dom/namelist.c index 116165e16..6ed0f6fb9 100644 --- a/ext/dom/namelist.c +++ b/ext/dom/namelist.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: namelist.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: namelist.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/dom/node.c b/ext/dom/node.c index 923757d93..dc6309af0 100644 --- a/ext/dom/node.c +++ b/ext/dom/node.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: node.c 277102 2009-03-13 13:43:29Z rrichards $ */ +/* $Id: node.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -1730,7 +1730,7 @@ PHP_FUNCTION(dom_node_get_feature) } /* }}} end dom_node_get_feature */ -/* {{{ proto DomUserData dom_node_set_user_data(string key, DomUserData data, userdatahandler handler); +/* {{{ proto mixed dom_node_set_user_data(string key, mixed data, userdatahandler handler); URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Node3-setUserData Since: DOM Level 3 */ @@ -1740,7 +1740,7 @@ PHP_FUNCTION(dom_node_set_user_data) } /* }}} end dom_node_set_user_data */ -/* {{{ proto DomUserData dom_node_get_user_data(string key); +/* {{{ proto mixed dom_node_get_user_data(string key); URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Node3-getUserData Since: DOM Level 3 */ diff --git a/ext/dom/nodelist.c b/ext/dom/nodelist.c index 923db9680..0392d8380 100644 --- a/ext/dom/nodelist.c +++ b/ext/dom/nodelist.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: nodelist.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: nodelist.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/dom/notation.c b/ext/dom/notation.c index 48171775b..75e03107e 100644 --- a/ext/dom/notation.c +++ b/ext/dom/notation.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: notation.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: notation.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/dom/php_dom.c b/ext/dom/php_dom.c index 214139c5f..73c711046 100644 --- a/ext/dom/php_dom.c +++ b/ext/dom/php_dom.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_dom.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_dom.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/dom/php_dom.h b/ext/dom/php_dom.h index 1e43aa0fd..6724bde4d 100644 --- a/ext/dom/php_dom.h +++ b/ext/dom/php_dom.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_dom.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_dom.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_DOM_H #define PHP_DOM_H diff --git a/ext/dom/processinginstruction.c b/ext/dom/processinginstruction.c index 8e6d676cf..ac83d8cad 100644 --- a/ext/dom/processinginstruction.c +++ b/ext/dom/processinginstruction.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: processinginstruction.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: processinginstruction.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/dom/string_extend.c b/ext/dom/string_extend.c index 8b791dfbf..fc09e3040 100644 --- a/ext/dom/string_extend.c +++ b/ext/dom/string_extend.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: string_extend.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: string_extend.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/dom/tests/DOMAttr_value_basic_001.phpt b/ext/dom/tests/DOMAttr_value_basic_001.phpt index 2a2b52121..40e00bcc4 100755 --- a/ext/dom/tests/DOMAttr_value_basic_001.phpt +++ b/ext/dom/tests/DOMAttr_value_basic_001.phpt @@ -3,9 +3,14 @@ Read empty $value. --CREDIT-- Jason Bouffard # TestFest Atlanta 2009-05-14 +--SKIPIF-- + --FILE-- value."\n"; ?> +===DONE=== --EXPECTF-- +===DONE=== + \ No newline at end of file diff --git a/ext/dom/tests/DOMCharacterData_length_error_001.phpt b/ext/dom/tests/DOMCharacterData_length_error_001.phpt index 87c9377b3..0dda492ad 100755 --- a/ext/dom/tests/DOMCharacterData_length_error_001.phpt +++ b/ext/dom/tests/DOMCharacterData_length_error_001.phpt @@ -3,10 +3,15 @@ Invalid State Error when getting length on DOMCharacterData out of content. --CREDIT-- Jason Bouffard # TestFest Atlanta 2009-05-14 +--SKIPIF-- + --FILE-- length; ?> +===DONE=== --EXPECTF-- -Warning: main(): Invalid State Error in %s \ No newline at end of file +Warning: main(): Invalid State Error in %s +===DONE=== + \ No newline at end of file diff --git a/ext/dom/tests/DOMText_appendData_basic.phpt b/ext/dom/tests/DOMText_appendData_basic.phpt index 6a28a9ae4..0eea699a7 100644 --- a/ext/dom/tests/DOMText_appendData_basic.phpt +++ b/ext/dom/tests/DOMText_appendData_basic.phpt @@ -3,6 +3,8 @@ DOMText::appendData basic functionality test --CREDITS-- Mike Sullivan #TestFest 2008 (London) +--SKIPIF-- + --FILE-- data . "\n"; echo "\n" . $document->saveXML(); ?> +===DONE=== --EXPECT-- Text Length (one append): 4 Text Length (two appends): 8 Text Content: data><&" -data><&" \ No newline at end of file +data><&" +===DONE=== + \ No newline at end of file diff --git a/ext/dom/tests/bug42082.phpt b/ext/dom/tests/bug42082.phpt index 86f32dd8d..ab018a777 100644 --- a/ext/dom/tests/bug42082.phpt +++ b/ext/dom/tests/bug42082.phpt @@ -1,5 +1,7 @@ --TEST-- Bug #42082 (NodeList length zero should be empty) +--SKIPIF-- + --FILE-- loadXML(""); var_dump($doc->firstChild->nodeValue, empty($doc->firstChild->nodeValue), isset($doc->firstChild->nodeValue)); var_dump(empty($doc->nodeType), empty($doc->firstChild->nodeType)) ?> +===DONE=== --EXPECTF-- object(DOMNodeList)#%d (0) { } @@ -24,4 +27,6 @@ string(0) "" bool(true) bool(true) bool(false) -bool(false) \ No newline at end of file +bool(false) +===DONE=== + \ No newline at end of file diff --git a/ext/dom/tests/bug47848.phpt b/ext/dom/tests/bug47848.phpt new file mode 100644 index 000000000..b4453c720 --- /dev/null +++ b/ext/dom/tests/bug47848.phpt @@ -0,0 +1,25 @@ +--TEST-- +Bug #47848 (importNode doesn't preserve attribute namespaces) +--SKIPIF-- + +--FILE-- +appendChild($aDOM->createElementNS('http://friend2friend.net/','f2f:a')); + +$fromdom = new DOMDocument(); +$fromdom->loadXML(''); + +$attr= $fromdom->firstChild->attributes->item(0); + +$att = $aDOM->importNode($attr); + +$aDOM->documentElement->appendChild($aDOM->importNode($attr, true)); + +echo $aDOM->saveXML(); + +?> +--EXPECT-- + + \ No newline at end of file diff --git a/ext/dom/tests/bug49463.phpt b/ext/dom/tests/bug49463.phpt new file mode 100644 index 000000000..4f232e3b3 --- /dev/null +++ b/ext/dom/tests/bug49463.phpt @@ -0,0 +1,17 @@ +--TEST-- +Bug #49463 (setAttributeNS fails setting default namespace). +--SKIPIF-- + +--FILE-- +createElementNS('http://purl.org/rss/1.0/','rdf:RDF'); +$doc->appendChild($root); +$root->setAttributeNS("http://www.w3.org/2000/xmlns/","xmlns","http://purl.org/rss/1.0/" ); + +echo $doc->saveXML()."\n"; +?> +--EXPECT-- + + diff --git a/ext/dom/tests/bug50661.phpt b/ext/dom/tests/bug50661.phpt new file mode 100644 index 000000000..3760db9b4 --- /dev/null +++ b/ext/dom/tests/bug50661.phpt @@ -0,0 +1,16 @@ +--TEST-- +Bug #50661 (DOMDocument::loadXML does not allow UTF-16). +--SKIPIF-- + +--FILE-- +loadXML($data); +echo $dom->saveXML(); + +?> +--EXPECT-- + + diff --git a/ext/dom/tests/domdocument_createcomment_error_001.phpt b/ext/dom/tests/domdocument_createcomment_error_001.phpt index 5df4e2047..24104a1a0 100644 --- a/ext/dom/tests/domdocument_createcomment_error_001.phpt +++ b/ext/dom/tests/domdocument_createcomment_error_001.phpt @@ -2,10 +2,15 @@ DomDocument::CreateComment() - Incorrect Parameters --CREDITS-- Clint Priest @ PhpTek09 +--SKIPIF-- + --FILE-- createComment(); ?> +===DONE=== --EXPECTF-- -Warning: DOMDocument::createComment() expects exactly 1 parameter, 0 given in %s \ No newline at end of file +Warning: DOMDocument::createComment() expects exactly 1 parameter, 0 given in %s +===DONE=== + \ No newline at end of file diff --git a/ext/dom/tests/domdocument_createentityreference_001.phpt b/ext/dom/tests/domdocument_createentityreference_001.phpt index 15f7df188..7343e74cf 100644 --- a/ext/dom/tests/domdocument_createentityreference_001.phpt +++ b/ext/dom/tests/domdocument_createentityreference_001.phpt @@ -2,12 +2,17 @@ DomDocument::CreateEntityReference() - Creates an entity reference with the appropriate name --CREDITS-- Clint Priest @ PhpTek09 +--SKIPIF-- + --FILE-- createEntityReference('Test'); - echo $objRef->nodeName; + echo $objRef->nodeName . "\n"; ?> +===DONE=== --EXPECT-- -Test \ No newline at end of file +Test +===DONE=== + \ No newline at end of file diff --git a/ext/dom/tests/domdocument_createentityreference_002.phpt b/ext/dom/tests/domdocument_createentityreference_002.phpt index 21d79aa4b..a2416c2d8 100644 --- a/ext/dom/tests/domdocument_createentityreference_002.phpt +++ b/ext/dom/tests/domdocument_createentityreference_002.phpt @@ -2,11 +2,16 @@ DomDocument::CreateEntityReference() - Empty Arguments --CREDITS-- Clint Priest @ PhpTek09 +--SKIPIF-- + --FILE-- createEntityReference(); ?> +===DONE=== --EXPECTF-- -Warning: DOMDocument::createEntityReference() expects exactly 1 parameter, 0 given in %s \ No newline at end of file +Warning: DOMDocument::createEntityReference() expects exactly 1 parameter, 0 given in %s +===DONE=== + \ No newline at end of file diff --git a/ext/dom/text.c b/ext/dom/text.c index c658e1b76..2e5b237e6 100644 --- a/ext/dom/text.c +++ b/ext/dom/text.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: text.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: text.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/dom/typeinfo.c b/ext/dom/typeinfo.c index 7c42f906e..95521e8eb 100644 --- a/ext/dom/typeinfo.c +++ b/ext/dom/typeinfo.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: typeinfo.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: typeinfo.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/dom/userdatahandler.c b/ext/dom/userdatahandler.c index 2b761d78e..2ee47ea46 100644 --- a/ext/dom/userdatahandler.c +++ b/ext/dom/userdatahandler.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: userdatahandler.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: userdatahandler.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/dom/xml_common.h b/ext/dom/xml_common.h index 9c3c6fc24..16d19288d 100644 --- a/ext/dom/xml_common.h +++ b/ext/dom/xml_common.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: xml_common.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: xml_common.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_XML_COMMON_H #define PHP_XML_COMMON_H diff --git a/ext/dom/xpath.c b/ext/dom/xpath.c index a2fdc13dc..209b213dc 100644 --- a/ext/dom/xpath.c +++ b/ext/dom/xpath.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: xpath.c 281742 2009-06-06 02:40:49Z mattwil $ */ +/* $Id: xpath.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/enchant/config.m4 b/ext/enchant/config.m4 index 8a36ee83c..8e2fc5bb7 100755 --- a/ext/enchant/config.m4 +++ b/ext/enchant/config.m4 @@ -1,5 +1,5 @@ dnl -dnl $Id: config.m4 289597 2009-10-12 22:35:36Z pajoye $ +dnl $Id: config.m4 289366 2009-10-08 20:28:21Z pajoye $ dnl PHP_ARG_WITH(enchant,for ENCHANT support, diff --git a/ext/enchant/config.w32 b/ext/enchant/config.w32 index f36b7c8e9..011688db4 100644 --- a/ext/enchant/config.w32 +++ b/ext/enchant/config.w32 @@ -1,4 +1,4 @@ -// $Id: config.w32 289597 2009-10-12 22:35:36Z pajoye $ +// $Id: config.w32 289372 2009-10-08 20:59:50Z pajoye $ // vim:ft=javascript ARG_WITH("enchant", "Enchant Support", "no"); diff --git a/ext/enchant/enchant.c b/ext/enchant/enchant.c index 1a003aa10..87c16e297 100755 --- a/ext/enchant/enchant.c +++ b/ext/enchant/enchant.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.0 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ | Ilia Alshanetsky | +----------------------------------------------------------------------+ - $Id: enchant.c 289597 2009-10-12 22:35:36Z pajoye $ + $Id: enchant.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H @@ -327,7 +327,7 @@ PHP_MINFO_FUNCTION(enchant) #elif defined(HAVE_ENCHANT_BROKER_SET_PARAM) php_info_print_table_row(2, "Libenchant Version", "1.5.0 or later"); #endif - php_info_print_table_row(2, "Revision", "$Revision: 289597 $"); + php_info_print_table_row(2, "Revision", "$Revision: 293036 $"); php_info_print_table_end(); php_info_print_table_start(); diff --git a/ext/enchant/php_enchant.h b/ext/enchant/php_enchant.h index 0f27db94e..50cfdc72f 100644 --- a/ext/enchant/php_enchant.h +++ b/ext/enchant/php_enchant.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 4 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.0 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -15,7 +15,7 @@ | Author: Pierre-Alain Joye | +----------------------------------------------------------------------+ - $Id: php_enchant.h 289597 2009-10-12 22:35:36Z pajoye $ + $Id: php_enchant.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_ENCHANT_H diff --git a/ext/ereg/ereg.c b/ext/ereg/ereg.c index 7298626fa..d433ebbe3 100644 --- a/ext/ereg/ereg.c +++ b/ext/ereg/ereg.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ | Jaakko Hyvtti | +----------------------------------------------------------------------+ */ -/* $Id: ereg.c 281350 2009-05-28 21:57:24Z scottmac $ */ +/* $Id: ereg.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include #include diff --git a/ext/ereg/php_ereg.h b/ext/ereg/php_ereg.h index 28fd54d72..7c1d1a0f8 100644 --- a/ext/ereg/php_ereg.h +++ b/ext/ereg/php_ereg.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ */ -/* $Id: php_ereg.h 281350 2009-05-28 21:57:24Z scottmac $ */ +/* $Id: php_ereg.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef EREG_H #define EREG_H diff --git a/ext/ereg/php_regex.h b/ext/ereg/php_regex.h index 2ff44a575..7689540d9 100644 --- a/ext/ereg/php_regex.h +++ b/ext/ereg/php_regex.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_regex.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_regex.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_REGEX_H #define PHP_REGEX_H diff --git a/ext/exif/exif.c b/ext/exif/exif.c index f03c3c173..85fa1b90c 100644 --- a/ext/exif/exif.c +++ b/ext/exif/exif.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: exif.c 287372 2009-08-16 14:32:32Z iliaa $ */ +/* $Id: exif.c 293036 2010-01-03 09:23:27Z sebastian $ */ /* ToDos * @@ -138,7 +138,7 @@ const zend_function_entry exif_functions[] = { }; /* }}} */ -#define EXIF_VERSION "1.4 $Id: exif.c 287372 2009-08-16 14:32:32Z iliaa $" +#define EXIF_VERSION "1.4 $Id: exif.c 293036 2010-01-03 09:23:27Z sebastian $" /* {{{ PHP_MINFO_FUNCTION */ @@ -3876,11 +3876,7 @@ static int exif_read_file(image_info_type *ImageInfo, char *FileName, int read_t } /* Store file date/time. */ -#ifdef NETWARE - ImageInfo->FileDateTime = st.st_mtime.tv_sec; -#else ImageInfo->FileDateTime = st.st_mtime; -#endif ImageInfo->FileSize = st.st_size; /*exif_error_docref(NULL EXIFERR_CC, ImageInfo, E_NOTICE, "Opened stream is file: %d", ImageInfo->FileSize);*/ } diff --git a/ext/exif/php_exif.h b/ext/exif/php_exif.h index 105490e2a..2b1b77e3f 100644 --- a/ext/exif/php_exif.h +++ b/ext/exif/php_exif.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_exif.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_exif.h 293036 2010-01-03 09:23:27Z sebastian $ */ #if HAVE_EXIF extern zend_module_entry exif_module_entry; diff --git a/ext/exif/tests/exif006.phpt b/ext/exif/tests/exif006.phpt index 256a9ebc5..cbd71919d 100644 --- a/ext/exif/tests/exif006.phpt +++ b/ext/exif/tests/exif006.phpt @@ -20,7 +20,7 @@ magic_quotes_runtime=1 var_dump(exif_read_data(dirname(__FILE__).'/test6.jpg','',true,false)); ?> --EXPECTF-- -PHP Warning: Directive 'magic_quotes_runtime' is deprecated in PHP 5.3 and greater in Unknown on line 0 +Warning: Directive 'magic_quotes_runtime' is deprecated in PHP 5.3 and greater in Unknown on line 0 array(5) { ["FILE"]=> array(6) { diff --git a/ext/fileinfo/libmagic.patch b/ext/fileinfo/libmagic.patch index 1427d87d6..dc8e03fd1 100644 --- a/ext/fileinfo/libmagic.patch +++ b/ext/fileinfo/libmagic.patch @@ -1,127 +1,3030 @@ -Index: libmagic/apprentice.c -=================================================================== -RCS file: /repository/pecl/fileinfo/libmagic/apprentice.c,v -retrieving revision 1.1 -diff -u -r1.1 apprentice.c ---- libmagic/apprentice.c 11 Jul 2008 14:13:50 -0000 1.1 -+++ libmagic/apprentice.c 25 Jul 2008 08:18:07 -0000 -@@ -157,6 +157,10 @@ - } - #endif /* COMPILE_ONLY */ - -+#ifdef PHP_BUNDLE -+#include "../data_file.c" +diff -u libmagic.orig/apprentice.c libmagic/apprentice.c +--- libmagic.orig/apprentice.c 2009-03-18 15:19:23.000000000 +0000 ++++ libmagic/apprentice.c 2010-01-28 11:02:24.000000000 +0000 +@@ -29,6 +29,8 @@ + * apprentice - make one pass through /etc/magic, learning its secrets. + */ + ++#include "php.h" ++ + #include "file.h" + + #ifndef lint +@@ -38,17 +40,24 @@ + #include "magic.h" + #include "patchlevel.h" + #include +-#ifdef HAVE_UNISTD_H ++ ++#ifdef PHP_WIN32 ++#include "win32/unistd.h" ++#if _MSC_VER <= 1300 ++# include "win32/php_strtoi64.h" +#endif ++#define strtoull _strtoui64 ++#else + #include + #endif + + #include + #include + #include + #include +-#ifdef QUICK +-#include +-#endif ++#ifndef PHP_WIN32 + #include ++#endif + + #define EATAB {while (isascii((unsigned char) *l) && \ + isspace((unsigned char) *l)) ++l;} +@@ -116,12 +125,10 @@ + private int parse_strength(struct magic_set *, struct magic_entry *, const char *); + private int parse_apple(struct magic_set *, struct magic_entry *, const char *); + +- + private size_t maxmagic = 0; + private size_t magicsize = sizeof(struct magic); + + private const char usg_hdr[] = "cont\toffset\ttype\topcode\tmask\tvalue\tdesc"; +- + private struct { + const char *name; + size_t len; +@@ -135,38 +142,7 @@ + { NULL, 0, NULL } + }; + +-#ifdef COMPILE_ONLY +- +-int main(int, char *[]); +- +-int +-main(int argc, char *argv[]) +-{ +- int ret; +- struct magic_set *ms; +- char *progname; +- +- if ((progname = strrchr(argv[0], '/')) != NULL) +- progname++; +- else +- progname = argv[0]; +- +- if (argc != 2) { +- (void)fprintf(stderr, "Usage: %s file\n", progname); +- return 1; +- } +- +- if ((ms = magic_open(MAGIC_CHECK)) == NULL) { +- (void)fprintf(stderr, "%s: %s\n", progname, strerror(errno)); +- return 1; +- } +- ret = magic_compile(ms, argv[1]) == -1 ? 1 : 0; +- if (ret == 1) +- (void)fprintf(stderr, "%s: %s\n", progname, magic_error(ms)); +- magic_close(ms); +- return ret; +-} +-#endif /* COMPILE_ONLY */ ++#include "../data_file.c" + static const struct type_tbl_s { const char name[16]; - const size_t len; -@@ -310,6 +314,11 @@ +@@ -222,6 +198,10 @@ + # undef XX_NULL + }; + ++#ifndef S_ISDIR ++#define S_ISDIR(mode) ((mode) & _S_IFDIR) ++#endif ++ + private int + get_type(const char *l, const char **t) + { +@@ -279,15 +259,17 @@ + if (rv != 0) + return -1; + rv = apprentice_compile(ms, &magic, &nmagic, fn); +- free(magic); ++ efree(magic); + return rv; + } + +-#ifndef COMPILE_ONLY + if ((rv = apprentice_map(ms, &magic, &nmagic, fn)) == -1) { +- if (ms->flags & MAGIC_CHECK) +- file_magwarn(ms, "using regular magic file `%s'", fn); +- rv = apprentice_load(ms, &magic, &nmagic, fn, action); ++ if (fn) { ++ if (ms->flags & MAGIC_CHECK) ++ file_magwarn(ms, "using regular magic file `%s'", fn); ++ rv = apprentice_load(ms, &magic, &nmagic, fn, action); ++ } ++ + if (rv != 0) + return -1; + } +@@ -299,11 +281,7 @@ + return -1; + } + +- if ((ml = CAST(struct mlist *, malloc(sizeof(*ml)))) == NULL) { +- file_delmagic(magic, mapped, nmagic); +- file_oomem(ms, sizeof(*ml)); +- return -1; +- } ++ ml = emalloc(sizeof(*ml)); + + ml->magic = magic; + ml->nmagic = nmagic; +@@ -315,7 +293,6 @@ + mlist->prev = ml; + + return 0; +-#endif /* COMPILE_ONLY */ + } + + protected void +@@ -324,22 +301,18 @@ if (p == NULL) return; switch (type) { -+#ifdef PHP_BUNDLE +- case 2: +-#ifdef QUICK +- p--; +- (void)munmap((void *)p, sizeof(*p) * (entries + 1)); + case 3: + /* Do nothing, it's part of the code segment */ -+ break; -+#endif - #ifdef QUICK - case 2: + break; +-#else +- (void)&entries; +- abort(); +- /*NOTREACHED*/ +-#endif ++ + case 1: p--; -@@ -339,8 +348,19 @@ + /*FALLTHROUGH*/ ++ + case 0: +- free(p); ++ efree(p); + break; ++ + default: + abort(); + } +@@ -357,20 +330,17 @@ if (fn == NULL) fn = getenv("MAGIC"); - if (fn == NULL) +- fn = MAGIC; +- +- if ((mfn = strdup(fn)) == NULL) { +- file_oomem(ms, strlen(fn)); +- return NULL; + if (fn == NULL) { -+#ifdef PHP_BUNDLE -+ if ((mlist = malloc(sizeof(*mlist))) == NULL) { -+ file_oomem(ms, sizeof(*mlist)); -+ return NULL; -+ } ++ mlist = emalloc(sizeof(*mlist)); + mlist->next = mlist->prev = mlist; + apprentice_1(ms, fn, action, mlist); + return mlist; + } ++ ++ mfn = estrdup(fn); + fn = mfn; + +- if ((mlist = CAST(struct mlist *, malloc(sizeof(*mlist)))) == NULL) { +- free(mfn); +- file_oomem(ms, sizeof(*mlist)); +- return NULL; +- } ++ mlist = emalloc(sizeof(*mlist)); + mlist->next = mlist->prev = mlist; + + while (fn) { +@@ -384,13 +354,13 @@ + fn = p; + } + if (errs == -1) { +- free(mfn); +- free(mlist); ++ efree(mfn); ++ efree(mlist); + mlist = NULL; + file_error(ms, 0, "could not find any magic files!"); + return NULL; + } +- free(mfn); ++ efree(mfn); + return mlist; + } + +@@ -523,6 +493,7 @@ + abort(); + } + ++ + /* + * Magic entries with no description get a bonus because they depend + * on subsequent magic entries to print something. +@@ -538,8 +509,8 @@ + private int + apprentice_sort(const void *a, const void *b) + { +- const struct magic_entry *ma = CAST(const struct magic_entry *, a); +- const struct magic_entry *mb = CAST(const struct magic_entry *, b); ++ const struct magic_entry *ma = a; ++ const struct magic_entry *mb = b; + size_t sa = apprentice_magic_strength(ma->mp); + size_t sb = apprentice_magic_strength(mb->mp); + if (sa == sb) +@@ -617,34 +588,51 @@ + load_1(struct magic_set *ms, int action, const char *fn, int *errs, + struct magic_entry **marray, uint32_t *marraycount) + { +- char line[BUFSIZ]; ++ char buffer[BUFSIZ + 1]; ++ char *line; ++ size_t line_len; + size_t lineno = 0; +- FILE *f = fopen(ms->file = fn, "r"); +- if (f == NULL) { ++ ++ php_stream *stream; ++ ++ TSRMLS_FETCH(); ++ ++#if (PHP_MAJOR_VERSION < 6) ++ stream = php_stream_open_wrapper((char *)fn, "rb", REPORT_ERRORS|ENFORCE_SAFE_MODE, NULL); +#else - fn = MAGIC; ++ stream = php_stream_open_wrapper((char *)fn, "rb", REPORT_ERRORS, NULL); +#endif -+ } ++ ++ if (stream == NULL) { + if (errno != ENOENT) + file_error(ms, errno, "cannot read magic file `%s'", + fn); + (*errs)++; + } else { ++ + /* read and parse this file */ +- for (ms->line = 1; fgets(line, sizeof(line), f) != NULL; ms->line++) { +- size_t len; +- len = strlen(line); +- if (len == 0) /* null line, garbage, etc */ ++#if (PHP_MAJOR_VERSION < 6) ++ for (ms->line = 1; (line = php_stream_get_line(stream, buffer , BUFSIZ, &line_len)) != NULL; ms->line++) { ++#else ++ for (ms->line = 1; (line = php_stream_get_line(stream, ZSTR(buffer), BUFSIZ, &line_len)) != NULL; ms->line++) { ++#endif ++ if (line_len == 0) /* null line, garbage, etc */ + continue; +- if (line[len - 1] == '\n') { ++ ++ if (line[line_len - 1] == '\n') { + lineno++; +- line[len - 1] = '\0'; /* delete newline */ ++ line[line_len - 1] = '\0'; /* delete newline */ + } + if (line[0] == '\0') /* empty, do not parse */ + continue; + if (line[0] == '#') /* comment, do not parse */ + continue; ++ + if (line[0] == '!' && line[1] == ':') { + size_t i; + + for (i = 0; bang[i].name != NULL; i++) { +- if (len - 2 > bang[i].len && ++ if (line_len - 2 > bang[i].len && + memcmp(bang[i].name, line + 2, + bang[i].len) == 0) + break; +@@ -670,12 +658,11 @@ + } + continue; + } +- if (parse(ms, marray, marraycount, line, lineno, +- action) != 0) ++ if (parse(ms, marray, marraycount, line, lineno, action) != 0) + (*errs)++; + } - if ((mfn = strdup(fn)) == NULL) { - file_oomem(ms, strlen(fn)); -@@ -1886,6 +1906,15 @@ +- (void)fclose(f); ++ php_stream_close(stream); + } + } + +@@ -690,7 +677,6 @@ + int errs = 0; + struct magic_entry *marray; + uint32_t marraycount, i, mentrycount = 0, starttest; +- size_t slen; + char subfn[MAXPATHLEN]; + struct stat st; + DIR *dir; +@@ -698,12 +684,8 @@ + + ms->flags |= MAGIC_CHECK; /* Enable checks for parsed files */ + +- maxmagic = MAXMAGIS; +- if ((marray = CAST(struct magic_entry *, calloc(maxmagic, +- sizeof(*marray)))) == NULL) { +- file_oomem(ms, maxmagic * sizeof(*marray)); +- return -1; +- } ++ maxmagic = MAXMAGIS; ++ marray = ecalloc(maxmagic, sizeof(*marray)); + marraycount = 0; + + /* print silly verbose header for USG compat. */ +@@ -713,14 +695,14 @@ + /* load directory or file */ + /* FIXME: Read file names and sort them to prevent + non-determinism. See Debian bug #488562. */ +- if (stat(fn, &st) == 0 && S_ISDIR(st.st_mode)) { ++ if (php_sys_stat(fn, &st) == 0 && S_ISDIR(st.st_mode)) { + dir = opendir(fn); + if (dir) { + while ((d = readdir(dir)) != NULL) { + snprintf(subfn, sizeof(subfn), "%s/%s", + fn, d->d_name); + if (stat(subfn, &st) == 0 && +- S_ISREG(st.st_mode)) { ++ S_ISREG(st.st_mode)) { + load_1(ms, action, subfn, &errs, + &marray, &marraycount); + } +@@ -790,12 +772,7 @@ + for (i = 0; i < marraycount; i++) + mentrycount += marray[i].cont_count; + +- slen = sizeof(**magicp) * mentrycount; +- if ((*magicp = CAST(struct magic *, malloc(slen))) == NULL) { +- file_oomem(ms, slen); +- errs++; +- goto out; +- } ++ *magicp = emalloc(sizeof(**magicp) * mentrycount); + + mentrycount = 0; + for (i = 0; i < marraycount; i++) { +@@ -805,8 +782,8 @@ + } + out: + for (i = 0; i < marraycount; i++) +- free(marray[i].mp); +- free(marray); ++ efree(marray[i].mp); ++ efree(marray); + if (errs) { + *magicp = NULL; + *nmagicp = 0; +@@ -1081,11 +1058,7 @@ + if (me->cont_count == me->max_count) { + struct magic *nm; + size_t cnt = me->max_count + ALLOC_CHUNK; +- if ((nm = CAST(struct magic *, realloc(me->mp, +- sizeof(*nm) * cnt))) == NULL) { +- file_oomem(ms, sizeof(*nm) * cnt); +- return -1; +- } ++ nm = erealloc(me->mp, sizeof(*nm) * cnt); + me->mp = m = nm; + me->max_count = cnt; + } +@@ -1097,23 +1070,13 @@ + struct magic_entry *mp; + + maxmagic += ALLOC_INCR; +- if ((mp = CAST(struct magic_entry *, +- realloc(*mentryp, sizeof(*mp) * maxmagic))) == +- NULL) { +- file_oomem(ms, sizeof(*mp) * maxmagic); +- return -1; +- } +- (void)memset(&mp[*nmentryp], 0, sizeof(*mp) * +- ALLOC_INCR); ++ mp = erealloc(*mentryp, sizeof(*mp) * maxmagic); ++ (void)memset(&mp[*nmentryp], 0, sizeof(*mp) * ALLOC_INCR); + *mentryp = mp; + } + me = &(*mentryp)[*nmentryp]; + if (me->mp == NULL) { +- size_t len = sizeof(*m) * ALLOC_CHUNK; +- if ((m = CAST(struct magic *, malloc(len))) == NULL) { +- file_oomem(ms, len); +- return -1; +- } ++ m = safe_emalloc(sizeof(*m), ALLOC_CHUNK, 0); + me->mp = m; + me->max_count = ALLOC_CHUNK; + } else +@@ -1264,7 +1227,7 @@ + + m->mask_op = 0; + if (*l == '~') { +- if (!IS_STRING(m->type)) ++ if (!IS_LIBMAGIC_STRING(m->type)) + m->mask_op |= FILE_OPINVERSE; + else if (ms->flags & MAGIC_CHECK) + file_magwarn(ms, "'~' invalid for string types"); +@@ -1274,7 +1237,7 @@ + m->str_flags = 0; + m->num_mask = 0; + if ((op = get_op(*l)) != -1) { +- if (!IS_STRING(m->type)) { ++ if (!IS_LIBMAGIC_STRING(m->type)) { + uint64_t val; + ++l; + m->mask_op |= op; +@@ -1423,11 +1386,6 @@ + if (check_format(ms, m) == -1) + return -1; + } +-#ifndef COMPILE_ONLY +- if (action == FILE_CHECK) { +- file_mdump(m); +- } +-#endif + m->mimetype[0] = '\0'; /* initialise MIME type to none */ + if (m->cont_level == 0) + ++(*nmentryp); /* make room for next */ +@@ -2053,56 +2011,68 @@ + + /* + * handle a compiled file. ++ * return -1 = error ++ * return 1 = memory structure you can free ++ * return 3 = bundled library from PHP + */ + private int + apprentice_map(struct magic_set *ms, struct magic **magicp, uint32_t *nmagicp, + const char *fn) + { +- int fd; +- struct stat st; + uint32_t *ptr; + uint32_t version; int needsbyteswap; char *dbname = NULL; void *mm = NULL; + int ret = 0; ++ php_stream *stream = NULL; ++ php_stream_statbuf st; ++ ++ ++ TSRMLS_FETCH(); + -+#ifdef PHP_BUNDLE + if (fn == NULL) { -+ mm = &php_magic_database; ++ mm = (void *)&php_magic_database; + ret = 3; + goto internal_loaded; + } -+#endif - mkdbname(fn, &dbname, 0); + dbname = mkdbname(ms, fn, 0); if (dbname == NULL) -@@ -1909,7 +1938,7 @@ - file_error(ms, errno, "cannot map `%s'", dbname); + goto error2; + +- if ((fd = open(dbname, O_RDONLY|O_BINARY)) == -1) ++#if (PHP_MAJOR_VERSION < 6) ++ stream = php_stream_open_wrapper((char *)fn, "rb", REPORT_ERRORS|ENFORCE_SAFE_MODE, NULL); ++#else ++ stream = php_stream_open_wrapper((char *)fn, "rb", REPORT_ERRORS, NULL); ++#endif ++ ++ if (!stream) { + goto error2; ++ } + +- if (fstat(fd, &st) == -1) { ++ if (php_stream_stat(stream, &st) < 0) { + file_error(ms, errno, "cannot stat `%s'", dbname); + goto error1; + } +- if (st.st_size < 8) { ++ ++ if (st.sb.st_size < 8) { + file_error(ms, 0, "file `%s' is too small", dbname); goto error1; } + +-#ifdef QUICK +- if ((mm = mmap(0, (size_t)st.st_size, PROT_READ|PROT_WRITE, +- MAP_PRIVATE|MAP_FILE, fd, (off_t)0)) == MAP_FAILED) { +- file_error(ms, errno, "cannot map `%s'", dbname); +- goto error1; +- } -#define RET 2 -+ ret = 2; - #else - if ((mm = malloc((size_t)st.st_size)) == NULL) { - file_oomem(ms, (size_t)st.st_size); -@@ -1919,11 +1948,14 @@ +-#else +- if ((mm = CAST(void *, malloc((size_t)st.st_size))) == NULL) { +- file_oomem(ms, (size_t)st.st_size); +- goto error1; +- } +- if (read(fd, mm, (size_t)st.st_size) != (ssize_t)st.st_size) { ++ mm = emalloc((size_t)st.sb.st_size); ++ if (php_stream_read(stream, mm, (size_t)st.sb.st_size) != (size_t)st.sb.st_size) { file_badread(ms); goto error1; } -#define RET 1 +-#endif +- *magicp = CAST(struct magic *, mm); +- (void)close(fd); +- fd = -1; + ret = 1; - #endif -- *magicp = mm; - (void)close(fd); - fd = -1; -+#ifdef PHP_BUNDLE ++ ++ php_stream_close(stream); ++ stream = NULL; ++ +internal_loaded: -+#endif + *magicp = mm; ptr = (uint32_t *)(void *)*magicp; if (*ptr != MAGICNO) { if (swap4(*ptr) != MAGICNO) { -@@ -1943,6 +1975,11 @@ +@@ -2110,42 +2080,65 @@ + goto error1; + } + needsbyteswap = 1; +- } else ++ } else { + needsbyteswap = 0; ++ } ++ + if (needsbyteswap) + version = swap4(ptr[1]); + else + version = ptr[1]; ++ + if (version != VERSIONNO) { + file_error(ms, 0, "File %d.%d supports only version %d magic " + "files. `%s' is version %d", FILE_VERSION_MAJOR, patchlevel, VERSIONNO, dbname, version); goto error1; } -+#ifdef PHP_BUNDLE -+ if (fn == NULL) +- *nmagicp = (uint32_t)(st.st_size / sizeof(struct magic)); +- if (*nmagicp > 0) ++ ++ /* php_magic_database is a const, performing writes will segfault. This is for big-endian ++ machines only, PPC and Sparc specifically. Consider static variable or MINIT in ++ future. */ ++ if (needsbyteswap && fn == NULL) { ++ mm = emalloc(sizeof(php_magic_database)); ++ mm = memcpy(mm, php_magic_database, sizeof(php_magic_database)); ++ *magicp = mm; ++ ret = 1; ++ } ++ ++ if (fn == NULL) { + *nmagicp = (sizeof(php_magic_database) / sizeof(struct magic)); -+ else /* the statement after the #endif is used */ -+#endif - *nmagicp = (uint32_t)(st.st_size / sizeof(struct magic)); - if (*nmagicp > 0) ++ } else { ++ *nmagicp = (uint32_t)(st.sb.st_size / sizeof(struct magic)); ++ } ++ if (*nmagicp > 0) { (*nmagicp)--; -@@ -1950,7 +1987,7 @@ - if (needsbyteswap) ++ } + (*magicp)++; +- if (needsbyteswap) ++ if (needsbyteswap) { byteswap(*magicp, *nmagicp); - free(dbname); +- free(dbname); - return RET; ++ } ++ ++ if (dbname) { ++ efree(dbname); ++ } + return ret; error1: - if (fd != -1) -Index: libmagic/config.h -=================================================================== -RCS file: /repository/pecl/fileinfo/libmagic/config.h,v -retrieving revision 1.2 -retrieving revision 1.3 -diff -u -r1.2 -r1.3 ---- libmagic/config.h 11 Jul 2008 14:49:45 -0000 1.2 -+++ libmagic/config.h 24 Jul 2008 13:40:21 -0000 1.3 -@@ -2,3 +2,4 @@ - #ifdef HAVE_CONFIG_H - #include "../config.h" - #endif -+#define PHP_BUNDLE +- if (fd != -1) +- (void)close(fd); +- if (mm) { +-#ifdef QUICK +- (void)munmap((void *)mm, (size_t)st.st_size); +-#else +- free(mm); +-#endif ++ if (stream) { ++ php_stream_close(stream); ++ } ++ ++ if (mm && ret == 1) { ++ efree(mm); + } else { + *magicp = NULL; + *nmagicp = 0; + } + error2: +- free(dbname); ++ if (dbname) { ++ efree(dbname); ++ } + return -1; + } + +@@ -2159,41 +2152,50 @@ + apprentice_compile(struct magic_set *ms, struct magic **magicp, + uint32_t *nmagicp, const char *fn) + { +- int fd; + char *dbname; + int rv = -1; ++ php_stream *stream; + +- dbname = mkdbname(ms, fn, 1); ++ TSRMLS_FETCH(); + +- if (dbname == NULL) ++ dbname = mkdbname(ms, fn, 0); ++ ++ if (dbname == NULL) { + goto out; ++ } + +- if ((fd = open(dbname, O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, 0644)) == -1) { ++/* wb+ == O_WRONLY|O_CREAT|O_TRUNC|O_BINARY */ ++#if (PHP_MAJOR_VERSION < 6) ++ stream = php_stream_open_wrapper((char *)fn, "wb+", REPORT_ERRORS|ENFORCE_SAFE_MODE, NULL); ++#else ++ stream = php_stream_open_wrapper((char *)fn, "wb+", REPORT_ERRORS, NULL); ++#endif ++ ++ if (!stream) { + file_error(ms, errno, "cannot open `%s'", dbname); + goto out; + } + +- if (write(fd, ar, sizeof(ar)) != (ssize_t)sizeof(ar)) { ++ if (php_stream_write(stream, (char *)ar, sizeof(ar)) != (ssize_t)sizeof(ar)) { + file_error(ms, errno, "error writing `%s'", dbname); + goto out; + } + +- if (lseek(fd, (off_t)sizeof(struct magic), SEEK_SET) +- != sizeof(struct magic)) { ++ if (php_stream_seek(stream,(off_t)sizeof(struct magic), SEEK_SET) != sizeof(struct magic)) { + file_error(ms, errno, "error seeking `%s'", dbname); + goto out; + } + +- if (write(fd, *magicp, (sizeof(struct magic) * *nmagicp)) +- != (ssize_t)(sizeof(struct magic) * *nmagicp)) { ++ if (php_stream_write(stream, (char *)*magicp, (sizeof(struct magic) * *nmagicp) != (ssize_t)(sizeof(struct magic) * *nmagicp))) { + file_error(ms, errno, "error writing `%s'", dbname); + goto out; + } + +- (void)close(fd); ++ php_stream_close(stream); ++ + rv = 0; + out: +- free(dbname); ++ efree(dbname); + return rv; + } + +@@ -2206,6 +2208,7 @@ + { + const char *p, *q; + char *buf; ++ TSRMLS_FETCH(); + + if (strip) { + if ((p = strrchr(fn, '/')) != NULL) +@@ -2227,14 +2230,14 @@ + q++; + /* Compatibility with old code that looked in .mime */ + if (ms->flags & MAGIC_MIME) { +- asprintf(&buf, "%.*s.mime%s", (int)(q - fn), fn, ext); +- if (access(buf, R_OK) != -1) { ++ spprintf(&buf, MAXPATHLEN, "%.*s.mime%s", (int)(q - fn), fn, ext); ++ if (VCWD_ACCESS(buf, R_OK) != -1) { + ms->flags &= MAGIC_MIME_TYPE; + return buf; + } +- free(buf); ++ efree(buf); + } +- asprintf(&buf, "%.*s%s", (int)(q - fn), fn, ext); ++ spprintf(&buf, MAXPATHLEN, "%.*s%s", (int)(q - fn), fn, ext); + + /* Compatibility with old code that looked in .mime */ + if (strstr(p, ".mime") != NULL) +@@ -2324,7 +2327,7 @@ + m->offset = swap4((uint32_t)m->offset); + m->in_offset = swap4((uint32_t)m->in_offset); + m->lineno = swap4((uint32_t)m->lineno); +- if (IS_STRING(m->type)) { ++ if (IS_LIBMAGIC_STRING(m->type)) { + m->str_range = swap4(m->str_range); + m->str_flags = swap4(m->str_flags); + } +diff -u libmagic.orig/ascmagic.c libmagic/ascmagic.c +--- libmagic.orig/ascmagic.c 2009-03-17 21:52:35.000000000 +0000 ++++ libmagic/ascmagic.c 2009-12-23 19:39:50.000000000 +0000 +@@ -144,10 +144,8 @@ + /* malloc size is a conservative overestimate; could be + improved, or at least realloced after conversion. */ + mlen = ulen * 6; +- if ((utf8_buf = CAST(unsigned char *, malloc(mlen))) == NULL) { +- file_oomem(ms, mlen); +- goto done; +- } ++ utf8_buf = emalloc(mlen); ++ + if ((utf8_end = encode_utf8(utf8_buf, mlen, ubuf, ulen)) == NULL) + goto done; + if ((rv = file_softmagic(ms, utf8_buf, (size_t)(utf8_end - utf8_buf), +@@ -310,7 +308,7 @@ + rv = 1; + done: + if (utf8_buf) +- free(utf8_buf); ++ efree(utf8_buf); + + return rv; + } +diff -u libmagic.orig/cdf.c libmagic/cdf.c +--- libmagic.orig/cdf.c 2009-05-06 15:29:47.000000000 +0100 ++++ libmagic/cdf.c 2009-12-23 19:39:50.000000000 +0000 +@@ -40,7 +40,17 @@ + #include + #endif + #include ++ ++#ifdef PHP_WIN32 ++#include "win32/unistd.h" ++#else + #include ++#endif ++ ++#ifndef UINT32_MAX ++# define UINT32_MAX (0xffffffff) ++#endif ++ + #include + #include + #include +@@ -1042,7 +1052,7 @@ + cdf_directory_t *d; + char name[__arraycount(d->d_name)]; + cdf_stream_t scn; +- struct timespec ts; ++ struct timeval ts; + + static const char *types[] = { "empty", "user storage", + "user stream", "lockbytes", "property", "root storage" }; +@@ -1094,13 +1104,13 @@ + cdf_dump_property_info(const cdf_property_info_t *info, size_t count) + { + cdf_timestamp_t tp; +- struct timespec ts; ++ struct timeval ts; + char buf[64]; + size_t i; + + for (i = 0; i < count; i++) { + cdf_print_property_name(buf, sizeof(buf), info[i].pi_id); +- (void)fprintf(stderr, "%zu) %s: ", i, buf); ++ (void)fprintf(stderr, "%zu) %s: ", i, buf); + switch (info[i].pi_type) { + case CDF_SIGNED16: + (void)fprintf(stderr, "signed 16 [%hd]\n", +@@ -1121,13 +1131,17 @@ + break; + case CDF_FILETIME: + tp = info[i].pi_tp; ++#if defined(PHP_WIN32 ) && _MSC_VER <= 1500 ++ if (tp < 1000000000000000i64) { ++#else + if (tp < 1000000000000000LL) { ++#endif + cdf_print_elapsed_time(buf, sizeof(buf), tp); + (void)fprintf(stderr, "timestamp %s\n", buf); + } else { + cdf_timestamp_to_timespec(&ts, tp); + (void)fprintf(stderr, "timestamp %s", +- ctime(&ts.tv_sec)); ++ ctime(&ts.tv_sec)); + } + break; + case CDF_CLIPBOARD: +diff -u libmagic.orig/cdf.h libmagic/cdf.h +--- libmagic.orig/cdf.h 2009-04-29 20:03:02.000000000 +0100 ++++ libmagic/cdf.h 2009-12-23 19:39:50.000000000 +0000 +@@ -42,7 +42,11 @@ + + typedef struct { + uint64_t h_magic; +-#define CDF_MAGIC 0xE11AB1A1E011CFD0LL ++#if defined(PHP_WIN32 ) && _MSC_VER <= 1500 ++# define CDF_MAGIC 0xE11AB1A1E011CFD0i64 ++#else ++# define CDF_MAGIC 0xE11AB1A1E011CFD0LL ++#endif + uint64_t h_uuid[2]; + uint16_t h_revision; + uint16_t h_version; +@@ -248,9 +252,9 @@ + size_t i_len; + } cdf_info_t; + +-struct timespec; +-int cdf_timestamp_to_timespec(struct timespec *, cdf_timestamp_t); +-int cdf_timespec_to_timestamp(cdf_timestamp_t *, const struct timespec *); ++struct timeval; ++int cdf_timestamp_to_timespec(struct timeval *, cdf_timestamp_t); ++int cdf_timespec_to_timestamp(cdf_timestamp_t *, const struct timeval *); + int cdf_read_header(const cdf_info_t *, cdf_header_t *); + void cdf_swap_header(cdf_header_t *); + void cdf_unpack_header(cdf_header_t *, char *); +diff -u libmagic.orig/cdf_time.c libmagic/cdf_time.c +--- libmagic.orig/cdf_time.c 2009-03-10 11:44:29.000000000 +0000 ++++ libmagic/cdf_time.c 2009-12-23 19:39:50.000000000 +0000 +@@ -96,7 +96,7 @@ + } + + int +-cdf_timestamp_to_timespec(struct timespec *ts, cdf_timestamp_t t) ++cdf_timestamp_to_timespec(struct timeval *ts, cdf_timestamp_t t) + { + struct tm tm; + #ifdef HAVE_STRUCT_TM_TM_ZONE +@@ -104,8 +104,8 @@ + #endif + int rdays; + +- /* Unit is 100's of nanoseconds */ +- ts->tv_nsec = (t % CDF_TIME_PREC) * 100; ++ /* Time interval, in microseconds */ ++ ts->tv_usec = (t % CDF_TIME_PREC) * CDF_TIME_PREC; + + t /= CDF_TIME_PREC; + tm.tm_sec = t % 60; +@@ -143,7 +143,7 @@ + } + + int +-cdf_timespec_to_timestamp(cdf_timestamp_t *t, const struct timespec *ts) ++cdf_timespec_to_timestamp(cdf_timestamp_t *t, const struct timeval *ts) + { + (void)&t; + (void)&ts; +@@ -153,7 +153,7 @@ + errno = EINVAL; + return -1; + } +- *t = (ts->ts_nsec / 100) * CDF_TIME_PREC; ++ *t = (ts->ts_usec / CDF_TIME_PREC) * CDF_TIME_PREC; + *t = tm.tm_sec; + *t += tm.tm_min * 60; + *t += tm.tm_hour * 60 * 60; +@@ -167,7 +167,7 @@ + int + main(int argc, char *argv[]) + { +- struct timespec ts; ++ struct timeval ts; + static const cdf_timestamp_t tst = 0x01A5E403C2D59C00ULL; + static const char *ref = "Sat Apr 23 01:30:00 1977"; + char *p, *q; +diff -u libmagic.orig/compress.c libmagic/compress.c +--- libmagic.orig/compress.c 2009-03-23 14:21:51.000000000 +0000 ++++ libmagic/compress.c 2009-12-23 19:39:50.000000000 +0000 +@@ -32,6 +32,7 @@ + * uncompress(method, old, n, newch) - uncompress old into new, + * using method, return sizeof new + */ ++#include "config.h" + #include "file.h" + + #ifndef lint +@@ -45,7 +46,10 @@ + #endif + #include + #include ++#include ++#ifndef PHP_WIN32 + #include ++#endif + #ifdef HAVE_SYS_WAIT_H + #include + #endif +@@ -57,6 +61,9 @@ + #include + #endif + ++#undef FIONREAD ++ ++ + private const struct { + const char magic[8]; + size_t maglen; +@@ -79,12 +86,10 @@ + { "\3757zXZ\0",6,{ "xz", "-cd", NULL }, 1 }, /* XZ Utils */ + }; + +-private size_t ncompr = sizeof(compr) / sizeof(compr[0]); +- + #define NODATA ((size_t)~0) + +- + private ssize_t swrite(int, const void *, size_t); ++#ifdef PHP_FILEINFO_UNCOMPRESS + private size_t uncompressbuf(struct magic_set *, int, size_t, + const unsigned char *, unsigned char **, size_t); + #ifdef BUILTIN_DECOMPRESS +@@ -100,10 +105,13 @@ + size_t i, nsz; + int rv = 0; + int mime = ms->flags & MAGIC_MIME; ++ size_t ncompr; + + if ((ms->flags & MAGIC_COMPRESS) == 0) + return 0; + ++ ncompr = sizeof(compr) / sizeof(compr[0]); ++ + for (i = 0; i < ncompr; i++) { + if (nbytes < compr[i].maglen) + continue; +@@ -133,10 +141,11 @@ + } + error: + if (newbuf) +- free(newbuf); ++ efree(newbuf); + ms->flags |= MAGIC_COMPRESS; + return rv; + } ++#endif + + /* + * `safe' write for sockets and pipes. +@@ -169,7 +178,7 @@ + protected ssize_t + sread(int fd, void *buf, size_t n, int canbepipe) + { +- int rv, cnt; ++ int rv; + #ifdef FIONREAD + int t = 0; + #endif +@@ -181,6 +190,7 @@ + #ifdef FIONREAD + if ((canbepipe && (ioctl(fd, FIONREAD, &t) == -1)) || (t == 0)) { + #ifdef FD_ZERO ++ int cnt; + for (cnt = 0;; cnt++) { + fd_set check; + struct timeval tout = {0, 100 * 1000}; +@@ -294,6 +304,7 @@ + return fd; + } + ++#ifdef PHP_FILEINFO_UNCOMPRESS + #ifdef BUILTIN_DECOMPRESS + + #define FHCRC (1 << 1) +@@ -301,6 +312,7 @@ + #define FNAME (1 << 3) + #define FCOMMENT (1 << 4) + ++ + private size_t + uncompressgzipped(struct magic_set *ms, const unsigned char *old, + unsigned char **newch, size_t n) +@@ -330,9 +342,7 @@ + + if (data_start >= n) + return 0; +- if ((*newch = CAST(unsigned char *, malloc(HOWMANY + 1))) == NULL) { +- return 0; +- } ++ *newch = (unsigned char *)emalloc(HOWMANY + 1)); + + /* XXX: const castaway, via strchr */ + z.next_in = (Bytef *)strchr((const char *)old + data_start, +@@ -455,20 +465,14 @@ + fdin[1] = -1; + } + +- if ((*newch = (unsigned char *) malloc(HOWMANY + 1)) == NULL) { +-#ifdef DEBUG +- (void)fprintf(stderr, "Malloc failed (%s)\n", +- strerror(errno)); +-#endif +- n = 0; +- goto err; +- } ++ *newch = (unsigned char *) emalloc(HOWMANY + 1); ++ + if ((r = sread(fdout[0], *newch, HOWMANY, 0)) <= 0) { + #ifdef DEBUG + (void)fprintf(stderr, "Read failed (%s)\n", + strerror(errno)); + #endif +- free(*newch); ++ efree(*newch); + n = 0; + newch[0] = '\0'; + goto err; +@@ -492,3 +496,4 @@ + return n; + } + } ++#endif /* if PHP_FILEINFO_UNCOMPRESS */ +diff -u libmagic.orig/file.h libmagic/file.h +--- libmagic.orig/file.h 2009-03-17 21:52:35.000000000 +0000 ++++ libmagic/file.h 2009-12-23 19:39:50.000000000 +0000 +@@ -33,9 +33,7 @@ + #ifndef __file_h__ + #define __file_h__ + +-#ifdef HAVE_CONFIG_H +-#include +-#endif ++#include "config.h" + + #include /* Include that here, to make sure __P gets defined */ + #include +@@ -46,9 +44,20 @@ + #ifdef HAVE_INTTYPES_H + #include + #endif +-#include ++#ifdef PHP_WIN32 ++#include "win32/php_stdint.h" ++#endif ++ ++#include "php.h" ++#include "ext/standard/php_string.h" ++#include "ext/pcre/php_pcre.h" ++ + #include ++#ifdef PHP_WIN32 ++#include "win32/param.h" ++#else + #include ++#endif + /* Do this here and now, because struct stat gets re-defined on solaris */ + #include + #include +@@ -59,7 +68,7 @@ + #define MAGIC "/etc/magic" + #endif + +-#ifdef __EMX__ ++#if defined(__EMX__) || defined(PHP_WIN32) + #define PATHSEP ';' + #else + #define PATHSEP ':' +@@ -81,12 +90,6 @@ + #endif + #endif + +-#ifndef __GNUC__ +-#ifndef __attribute__ +-#define __attribute__(a) +-#endif +-#endif +- + #ifndef MIN + #define MIN(a,b) (((a) < (b)) ? (a) : (b)) + #endif +@@ -189,7 +192,7 @@ + #define FILE_INDIRECT 41 + #define FILE_NAMES_SIZE 42/* size of array to contain all names */ + +-#define IS_STRING(t) \ ++#define IS_LIBMAGIC_STRING(t) \ + ((t) == FILE_STRING || \ + (t) == FILE_PSTRING || \ + (t) == FILE_BESTRING16 || \ +@@ -211,7 +214,7 @@ + #ifdef ENABLE_CONDITIONALS + uint8_t cond; /* conditional type */ + #else +- uint8_t dummy; ++ uint8_t dummy; + #endif + uint8_t factor_op; + #define FILE_FACTOR_OP_PLUS '+' +@@ -345,20 +348,20 @@ + + struct stat; + protected const char *file_fmttime(uint32_t, int); +-protected int file_buffer(struct magic_set *, int, const char *, const void *, ++protected int file_buffer(struct magic_set *, php_stream *, const char *, const void *, + size_t); +-protected int file_fsmagic(struct magic_set *, const char *, struct stat *); ++protected int file_fsmagic(struct magic_set *ms, const char *fn, struct stat *sb, php_stream *stream); + protected int file_pipe2file(struct magic_set *, int, const void *, size_t); +-protected int file_vprintf(struct magic_set *, const char *, va_list); +-protected int file_printf(struct magic_set *, const char *, ...) +- __attribute__((__format__(__printf__, 2, 3))); ++protected int file_printf(struct magic_set *, const char *, ...); + protected int file_reset(struct magic_set *); + protected int file_tryelf(struct magic_set *, int, const unsigned char *, + size_t); + protected int file_trycdf(struct magic_set *, int, const unsigned char *, + size_t); ++#ifdef PHP_FILEINFO_UNCOMPRESS + protected int file_zmagic(struct magic_set *, int, const char *, + const unsigned char *, size_t); ++#endif + protected int file_ascmagic(struct magic_set *, const unsigned char *, size_t); + protected int file_ascmagic_with_encoding(struct magic_set *, + const unsigned char *, size_t, unichar *, size_t, const char *, +@@ -375,13 +378,9 @@ + protected void file_badread(struct magic_set *); + protected void file_badseek(struct magic_set *); + protected void file_oomem(struct magic_set *, size_t); +-protected void file_error(struct magic_set *, int, const char *, ...) +- __attribute__((__format__(__printf__, 3, 4))); +-protected void file_magerror(struct magic_set *, const char *, ...) +- __attribute__((__format__(__printf__, 2, 3))); +-protected void file_magwarn(struct magic_set *, const char *, ...) +- __attribute__((__format__(__printf__, 2, 3))); +-protected void file_mdump(struct magic *); ++protected void file_error(struct magic_set *, int, const char *, ...); ++protected void file_magerror(struct magic_set *, const char *, ...); ++protected void file_magwarn(struct magic_set *, const char *, ...); + protected void file_showstr(FILE *, const char *, size_t); + protected size_t file_mbswidth(const char *); + protected const char *file_getbuffer(struct magic_set *); +@@ -394,11 +393,8 @@ + size_t); + #endif /* __EMX__ */ + +- +-#ifndef COMPILE_ONLY + extern const char *file_names[]; + extern const size_t file_nnames; +-#endif + + #ifndef HAVE_STRERROR + extern int sys_nerr; +@@ -411,20 +407,14 @@ + #define strtoul(a, b, c) strtol(a, b, c) + #endif + +-#ifndef HAVE_VASPRINTF +-int vasprintf(char **, const char *, va_list); +-#endif +-#ifndef HAVE_ASPRINTF +-int asprintf(char **ptr, const char *format_string, ...); +-#endif +- +-#ifndef HAVE_STRLCPY ++#ifndef strlcpy + size_t strlcpy(char *dst, const char *src, size_t siz); + #endif +-#ifndef HAVE_STRLCAT ++#ifndef strlcat + size_t strlcat(char *dst, const char *src, size_t siz); + #endif + ++ + #if defined(HAVE_MMAP) && defined(HAVE_SYS_MMAN_H) && !defined(QUICK) + #define QUICK + #endif +diff -u libmagic.orig/fsmagic.c libmagic/fsmagic.c +--- libmagic.orig/fsmagic.c 2009-03-17 21:52:35.000000000 +0000 ++++ libmagic/fsmagic.c 2009-12-23 19:39:50.000000000 +0000 +@@ -60,29 +60,19 @@ + #endif + #undef HAVE_MAJOR + +-private int +-bad_link(struct magic_set *ms, int err, char *buf) +-{ +- const char *errfmt; +- int mime = ms->flags & MAGIC_MIME; +- if ((mime & MAGIC_MIME_TYPE) && +- file_printf(ms, "application/x-symlink") +- == -1) +- return -1; +- else if (!mime) { +- if (err == ELOOP) +- errfmt = "symbolic link in a loop"; +- else +- errfmt = "broken symbolic link to `%s'"; +- if (ms->flags & MAGIC_ERROR) { +- file_error(ms, err, errfmt, buf); +- return -1; +- } +- if (file_printf(ms, errfmt, buf) == -1) +- return -1; +- } +- return 1; +-} ++#ifdef PHP_WIN32 ++ ++# undef S_IFIFO ++#endif ++ ++ ++#ifndef S_ISDIR ++#define S_ISDIR(mode) ((mode) & _S_IFDIR) ++#endif ++ ++#ifndef S_ISREG ++#define S_ISREG(mode) ((mode) & _S_IFREG) ++#endif + + private int + handle_mime(struct magic_set *ms, int mime, const char *str) +@@ -100,41 +90,36 @@ + } + + protected int +-file_fsmagic(struct magic_set *ms, const char *fn, struct stat *sb) ++file_fsmagic(struct magic_set *ms, const char *fn, struct stat *sb, php_stream *stream) + { +- int ret = 0; + int mime = ms->flags & MAGIC_MIME; +-#ifdef S_IFLNK +- char buf[BUFSIZ+4]; +- int nch; +- struct stat tstatbuf; +-#endif ++ TSRMLS_FETCH(); + + if (ms->flags & MAGIC_APPLE) + return 0; +- if (fn == NULL) ++ ++ if (!fn && !stream) { + return 0; ++ } + +- /* +- * Fstat is cheaper but fails for files you don't have read perms on. +- * On 4.2BSD and similar systems, use lstat() to identify symlinks. +- */ +-#ifdef S_IFLNK +- if ((ms->flags & MAGIC_SYMLINK) == 0) +- ret = lstat(fn, sb); +- else +-#endif +- ret = stat(fn, sb); /* don't merge into if; see "ret =" above */ +- +- if (ret) { +- if (ms->flags & MAGIC_ERROR) { +- file_error(ms, errno, "cannot stat `%s'", fn); +- return -1; ++ if (stream) { ++ php_stream_statbuf ssb; ++ if (php_stream_stat(stream, &ssb) < 0) { ++ if (ms->flags & MAGIC_ERROR) { ++ file_error(ms, errno, "cannot stat `%s'", fn); ++ return -1; ++ } ++ return 1; ++ } ++ memcpy(sb, &ssb.sb, sizeof(struct stat)); ++ } else { ++ if (php_sys_stat(fn, sb) != 0) { ++ if (ms->flags & MAGIC_ERROR) { ++ file_error(ms, errno, "cannot stat `%s'", fn); ++ return -1; ++ } ++ return 1; + } +- if (file_printf(ms, "cannot open `%s' (%s)", +- fn, strerror(errno)) == -1) +- return -1; +- return 1; + } + + if (!mime) { +@@ -154,172 +139,75 @@ + return -1; + #endif + } +- ++ + switch (sb->st_mode & S_IFMT) { +- case S_IFDIR: +- if (mime) { +- if (handle_mime(ms, mime, "x-directory") == -1) +- return -1; +- } else if (file_printf(ms, "directory") == -1) +- return -1; +- return 1; +-#ifdef S_IFCHR +- case S_IFCHR: +- /* +- * If -s has been specified, treat character special files +- * like ordinary files. Otherwise, just report that they +- * are block special files and go on to the next file. +- */ +- if ((ms->flags & MAGIC_DEVICES) != 0) +- break; +- if (mime) { +- if (handle_mime(ms, mime, "x-character-device") == -1) +- return -1; +- } else { +-#ifdef HAVE_STAT_ST_RDEV +-# ifdef dv_unit +- if (file_printf(ms, "character special (%d/%d/%d)", +- major(sb->st_rdev), dv_unit(sb->st_rdev), +- dv_subunit(sb->st_rdev)) == -1) +- return -1; +-# else +- if (file_printf(ms, "character special (%ld/%ld)", +- (long)major(sb->st_rdev), (long)minor(sb->st_rdev)) +- == -1) +- return -1; +-# endif +-#else +- if (file_printf(ms, "character special") == -1) +- return -1; +-#endif +- } +- return 1; +-#endif +-#ifdef S_IFBLK +- case S_IFBLK: +- /* +- * If -s has been specified, treat block special files +- * like ordinary files. Otherwise, just report that they +- * are block special files and go on to the next file. +- */ +- if ((ms->flags & MAGIC_DEVICES) != 0) +- break; +- if (mime) { +- if (handle_mime(ms, mime, "x-block-device") == -1) +- return -1; +- } else { +-#ifdef HAVE_STAT_ST_RDEV +-# ifdef dv_unit +- if (file_printf(ms, "block special (%d/%d/%d)", +- major(sb->st_rdev), dv_unit(sb->st_rdev), +- dv_subunit(sb->st_rdev)) == -1) +- return -1; +-# else +- if (file_printf(ms, "block special (%ld/%ld)", +- (long)major(sb->st_rdev), (long)minor(sb->st_rdev)) == -1) +- return -1; +-# endif +-#else +- if (file_printf(ms, "block special") == -1) +- return -1; +-#endif +- } +- return 1; +-#endif +- /* TODO add code to handle V7 MUX and Blit MUX files */ +-#ifdef S_IFIFO +- case S_IFIFO: +- if((ms->flags & MAGIC_DEVICES) != 0) +- break; +- if (mime) { +- if (handle_mime(ms, mime, "x-fifo") == -1) +- return -1; +- } else if (file_printf(ms, "fifo (named pipe)") == -1) +- return -1; +- return 1; +-#endif +-#ifdef S_IFDOOR +- case S_IFDOOR: +- if (mime) { +- if (handle_mime(ms, mime, "x-door") == -1) +- return -1; +- } else if (file_printf(ms, "door") == -1) +- return -1; +- return 1; +-#endif +-#ifdef S_IFLNK +- case S_IFLNK: +- if ((nch = readlink(fn, buf, BUFSIZ-1)) <= 0) { +- if (ms->flags & MAGIC_ERROR) { +- file_error(ms, errno, "unreadable symlink `%s'", +- fn); +- return -1; ++#ifndef PHP_WIN32 ++# ifdef S_IFCHR ++ case S_IFCHR: ++ /* ++ * If -s has been specified, treat character special files ++ * like ordinary files. Otherwise, just report that they ++ * are block special files and go on to the next file. ++ */ ++ if ((ms->flags & MAGIC_DEVICES) != 0) { ++ break; + } + if (mime) { +- if (handle_mime(ms, mime, "x-symlink") == -1) ++ if (handle_mime(ms, mime, "x-character-device") == -1) + return -1; +- } else if (file_printf(ms, +- "unreadable symlink `%s' (%s)", fn, +- strerror(errno)) == -1) +- return -1; ++ } else { ++# ifdef HAVE_STAT_ST_RDEV ++# ifdef dv_unit ++ if (file_printf(ms, "character special (%d/%d/%d)", ++ major(sb->st_rdev), dv_unit(sb->st_rdev), ++ dv_subunit(sb->st_rdev)) == -1) ++ return -1; ++# else ++ if (file_printf(ms, "character special (%ld/%ld)", ++ (long)major(sb->st_rdev), (long)minor(sb->st_rdev)) ++ == -1) ++ return -1; ++# endif ++# else ++ if (file_printf(ms, "character special") == -1) ++ return -1; ++# endif ++ } + return 1; +- } +- buf[nch] = '\0'; /* readlink(2) does not do this */ +- +- /* If broken symlink, say so and quit early. */ +- if (*buf == '/') { +- if (stat(buf, &tstatbuf) < 0) +- return bad_link(ms, errno, buf); +- } else { +- char *tmp; +- char buf2[BUFSIZ+BUFSIZ+4]; ++# endif ++#endif + +- if ((tmp = strrchr(fn, '/')) == NULL) { +- tmp = buf; /* in current directory anyway */ +- } else { +- if (tmp - fn + 1 > BUFSIZ) { +- if (ms->flags & MAGIC_ERROR) { +- file_error(ms, 0, +- "path too long: `%s'", buf); ++#ifdef S_IFIFO ++ case S_IFIFO: ++ if((ms->flags & MAGIC_DEVICES) != 0) ++ break; ++ if (mime) { ++ if (handle_mime(ms, mime, "x-fifo") == -1) + return -1; +- } ++ } else if (file_printf(ms, "fifo (named pipe)") == -1) ++ return -1; ++ return 1; ++#endif ++#ifdef S_IFDOOR ++ case S_IFDOOR: + if (mime) { +- if (handle_mime(ms, mime, +- "x-path-too-long") == -1) ++ if (handle_mime(ms, mime, "x-door") == -1) + return -1; +- } else if (file_printf(ms, +- "path too long: `%s'", fn) == -1) ++ } else if (file_printf(ms, "door") == -1) + return -1; + return 1; +- } +- /* take dir part */ +- (void)strlcpy(buf2, fn, sizeof buf2); +- buf2[tmp - fn + 1] = '\0'; +- /* plus (rel) link */ +- (void)strlcat(buf2, buf, sizeof buf2); +- tmp = buf2; +- } +- if (stat(tmp, &tstatbuf) < 0) +- return bad_link(ms, errno, buf); +- } ++#endif + +- /* Otherwise, handle it. */ +- if ((ms->flags & MAGIC_SYMLINK) != 0) { +- const char *p; +- ms->flags &= MAGIC_SYMLINK; +- p = magic_file(ms, buf); +- ms->flags |= MAGIC_SYMLINK; +- return p != NULL ? 1 : -1; +- } else { /* just print what it points to */ +- if (mime) { +- if (handle_mime(ms, mime, "x-symlink") == -1) +- return -1; +- } else if (file_printf(ms, "symbolic link to `%s'", +- buf) == -1) +- return -1; +- } +- return 1; ++#ifdef S_IFLNK ++ case S_IFLNK: ++ /* stat is used, if it made here then the link is broken */ ++ if (ms->flags & MAGIC_ERROR) { ++ file_error(ms, errno, "unreadable symlink `%s'", fn); ++ return -1; ++ } ++ return 1; + #endif ++ + #ifdef S_IFSOCK + #ifndef __COHERENT__ + case S_IFSOCK: +@@ -331,12 +219,14 @@ + return 1; + #endif + #endif +- case S_IFREG: +- break; +- default: +- file_error(ms, 0, "invalid mode 0%o", sb->st_mode); +- return -1; +- /*NOTREACHED*/ ++ ++ case S_IFREG: ++ break; ++ ++ default: ++ file_error(ms, 0, "invalid mode 0%o", sb->st_mode); ++ return -1; ++ /*NOTREACHED*/ + } + + /* +diff -u libmagic.orig/funcs.c libmagic/funcs.c +--- libmagic.orig/funcs.c 2009-04-07 12:07:00.000000000 +0100 ++++ libmagic/funcs.c 2009-12-23 19:39:50.000000000 +0000 +@@ -41,52 +41,36 @@ + #if defined(HAVE_WCTYPE_H) + #include + #endif +-#if defined(HAVE_LIMITS_H) +-#include +-#endif + +-#ifndef SIZE_MAX +-#define SIZE_MAX ((size_t)~0) ++#ifndef SIZE_MAX ++# define SIZE_MAX ((size_t) -1) + #endif + + /* + * Like printf, only we append to a buffer. + */ + protected int +-file_vprintf(struct magic_set *ms, const char *fmt, va_list ap) ++file_printf(struct magic_set *ms, const char *fmt, ...) + { ++ va_list ap; + int len; +- char *buf, *newstr; ++ char *buf = NULL, *newstr; + +- len = vasprintf(&buf, fmt, ap); +- if (len < 0) +- goto out; ++ va_start(ap, fmt); ++ len = vspprintf(&buf, 0, fmt, ap); ++ va_end(ap); + + if (ms->o.buf != NULL) { +- len = asprintf(&newstr, "%s%s", ms->o.buf, buf); +- free(buf); +- if (len < 0) +- goto out; +- free(ms->o.buf); +- buf = newstr; ++ len = spprintf(&newstr, 0, "%s%s", ms->o.buf, (buf ? buf : "")); ++ if (buf) { ++ efree(buf); ++ } ++ efree(ms->o.buf); ++ ms->o.buf = newstr; ++ } else { ++ ms->o.buf = buf; + } +- ms->o.buf = buf; + return 0; +-out: +- file_error(ms, errno, "vasprintf failed"); +- return -1; +-} +- +-protected int +-file_printf(struct magic_set *ms, const char *fmt, ...) +-{ +- int rv; +- va_list ap; +- +- va_start(ap, fmt); +- rv = file_vprintf(ms, fmt, ap); +- va_end(ap); +- return rv; + } + + /* +@@ -97,17 +81,32 @@ + file_error_core(struct magic_set *ms, int error, const char *f, va_list va, + uint32_t lineno) + { ++ char *buf = NULL; ++ + /* Only the first error is ok */ +- if (ms->event_flags & EVENT_HAD_ERR) ++ if (ms->event_flags & EVENT_HAD_ERR) { + return; ++ } ++ + if (lineno != 0) { +- free(ms->o.buf); ++ efree(ms->o.buf); + ms->o.buf = NULL; + file_printf(ms, "line %u: ", lineno); + } +- file_vprintf(ms, f, va); +- if (error > 0) +- file_printf(ms, " (%s)", strerror(error)); ++ ++ vspprintf(&buf, 0, f, va); ++ va_end(va); ++ ++ if (error > 0) { ++ file_printf(ms, "%s (%s)", (*buf ? buf : ""), strerror(error)); ++ } else if (*buf) { ++ file_printf(ms, "%s", buf); ++ } ++ ++ if (buf) { ++ efree(buf); ++ } ++ + ms->event_flags |= EVENT_HAD_ERR; + ms->error = error; + } +@@ -153,14 +152,13 @@ + file_error(ms, errno, "error reading"); + } + +-#ifndef COMPILE_ONLY + protected int +-file_buffer(struct magic_set *ms, int fd, const char *inname, const void *buf, ++file_buffer(struct magic_set *ms, php_stream *stream, const char *inname, const void *buf, + size_t nb) + { + int m = 0, rv = 0, looks_text = 0; + int mime = ms->flags & MAGIC_MIME; +- const unsigned char *ubuf = CAST(const unsigned char *, buf); ++ const unsigned char *ubuf = buf; + unichar *u8buf = NULL; + size_t ulen; + const char *code = NULL; +@@ -188,7 +186,7 @@ + &code, &code_mime, &type); + } + +-#ifdef __EMX__ ++#if defined(__EMX__) + if ((ms->flags & MAGIC_NO_CHECK_APPTYPE) == 0 && inname) { + switch (file_os2_apptype(ms, inname, buf, nb)) { + case -1: +@@ -201,13 +199,14 @@ + } + #endif + +- /* try compression stuff */ ++#if PHP_FILEINFO_UNCOMPRESS + if ((ms->flags & MAGIC_NO_CHECK_COMPRESS) == 0) +- if ((m = file_zmagic(ms, fd, inname, ubuf, nb)) != 0) { ++ if ((m = file_zmagic(ms, stream, inname, ubuf, nb)) != 0) { + if ((ms->flags & MAGIC_DEBUG) != 0) + (void)fprintf(stderr, "zmagic %d\n", m); + goto done; +- } ++ } ++#endif + + /* Check if we have a tar file */ + if ((ms->flags & MAGIC_NO_CHECK_TAR) == 0) +@@ -218,12 +217,17 @@ + } + + /* Check if we have a CDF file */ +- if ((ms->flags & MAGIC_NO_CHECK_CDF) == 0) +- if ((m = file_trycdf(ms, fd, ubuf, nb)) != 0) { +- if ((ms->flags & MAGIC_DEBUG) != 0) +- (void)fprintf(stderr, "cdf %d\n", m); +- goto done; ++ if ((ms->flags & MAGIC_NO_CHECK_CDF) == 0) { ++ int fd; ++ TSRMLS_FETCH(); ++ if (stream && SUCCESS == php_stream_cast(stream, PHP_STREAM_AS_FD, (void **)&fd, 0)) { ++ if ((m = file_trycdf(ms, fd, ubuf, nb)) != 0) { ++ if ((ms->flags & MAGIC_DEBUG) != 0) ++ (void)fprintf(stderr, "cdf %d\n", m); ++ goto done; ++ } + } ++ } + + /* try soft magic tests */ + if ((ms->flags & MAGIC_NO_CHECK_SOFT) == 0) +@@ -294,7 +298,6 @@ + + return m; + } +-#endif + + protected int + file_reset(struct magic_set *ms) +@@ -304,11 +307,11 @@ + return -1; + } + if (ms->o.buf) { +- free(ms->o.buf); ++ efree(ms->o.buf); + ms->o.buf = NULL; + } + if (ms->o.pbuf) { +- free(ms->o.pbuf); ++ efree(ms->o.pbuf); + ms->o.pbuf = NULL; + } + ms->event_flags &= ~EVENT_HAD_ERR; +@@ -342,14 +345,10 @@ + /* * 4 is for octal representation, + 1 is for NUL */ + len = strlen(ms->o.buf); + if (len > (SIZE_MAX - 1) / 4) { +- file_oomem(ms, len); + return NULL; + } + psize = len * 4 + 1; +- if ((pbuf = CAST(char *, realloc(ms->o.pbuf, psize))) == NULL) { +- file_oomem(ms, psize); +- return NULL; +- } ++ pbuf = erealloc(ms->o.pbuf, psize); + ms->o.pbuf = pbuf; + + #if defined(HAVE_WCHAR_H) && defined(HAVE_MBRTOWC) && defined(HAVE_WCWIDTH) +@@ -409,13 +408,7 @@ + + if (level >= ms->c.len) { + len = (ms->c.len += 20) * sizeof(*ms->c.li); +- ms->c.li = CAST(struct level_info *, (ms->c.li == NULL) ? +- malloc(len) : +- realloc(ms->c.li, len)); +- if (ms->c.li == NULL) { +- file_oomem(ms, len); +- return -1; +- } ++ ms->c.li = (ms->c.li == NULL) ? emalloc(len) : erealloc(ms->c.li, len); + } + ms->c.li[level].got_match = 0; + #ifdef ENABLE_CONDITIONALS +diff -u libmagic.orig/magic.c libmagic/magic.c +--- libmagic.orig/magic.c 2009-03-20 21:25:41.000000000 +0000 ++++ libmagic/magic.c 2009-12-23 19:39:50.000000000 +0000 +@@ -34,14 +34,19 @@ + #include "magic.h" + + #include ++#ifdef PHP_WIN32 ++#include "win32/unistd.h" ++#else + #include ++#endif + #include +-#ifdef QUICK +-#include ++#ifdef PHP_WIN32 ++# include "config.w32.h" ++#else ++# include "php_config.h" + #endif +-#ifdef HAVE_LIMITS_H ++ + #include /* for PIPE_BUF */ +-#endif + + #if defined(HAVE_UTIMES) + # include +@@ -57,7 +62,9 @@ + #include /* for read() */ + #endif + +-#include /* for byte swapping */ ++#ifndef PHP_WIN32 ++# include /* for byte swapping */ ++#endif + + #include "patchlevel.h" + +@@ -70,13 +77,16 @@ + #endif + #endif + ++#ifdef PHP_WIN32 ++# undef S_IFLNK ++# undef S_IFIFO ++#endif ++ + private void free_mlist(struct mlist *); + private void close_and_restore(const struct magic_set *, const char *, int, + const struct stat *); + private int unreadable_info(struct magic_set *, mode_t, const char *); +-#ifndef COMPILE_ONLY +-private const char *file_or_fd(struct magic_set *, const char *, int); +-#endif ++private const char *file_or_stream(struct magic_set *, const char *, php_stream *); + + #ifndef STDIN_FILENO + #define STDIN_FILENO 0 +@@ -86,11 +96,8 @@ + magic_open(int flags) + { + struct magic_set *ms; +- size_t len; + +- if ((ms = CAST(magic_set *, calloc((size_t)1, +- sizeof(struct magic_set)))) == NULL) +- return NULL; ++ ms = ecalloc((size_t)1, sizeof(struct magic_set)); + + if (magic_setflags(ms, flags) == -1) { + errno = EINVAL; +@@ -98,11 +105,9 @@ + } + + ms->o.buf = ms->o.pbuf = NULL; +- len = (ms->c.len = 10) * sizeof(*ms->c.li); +- +- if ((ms->c.li = CAST(struct level_info *, malloc(len))) == NULL) +- goto free; + ++ ms->c.li = emalloc((ms->c.len = 10) * sizeof(*ms->c.li)); ++ + ms->event_flags = 0; + ms->error = -1; + ms->mlist = NULL; +@@ -110,7 +115,7 @@ + ms->line = 0; + return ms; + free: +- free(ms); ++ efree(ms); + return NULL; + } + +@@ -126,10 +131,10 @@ + struct mlist *next = ml->next; + struct magic *mg = ml->magic; + file_delmagic(mg, ml->mapped, ml->nmagic); +- free(ml); ++ efree(ml); + ml = next; + } +- free(ml); ++ efree(ml); + } + + private int +@@ -153,11 +158,19 @@ + public void + magic_close(struct magic_set *ms) + { +- free_mlist(ms->mlist); +- free(ms->o.pbuf); +- free(ms->o.buf); +- free(ms->c.li); +- free(ms); ++ if (ms->mlist) { ++ free_mlist(ms->mlist); ++ } ++ if (ms->o.pbuf) { ++ efree(ms->o.pbuf); ++ } ++ if (ms->o.buf) { ++ efree(ms->o.buf); ++ } ++ if (ms->c.li) { ++ efree(ms->c.li); ++ } ++ efree(ms); + } + + /* +@@ -183,21 +196,10 @@ + return ml ? 0 : -1; + } + +-public int +-magic_check(struct magic_set *ms, const char *magicfile) +-{ +- struct mlist *ml = file_apprentice(ms, magicfile, FILE_CHECK); +- free_mlist(ml); +- return ml ? 0 : -1; +-} +- + private void + close_and_restore(const struct magic_set *ms, const char *name, int fd, + const struct stat *sb) + { +- if (fd == STDIN_FILENO) +- return; +- (void) close(fd); + + if ((ms->flags & MAGIC_PRESERVE_ATIME) != 0) { + /* +@@ -224,7 +226,6 @@ + } + } + +-#ifndef COMPILE_ONLY + + /* + * find type of descriptor +@@ -232,7 +233,7 @@ + public const char * + magic_descriptor(struct magic_set *ms, int fd) + { +- return file_or_fd(ms, NULL, fd); ++ return file_or_stream(ms, NULL, NULL); + } + + /* +@@ -241,103 +242,95 @@ + public const char * + magic_file(struct magic_set *ms, const char *inname) + { +- return file_or_fd(ms, inname, STDIN_FILENO); ++ return file_or_stream(ms, inname, NULL); ++} ++ ++public const char * ++magic_stream(struct magic_set *ms, php_stream *stream) ++{ ++ return file_or_stream(ms, NULL, stream); + } + + private const char * +-file_or_fd(struct magic_set *ms, const char *inname, int fd) ++file_or_stream(struct magic_set *ms, const char *inname, php_stream *stream) + { + int rv = -1; + unsigned char *buf; + struct stat sb; + ssize_t nbytes = 0; /* number of bytes read from a datafile */ +- int ispipe = 0; ++ int no_in_stream = 0; ++ TSRMLS_FETCH(); ++ ++ if (!inname && !stream) { ++ return NULL; ++ } + + /* + * one extra for terminating '\0', and + * some overlapping space for matches near EOF + */ + #define SLOP (1 + sizeof(union VALUETYPE)) +- if ((buf = CAST(unsigned char *, malloc(HOWMANY + SLOP))) == NULL) +- return NULL; ++ buf = emalloc(HOWMANY + SLOP); + +- if (file_reset(ms) == -1) ++ if (file_reset(ms) == -1) { + goto done; ++ } + +- switch (file_fsmagic(ms, inname, &sb)) { +- case -1: /* error */ +- goto done; +- case 0: /* nothing found */ +- break; +- default: /* matched it and printed type */ ++ switch (file_fsmagic(ms, inname, &sb, stream)) { ++ case -1: /* error */ ++ goto done; ++ case 0: /* nothing found */ ++ break; ++ default: /* matched it and printed type */ ++ rv = 0; ++ goto done; ++ } ++ ++ errno = 0; ++ ++ if (!stream && inname) { ++ no_in_stream = 1; ++#if (PHP_MAJOR_VERSION < 6) ++ stream = php_stream_open_wrapper(inname, "rb", REPORT_ERRORS|ENFORCE_SAFE_MODE, NULL); ++#else ++ stream = php_stream_open_wrapper(inname, "rb", REPORT_ERRORS, NULL); ++#endif ++ } ++ ++ if (!stream) { ++ if (unreadable_info(ms, sb.st_mode, inname) == -1) ++ goto done; + rv = 0; + goto done; + } + +- if (inname == NULL) { +- if (fstat(fd, &sb) == 0 && S_ISFIFO(sb.st_mode)) +- ispipe = 1; +- } else { +- int flags = O_RDONLY|O_BINARY; +- +- if (stat(inname, &sb) == 0 && S_ISFIFO(sb.st_mode)) { +- flags |= O_NONBLOCK; +- ispipe = 1; +- } +- +- errno = 0; +- if ((fd = open(inname, flags)) < 0) { +- if (unreadable_info(ms, sb.st_mode, inname) == -1) +- goto done; +- rv = 0; +- goto done; +- } + #ifdef O_NONBLOCK +- if ((flags = fcntl(fd, F_GETFL)) != -1) { +- flags &= ~O_NONBLOCK; +- (void)fcntl(fd, F_SETFL, flags); +- } ++/* we should be already be in non blocking mode for network socket */ + #endif +- } + + /* + * try looking at the first HOWMANY bytes + */ +- if (ispipe) { +- ssize_t r = 0; +- +- while ((r = sread(fd, (void *)&buf[nbytes], +- (size_t)(HOWMANY - nbytes), 1)) > 0) { +- nbytes += r; +- if (r < PIPE_BUF) break; +- } +- +- if (nbytes == 0) { +- /* We can not read it, but we were able to stat it. */ +- if (unreadable_info(ms, sb.st_mode, inname) == -1) +- goto done; +- rv = 0; +- goto done; +- } +- +- } else { +- if ((nbytes = read(fd, (char *)buf, HOWMANY)) == -1) { +- file_error(ms, errno, "cannot read `%s'", inname); +- goto done; +- } ++ if ((nbytes = php_stream_read(stream, (char *)buf, HOWMANY)) < 0) { ++ file_error(ms, errno, "cannot read `%s'", inname); ++ goto done; + } + + (void)memset(buf + nbytes, 0, SLOP); /* NUL terminate */ +- if (file_buffer(ms, fd, inname, buf, (size_t)nbytes) == -1) ++ if (file_buffer(ms, stream, inname, buf, (size_t)nbytes) == -1) + goto done; + rv = 0; + done: +- free(buf); +- close_and_restore(ms, inname, fd, &sb); ++ efree(buf); ++ ++ if (no_in_stream && stream) { ++ php_stream_close(stream); ++ } ++ ++ close_and_restore(ms, inname, 0, &sb); + return rv == 0 ? file_getbuffer(ms) : NULL; + } + +- + public const char * + magic_buffer(struct magic_set *ms, const void *buf, size_t nb) + { +@@ -345,14 +338,13 @@ + return NULL; + /* + * The main work is done here! +- * We have the file name and/or the data buffer to be identified. ++ * We have the file name and/or the data buffer to be identified. + */ +- if (file_buffer(ms, -1, NULL, buf, nb) == -1) { ++ if (file_buffer(ms, NULL, NULL, buf, nb) == -1) { + return NULL; + } + return file_getbuffer(ms); + } +-#endif + + public const char * + magic_error(struct magic_set *ms) +diff -u libmagic.orig/magic.h libmagic/magic.h +--- libmagic.orig/magic.h 2009-03-17 21:52:35.000000000 +0000 ++++ libmagic/magic.h 2009-12-23 19:39:50.000000000 +0000 +@@ -70,6 +70,7 @@ + void magic_close(magic_t); + + const char *magic_file(magic_t, const char *); ++const char *magic_stream(magic_t, php_stream *); + const char *magic_descriptor(magic_t, int); + const char *magic_buffer(magic_t, const void *, size_t); + +@@ -78,7 +79,6 @@ + + int magic_load(magic_t, const char *); + int magic_compile(magic_t, const char *); +-int magic_check(magic_t, const char *); + int magic_errno(magic_t); + + #ifdef __cplusplus +diff -u libmagic.orig/patchlevel.h libmagic/patchlevel.h +--- libmagic.orig/patchlevel.h 2009-05-06 21:32:48.000000000 +0100 ++++ libmagic/patchlevel.h 2009-12-23 19:39:50.000000000 +0000 +@@ -3,23 +3,23 @@ + + /* + * Patchlevel file for Ian Darwin's MAGIC command. +- * $File: patchlevel.h,v 1.74 2009/05/06 20:32:48 christos Exp $ ++ * $File: patchlevel.h,v 1.68 2008/03/22 21:39:43 christos Exp $ + * +- * $Log: patchlevel.h,v $ +- * Revision 1.74 2009/05/06 20:32:48 christos +- * welcome to 5.03 ++ * $Log$ ++ * Revision 1.4 2009/05/04 20:52:43 scottmac ++ * Update libmagic to 5.02 + * +- * Revision 1.73 2009/05/04 15:15:13 christos +- * 5.02... ++ * Revision 1.3 2009/03/15 23:02:35 scottmac ++ * Update fileinfo to libmagic 5.00 and remove dependency on dirent.h on Windows + * +- * Revision 1.72 2009/04/30 21:20:15 christos +- * 5.01 we are almost here. ++ * Revision 1.2 2008/11/02 16:09:27 scottmac ++ * Update libmagic to 4.26 and add support for v6 of the magic file format. + * +- * Revision 1.71 2009/01/21 19:09:42 christos +- * file 5.0 ++ * Revision 1.1 2008/07/11 14:13:50 derick ++ * - Move lib to libmagic + * +- * Revision 1.70 2008/08/30 10:01:01 christos +- * file 4.26 ++ * Revision 1.1 2008/07/11 14:10:50 derick ++ * - Step one for bundling the libmagic library. Some config.m4 issues left. + * + * Revision 1.69 2008/07/02 15:27:05 christos + * welcome to 4.25 +diff -u libmagic.orig/print.c libmagic/print.c +--- libmagic.orig/print.c 2009-03-17 21:52:35.000000000 +0000 ++++ libmagic/print.c 2009-12-23 19:39:50.000000000 +0000 +@@ -29,6 +29,8 @@ + * print.c - debugging printout routines + */ + ++#include "php.h" ++ + #include "file.h" + + #ifndef lint +@@ -45,157 +47,21 @@ + + #define SZOF(a) (sizeof(a) / sizeof(a[0])) + +-#ifndef COMPILE_ONLY +-protected void +-file_mdump(struct magic *m) +-{ +- private const char optyp[] = { FILE_OPS }; +- +- (void) fprintf(stderr, "[%u", m->lineno); +- (void) fprintf(stderr, ">>>>>>>> %u" + 8 - (m->cont_level & 7), +- m->offset); +- +- if (m->flag & INDIR) { +- (void) fprintf(stderr, "(%s,", +- /* Note: type is unsigned */ +- (m->in_type < file_nnames) ? +- file_names[m->in_type] : "*bad*"); +- if (m->in_op & FILE_OPINVERSE) +- (void) fputc('~', stderr); +- (void) fprintf(stderr, "%c%u),", +- ((size_t)(m->in_op & FILE_OPS_MASK) < +- SZOF(optyp)) ? +- optyp[m->in_op & FILE_OPS_MASK] : '?', +- m->in_offset); +- } +- (void) fprintf(stderr, " %s%s", (m->flag & UNSIGNED) ? "u" : "", +- /* Note: type is unsigned */ +- (m->type < file_nnames) ? file_names[m->type] : "*bad*"); +- if (m->mask_op & FILE_OPINVERSE) +- (void) fputc('~', stderr); +- +- if (IS_STRING(m->type)) { +- if (m->str_flags) { +- (void) fputc('/', stderr); +- if (m->str_flags & STRING_COMPACT_BLANK) +- (void) fputc(CHAR_COMPACT_BLANK, stderr); +- if (m->str_flags & STRING_COMPACT_OPTIONAL_BLANK) +- (void) fputc(CHAR_COMPACT_OPTIONAL_BLANK, +- stderr); +- if (m->str_flags & STRING_IGNORE_LOWERCASE) +- (void) fputc(CHAR_IGNORE_LOWERCASE, stderr); +- if (m->str_flags & STRING_IGNORE_UPPERCASE) +- (void) fputc(CHAR_IGNORE_UPPERCASE, stderr); +- if (m->str_flags & REGEX_OFFSET_START) +- (void) fputc(CHAR_REGEX_OFFSET_START, stderr); +- } +- if (m->str_range) +- (void) fprintf(stderr, "/%u", m->str_range); +- } +- else { +- if ((size_t)(m->mask_op & FILE_OPS_MASK) < SZOF(optyp)) +- (void) fputc(optyp[m->mask_op & FILE_OPS_MASK], stderr); +- else +- (void) fputc('?', stderr); +- +- if (m->num_mask) { +- (void) fprintf(stderr, "%.8llx", +- (unsigned long long)m->num_mask); +- } +- } +- (void) fprintf(stderr, ",%c", m->reln); +- +- if (m->reln != 'x') { +- switch (m->type) { +- case FILE_BYTE: +- case FILE_SHORT: +- case FILE_LONG: +- case FILE_LESHORT: +- case FILE_LELONG: +- case FILE_MELONG: +- case FILE_BESHORT: +- case FILE_BELONG: +- (void) fprintf(stderr, "%d", m->value.l); +- break; +- case FILE_BEQUAD: +- case FILE_LEQUAD: +- case FILE_QUAD: +- (void) fprintf(stderr, "%lld", +- (unsigned long long)m->value.q); +- break; +- case FILE_PSTRING: +- case FILE_STRING: +- case FILE_REGEX: +- case FILE_BESTRING16: +- case FILE_LESTRING16: +- case FILE_SEARCH: +- file_showstr(stderr, m->value.s, (size_t)m->vallen); +- break; +- case FILE_DATE: +- case FILE_LEDATE: +- case FILE_BEDATE: +- case FILE_MEDATE: +- (void)fprintf(stderr, "%s,", +- file_fmttime(m->value.l, 1)); +- break; +- case FILE_LDATE: +- case FILE_LELDATE: +- case FILE_BELDATE: +- case FILE_MELDATE: +- (void)fprintf(stderr, "%s,", +- file_fmttime(m->value.l, 0)); +- break; +- case FILE_QDATE: +- case FILE_LEQDATE: +- case FILE_BEQDATE: +- (void)fprintf(stderr, "%s,", +- file_fmttime((uint32_t)m->value.q, 1)); +- break; +- case FILE_QLDATE: +- case FILE_LEQLDATE: +- case FILE_BEQLDATE: +- (void)fprintf(stderr, "%s,", +- file_fmttime((uint32_t)m->value.q, 0)); +- break; +- case FILE_FLOAT: +- case FILE_BEFLOAT: +- case FILE_LEFLOAT: +- (void) fprintf(stderr, "%G", m->value.f); +- break; +- case FILE_DOUBLE: +- case FILE_BEDOUBLE: +- case FILE_LEDOUBLE: +- (void) fprintf(stderr, "%G", m->value.d); +- break; +- case FILE_DEFAULT: +- /* XXX - do anything here? */ +- break; +- default: +- (void) fputs("*bad*", stderr); +- break; +- } +- } +- (void) fprintf(stderr, ",\"%s\"]\n", m->desc); +-} +-#endif +- + /*VARARGS*/ + protected void + file_magwarn(struct magic_set *ms, const char *f, ...) + { + va_list va; ++ char *expanded_format; ++ TSRMLS_FETCH(); + +- /* cuz we use stdout for most, stderr here */ +- (void) fflush(stdout); +- +- if (ms->file) +- (void) fprintf(stderr, "%s, %lu: ", ms->file, +- (unsigned long)ms->line); +- (void) fprintf(stderr, "Warning: "); + va_start(va, f); +- (void) vfprintf(stderr, f, va); ++ vasprintf(&expanded_format, f, va); + va_end(va); +- (void) fputc('\n', stderr); ++ ++ php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Warning: %s", expanded_format); ++ ++ free(expanded_format); + } + + protected const char * +diff -u libmagic.orig/readcdf.c libmagic/readcdf.c +--- libmagic.orig/readcdf.c 2009-05-06 21:48:22.000000000 +0100 ++++ libmagic/readcdf.c 2009-12-23 19:39:50.000000000 +0000 +@@ -30,7 +30,11 @@ + #endif + + #include ++#ifdef PHP_WIN32 ++#include "win32/unistd.h" ++#else + #include ++#endif + #include + #include + #include +@@ -46,7 +50,7 @@ + { + size_t i; + cdf_timestamp_t tp; +- struct timespec ts; ++ struct timeval ts; + char buf[64]; + const char *str = "vnd.ms-office"; + const char *s; +@@ -106,7 +110,11 @@ + case CDF_FILETIME: + tp = info[i].pi_tp; + if (tp != 0) { ++#if defined(PHP_WIN32 ) && _MSC_VER <= 1500 ++ if (tp < 1000000000000000i64) { ++#else + if (tp < 1000000000000000LL) { ++#endif + char tbuf[64]; + cdf_print_elapsed_time(tbuf, + sizeof(tbuf), tp); +@@ -115,7 +123,10 @@ + return -1; + } else { + char *c, *ec; +- cdf_timestamp_to_timespec(&ts, tp); ++ ++ if (cdf_timestamp_to_timespec(&ts, tp) == -1) { ++ return -1; ++ } + c = ctime(&ts.tv_sec); + if ((ec = strchr(c, '\n')) != NULL) + *ec = '\0'; +diff -u libmagic.orig/readelf.c libmagic/readelf.c +--- libmagic.orig/readelf.c 2009-03-17 21:52:35.000000000 +0000 ++++ libmagic/readelf.c 2009-12-23 19:39:50.000000000 +0000 +@@ -49,7 +49,7 @@ + off_t, int *, int); + private int doshn(struct magic_set *, int, int, int, off_t, int, size_t, int *, + int); +-private size_t donote(struct magic_set *, void *, size_t, size_t, int, ++private size_t donote(struct magic_set *, unsigned char *, size_t, size_t, int, + int, size_t, int *); + + #define ELF_ALIGN(a) ((((a) + align - 1) / align) * align) +@@ -364,7 +364,7 @@ + #endif + + private size_t +-donote(struct magic_set *ms, void *vbuf, size_t offset, size_t size, ++donote(struct magic_set *ms, unsigned char *nbuf, size_t offset, size_t size, + int clazz, int swap, size_t align, int *flags) + { + Elf32_Nhdr nh32; +@@ -374,7 +374,6 @@ + int os_style = -1; + #endif + uint32_t namesz, descsz; +- unsigned char *nbuf = CAST(unsigned char *, vbuf); + + (void)memcpy(xnh_addr, &nbuf[offset], xnh_sizeof); + offset += xnh_sizeof; +@@ -855,20 +854,16 @@ + file_badread(ms); + return -1; + } +- if ((nbuf = malloc((size_t)xsh_size)) == NULL) { +- file_error(ms, errno, "Cannot allocate memory" +- " for note"); +- return -1; +- } ++ nbuf = emalloc((size_t)xsh_size); + if ((noff = lseek(fd, (off_t)xsh_offset, SEEK_SET)) == + (off_t)-1) { + file_badread(ms); +- free(nbuf); ++ efree(nbuf); + return -1; + } + if (read(fd, nbuf, (size_t)xsh_size) != + (ssize_t)xsh_size) { +- free(nbuf); ++ efree(nbuf); + file_badread(ms); + return -1; + } +@@ -884,11 +879,11 @@ + break; + } + if ((lseek(fd, off, SEEK_SET)) == (off_t)-1) { +- free(nbuf); ++ efree(nbuf); + file_badread(ms); + return -1; + } +- free(nbuf); ++ efree(nbuf); + break; + case SHT_SUNW_cap: + { +diff -u libmagic.orig/softmagic.c libmagic/softmagic.c +--- libmagic.orig/softmagic.c 2009-03-27 22:42:49.000000000 +0000 ++++ libmagic/softmagic.c 2009-12-23 19:39:50.000000000 +0000 +@@ -41,6 +41,11 @@ + #include + #include + ++#ifndef PREG_OFFSET_CAPTURE ++# define PREG_OFFSET_CAPTURE (1<<8) ++#endif ++ ++ + + private int match(struct magic_set *, struct magic *, uint32_t, + const unsigned char *, size_t, int); +@@ -125,9 +130,9 @@ + + if ((m->flag & BINTEST) != mode) { + /* Skip sub-tests */ +- while (magic[magindex + 1].cont_level != 0 && +- ++magindex < nmagic) +- continue; ++ while (magindex < nmagic - 1 && magic[magindex + 1].cont_level != 0) { ++ magindex++; ++ } + continue; /* Skip to next top-level test*/ + } + +@@ -162,9 +167,9 @@ + * main entry didn't match, + * flush its continuations + */ +- while (magindex < nmagic - 1 && +- magic[magindex + 1].cont_level != 0) ++ while (magindex < nmagic - 1 && magic[magindex + 1].cont_level != 0) { + magindex++; ++ } + continue; + } + +@@ -191,8 +196,8 @@ + if (file_check_mem(ms, ++cont_level) == -1) + return -1; + +- while (magic[magindex+1].cont_level != 0 && +- ++magindex < nmagic) { ++ while (magindex < nmagic - 1 && magic[magindex + 1].cont_level != 0) { ++ magindex++; + m = &magic[magindex]; + ms->line = m->lineno; /* for messages */ + +@@ -207,8 +212,7 @@ + } + ms->offset = m->offset; + if (m->flag & OFFADD) { +- ms->offset += +- ms->c.li[cont_level - 1].off; ++ ms->offset += ms->c.li[cont_level - 1].off; + } + + #ifdef ENABLE_CONDITIONALS +@@ -313,44 +317,22 @@ + private int + check_fmt(struct magic_set *ms, struct magic *m) + { +- regex_t rx; +- int rc; +- +- if (strchr(m->desc, '%') == NULL) ++ pcre *pce; ++ int re_options; ++ pcre_extra *re_extra; ++ TSRMLS_FETCH(); ++ ++ if (strchr(m->desc, '%') == NULL) { + return 0; +- +- rc = regcomp(&rx, "%[-0-9\\.]*s", REG_EXTENDED|REG_NOSUB); +- if (rc) { +- char errmsg[512]; +- (void)regerror(rc, &rx, errmsg, sizeof(errmsg)); +- file_magerror(ms, "regex error %d, (%s)", rc, errmsg); ++ } ++ ++ if ((pce = pcre_get_compiled_regex("~%[-0-9.]*s~", &re_extra, &re_options TSRMLS_CC)) == NULL) { + return -1; + } else { +- rc = regexec(&rx, m->desc, 0, 0, 0); +- regfree(&rx); +- return !rc; ++ return !pcre_exec(pce, re_extra, m->desc, strlen(m->desc), 0, re_options, NULL, 0); + } + } + +-#ifndef HAVE_STRNDUP +-char * strndup(const char *, size_t); +- +-char * +-strndup(const char *str, size_t n) +-{ +- size_t len; +- char *copy; +- +- for (len = 0; len < n && str[len]; len++) +- continue; +- if ((copy = malloc(len + 1)) == NULL) +- return NULL; +- (void)memcpy(copy, str, len); +- copy[len] = '\0'; +- return copy; +-} +-#endif /* HAVE_STRNDUP */ +- + private int32_t + mprint(struct magic_set *ms, struct magic *m) + { +@@ -533,13 +515,10 @@ + char *cp; + int rval; + +- cp = strndup((const char *)ms->search.s, ms->search.rm_len); +- if (cp == NULL) { +- file_oomem(ms, ms->search.rm_len); +- return -1; +- } ++ cp = estrndup((const char *)ms->search.s, ms->search.rm_len); ++ + rval = file_printf(ms, m->desc, cp); +- free(cp); ++ efree(cp); + + if (rval == -1) + return -1; +@@ -733,16 +712,16 @@ + if (m->num_mask) \ + switch (m->mask_op & FILE_OPS_MASK) { \ + case FILE_OPADD: \ +- p->fld += cast m->num_mask; \ ++ p->fld += cast (int64_t)m->num_mask; \ + break; \ + case FILE_OPMINUS: \ +- p->fld -= cast m->num_mask; \ ++ p->fld -= cast (int64_t)m->num_mask; \ + break; \ + case FILE_OPMULTIPLY: \ +- p->fld *= cast m->num_mask; \ ++ p->fld *= cast (int64_t)m->num_mask; \ + break; \ + case FILE_OPDIVIDE: \ +- p->fld /= cast m->num_mask; \ ++ p->fld /= cast (int64_t)m->num_mask; \ + break; \ + } \ + +@@ -1033,16 +1012,13 @@ + + if ((ms->flags & MAGIC_DEBUG) != 0) { + mdebug(offset, (char *)(void *)p, sizeof(union VALUETYPE)); +-#ifndef COMPILE_ONLY +- file_mdump(m); +-#endif + } + + if (m->flag & INDIR) { + int off = m->in_offset; + if (m->in_op & FILE_OPINDIRECT) { +- const union VALUETYPE *q = CAST(const union VALUETYPE *, +- ((const void *)(s + offset + off))); ++ const union VALUETYPE *q = ++ ((const void *)(s + offset + off)); + switch (m->in_type) { + case FILE_BYTE: + off = q->b; +@@ -1522,9 +1498,6 @@ + if ((ms->flags & MAGIC_DEBUG) != 0) { + mdebug(offset, (char *)(void *)p, + sizeof(union VALUETYPE)); +-#ifndef COMPILE_ONLY +- file_mdump(m); +-#endif + } + } + +@@ -1672,6 +1645,66 @@ + return file_strncmp(a, b, len, flags); + } + ++private void ++convert_libmagic_pattern(zval *pattern, int options) ++{ ++ int i, j=0; ++ char *t; ++ ++ t = (char *) safe_emalloc(Z_STRLEN_P(pattern), 2, 5); ++ memset(t, '\0', sizeof(t)); ++ ++ t[j++] = '~'; ++ ++ for (i=0; isearch.s == NULL) +- return 0; +- +- l = 0; +- rc = regcomp(&rx, m->value.s, +- REG_EXTENDED|REG_NEWLINE| +- ((m->str_flags & STRING_IGNORE_CASE) ? REG_ICASE : 0)); +- if (rc) { +- (void)regerror(rc, &rx, errmsg, sizeof(errmsg)); +- file_magerror(ms, "regex error %d, (%s)", +- rc, errmsg); +- v = (uint64_t)-1; +- } +- else { +- regmatch_t pmatch[1]; +-#ifndef REG_STARTEND +-#define REG_STARTEND 0 +- size_t l = ms->search.s_len - 1; +- char c = ms->search.s[l]; +- ((char *)(intptr_t)ms->search.s)[l] = '\0'; ++ zval *pattern; ++ int options = 0; ++ pcre_cache_entry *pce; ++ TSRMLS_FETCH(); ++ ++ MAKE_STD_ZVAL(pattern); ++ ZVAL_STRINGL(pattern, (char *)m->value.s, m->vallen, 0); ++ ++ options |= PCRE_MULTILINE; ++ ++ if (m->str_flags & STRING_IGNORE_CASE) { ++ options |= PCRE_CASELESS; ++ } ++ ++ convert_libmagic_pattern(pattern, options); ++ ++#if (PHP_MAJOR_VERSION < 6) ++ if ((pce = pcre_get_compiled_regex_cache(Z_STRVAL_P(pattern), Z_STRLEN_P(pattern) TSRMLS_CC)) == NULL) { + #else +- pmatch[0].rm_so = 0; +- pmatch[0].rm_eo = ms->search.s_len; ++ if ((pce = pcre_get_compiled_regex_cache(IS_STRING, Z_STRVAL_P(pattern), Z_STRLEN_P(pattern) TSRMLS_CC)) == NULL) { + #endif +- rc = regexec(&rx, (const char *)ms->search.s, +- 1, pmatch, REG_STARTEND); +-#if REG_STARTEND == 0 +- ((char *)(intptr_t)ms->search.s)[l] = c; ++ zval_dtor(pattern); ++ FREE_ZVAL(pattern); ++ return -1; ++ } else { ++ /* pce now contains the compiled regex */ ++ zval *retval; ++ zval *subpats; ++ char *haystack; ++ ++ MAKE_STD_ZVAL(retval); ++ ALLOC_INIT_ZVAL(subpats); ++ ++ /* Cut the search len from haystack, equals to REG_STARTEND */ ++ haystack = estrndup(ms->search.s, ms->search.s_len); ++ ++ /* match v = 0, no match v = 1 */ ++#if (PHP_MAJOR_VERSION < 6) ++ php_pcre_match_impl(pce, haystack, ms->search.s_len, retval, subpats, 1, 1, PREG_OFFSET_CAPTURE, 0 TSRMLS_CC); ++#else ++ php_pcre_match_impl(pce, IS_STRING, haystack, ms->search.s_len, retval, subpats, 1, 1, PREG_OFFSET_CAPTURE, 0 TSRMLS_CC); + #endif +- switch (rc) { +- case 0: +- ms->search.s += (int)pmatch[0].rm_so; +- ms->search.offset += (size_t)pmatch[0].rm_so; +- ms->search.rm_len = +- (size_t)(pmatch[0].rm_eo - pmatch[0].rm_so); +- v = 0; +- break; ++ /* Free haystack */ ++ efree(haystack); ++ ++ if (Z_LVAL_P(retval) < 0) { ++ zval_ptr_dtor(&subpats); ++ FREE_ZVAL(retval); ++ zval_dtor(pattern); ++ FREE_ZVAL(pattern); ++ return -1; ++ } else if ((Z_LVAL_P(retval) > 0) && (Z_TYPE_P(subpats) == IS_ARRAY)) { ++ ++ /* Need to fetch global match which equals pmatch[0] */ ++ HashTable *ht = Z_ARRVAL_P(subpats); ++ HashPosition outer_pos; ++ zval *pattern_match = NULL, *pattern_offset = NULL; ++ ++ zend_hash_internal_pointer_reset_ex(ht, &outer_pos); ++ ++ if (zend_hash_has_more_elements_ex(ht, &outer_pos) == SUCCESS && ++ zend_hash_move_forward_ex(ht, &outer_pos)) { ++ ++ zval **ppzval; ++ ++ /* The first element (should be) is the global match ++ Need to move to the inner array to get the global match */ ++ ++ if (zend_hash_get_current_data_ex(ht, (void**)&ppzval, &outer_pos) != FAILURE) { ++ ++ HashTable *inner_ht; ++ HashPosition inner_pos; ++ zval **match, **offset; ++ zval tmpcopy = **ppzval, matchcopy, offsetcopy; ++ ++ zval_copy_ctor(&tmpcopy); ++ INIT_PZVAL(&tmpcopy); ++ ++ inner_ht = Z_ARRVAL(tmpcopy); ++ ++ /* If everything goes according to the master plan ++ tmpcopy now contains two elements: ++ 0 = the match ++ 1 = starting position of the match */ ++ zend_hash_internal_pointer_reset_ex(inner_ht, &inner_pos); ++ ++ if (zend_hash_has_more_elements_ex(inner_ht, &inner_pos) == SUCCESS && ++ zend_hash_move_forward_ex(inner_ht, &inner_pos)) { ++ ++ if (zend_hash_get_current_data_ex(inner_ht, (void**)&match, &inner_pos) != FAILURE) { ++ ++ matchcopy = **match; ++ zval_copy_ctor(&matchcopy); ++ INIT_PZVAL(&matchcopy); ++ convert_to_string(&matchcopy); ++ ++ MAKE_STD_ZVAL(pattern_match); ++ Z_STRVAL_P(pattern_match) = (char *)Z_STRVAL(matchcopy); ++ Z_STRLEN_P(pattern_match) = Z_STRLEN(matchcopy); ++ Z_TYPE_P(pattern_match) = IS_STRING; ++ ++ zval_dtor(&matchcopy); ++ } ++ } ++ ++ if (zend_hash_has_more_elements_ex(inner_ht, &inner_pos) == SUCCESS && ++ zend_hash_move_forward_ex(inner_ht, &inner_pos)) { ++ ++ if (zend_hash_get_current_data_ex(inner_ht, (void**)&offset, &inner_pos) != FAILURE) { ++ ++ offsetcopy = **offset; ++ zval_copy_ctor(&offsetcopy); ++ INIT_PZVAL(&offsetcopy); ++ convert_to_long(&offsetcopy); ++ ++ MAKE_STD_ZVAL(pattern_offset); ++ Z_LVAL_P(pattern_offset) = Z_LVAL(offsetcopy); ++ Z_TYPE_P(pattern_offset) = IS_LONG; ++ ++ zval_dtor(&offsetcopy); ++ } ++ } ++ zval_dtor(&tmpcopy); ++ } ++ ++ if ((pattern_match != NULL) && (pattern_offset != NULL)) { ++ ms->search.s += (int)Z_LVAL_P(pattern_offset); /* this is where the match starts */ ++ ms->search.offset += (size_t)Z_LVAL_P(pattern_offset); /* this is where the match starts as size_t */ ++ ms->search.rm_len = Z_STRLEN_P(pattern_match) /* This is the length of the matched pattern */; ++ v = 0; ++ ++ efree(pattern_match); ++ efree(pattern_offset); ++ ++ } else { ++ zval_ptr_dtor(&subpats); ++ FREE_ZVAL(retval); ++ zval_dtor(pattern); ++ FREE_ZVAL(pattern); ++ return -1; ++ } ++ } + +- case REG_NOMATCH: ++ ++ } else { + v = 1; +- break; +- +- default: +- (void)regerror(rc, &rx, errmsg, sizeof(errmsg)); +- file_magerror(ms, "regexec error %d, (%s)", +- rc, errmsg); +- v = (uint64_t)-1; +- break; + } +- regfree(&rx); ++ zval_ptr_dtor(&subpats); ++ FREE_ZVAL(retval); + } +- if (v == (uint64_t)-1) +- return -1; +- break; ++ zval_dtor(pattern); ++ FREE_ZVAL(pattern); ++ break; + } + case FILE_INDIRECT: +- return 1; ++ return 1; + default: + file_magerror(ms, "invalid type %d in magiccheck()", m->type); + return -1; +@@ -1900,7 +2028,7 @@ + case 'x': + if ((ms->flags & MAGIC_DEBUG) != 0) + (void) fprintf(stderr, "%llu == *any* = 1\n", +- (unsigned long long)v); ++ (uint64_t)v); + matched = 1; + break; + +@@ -1908,7 +2036,7 @@ + matched = v != l; + if ((ms->flags & MAGIC_DEBUG) != 0) + (void) fprintf(stderr, "%llu != %llu = %d\n", +- (unsigned long long)v, (unsigned long long)l, ++ (uint64_t)v, (uint64_t)l, + matched); + break; + +@@ -1916,7 +2044,7 @@ + matched = v == l; + if ((ms->flags & MAGIC_DEBUG) != 0) + (void) fprintf(stderr, "%llu == %llu = %d\n", +- (unsigned long long)v, (unsigned long long)l, ++ (uint64_t)v, (uint64_t)l, + matched); + break; + +@@ -1925,14 +2053,14 @@ + matched = v > l; + if ((ms->flags & MAGIC_DEBUG) != 0) + (void) fprintf(stderr, "%llu > %llu = %d\n", +- (unsigned long long)v, +- (unsigned long long)l, matched); ++ (uint64_t)v, ++ (uint64_t)l, matched); + } + else { + matched = (int64_t) v > (int64_t) l; + if ((ms->flags & MAGIC_DEBUG) != 0) + (void) fprintf(stderr, "%lld > %lld = %d\n", +- (long long)v, (long long)l, matched); ++ (uint64_t)v, (uint64_t)l, matched); + } + break; + +@@ -1941,14 +2069,14 @@ + matched = v < l; + if ((ms->flags & MAGIC_DEBUG) != 0) + (void) fprintf(stderr, "%llu < %llu = %d\n", +- (unsigned long long)v, +- (unsigned long long)l, matched); ++ (uint64_t)v, ++ (uint64_t)l, matched); + } + else { + matched = (int64_t) v < (int64_t) l; + if ((ms->flags & MAGIC_DEBUG) != 0) + (void) fprintf(stderr, "%lld < %lld = %d\n", +- (long long)v, (long long)l, matched); ++ (int64_t)v, (int64_t)l, matched); + } + break; + +@@ -1956,16 +2084,16 @@ + matched = (v & l) == l; + if ((ms->flags & MAGIC_DEBUG) != 0) + (void) fprintf(stderr, "((%llx & %llx) == %llx) = %d\n", +- (unsigned long long)v, (unsigned long long)l, +- (unsigned long long)l, matched); ++ (uint64_t)v, (uint64_t)l, ++ (uint64_t)l, matched); + break; + + case '^': + matched = (v & l) != l; + if ((ms->flags & MAGIC_DEBUG) != 0) + (void) fprintf(stderr, "((%llx & %llx) != %llx) = %d\n", +- (unsigned long long)v, (unsigned long long)l, +- (unsigned long long)l, matched); ++ (uint64_t)v, (uint64_t)l, ++ (uint64_t)l, matched); + break; + + default: diff --git a/ext/fileinfo/libmagic/apprentice.c b/ext/fileinfo/libmagic/apprentice.c index 86b431fa6..ffa2cb529 100644 --- a/ext/fileinfo/libmagic/apprentice.c +++ b/ext/fileinfo/libmagic/apprentice.c @@ -34,7 +34,7 @@ #include "file.h" #ifndef lint -FILE_RCSID("@(#)$File: apprentice.c,v 1.132 2008/03/28 18:19:30 christos Exp $") +FILE_RCSID("@(#)$File: apprentice.c,v 1.151 2009/03/18 15:19:23 christos Exp $") #endif /* lint */ #include "magic.h" @@ -44,7 +44,7 @@ FILE_RCSID("@(#)$File: apprentice.c,v 1.132 2008/03/28 18:19:30 christos Exp $") #ifdef PHP_WIN32 #include "win32/unistd.h" #if _MSC_VER <= 1300 -#include "win32/php_strtoi64.h" +# include "win32/php_strtoi64.h" #endif #define strtoull _strtoui64 #else @@ -55,7 +55,9 @@ FILE_RCSID("@(#)$File: apprentice.c,v 1.132 2008/03/28 18:19:30 christos Exp $") #include #include #include - +#ifndef PHP_WIN32 +#include +#endif #define EATAB {while (isascii((unsigned char) *l) && \ isspace((unsigned char) *l)) ++l;} @@ -609,7 +611,11 @@ load_1(struct magic_set *ms, int action, const char *fn, int *errs, } else { /* read and parse this file */ +#if (PHP_MAJOR_VERSION < 6) for (ms->line = 1; (line = php_stream_get_line(stream, buffer , BUFSIZ, &line_len)) != NULL; ms->line++) { +#else + for (ms->line = 1; (line = php_stream_get_line(stream, ZSTR(buffer), BUFSIZ, &line_len)) != NULL; ms->line++) { +#endif if (line_len == 0) /* null line, garbage, etc */ continue; @@ -851,9 +857,9 @@ file_signextend(struct magic_set *ms, struct magic *m, uint64_t v) case FILE_INDIRECT: break; default: - if (ms->flags & MAGIC_CHECK) { - file_magwarn(ms, "cannot happen: m->type=%d\n", m->type); - } + if (ms->flags & MAGIC_CHECK) + file_magwarn(ms, "cannot happen: m->type=%d\n", + m->type); return ~0U; } } @@ -1669,7 +1675,7 @@ check_format(struct magic_set *ms, struct magic *m) */ file_magwarn(ms, "Printf format `%c' is not valid for type " "`%s' in description `%s'", *ptr ? *ptr : '?', - file_names[m->type], m->desc); + file_names[m->type], m->desc); return -1; } @@ -2114,7 +2120,7 @@ internal_loaded: } if (dbname) { - free(dbname); + efree(dbname); } return ret; @@ -2131,7 +2137,7 @@ error1: } error2: if (dbname) { - free(dbname); + efree(dbname); } return -1; } @@ -2189,7 +2195,7 @@ apprentice_compile(struct magic_set *ms, struct magic **magicp, rv = 0; out: - free(dbname); + efree(dbname); return rv; } @@ -2202,6 +2208,7 @@ mkdbname(struct magic_set *ms, const char *fn, int strip) { const char *p, *q; char *buf; + TSRMLS_FETCH(); if (strip) { if ((p = strrchr(fn, '/')) != NULL) @@ -2223,14 +2230,14 @@ mkdbname(struct magic_set *ms, const char *fn, int strip) q++; /* Compatibility with old code that looked in .mime */ if (ms->flags & MAGIC_MIME) { - asprintf(&buf, "%.*s.mime%s", (int)(q - fn), fn, ext); - if (access(buf, R_OK) != -1) { + spprintf(&buf, MAXPATHLEN, "%.*s.mime%s", (int)(q - fn), fn, ext); + if (VCWD_ACCESS(buf, R_OK) != -1) { ms->flags &= MAGIC_MIME_TYPE; return buf; } - free(buf); + efree(buf); } - asprintf(&buf, "%.*s%s", (int)(q - fn), fn, ext); + spprintf(&buf, MAXPATHLEN, "%.*s%s", (int)(q - fn), fn, ext); /* Compatibility with old code that looked in .mime */ if (strstr(p, ".mime") != NULL) diff --git a/ext/fileinfo/libmagic/apptype.c b/ext/fileinfo/libmagic/apptype.c index 85136ed15..31b8095e1 100644 --- a/ext/fileinfo/libmagic/apptype.c +++ b/ext/fileinfo/libmagic/apptype.c @@ -27,10 +27,9 @@ #include "file.h" #ifndef lint -FILE_RCSID("@(#)$File: apptype.c,v 1.7 2007/01/12 17:38:27 christos Exp $") +FILE_RCSID("@(#)$File: apptype.c,v 1.11 2009/02/04 18:24:32 christos Exp $") #endif /* lint */ - #include #include diff --git a/ext/fileinfo/libmagic/ascmagic.c b/ext/fileinfo/libmagic/ascmagic.c index 4fee8a87b..e73b26fe9 100644 --- a/ext/fileinfo/libmagic/ascmagic.c +++ b/ext/fileinfo/libmagic/ascmagic.c @@ -2,7 +2,7 @@ * Copyright (c) Ian F. Darwin 1986-1995. * Software written by Ian F. Darwin and others; * maintained 1995-present by Christos Zoulas and others. - * + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: @@ -12,7 +12,7 @@ * 2. 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. - * + * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 @@ -36,7 +36,7 @@ #include "file.h" #ifndef lint -FILE_RCSID("@(#)$File: ascmagic.c,v 1.62 2008/03/01 22:21:48 rrt Exp $") +FILE_RCSID("@(#)$File: ascmagic.c,v 1.75 2009/02/03 20:27:51 christos Exp $") #endif /* lint */ #include "magic.h" @@ -66,14 +66,14 @@ trim_nuls(const unsigned char *buf, size_t nbytes) { while (nbytes > 1 && buf[nbytes - 1] == '\0') nbytes--; - + return nbytes; } protected int file_ascmagic(struct magic_set *ms, const unsigned char *buf, size_t nbytes) { - unichar *ubuf = NULL; + unichar *ubuf = NULL; size_t ulen; int rv = 1; @@ -264,7 +264,7 @@ subtype_identified: if (file_printf(ms, ", with") == -1) goto done; - if (n_crlf == 0 && n_cr == 0 && n_nel == 0 && n_lf == 0) { + if (n_crlf == 0 && n_cr == 0 && n_nel == 0 && n_lf == 0) { if (file_printf(ms, " no") == -1) goto done; } else { diff --git a/ext/fileinfo/libmagic/cdf.c b/ext/fileinfo/libmagic/cdf.c index eecfa1e45..a3b4a11fc 100644 --- a/ext/fileinfo/libmagic/cdf.c +++ b/ext/fileinfo/libmagic/cdf.c @@ -32,7 +32,7 @@ #include "file.h" #ifndef lint -FILE_RCSID("@(#)$File: cdf.c,v 1.17 2009/02/03 20:27:51 christos Exp $") +FILE_RCSID("@(#)$File: cdf.c,v 1.30 2009/05/06 14:29:47 christos Exp $") #endif #include @@ -237,6 +237,19 @@ cdf_unpack_dir(cdf_directory_t *d, char *buf) CDF_UNPACK(d->d_unused0); } +static int +cdf_check_stream_offset(const cdf_stream_t *sst, const void *p, size_t tail) +{ + const char *b = (const char *)sst->sst_tab; + const char *e = ((const char *)p) + tail; + if (e >= b && (size_t)(e - b) < sst->sst_dirlen * sst->sst_len) + return 0; + DPRINTF((stderr, "offset begin %p end %p %zu >= %zu\n", b, e, + (size_t)(e - b), sst->sst_dirlen * sst->sst_len)); + errno = EFTYPE; + return -1; +} + static ssize_t cdf_read(const cdf_info_t *info, off_t off, void *buf, size_t len) { @@ -264,7 +277,6 @@ cdf_read(const cdf_info_t *info, off_t off, void *buf, size_t len) return (ssize_t)len; } - int cdf_read_header(const cdf_info_t *info, cdf_header_t *h) { @@ -332,15 +344,15 @@ cdf_read_sat(const cdf_info_t *info, cdf_header_t *h, cdf_sat_t *sat) break; #define CDF_SEC_LIMIT (UINT32_MAX / (4 * ss)) - if (h->h_num_sectors_in_master_sat > CDF_SEC_LIMIT || - i > CDF_SEC_LIMIT / nsatpersec) { + if (h->h_num_sectors_in_master_sat > CDF_SEC_LIMIT / nsatpersec || + i > CDF_SEC_LIMIT) { DPRINTF(("Number of sectors in master SAT too big %u %zu\n", h->h_num_sectors_in_master_sat, i)); errno = EFTYPE; return -1; } - sat->sat_len = h->h_num_sectors_in_master_sat + i * nsatpersec; + sat->sat_len = h->h_num_sectors_in_master_sat * nsatpersec + i; DPRINTF(("sat_len = %zu ss = %zu\n", sat->sat_len, ss)); if ((sat->sat_tab = calloc(sat->sat_len, ss)) == NULL) return -1; @@ -360,6 +372,8 @@ cdf_read_sat(const cdf_info_t *info, cdf_header_t *h, cdf_sat_t *sat) mid = h->h_secid_first_sector_in_master_sat; for (j = 0; j < h->h_num_sectors_in_master_sat; j++) { + if (mid < 0) + goto out; if (j >= CDF_LOOP_LIMIT) { DPRINTF(("Reading master sector loop limit")); errno = EFTYPE; @@ -371,10 +385,8 @@ cdf_read_sat(const cdf_info_t *info, cdf_header_t *h, cdf_sat_t *sat) } for (k = 0; k < nsatpersec; k++, i++) { sec = CDF_TOLE4(msa[k]); - if (sec < 0) { - sat->sat_len = i; - break; - } + if (sec < 0) + goto out; if (i >= sat->sat_len) { DPRINTF(("Out of bounds reading MSA %u >= %u", i, sat->sat_len)); @@ -390,6 +402,8 @@ cdf_read_sat(const cdf_info_t *info, cdf_header_t *h, cdf_sat_t *sat) } mid = CDF_TOLE4(msa[nsatpersec]); } +out: + sat->sat_len = i; free(msa); return 0; out2: @@ -478,7 +492,7 @@ cdf_read_short_sector_chain(const cdf_header_t *h, scn->sst_len = cdf_count_chain(ssat, sid, CDF_SEC_SIZE(h)); scn->sst_dirlen = len; - if (scn->sst_len == (size_t)-1) + if (sst->sst_tab == NULL || scn->sst_len == (size_t)-1) return -1; scn->sst_tab = calloc(scn->sst_len, ss); @@ -629,22 +643,21 @@ cdf_read_short_stream(const cdf_info_t *info, const cdf_header_t *h, break; /* If the it is not there, just fake it; some docs don't have it */ - if (i == dir->dir_len) { - scn->sst_tab = NULL; - scn->sst_len = 0; - return 0; - } + if (i == dir->dir_len) + goto out; d = &dir->dir_tab[i]; /* If the it is not there, just fake it; some docs don't have it */ - if (d->d_stream_first_sector < 0) { - scn->sst_tab = NULL; - scn->sst_len = 0; - return 0; - } + if (d->d_stream_first_sector < 0) + goto out; return cdf_read_long_sector_chain(info, h, sat, d->d_stream_first_sector, d->d_size, scn); +out: + scn->sst_tab = NULL; + scn->sst_len = 0; + scn->sst_dirlen = 0; + return 0; } static int @@ -697,15 +710,27 @@ cdf_read_property_info(const cdf_stream_t *sst, uint32_t offs, size_t i, o, nelements, j; cdf_property_info_t *inp; + if (offs > UINT32_MAX / 4) { + errno = EFTYPE; + goto out; + } shp = (const void *)((const char *)sst->sst_tab + offs); + if (cdf_check_stream_offset(sst, shp, sizeof(*shp)) == -1) + goto out; sh.sh_len = CDF_TOLE4(shp->sh_len); +#define CDF_SHLEN_LIMIT (UINT32_MAX / 8) + if (sh.sh_len > CDF_SHLEN_LIMIT) { + errno = EFTYPE; + goto out; + } sh.sh_properties = CDF_TOLE4(shp->sh_properties); -#define CDF_PROP_LIM (UINT32_MAX / (4 * sizeof(*inp))) - if (sh.sh_properties > CDF_PROP_LIM) +#define CDF_PROP_LIMIT (UINT32_MAX / (4 * sizeof(*inp))) + if (sh.sh_properties > CDF_PROP_LIMIT) goto out; - DPRINTF(("section len: %u properties %u\n", sh.sh_len, sh.sh_properties)); + DPRINTF(("section len: %u properties %u\n", sh.sh_len, + sh.sh_properties)); if (*maxcount) { - if (*maxcount > CDF_PROP_LIM) + if (*maxcount > CDF_PROP_LIMIT) goto out; *maxcount += sh.sh_properties; inp = realloc(*info, *maxcount * sizeof(*inp)); @@ -720,6 +745,8 @@ cdf_read_property_info(const cdf_stream_t *sst, uint32_t offs, *count += sh.sh_properties; p = (const void *)((const char *)sst->sst_tab + offs + sizeof(sh)); e = (const void *)(((const char *)shp) + sh.sh_len); + if (cdf_check_stream_offset(sst, e, 0) == -1) + goto out; for (i = 0; i < sh.sh_properties; i++) { q = (const uint32_t *)((const char *)p + CDF_TOLE4(p[(i << 1) + 1])) - 2; @@ -777,8 +804,8 @@ cdf_read_property_info(const cdf_stream_t *sst, uint32_t offs, case CDF_LENGTH32_STRING: if (nelements > 1) { size_t nelem = inp - *info; - if (*maxcount > CDF_PROP_LIM - || nelements > CDF_PROP_LIM) + if (*maxcount > CDF_PROP_LIMIT + || nelements > CDF_PROP_LIMIT) goto out; *maxcount += nelements; inp = realloc(*info, *maxcount * sizeof(*inp)); @@ -832,6 +859,9 @@ cdf_unpack_summary_info(const cdf_stream_t *sst, cdf_summary_info_header_t *ssi, const cdf_section_declaration_t *sd = (const void *) ((const char *)sst->sst_tab + CDF_SECTION_DECLARATION_OFFSET); + if (cdf_check_stream_offset(sst, si, sizeof(*si)) == -1 || + cdf_check_stream_offset(sst, sd, sizeof(*sd)) == -1) + return -1; ssi->si_byte_order = CDF_TOLE2(si->si_byte_order); ssi->si_os_version = CDF_TOLE2(si->si_os_version); ssi->si_os = CDF_TOLE2(si->si_os); @@ -946,11 +976,13 @@ cdf_dump_header(const cdf_header_t *h) size_t i; #define DUMP(a, b) (void)fprintf(stderr, "%40.40s = " a "\n", # b, h->h_ ## b) +#define DUMP2(a, b) (void)fprintf(stderr, "%40.40s = " a " (" a ")\n", # b, \ + h->h_ ## b, 1 << h->h_ ## b) DUMP("%d", revision); DUMP("%d", version); DUMP("0x%x", byte_order); - DUMP("%d", sec_size_p2); - DUMP("%d", short_sec_size_p2); + DUMP2("%d", sec_size_p2); + DUMP2("%d", short_sec_size_p2); DUMP("%d", num_sectors_in_sat); DUMP("%d", secid_first_directory); DUMP("%d", min_size_standard_stream); @@ -1202,7 +1234,7 @@ main(int argc, char *argv[]) #endif - if (cdf_read_summary_info(&inf, &h, &sat, &ssat, &sst, &dir, + if (cdf_read_summary_info(&info, &h, &sat, &ssat, &sst, &dir, &scn) == -1) err(1, "Cannot read summary info"); #ifdef CDF_DEBUG diff --git a/ext/fileinfo/libmagic/cdf_time.c b/ext/fileinfo/libmagic/cdf_time.c index ac416ea2f..36372966a 100644 --- a/ext/fileinfo/libmagic/cdf_time.c +++ b/ext/fileinfo/libmagic/cdf_time.c @@ -27,7 +27,7 @@ #include "file.h" #ifndef lint -FILE_RCSID("@(#)$File: cdf_time.c,v 1.5 2009/02/03 20:27:51 christos Exp $") +FILE_RCSID("@(#)$File: cdf_time.c,v 1.6 2009/03/10 11:44:29 christos Exp $") #endif #include diff --git a/ext/fileinfo/libmagic/compress.c b/ext/fileinfo/libmagic/compress.c index 06786657d..de4de3401 100644 --- a/ext/fileinfo/libmagic/compress.c +++ b/ext/fileinfo/libmagic/compress.c @@ -32,12 +32,11 @@ * uncompress(method, old, n, newch) - uncompress old into new, * using method, return sizeof new */ - #include "config.h" #include "file.h" #ifndef lint -FILE_RCSID("@(#)$File: compress.c,v 1.56 2008/02/07 00:58:52 christos Exp $") +FILE_RCSID("@(#)$File: compress.c,v 1.63 2009/03/23 14:21:51 christos Exp $") #endif #include "magic.h" @@ -89,7 +88,6 @@ private const struct { #define NODATA ((size_t)~0) - private ssize_t swrite(int, const void *, size_t); #ifdef PHP_FILEINFO_UNCOMPRESS private size_t uncompressbuf(struct magic_set *, int, size_t, @@ -107,10 +105,13 @@ file_zmagic(struct magic_set *ms, int fd, const char *name, size_t i, nsz; int rv = 0; int mime = ms->flags & MAGIC_MIME; + size_t ncompr; if ((ms->flags & MAGIC_COMPRESS) == 0) return 0; + ncompr = sizeof(compr) / sizeof(compr[0]); + for (i = 0; i < ncompr; i++) { if (nbytes < compr[i].maglen) continue; @@ -189,6 +190,7 @@ sread(int fd, void *buf, size_t n, int canbepipe) #ifdef FIONREAD if ((canbepipe && (ioctl(fd, FIONREAD, &t) == -1)) || (t == 0)) { #ifdef FD_ZERO + int cnt; for (cnt = 0;; cnt++) { fd_set check; struct timeval tout = {0, 100 * 1000}; @@ -310,6 +312,7 @@ file_pipe2file(struct magic_set *ms, int fd, const void *startbuf, #define FNAME (1 << 3) #define FCOMMENT (1 << 4) + private size_t uncompressgzipped(struct magic_set *ms, const unsigned char *old, unsigned char **newch, size_t n) @@ -373,7 +376,6 @@ uncompressgzipped(struct magic_set *ms, const unsigned char *old, } #endif - private size_t uncompressbuf(struct magic_set *ms, int fd, size_t method, const unsigned char *old, unsigned char **newch, size_t n) @@ -490,7 +492,7 @@ err: (void)wait(NULL); #endif (void) close(fdin[0]); - + return n; } } diff --git a/ext/fileinfo/libmagic/file.h b/ext/fileinfo/libmagic/file.h index 58211f192..915602fa6 100644 --- a/ext/fileinfo/libmagic/file.h +++ b/ext/fileinfo/libmagic/file.h @@ -2,7 +2,7 @@ * Copyright (c) Ian F. Darwin 1986-1995. * Software written by Ian F. Darwin and others; * maintained 1995-present by Christos Zoulas and others. - * + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: @@ -12,7 +12,7 @@ * 2. 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. - * + * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 @@ -27,7 +27,7 @@ */ /* * file.h - definitions for file(1) program - * @(#)$File: file.h,v 1.103 2008/03/01 22:21:49 rrt Exp $ + * @(#)$File: file.h,v 1.119 2009/02/04 18:24:32 christos Exp $ */ #ifndef __file_h__ @@ -138,7 +138,7 @@ struct magic { #define UNSIGNED 0x08 /* comparison is unsigned */ #define NOSPACE 0x10 /* suppress space character before output */ #define BINTEST 0x20 /* test is for a binary type (set only - for top-level tests) */ + for top-level tests) */ #define TEXTTEST 0 /* for passing to file_softmagic */ uint8_t factor; @@ -216,7 +216,7 @@ struct magic { #else uint8_t dummy; #endif - uint8_t factor_op; + uint8_t factor_op; #define FILE_FACTOR_OP_PLUS '+' #define FILE_FACTOR_OP_MINUS '-' #define FILE_FACTOR_OP_TIMES '*' @@ -264,7 +264,7 @@ struct magic { #define str_range _u._s._count #define str_flags _u._s._flags /* Words 9-16 */ - union VALUETYPE value; /* either number of string */ + union VALUETYPE value; /* either number or string */ /* Words 17-24 */ char desc[MAXDESC]; /* description */ /* Words 25-32 */ @@ -312,7 +312,6 @@ struct level_info { int last_cond; /* used for error checking by parse() */ #endif }; - struct magic_set { struct mlist *mlist; struct cont { diff --git a/ext/fileinfo/libmagic/fsmagic.c b/ext/fileinfo/libmagic/fsmagic.c index dd84db88e..ca2171398 100644 --- a/ext/fileinfo/libmagic/fsmagic.c +++ b/ext/fileinfo/libmagic/fsmagic.c @@ -176,7 +176,7 @@ file_fsmagic(struct magic_set *ms, const char *fn, struct stat *sb, php_stream * return 1; # endif #endif - + #ifdef S_IFIFO case S_IFIFO: if((ms->flags & MAGIC_DEVICES) != 0) diff --git a/ext/fileinfo/libmagic/funcs.c b/ext/fileinfo/libmagic/funcs.c index f36f9b29a..3ca540808 100644 --- a/ext/fileinfo/libmagic/funcs.c +++ b/ext/fileinfo/libmagic/funcs.c @@ -1,7 +1,7 @@ /* * Copyright (c) Christos Zoulas 2003. * All Rights Reserved. - * + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: @@ -11,7 +11,7 @@ * 2. 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. - * + * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 @@ -27,7 +27,7 @@ #include "file.h" #ifndef lint -FILE_RCSID("@(#)$File: funcs.c,v 1.39 2008/03/01 22:21:49 rrt Exp $") +FILE_RCSID("@(#)$File: funcs.c,v 1.53 2009/04/07 11:07:00 christos Exp $") #endif /* lint */ #include "magic.h" @@ -392,7 +392,7 @@ file_getbuffer(struct magic_set *ms) for (np = ms->o.pbuf, op = ms->o.buf; *op; op++) { if (isprint((unsigned char)*op)) { - *np++ = *op; + *np++ = *op; } else { OCTALIFY(np, op); } diff --git a/ext/fileinfo/libmagic/is_tar.c b/ext/fileinfo/libmagic/is_tar.c index 9802877e8..f962edbd8 100644 --- a/ext/fileinfo/libmagic/is_tar.c +++ b/ext/fileinfo/libmagic/is_tar.c @@ -40,7 +40,7 @@ #include "file.h" #ifndef lint -FILE_RCSID("@(#)$File: is_tar.c,v 1.31 2008/02/04 20:51:17 christos Exp $") +FILE_RCSID("@(#)$File: is_tar.c,v 1.36 2009/02/03 20:27:51 christos Exp $") #endif #include "magic.h" diff --git a/ext/fileinfo/libmagic/magic.c b/ext/fileinfo/libmagic/magic.c index 9c4b3bf4d..849896bc8 100644 --- a/ext/fileinfo/libmagic/magic.c +++ b/ext/fileinfo/libmagic/magic.c @@ -1,7 +1,7 @@ /* * Copyright (c) Christos Zoulas 2003. * All Rights Reserved. - * + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: @@ -11,7 +11,7 @@ * 2. 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. - * + * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 @@ -28,7 +28,7 @@ #include "file.h" #ifndef lint -FILE_RCSID("@(#)$File: magic.c,v 1.50 2008/02/19 00:58:59 rrt Exp $") +FILE_RCSID("@(#)$File: magic.c,v 1.62 2009/03/20 21:25:41 christos Exp $") #endif /* lint */ #include "magic.h" @@ -65,9 +65,10 @@ FILE_RCSID("@(#)$File: magic.c,v 1.50 2008/02/19 00:58:59 rrt Exp $") #ifndef PHP_WIN32 # include /* for byte swapping */ #endif + #include "patchlevel.h" -#ifndef PIPE_BUF +#ifndef PIPE_BUF /* Get the PIPE_BUF from pathconf */ #ifdef _PC_PIPE_BUF #define PIPE_BUF pathconf(".", _PC_PIPE_BUF) @@ -199,6 +200,7 @@ private void close_and_restore(const struct magic_set *ms, const char *name, int fd, const struct stat *sb) { + if ((ms->flags & MAGIC_PRESERVE_ATIME) != 0) { /* * Try to restore access, modification times if read it. @@ -303,7 +305,7 @@ file_or_stream(struct magic_set *ms, const char *inname, php_stream *stream) } #ifdef O_NONBLOCK - /* we should be already be in non blocking mode for network socket */ +/* we should be already be in non blocking mode for network socket */ #endif /* diff --git a/ext/fileinfo/libmagic/magic.h b/ext/fileinfo/libmagic/magic.h index 2e0fdc392..ba037921d 100644 --- a/ext/fileinfo/libmagic/magic.h +++ b/ext/fileinfo/libmagic/magic.h @@ -1,7 +1,7 @@ /* * Copyright (c) Christos Zoulas 2003. * All Rights Reserved. - * + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: @@ -11,7 +11,7 @@ * 2. 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. - * + * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 diff --git a/ext/fileinfo/libmagic/patchlevel.h b/ext/fileinfo/libmagic/patchlevel.h index 12e685af8..f458f56c0 100644 --- a/ext/fileinfo/libmagic/patchlevel.h +++ b/ext/fileinfo/libmagic/patchlevel.h @@ -6,14 +6,14 @@ * $File: patchlevel.h,v 1.68 2008/03/22 21:39:43 christos Exp $ * * $Log$ - * Revision 1.1.2.3 2009/05/04 20:54:53 scottmac - * MFH Update libmagic to 5.02 + * Revision 1.4 2009/05/04 20:52:43 scottmac + * Update libmagic to 5.02 * - * Revision 1.1.2.2 2009/03/15 23:04:18 scottmac - * MFH Update fileinfo to libmagic 5.00 and remove dependency on dirent.h on Windows + * Revision 1.3 2009/03/15 23:02:35 scottmac + * Update fileinfo to libmagic 5.00 and remove dependency on dirent.h on Windows * - * Revision 1.1.2.1 2008/11/02 16:13:49 scottmac - * MFH: Sync libmagic with 4.26 and add support for the new v6 magic file format + * Revision 1.2 2008/11/02 16:09:27 scottmac + * Update libmagic to 4.26 and add support for v6 of the magic file format. * * Revision 1.1 2008/07/11 14:13:50 derick * - Move lib to libmagic diff --git a/ext/fileinfo/libmagic/print.c b/ext/fileinfo/libmagic/print.c index acba041bc..fd10126b1 100644 --- a/ext/fileinfo/libmagic/print.c +++ b/ext/fileinfo/libmagic/print.c @@ -34,7 +34,7 @@ #include "file.h" #ifndef lint -FILE_RCSID("@(#)$File: print.c,v 1.63 2008/02/17 19:28:54 rrt Exp $") +FILE_RCSID("@(#)$File: print.c,v 1.66 2009/02/03 20:27:51 christos Exp $") #endif /* lint */ #include diff --git a/ext/fileinfo/libmagic/readcdf.c b/ext/fileinfo/libmagic/readcdf.c index a12fa9c9b..56d650403 100644 --- a/ext/fileinfo/libmagic/readcdf.c +++ b/ext/fileinfo/libmagic/readcdf.c @@ -26,17 +26,15 @@ #include "file.h" #ifndef lint -FILE_RCSID("@(#)$File: readcdf.c,v 1.11 2009/02/03 20:27:51 christos Exp $") +FILE_RCSID("@(#)$File: readcdf.c,v 1.18 2009/05/06 20:48:22 christos Exp $") #endif #include - #ifdef PHP_WIN32 #include "win32/unistd.h" #else #include #endif - #include #include #include @@ -202,7 +200,7 @@ protected int file_trycdf(struct magic_set *ms, int fd, const unsigned char *buf, size_t nbytes) { - cdf_info_t info; + cdf_info_t info; cdf_header_t h; cdf_sat_t sat, ssat; cdf_stream_t sst, scn; @@ -246,7 +244,6 @@ file_trycdf(struct magic_set *ms, int fd, const unsigned char *buf, expn = "Cannot read short stream"; goto out3; } - #ifdef CDF_DEBUG cdf_dump_dir(&info, &h, &sat, &ssat, &sst, &dir); #endif diff --git a/ext/fileinfo/libmagic/readelf.c b/ext/fileinfo/libmagic/readelf.c index e78b5ef37..5429b503b 100644 --- a/ext/fileinfo/libmagic/readelf.c +++ b/ext/fileinfo/libmagic/readelf.c @@ -27,7 +27,7 @@ #include "file.h" #ifndef lint -FILE_RCSID("@(#)$File: readelf.c,v 1.73 2008/03/27 22:00:28 christos Exp $") +FILE_RCSID("@(#)$File: readelf.c,v 1.81 2008/11/04 16:38:28 christos Exp $") #endif #ifdef BUILTIN_ELF @@ -1118,6 +1118,7 @@ dophn_exec(struct magic_set *ms, int clazz, int swap, int fd, off_t off, return 0; } + protected int file_tryelf(struct magic_set *ms, int fd, const unsigned char *buf, size_t nbytes) @@ -1137,7 +1138,6 @@ file_tryelf(struct magic_set *ms, int fd, const unsigned char *buf, if (ms->flags & (MAGIC_MIME|MAGIC_APPLE)) return 0; - /* * ELF executables have multiple section headers in arbitrary * file locations and thus file(1) cannot determine it from easily. diff --git a/ext/fileinfo/libmagic/softmagic.c b/ext/fileinfo/libmagic/softmagic.c index 5bed6e64b..0a06d00f8 100644 --- a/ext/fileinfo/libmagic/softmagic.c +++ b/ext/fileinfo/libmagic/softmagic.c @@ -2,7 +2,7 @@ * Copyright (c) Ian F. Darwin 1986-1995. * Software written by Ian F. Darwin and others; * maintained 1995-present by Christos Zoulas and others. - * + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: @@ -12,7 +12,7 @@ * 2. 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. - * + * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 @@ -32,7 +32,7 @@ #include "file.h" #ifndef lint -FILE_RCSID("@(#)$File: softmagic.c,v 1.117 2008/03/01 22:21:49 rrt Exp $") +FILE_RCSID("@(#)$File: softmagic.c,v 1.135 2009/03/27 22:42:49 christos Exp $") #endif /* lint */ #include "magic.h" @@ -149,7 +149,7 @@ match(struct magic_set *ms, struct magic *magic, uint32_t nmagic, default: if (m->type == FILE_INDIRECT) returnval = 1; - + switch (magiccheck(ms, m)) { case -1: return -1; @@ -163,7 +163,7 @@ match(struct magic_set *ms, struct magic *magic, uint32_t nmagic, break; } if (flush) { - /* + /* * main entry didn't match, * flush its continuations */ @@ -188,7 +188,7 @@ match(struct magic_set *ms, struct magic *magic, uint32_t nmagic, if (print && mprint(ms, m) == -1) - return -1; + return -1; ms->c.li[cont_level].off = moffset(ms, m); @@ -227,7 +227,7 @@ match(struct magic_set *ms, struct magic *magic, uint32_t nmagic, return -1; case 0: if (m->reln != '!') - continue; + continue; flush = 1; break; default: @@ -305,11 +305,11 @@ match(struct magic_set *ms, struct magic *magic, uint32_t nmagic, if (printed_something) { firstline = 0; if (print) - returnval = 1; + returnval = 1; } if ((ms->flags & MAGIC_CONTINUE) == 0 && printed_something) { return returnval; /* don't keep searching */ - } + } } return returnval; /* This is hit if -k is set or there is no match */ } @@ -377,7 +377,8 @@ mprint(struct magic_set *ms, struct magic *m) return -1; break; default: - if (file_printf(ms, m->desc, (unsigned short) v) == -1) + if ( + file_printf(ms, m->desc, (unsigned short) v) == -1) return -1; break; } @@ -932,7 +933,7 @@ mcopy(struct magic_set *ms, union VALUETYPE *p, int type, int indir, } if (lines) last = (const char *)s + nbytes; - + ms->search.s = buf; ms->search.s_len = last - buf; ms->search.offset = offset; @@ -945,10 +946,10 @@ mcopy(struct magic_set *ms, union VALUETYPE *p, int type, int indir, const unsigned char *esrc = s + nbytes; char *dst = p->s; char *edst = &p->s[sizeof(p->s) - 1]; - + if (type == FILE_BESTRING16) src++; - + /* check for pointer overflow */ if (src < s) { file_magerror(ms, "invalid offset %u in mcopy()", @@ -1506,14 +1507,14 @@ mget(struct magic_set *ms, const unsigned char *s, if (nbytes < (offset + 1)) /* should alway be true */ return 0; break; - + case FILE_SHORT: case FILE_BESHORT: case FILE_LESHORT: if (nbytes < (offset + 2)) return 0; break; - + case FILE_LONG: case FILE_BELONG: case FILE_LELONG: @@ -1532,7 +1533,7 @@ mget(struct magic_set *ms, const unsigned char *s, if (nbytes < (offset + 4)) return 0; break; - + case FILE_DOUBLE: case FILE_BEDOUBLE: case FILE_LEDOUBLE: @@ -1591,7 +1592,7 @@ file_strncmp(const char *s1, const char *s2, size_t len, uint32_t flags) if (0L == flags) { /* normal string: do it fast */ while (len-- > 0) if ((v = *b++ - *a++) != '\0') - break; + break; } else { /* combine the others */ while (len-- > 0) { @@ -1605,8 +1606,8 @@ file_strncmp(const char *s1, const char *s2, size_t len, uint32_t flags) if ((v = toupper(*b++) - *a++) != '\0') break; } - else if ((flags & STRING_COMPACT_BLANK) && - isspace(*a)) { + else if ((flags & STRING_COMPACT_BLANK) && + isspace(*a)) { a++; if (isspace(*b++)) { while (isspace(*b)) @@ -1761,23 +1762,23 @@ magiccheck(struct magic_set *ms, struct magic *m) case 'x': matched = 1; break; - + case '!': matched = fv != fl; break; - + case '=': matched = fv == fl; break; - + case '>': matched = fv > fl; break; - + case '<': matched = fv < fl; break; - + default: matched = 0; file_magerror(ms, "cannot happen with float: invalid relation `%c'", @@ -1795,23 +1796,23 @@ magiccheck(struct magic_set *ms, struct magic *m) case 'x': matched = 1; break; - + case '!': matched = dv != dl; break; - + case '=': matched = dv == dl; break; - + case '>': matched = dv > dl; break; - + case '<': matched = dv < dl; break; - + default: matched = 0; file_magerror(ms, "cannot happen with double: invalid relation `%c'", m->reln); @@ -1859,7 +1860,6 @@ magiccheck(struct magic_set *ms, struct magic *m) } break; } - case FILE_REGEX: { zval *pattern; int options = 0; @@ -1867,9 +1867,7 @@ magiccheck(struct magic_set *ms, struct magic *m) TSRMLS_FETCH(); MAKE_STD_ZVAL(pattern); - Z_STRVAL_P(pattern) = (char *)m->value.s; - Z_STRLEN_P(pattern) = m->vallen; - Z_TYPE_P(pattern) = IS_STRING; + ZVAL_STRINGL(pattern, (char *)m->value.s, m->vallen, 0); options |= PCRE_MULTILINE; @@ -1878,8 +1876,14 @@ magiccheck(struct magic_set *ms, struct magic *m) } convert_libmagic_pattern(pattern, options); - + +#if (PHP_MAJOR_VERSION < 6) if ((pce = pcre_get_compiled_regex_cache(Z_STRVAL_P(pattern), Z_STRLEN_P(pattern) TSRMLS_CC)) == NULL) { +#else + if ((pce = pcre_get_compiled_regex_cache(IS_STRING, Z_STRVAL_P(pattern), Z_STRLEN_P(pattern) TSRMLS_CC)) == NULL) { +#endif + zval_dtor(pattern); + FREE_ZVAL(pattern); return -1; } else { /* pce now contains the compiled regex */ @@ -1894,16 +1898,19 @@ magiccheck(struct magic_set *ms, struct magic *m) haystack = estrndup(ms->search.s, ms->search.s_len); /* match v = 0, no match v = 1 */ +#if (PHP_MAJOR_VERSION < 6) php_pcre_match_impl(pce, haystack, ms->search.s_len, retval, subpats, 1, 1, PREG_OFFSET_CAPTURE, 0 TSRMLS_CC); - +#else + php_pcre_match_impl(pce, IS_STRING, haystack, ms->search.s_len, retval, subpats, 1, 1, PREG_OFFSET_CAPTURE, 0 TSRMLS_CC); +#endif /* Free haystack */ efree(haystack); if (Z_LVAL_P(retval) < 0) { zval_ptr_dtor(&subpats); FREE_ZVAL(retval); - efree(Z_STRVAL_P(pattern)); - efree(pattern); + zval_dtor(pattern); + FREE_ZVAL(pattern); return -1; } else if ((Z_LVAL_P(retval) > 0) && (Z_TYPE_P(subpats) == IS_ARRAY)) { @@ -1991,8 +1998,8 @@ magiccheck(struct magic_set *ms, struct magic *m) } else { zval_ptr_dtor(&subpats); FREE_ZVAL(retval); - efree(Z_STRVAL_P(pattern)); - efree(pattern); + zval_dtor(pattern); + FREE_ZVAL(pattern); return -1; } } @@ -2004,8 +2011,8 @@ magiccheck(struct magic_set *ms, struct magic *m) zval_ptr_dtor(&subpats); FREE_ZVAL(retval); } - efree(Z_STRVAL_P(pattern)); - efree(pattern); + zval_dtor(pattern); + FREE_ZVAL(pattern); break; } case FILE_INDIRECT: @@ -2123,7 +2130,7 @@ print_sep(struct magic_set *ms, int firstline) if (firstline) return 0; /* - * we found another match + * we found another match * put a newline and '-' to do some simple formatting */ return file_printf(ms, "\n- "); diff --git a/ext/filter/callback_filter.c b/ext/filter/callback_filter.c index 431356ea4..9a641c88c 100644 --- a/ext/filter/callback_filter.c +++ b/ext/filter/callback_filter.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: callback_filter.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: callback_filter.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php_filter.h" diff --git a/ext/filter/filter.c b/ext/filter/filter.c index 7268d08d1..087ca2f98 100644 --- a/ext/filter/filter.c +++ b/ext/filter/filter.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -19,7 +19,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: filter.c 289434 2009-10-09 17:32:53Z pajoye $ */ +/* $Id: filter.c 294106 2010-01-27 17:22:54Z johannes $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -251,6 +251,7 @@ PHP_MINIT_FUNCTION(filter) REGISTER_LONG_CONSTANT("FILTER_FLAG_STRIP_LOW", FILTER_FLAG_STRIP_LOW, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("FILTER_FLAG_STRIP_HIGH", FILTER_FLAG_STRIP_HIGH, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("FILTER_FLAG_STRIP_BACKTICK", FILTER_FLAG_STRIP_BACKTICK, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("FILTER_FLAG_ENCODE_LOW", FILTER_FLAG_ENCODE_LOW, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("FILTER_FLAG_ENCODE_HIGH", FILTER_FLAG_ENCODE_HIGH, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("FILTER_FLAG_ENCODE_AMP", FILTER_FLAG_ENCODE_AMP, CONST_CS | CONST_PERSISTENT); @@ -313,7 +314,7 @@ PHP_MINFO_FUNCTION(filter) { php_info_print_table_start(); php_info_print_table_row( 2, "Input Validation and Filtering", "enabled" ); - php_info_print_table_row( 2, "Revision", "$Revision: 289434 $"); + php_info_print_table_row( 2, "Revision", "$Revision: 294106 $"); php_info_print_table_end(); DISPLAY_INI_ENTRIES(); @@ -391,9 +392,7 @@ static void php_zval_filter(zval **value, long filter, long flags, zval *options ) { zval **tmp; if (zend_hash_find(HASH_OF(options), "default", sizeof("default"), (void **)&tmp) == SUCCESS) { - **value = **tmp; - zval_copy_ctor(*value); - INIT_PZVAL(*value); + MAKE_COPY_ZVAL(tmp, *value); } } } @@ -678,9 +677,7 @@ static void php_filter_call(zval **filtered, long filter, zval **filter_args, co zval *tmp; ALLOC_ZVAL(tmp); - *tmp = **filtered; - zval_copy_ctor(tmp); - INIT_PZVAL(tmp); + MAKE_COPY_ZVAL(filtered, tmp); zval_dtor(*filtered); @@ -700,15 +697,11 @@ static void php_filter_array_handler(zval *input, zval **op, zval *return_value if (!op) { zval_dtor(return_value); - *return_value = *input; - zval_copy_ctor(return_value); - INIT_PZVAL(return_value); + MAKE_COPY_ZVAL(&input, return_value); php_filter_call(&return_value, FILTER_DEFAULT, NULL, 0, FILTER_REQUIRE_ARRAY TSRMLS_CC); } else if (Z_TYPE_PP(op) == IS_LONG) { zval_dtor(return_value); - *return_value = *input; - zval_copy_ctor(return_value); - INIT_PZVAL(return_value); + MAKE_COPY_ZVAL(&input, return_value); php_filter_call(&return_value, Z_LVAL_PP(op), NULL, 0, FILTER_REQUIRE_ARRAY TSRMLS_CC); } else if (Z_TYPE_PP(op) == IS_ARRAY) { array_init(return_value); @@ -734,9 +727,7 @@ static void php_filter_array_handler(zval *input, zval **op, zval *return_value zval *nval; ALLOC_ZVAL(nval); - *nval = **tmp; - zval_copy_ctor(nval); - INIT_PZVAL(nval); + MAKE_COPY_ZVAL(tmp, nval); php_filter_call(&nval, -1, arg_elm, 0, FILTER_REQUIRE_SCALAR TSRMLS_CC); add_assoc_zval_ex(return_value, arg_key, arg_key_len, nval); @@ -777,14 +768,13 @@ PHP_FUNCTION(filter_input) filter_flags = Z_LVAL_PP(filter_args); } else if (Z_TYPE_PP(filter_args) == IS_ARRAY && zend_hash_find(HASH_OF(*filter_args), "flags", sizeof("flags"), (void **)&option) == SUCCESS) { PHP_FILTER_GET_LONG_OPT(option, filter_flags); - } else if (Z_TYPE_PP(filter_args) == IS_ARRAY && + } + if (Z_TYPE_PP(filter_args) == IS_ARRAY && zend_hash_find(HASH_OF(*filter_args), "options", sizeof("options"), (void **)&opt) == SUCCESS && Z_TYPE_PP(opt) == IS_ARRAY && zend_hash_find(HASH_OF(*opt), "default", sizeof("default"), (void **)&def) == SUCCESS ) { - *return_value = **def; - zval_copy_ctor(return_value); - INIT_PZVAL(return_value); + MAKE_COPY_ZVAL(def, return_value); return; } } @@ -795,9 +785,7 @@ PHP_FUNCTION(filter_input) } } - *return_value = **tmp; - zval_copy_ctor(return_value); /* Watch out for empty strings */ - INIT_PZVAL(return_value); + MAKE_COPY_ZVAL(tmp, return_value); php_filter_call(&return_value, filter, filter_args, 1, FILTER_REQUIRE_SCALAR TSRMLS_CC); } @@ -819,9 +807,7 @@ PHP_FUNCTION(filter_var) RETURN_FALSE; } - *return_value = *data; - zval_copy_ctor(data); - INIT_PZVAL(return_value); + MAKE_COPY_ZVAL(&data, return_value); php_filter_call(&return_value, filter, filter_args, 1, FILTER_REQUIRE_SCALAR TSRMLS_CC); } diff --git a/ext/filter/filter_private.h b/ext/filter/filter_private.h index 958169150..892087757 100644 --- a/ext/filter/filter_private.h +++ b/ext/filter/filter_private.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: filter_private.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: filter_private.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef FILTER_PRIVATE_H #define FILTER_PRIVATE_H @@ -39,6 +39,7 @@ #define FILTER_FLAG_ENCODE_AMP 0x0040 #define FILTER_FLAG_NO_ENCODE_QUOTES 0x0080 #define FILTER_FLAG_EMPTY_STRING_NULL 0x0100 +#define FILTER_FLAG_STRIP_BACKTICK 0x0200 #define FILTER_FLAG_ALLOW_FRACTION 0x1000 #define FILTER_FLAG_ALLOW_THOUSAND 0x2000 diff --git a/ext/filter/logical_filters.c b/ext/filter/logical_filters.c index 237ed9d03..f8f453e41 100644 --- a/ext/filter/logical_filters.c +++ b/ext/filter/logical_filters.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: logical_filters.c 284212 2009-07-16 23:29:36Z felipe $ */ +/* $Id: logical_filters.c 293996 2010-01-25 16:14:28Z johannes $ */ #include "php_filter.h" #include "filter_private.h" @@ -456,12 +456,35 @@ void php_filter_validate_url(PHP_INPUT_FILTER_PARAM_DECL) /* {{{ */ RETURN_VALIDATION_FAILED } + if (url->scheme != NULL && (!strcasecmp(url->scheme, "http") || !strcasecmp(url->scheme, "https"))) { + char *e, *s; + + if (url->host == NULL) { + goto bad_url; + } + + e = url->host + strlen(url->host); + s = url->host; + + while (s < e) { + if (!isalnum((int)*(unsigned char *)s) && *s != '_' && *s != '.') { + goto bad_url; + } + s++; + } + + if (*(e - 1) == '.') { + goto bad_url; + } + } + if ( url->scheme == NULL || /* some schemas allow the host to be empty */ (url->host == NULL && (strcmp(url->scheme, "mailto") && strcmp(url->scheme, "news") && strcmp(url->scheme, "file"))) || ((flags & FILTER_FLAG_PATH_REQUIRED) && url->path == NULL) || ((flags & FILTER_FLAG_QUERY_REQUIRED) && url->query == NULL) ) { +bad_url: php_url_free(url); RETURN_VALIDATION_FAILED } @@ -472,7 +495,7 @@ void php_filter_validate_url(PHP_INPUT_FILTER_PARAM_DECL) /* {{{ */ void php_filter_validate_email(PHP_INPUT_FILTER_PARAM_DECL) /* {{{ */ { /* From http://cvs.php.net/co.php/pear/HTML_QuickForm/QuickForm/Rule/Email.php?r=1.4 */ - const char regexp[] = "/^((\\\"[^\\\"\\f\\n\\r\\t\\b]+\\\")|([A-Za-z0-9_][A-Za-z0-9_\\!\\#\\$\\%\\&\\'\\*\\+\\-\\~\\/\\^\\`\\|\\{\\}]*(\\.[A-Za-z0-9_\\!\\#\\$\\%\\&\\'\\*\\+\\-\\~\\/\\^\\`\\|\\{\\}]*)*))@((\\[(((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9])))\\])|(((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9])))|((([A-Za-z0-9])(([A-Za-z0-9\\-])*([A-Za-z0-9]))?(\\.(?=[A-Za-z0-9\\-]))?)+[A-Za-z]+))$/D"; + const char regexp[] = "/^((\\\"[^\\\"\\f\\n\\r\\t\\b]+\\\")|([A-Za-z0-9_][A-Za-z0-9_\\!\\#\\$\\%\\&\\'\\*\\+\\-\\~\\/\\=\\?\\^\\`\\|\\{\\}]*(\\.[A-Za-z0-9_\\!\\#\\$\\%\\&\\'\\*\\+\\-\\~\\/\\=\\?\\^\\`\\|\\{\\}]*)*))@((\\[(((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9])))\\])|(((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9])))|((([A-Za-z0-9])(([A-Za-z0-9\\-])*([A-Za-z0-9]))?(\\.(?=[A-Za-z0-9\\-]))?)+[A-Za-z]+))$/D"; pcre *re = NULL; pcre_extra *pcre_extra = NULL; diff --git a/ext/filter/php_filter.h b/ext/filter/php_filter.h index 63416a028..1c5d84628 100644 --- a/ext/filter/php_filter.h +++ b/ext/filter/php_filter.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_filter.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_filter.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_FILTER_H #define PHP_FILTER_H diff --git a/ext/filter/sanitizing_filters.c b/ext/filter/sanitizing_filters.c index fc0475c64..c5152dbe1 100644 --- a/ext/filter/sanitizing_filters.c +++ b/ext/filter/sanitizing_filters.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: sanitizing_filters.c 289438 2009-10-09 17:50:17Z pajoye $ */ +/* $Id: sanitizing_filters.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php_filter.h" #include "filter_private.h" @@ -123,6 +123,7 @@ static void php_filter_strip(zval *value, long flags) for (i = 0; i < Z_STRLEN_P(value); i++) { if ((str[i] > 127) && (flags & FILTER_FLAG_STRIP_HIGH)) { } else if ((str[i] < 32) && (flags & FILTER_FLAG_STRIP_LOW)) { + } else if ((str[i] == '`') && (flags & FILTER_FLAG_STRIP_BACKTICK)) { } else { buf[c] = str[i]; ++c; diff --git a/ext/filter/tests/033.phpt b/ext/filter/tests/033.phpt index f965e35c1..143d0c10e 100644 --- a/ext/filter/tests/033.phpt +++ b/ext/filter/tests/033.phpt @@ -21,7 +21,7 @@ stripped PHP 1 foo@bar.com http://a.b.c 1.2.3.4 123 12 encoded PHP 1 foo%40bar.com http%3A%2F%2Fa.b.c 1.2.3.4 123 123abc%3C%3E%28%29 O%27Henry %ED%95%98%ED%8D%BC special_chars PHP 1 foo@bar.com http://a.b.c 1.2.3.4 123 123abc<>() O'Henry 하퍼 unsafe_raw PHP 1 foo@bar.com http://a.b.c 1.2.3.4 123 123abc<>() O'Henry 하퍼 -email PHP 1 foo@bar.com http//a.b.c 1.2.3.4 123 123abc O'Henry +email PHP 1 foo@bar.com httpa.b.c 1.2.3.4 123 123abc O'Henry url PHP 1 foo@bar.com http://a.b.c 1.2.3.4 123 123abc<>() O'Henry number_int 1 1234 123 123 number_float 1 1234 123 123 diff --git a/ext/filter/tests/bug39763.phpt b/ext/filter/tests/bug39763.phpt index 429fff6f7..1422f52ac 100644 --- a/ext/filter/tests/bug39763.phpt +++ b/ext/filter/tests/bug39763.phpt @@ -12,6 +12,6 @@ parse_str("val=%22probably+a+bug%22"); echo $val . "\n"; ?> --EXPECT-- -PHP Warning: Directive 'magic_quotes_gpc' is deprecated in PHP 5.3 and greater in Unknown on line 0 +Warning: Directive 'magic_quotes_gpc' is deprecated in PHP 5.3 and greater in Unknown on line 0 \"probably a bug\" \"probably a bug\" \ No newline at end of file diff --git a/ext/filter/tests/bug42718-2.phpt b/ext/filter/tests/bug42718-2.phpt index fd2a91d9d..13cd990d0 100644 --- a/ext/filter/tests/bug42718-2.phpt +++ b/ext/filter/tests/bug42718-2.phpt @@ -3,6 +3,7 @@ Bug #42718 - 2 (unsafe_raw filter not applied when configured as default filter) --SKIPIF-- --INI-- +display_errors=0 magic_quotes_gpc=1 filter.default=unsafe_raw filter.default_flags= diff --git a/ext/filter/tests/bug50158.phpt b/ext/filter/tests/bug50158.phpt new file mode 100644 index 000000000..fbe2ca3af --- /dev/null +++ b/ext/filter/tests/bug50158.phpt @@ -0,0 +1,23 @@ +--TEST-- +Bug #50158 (FILTER_VALIDATE_EMAIL fails with valid addresses containing = or ?) +--FILE-- + +--EXPECTF-- +%unicode|string%(21) "test=mail@example.com" +%unicode|string%(21) "test-mail@example.com" +%unicode|string%(21) "test+mail@example.com" +%unicode|string%(21) "test?mail@example.com" diff --git a/ext/filter/tests/bug50632.phpt b/ext/filter/tests/bug50632.phpt new file mode 100644 index 000000000..2f33b91ff --- /dev/null +++ b/ext/filter/tests/bug50632.phpt @@ -0,0 +1,11 @@ +--TEST-- +bug 50632, filter_input() does not return default value if the variable does not exist +--SKIPIF-- + +--FILE-- + FILTER_REQUIRE_SCALAR, 'options' => array('default' => 23))); +var_dump($foo); +?> +--EXPECT-- +int(23) diff --git a/ext/ftp/ftp.c b/ext/ftp/ftp.c index 36c2b0726..be6c03f8a 100644 --- a/ext/ftp/ftp.c +++ b/ext/ftp/ftp.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: ftp.c 289416 2009-10-09 14:20:17Z pajoye $ */ +/* $Id: ftp.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -1387,7 +1387,7 @@ ftp_getdata(ftpbuf_t *ftp TSRMLS_DC) sa = (struct sockaddr *) &ftp->localaddr; /* bind/listen */ - if ((fd = socket(sa->sa_family, SOCK_STREAM, 0)) == -1) { + if ((fd = socket(sa->sa_family, SOCK_STREAM, 0)) == SOCK_ERR) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "socket() failed: %s (%d)", strerror(errno), errno); goto bail; } @@ -1420,17 +1420,17 @@ ftp_getdata(ftpbuf_t *ftp TSRMLS_DC) php_any_addr(sa->sa_family, &addr, 0); size = php_sockaddr_size(&addr); - if (bind(fd, (struct sockaddr*) &addr, size) == -1) { + if (bind(fd, (struct sockaddr*) &addr, size) != 0) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "bind() failed: %s (%d)", strerror(errno), errno); goto bail; } - if (getsockname(fd, (struct sockaddr*) &addr, &size) == -1) { + if (getsockname(fd, (struct sockaddr*) &addr, &size) != 0) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "getsockname() failed: %s (%d)", strerror(errno), errno); goto bail; } - if (listen(fd, 5) == -1) { + if (listen(fd, 5) != 0) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "listen() failed: %s (%d)", strerror(errno), errno); goto bail; } @@ -1699,7 +1699,7 @@ ftp_nb_get(ftpbuf_t *ftp, php_stream *outstream, const char *path, ftptype_t typ char arg[11]; if (ftp == NULL) { - goto bail; + return PHP_FTP_FAILED; } if (!ftp_type(ftp, type)) { diff --git a/ext/ftp/ftp.h b/ext/ftp/ftp.h index a8575e29b..9e481935d 100644 --- a/ext/ftp/ftp.h +++ b/ext/ftp/ftp.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: ftp.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: ftp.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef FTP_H #define FTP_H diff --git a/ext/ftp/php_ftp.c b/ext/ftp/php_ftp.c index 57d65ee6f..f06fe6be6 100644 --- a/ext/ftp/php_ftp.c +++ b/ext/ftp/php_ftp.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_ftp.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_ftp.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/ftp/php_ftp.h b/ext/ftp/php_ftp.h index cae3f489f..1155fd129 100644 --- a/ext/ftp/php_ftp.h +++ b/ext/ftp/php_ftp.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_ftp.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_ftp.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef _INCLUDED_FTP_H #define _INCLUDED_FTP_H diff --git a/ext/gd/gd.c b/ext/gd/gd.c index 8853e61a3..8459ac210 100644 --- a/ext/gd/gd.c +++ b/ext/gd/gd.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: gd.c 282455 2009-06-19 22:15:28Z kalle $ */ +/* $Id: gd.c 294458 2010-02-03 20:42:50Z pajoye $ */ /* gd 1.2 is copyright 1994, 1995, Quest Protein Database Center, Cold Spring Harbor Labs. */ @@ -3427,7 +3427,10 @@ static void php_imagepolygon(INTERNAL_FUNCTION_PARAMETERS, int filled) php_error_docref(NULL TSRMLS_CC, E_WARNING, "You must have at least 3 points in your array"); RETURN_FALSE; } - + if (npoints <= 0) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "You must give a positive number of points"); + RETURN_FALSE; + } if (nelem < npoints * 2) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Trying to use %d points in array with only %d points", npoints, nelem/2); RETURN_FALSE; @@ -3880,7 +3883,7 @@ static void php_imagettftext_common(INTERNAL_FUNCTION_PARAMETERS, int mode, int long col = -1, x = -1, y = -1; int str_len, fontname_len, i, brect[8]; double ptsize, angle; - unsigned char *str = NULL, *fontname = NULL; + char *str = NULL, *fontname = NULL; char *error = NULL; int argc = ZEND_NUM_ARGS(); #if HAVE_GD_STRINGFTEX @@ -3942,28 +3945,24 @@ static void php_imagettftext_common(INTERNAL_FUNCTION_PARAMETERS, int mode, int { char tmp_font_path[MAXPATHLEN]; - if (VCWD_REALPATH((char *)fontname, tmp_font_path)) { - fontname = (unsigned char *) fontname; - } else { + if (!VCWD_REALPATH(fontname, tmp_font_path)) { fontname = NULL; } } -#else - fontname = (unsigned char *) fontname; #endif - PHP_GD_CHECK_OPEN_BASEDIR((char *)fontname, "Invalid font filename"); + PHP_GD_CHECK_OPEN_BASEDIR(fontname, "Invalid font filename"); #ifdef USE_GD_IMGSTRTTF # if HAVE_GD_STRINGFTEX if (extended) { - error = gdImageStringFTEx(im, brect, col, (char *)fontname, ptsize, angle, x, y, (char *)str, &strex); + error = gdImageStringFTEx(im, brect, col, fontname, ptsize, angle, x, y, str, &strex); } else # endif # if HAVE_GD_STRINGFT - error = gdImageStringFT(im, brect, col, (char *)fontname, ptsize, angle, x, y, (char *)str); + error = gdImageStringFT(im, brect, col, fontname, ptsize, angle, x, y, str); # elif HAVE_GD_STRINGTTF error = gdImageStringTTF(im, brect, col, fontname, ptsize, angle, x, y, str); # endif @@ -4139,7 +4138,7 @@ PHP_FUNCTION(imagepsencodefont) T1_DeleteAllSizes(*f_ind); if (T1_ReencodeFont(*f_ind, enc_vector)) { T1_DeleteEncoding(enc_vector); - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Couldn't reencode font"); + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Couldn't re-encode font"); RETURN_FALSE; } diff --git a/ext/gd/gd_ctx.c b/ext/gd/gd_ctx.c index e4961cf79..13660e6f8 100644 --- a/ext/gd/gd_ctx.c +++ b/ext/gd/gd_ctx.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: gd_ctx.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: gd_ctx.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php_gd.h" diff --git a/ext/gd/libgd/gd.c b/ext/gd/libgd/gd.c index a0ea6f198..e4e2e0f1a 100644 --- a/ext/gd/libgd/gd.c +++ b/ext/gd/libgd/gd.c @@ -2568,7 +2568,7 @@ void gdImagePolygon (gdImagePtr im, gdPointPtr p, int n, int c) typedef void (*image_line)(gdImagePtr im, int x1, int y1, int x2, int y2, int color); image_line draw_line; - if (!n) { + if (n <= 0) { return; } @@ -2614,14 +2614,14 @@ void gdImageFilledPolygon (gdImagePtr im, gdPointPtr p, int n, int c) { int i; int y; - int miny, maxy; + int miny, maxy, pmaxy; int x1, y1; int x2, y2; int ind1, ind2; int ints; int fill_color; - if (!n) { + if (n <= 0) { return; } @@ -2658,7 +2658,7 @@ void gdImageFilledPolygon (gdImagePtr im, gdPointPtr p, int n, int c) maxy = p[i].y; } } - + pmaxy = maxy; /* 2.0.16: Optimization by Ilia Chipitsine -- don't waste time offscreen */ if (miny < 0) { miny = 0; @@ -2700,13 +2700,13 @@ void gdImageFilledPolygon (gdImagePtr im, gdPointPtr p, int n, int c) */ if (y >= y1 && y < y2) { im->polyInts[ints++] = (float) ((y - y1) * (x2 - x1)) / (float) (y2 - y1) + 0.5 + x1; - } else if (y == maxy && y > y1 && y <= y2) { - im->polyInts[ints++] = (float) ((y - y1) * (x2 - x1)) / (float) (y2 - y1) + 0.5 + x1; + } else if (y == pmaxy && y == y2) { + im->polyInts[ints++] = x2; } } qsort(im->polyInts, ints, sizeof(int), gdCompareInt); - for (i = 0; i < ints; i += 2) { + for (i = 0; i < ints - 1; i += 2) { gdImageLine(im, im->polyInts[i], y, im->polyInts[i + 1], y, fill_color); } } diff --git a/ext/gd/libgd/gd_png.c b/ext/gd/libgd/gd_png.c index da5a32f68..52a087e78 100644 --- a/ext/gd/libgd/gd_png.c +++ b/ext/gd/libgd/gd_png.c @@ -145,7 +145,7 @@ gdImagePtr gdImageCreateFromPngCtx (gdIOCtx * infile) return NULL; } - if (!png_check_sig (sig, 8)) { /* bad signature */ + if (png_sig_cmp(sig, 0, 8) != 0) { /* bad signature */ return NULL; } diff --git a/ext/gd/libgd/gdft.c b/ext/gd/libgd/gdft.c index ffac3ebf6..a3ced0ab1 100644 --- a/ext/gd/libgd/gdft.c +++ b/ext/gd/libgd/gdft.c @@ -1090,6 +1090,7 @@ gdImageStringFTEx (gdImage * im, int *brect, int fg, char *fontlist, double ptsi if (render) { if (image->format != ft_glyph_format_bitmap && FT_Glyph_To_Bitmap(&image, ft_render_mode_normal, 0, 1)) { + FT_Done_Glyph(image); if (tmpstr) { gdFree(tmpstr); } @@ -1100,7 +1101,7 @@ gdImageStringFTEx (gdImage * im, int *brect, int fg, char *fontlist, double ptsi /* now, draw to our target surface */ bm = (FT_BitmapGlyph) image; - gdft_draw_bitmap(tc_cache, im, fg, bm->bitmap, x + x1 + ((pen.x + 31) >> 6) + bm->left, y + y1 + ((pen.y + 31) >> 6) - bm->top); + gdft_draw_bitmap(tc_cache, im, fg, bm->bitmap, x + x1 + ((pen.x + 31) >> 6), y + y1 + ((pen.y + 31) >> 6) - bm->top); } /* record current glyph index for kerning */ diff --git a/ext/gd/libgd/xbm.c b/ext/gd/libgd/xbm.c index 983163ae5..053d22315 100644 --- a/ext/gd/libgd/xbm.c +++ b/ext/gd/libgd/xbm.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: xbm.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: xbm.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include #include diff --git a/ext/gd/php_gd.h b/ext/gd/php_gd.h index d2970ce0c..708b934e8 100644 --- a/ext/gd/php_gd.h +++ b/ext/gd/php_gd.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_gd.h 281216 2009-05-27 08:18:24Z pajoye $ */ +/* $Id: php_gd.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_GD_H #define PHP_GD_H diff --git a/ext/gd/tests/bug49600.phpt b/ext/gd/tests/bug49600.phpt new file mode 100644 index 000000000..068f8f36a --- /dev/null +++ b/ext/gd/tests/bug49600.phpt @@ -0,0 +1,32 @@ +--TEST-- +Bug #49600 (imageTTFText text shifted right) +--SKIPIF-- + +--FILE-- + 1 + || abs($x[2] - $y[2]) > 1 + || abs($x[4] - $y[4]) > 1 + || abs($x[6] - $y[6]) > 1 ) { + echo "FAILED: \n"; + var_dump($x); + var_dump($y); + exit; + } +} +echo 'OK'; +?> +--EXPECTF-- +OK \ No newline at end of file diff --git a/ext/gd/tests/image_type_to_mime_type_basic.phpt b/ext/gd/tests/image_type_to_mime_type_basic.phpt index 5199fd2c4..b81bdbde5 100644 --- a/ext/gd/tests/image_type_to_mime_type_basic.phpt +++ b/ext/gd/tests/image_type_to_mime_type_basic.phpt @@ -2,8 +2,7 @@ image_type_to_mime_type() --SKIPIF-- --FILE-- --FILE-- --FILE-- --FILE-- +--FILE-- + +--EXPECTF-- +Warning: imagefilledpolygon(): You must give a positive number of points in %s on line %d diff --git a/ext/gd/tests/imagepolygon_negative.phpt b/ext/gd/tests/imagepolygon_negative.phpt new file mode 100644 index 000000000..bb9010c92 --- /dev/null +++ b/ext/gd/tests/imagepolygon_negative.phpt @@ -0,0 +1,15 @@ +--TEST-- +imagepolygon() with a negative num of points +--SKIPIF-- + +--FILE-- + +--EXPECTF-- +Warning: imagepolygon(): You must give a positive number of points in %s on line %d diff --git a/ext/gd/tests/imagerectangle_basic.phpt b/ext/gd/tests/imagerectangle_basic.phpt index 0574ad35c..f706ee7ab 100755 --- a/ext/gd/tests/imagerectangle_basic.phpt +++ b/ext/gd/tests/imagerectangle_basic.phpt @@ -5,7 +5,7 @@ Ivan Rosolen #testfest PHPSP on 2009-06-30 --SKIPIF-- --FILE-- #testfest PHPSP on 2009-06-30 --SKIPIF-- --FILE-- +--FILE-- + +--EXPECTF-- +2e6cf558bb4dadf60c8b608d5f8cda4e diff --git a/ext/gettext/gettext.c b/ext/gettext/gettext.c index 7a5f8d204..09c580fd3 100644 --- a/ext/gettext/gettext.c +++ b/ext/gettext/gettext.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: gettext.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: gettext.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/gettext/php_gettext.h b/ext/gettext/php_gettext.h index 926b87742..dbaf5fb95 100644 --- a/ext/gettext/php_gettext.h +++ b/ext/gettext/php_gettext.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_gettext.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_gettext.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_GETTEXT_H #define PHP_GETTEXT_H diff --git a/ext/gmp/config.w32 b/ext/gmp/config.w32 index 5897d24d5..01194fb8f 100644 --- a/ext/gmp/config.w32 +++ b/ext/gmp/config.w32 @@ -1,4 +1,4 @@ -// $Id: config.w32 281914 2009-06-10 09:59:21Z pajoye $ +// $Id: config.w32 291937 2009-12-10 02:25:47Z pajoye $ // vim:ft=javascript ARG_WITH("gmp", "Include GNU MP support.", "no"); @@ -8,6 +8,7 @@ if (PHP_GMP != "no") { CHECK_HEADER_ADD_INCLUDE("gmp.h", "CFLAGS_GMP", PHP_GMP + ";" + PHP_PHP_BUILD + "\\include\\mpir")) { EXTENSION("gmp", "gmp.c"); AC_DEFINE('HAVE_GMP', 1, 'GMP support'); + AC_DEFINE('HAVE_MPIR', 1, 'MPIR support'); } else { WARNING("GMP not enabled; libraries and headers not found"); } diff --git a/ext/gmp/gmp.c b/ext/gmp/gmp.c index d4d7e30c5..f53dcd652 100644 --- a/ext/gmp/gmp.c +++ b/ext/gmp/gmp.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -356,6 +356,9 @@ ZEND_MODULE_STARTUP_D(gmp) REGISTER_LONG_CONSTANT("GMP_ROUND_ZERO", GMP_ROUND_ZERO, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("GMP_ROUND_PLUSINF", GMP_ROUND_PLUSINF, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("GMP_ROUND_MINUSINF", GMP_ROUND_MINUSINF, CONST_CS | CONST_PERSISTENT); +#ifdef mpir_version + REGISTER_STRING_CONSTANT("GMP_MPIR_VERSION", (char *)mpir_version, CONST_CS | CONST_PERSISTENT); +#endif REGISTER_STRING_CONSTANT("GMP_VERSION", (char *)gmp_version, CONST_CS | CONST_PERSISTENT); mp_set_memory_functions(gmp_emalloc, gmp_erealloc, gmp_efree); @@ -383,7 +386,11 @@ ZEND_MODULE_INFO_D(gmp) { php_info_print_table_start(); php_info_print_table_row(2, "gmp support", "enabled"); +#ifdef mpir_version + php_info_print_table_row(2, "MPIR version", mpir_version); +#else php_info_print_table_row(2, "GMP version", gmp_version); +#endif php_info_print_table_end(); } /* }}} */ @@ -746,7 +753,11 @@ ZEND_FUNCTION(gmp_init) return; } +#if (__GNU_MP_VERSION >= 4 && __GNU_MP_VERSION_MINOR >= 2) + if (base && (base < 2 || base > 62)) { +#else if (base && (base < 2 || base > 36)) { +#endif php_error_docref(NULL TSRMLS_CC, E_WARNING, "Bad base for conversion: %ld (should be between 2 and 36)", base); RETURN_FALSE; } @@ -796,14 +807,18 @@ ZEND_FUNCTION(gmp_strval) return; } +#if __GNU_MP_VERSION >= 4 && __GNU_MP_VERSION_MINOR >= 2 + if ((base < 2 && base > -2) || base > 62 || base < -36) { +#else if (base < 2 || base > 36) { +#endif php_error_docref(NULL TSRMLS_CC, E_WARNING, "Bad base for conversion: %ld", base); RETURN_FALSE; } FETCH_GMP_ZVAL(gmpnum, gmpnumber_arg, temp_a); - num_len = mpz_sizeinbase(*gmpnum, base); + num_len = mpz_sizeinbase(*gmpnum, abs(base)); out_string = emalloc(num_len+2); if (mpz_sgn(*gmpnum) < 0) { num_len++; @@ -1359,8 +1374,11 @@ ZEND_FUNCTION(gmp_random) GMPG(rand_initialized) = 1; } +#ifdef GMP_LIMB_BITS + mpz_urandomb(*gmpnum_result, GMPG(rand_state), GMP_ABS (limiter) * GMP_LIMB_BITS); +#else mpz_urandomb(*gmpnum_result, GMPG(rand_state), GMP_ABS (limiter) * __GMP_BITS_PER_MP_LIMB); - +#endif ZEND_REGISTER_RESOURCE(return_value, gmpnum_result, le_gmp); } /* }}} */ diff --git a/ext/gmp/php_gmp.h b/ext/gmp/php_gmp.h index da7071039..dfe2080a7 100644 --- a/ext/gmp/php_gmp.h +++ b/ext/gmp/php_gmp.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | diff --git a/ext/gmp/tests/bug50283.phpt b/ext/gmp/tests/bug50283.phpt new file mode 100644 index 000000000..e8132a78f --- /dev/null +++ b/ext/gmp/tests/bug50283.phpt @@ -0,0 +1,36 @@ +--TEST-- +Feature Request #50283 (allow base in gmp_strval to use full range: 2 to 62, and -2 to -36) +--SKIPIF-- + +--FILE-- + +--EXPECTF-- +Decimal: 71915494046709, -36-based: PHPISCOOL +Decimal: 71915494046709, 36-based: phpiscool + +Warning: gmp_strval(): Bad base for conversion: -1 in %s on line 5 +Decimal: 71915494046709, -1-based: + +Warning: gmp_strval(): Bad base for conversion: 1 in %s on line 6 +Decimal: 71915494046709, 1-based: + +Warning: gmp_strval(): Bad base for conversion: -37 in %s on line 7 +Decimal: 71915494046709, -37-based: +Decimal: 71915494046709, 37-based: KHKATELJF +Decimal: 71915494046709, 62-based: KQ6yq741 + +Warning: gmp_strval(): Bad base for conversion: 63 in %s on line 10 +Decimal: 71915494046709, 63-based: + +Base 32 and 62-based: 1NHkAcdIiD diff --git a/ext/hash/hash.c b/ext/hash/hash.c index f9de1043c..96c0ae216 100644 --- a/ext/hash/hash.c +++ b/ext/hash/hash.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: hash.c 287429 2009-08-17 21:28:22Z garretts $ */ +/* $Id: hash.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/hash/hash_adler32.c b/ext/hash/hash_adler32.c index b51f33d0e..9b2627839 100644 --- a/ext/hash/hash_adler32.c +++ b/ext/hash/hash_adler32.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: hash_adler32.c 283144 2009-06-30 13:21:53Z scottmac $ */ +/* $Id: hash_adler32.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php_hash.h" #include "php_hash_adler32.h" diff --git a/ext/hash/hash_crc32.c b/ext/hash/hash_crc32.c index cbce06653..b3b664088 100644 --- a/ext/hash/hash_crc32.c +++ b/ext/hash/hash_crc32.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: hash_crc32.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: hash_crc32.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php_hash.h" #include "php_hash_crc32.h" diff --git a/ext/hash/hash_gost.c b/ext/hash/hash_gost.c index dfc507877..5a430e375 100644 --- a/ext/hash/hash_gost.c +++ b/ext/hash/hash_gost.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: hash_gost.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: hash_gost.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php_hash.h" #include "php_hash_gost.h" diff --git a/ext/hash/hash_haval.c b/ext/hash/hash_haval.c index b21f53dab..528b28494 100644 --- a/ext/hash/hash_haval.c +++ b/ext/hash/hash_haval.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: hash_haval.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: hash_haval.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php_hash.h" #include "php_hash_haval.h" diff --git a/ext/hash/hash_md.c b/ext/hash/hash_md.c index 6423aefe0..419466f6c 100644 --- a/ext/hash/hash_md.c +++ b/ext/hash/hash_md.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: hash_md.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: hash_md.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php_hash.h" #include "php_hash_md.h" diff --git a/ext/hash/hash_ripemd.c b/ext/hash/hash_ripemd.c index a3e9972a6..95c14e44f 100644 --- a/ext/hash/hash_ripemd.c +++ b/ext/hash/hash_ripemd.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: hash_ripemd.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: hash_ripemd.c 293036 2010-01-03 09:23:27Z sebastian $ */ /* Heavily borrowed from md5.c & sha1.c of PHP archival fame Note that ripemd laughs in the face of logic and uses diff --git a/ext/hash/hash_salsa.c b/ext/hash/hash_salsa.c index 0b1446606..357ce2ec7 100644 --- a/ext/hash/hash_salsa.c +++ b/ext/hash/hash_salsa.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: hash_salsa.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: hash_salsa.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php_hash.h" #include "php_hash_salsa.h" diff --git a/ext/hash/hash_sha.c b/ext/hash/hash_sha.c index 177919db1..b3e3f8969 100644 --- a/ext/hash/hash_sha.c +++ b/ext/hash/hash_sha.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: hash_sha.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: hash_sha.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php_hash.h" #include "php_hash_sha.h" diff --git a/ext/hash/hash_snefru.c b/ext/hash/hash_snefru.c index 56a5aaa9c..c91c7e4f8 100644 --- a/ext/hash/hash_snefru.c +++ b/ext/hash/hash_snefru.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: hash_snefru.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: hash_snefru.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php_hash.h" #include "php_hash_snefru.h" diff --git a/ext/hash/hash_tiger.c b/ext/hash/hash_tiger.c index eba5226c0..5674eb20e 100644 --- a/ext/hash/hash_tiger.c +++ b/ext/hash/hash_tiger.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: hash_tiger.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: hash_tiger.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php_hash.h" #include "php_hash_tiger.h" diff --git a/ext/hash/hash_whirlpool.c b/ext/hash/hash_whirlpool.c index 18947f50a..9ddc69bc1 100644 --- a/ext/hash/hash_whirlpool.c +++ b/ext/hash/hash_whirlpool.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: hash_whirlpool.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: hash_whirlpool.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php_hash.h" diff --git a/ext/hash/php_hash.h b/ext/hash/php_hash.h index 93e57be87..3ae79057b 100644 --- a/ext/hash/php_hash.h +++ b/ext/hash/php_hash.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_hash.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_hash.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_HASH_H #define PHP_HASH_H diff --git a/ext/hash/php_hash_adler32.h b/ext/hash/php_hash_adler32.h index 4d1e86c84..b42da4cfc 100644 --- a/ext/hash/php_hash_adler32.h +++ b/ext/hash/php_hash_adler32.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_hash_adler32.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_hash_adler32.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_HASH_ADLER32_H #define PHP_HASH_ADLER32_H diff --git a/ext/hash/php_hash_crc32.h b/ext/hash/php_hash_crc32.h index d41f7e33c..063109114 100644 --- a/ext/hash/php_hash_crc32.h +++ b/ext/hash/php_hash_crc32.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_hash_crc32.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_hash_crc32.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_HASH_CRC32_H #define PHP_HASH_CRC32_H diff --git a/ext/hash/php_hash_crc32_tables.h b/ext/hash/php_hash_crc32_tables.h index 5a4d82fe4..ce1b162ee 100644 --- a/ext/hash/php_hash_crc32_tables.h +++ b/ext/hash/php_hash_crc32_tables.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_hash_crc32_tables.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_hash_crc32_tables.h 293036 2010-01-03 09:23:27Z sebastian $ */ static const php_hash_uint32 crc32_table[] = { 0x0, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b, diff --git a/ext/hash/php_hash_gost.h b/ext/hash/php_hash_gost.h index ac025eb17..9fbe9c0c4 100644 --- a/ext/hash/php_hash_gost.h +++ b/ext/hash/php_hash_gost.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_hash_gost.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_hash_gost.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_HASH_GOST_H #define PHP_HASH_GOST_H diff --git a/ext/hash/php_hash_haval.h b/ext/hash/php_hash_haval.h index 267548644..76d6a450f 100644 --- a/ext/hash/php_hash_haval.h +++ b/ext/hash/php_hash_haval.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_hash_haval.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_hash_haval.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_HASH_HAVAL_H #define PHP_HASH_HAVAL_H diff --git a/ext/hash/php_hash_md.h b/ext/hash/php_hash_md.h index 7256032de..8394ae53e 100644 --- a/ext/hash/php_hash_md.h +++ b/ext/hash/php_hash_md.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_hash_md.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_hash_md.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_HASH_MD_H #define PHP_HASH_MD_H diff --git a/ext/hash/php_hash_ripemd.h b/ext/hash/php_hash_ripemd.h index 41680deec..eab0505ab 100644 --- a/ext/hash/php_hash_ripemd.h +++ b/ext/hash/php_hash_ripemd.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_hash_ripemd.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_hash_ripemd.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_HASH_RIPEMD_H #define PHP_HASH_RIPEMD_H diff --git a/ext/hash/php_hash_salsa.h b/ext/hash/php_hash_salsa.h index 57609c74c..2a6a589b9 100644 --- a/ext/hash/php_hash_salsa.h +++ b/ext/hash/php_hash_salsa.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_hash_salsa.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_hash_salsa.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_HASH_SALSA_H #define PHP_HASH_SALSA_H diff --git a/ext/hash/php_hash_sha.h b/ext/hash/php_hash_sha.h index 4dcc785da..213f329d6 100644 --- a/ext/hash/php_hash_sha.h +++ b/ext/hash/php_hash_sha.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_hash_sha.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_hash_sha.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_HASH_SHA_H #define PHP_HASH_SHA_H diff --git a/ext/hash/php_hash_snefru.h b/ext/hash/php_hash_snefru.h index 7d472108d..b01606436 100644 --- a/ext/hash/php_hash_snefru.h +++ b/ext/hash/php_hash_snefru.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_hash_snefru.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_hash_snefru.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_HASH_SNEFRU_H #define PHP_HASH_SNEFRU_H diff --git a/ext/hash/php_hash_snefru_tables.h b/ext/hash/php_hash_snefru_tables.h index 94304ceed..4d5f4abb6 100644 --- a/ext/hash/php_hash_snefru_tables.h +++ b/ext/hash/php_hash_snefru_tables.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_hash_snefru_tables.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_hash_snefru_tables.h 293036 2010-01-03 09:23:27Z sebastian $ */ static const php_hash_uint32 tables[16][256]= { diff --git a/ext/hash/php_hash_tiger.h b/ext/hash/php_hash_tiger.h index 70b6b683e..78b05e1a8 100644 --- a/ext/hash/php_hash_tiger.h +++ b/ext/hash/php_hash_tiger.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_hash_tiger.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_hash_tiger.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_HASH_TIGER_H #define PHP_HASH_TIGER_H diff --git a/ext/hash/php_hash_tiger_tables.h b/ext/hash/php_hash_tiger_tables.h index 9de52a73a..9e1f2f585 100644 --- a/ext/hash/php_hash_tiger_tables.h +++ b/ext/hash/php_hash_tiger_tables.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_hash_tiger_tables.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_hash_tiger_tables.h 293036 2010-01-03 09:23:27Z sebastian $ */ #define t1 (table) #define t2 (table+256) diff --git a/ext/hash/php_hash_types.h b/ext/hash/php_hash_types.h index 9cb50b93f..6e5266236 100644 --- a/ext/hash/php_hash_types.h +++ b/ext/hash/php_hash_types.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_hash_types.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_hash_types.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_HASH_TYPES_H #define PHP_HASH_TYPES_H diff --git a/ext/hash/php_hash_whirlpool.h b/ext/hash/php_hash_whirlpool.h index 841c5ab32..a871c2330 100644 --- a/ext/hash/php_hash_whirlpool.h +++ b/ext/hash/php_hash_whirlpool.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_hash_whirlpool.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_hash_whirlpool.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_HASH_WHIRLPOOL_H #define PHP_HASH_WHIRLPOOL_H diff --git a/ext/hash/php_hash_whirlpool_tables.h b/ext/hash/php_hash_whirlpool_tables.h index 562455877..d40e80bbe 100644 --- a/ext/hash/php_hash_whirlpool_tables.h +++ b/ext/hash/php_hash_whirlpool_tables.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_hash_whirlpool_tables.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_hash_whirlpool_tables.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_HASH_WHIRLPOOL_TABLES_H #define PHP_HASH_WHIRLPOOL_TABLES_H diff --git a/ext/iconv/iconv.c b/ext/iconv/iconv.c index e5ef4b38a..8007fec12 100644 --- a/ext/iconv/iconv.c +++ b/ext/iconv/iconv.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: iconv.c 277327 2009-03-17 05:31:04Z moriyoshi $ */ +/* $Id: iconv.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/iconv/php_iconv.h b/ext/iconv/php_iconv.h index a19e56f7b..332ff3357 100644 --- a/ext/iconv/php_iconv.h +++ b/ext/iconv/php_iconv.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,21 +17,21 @@ +----------------------------------------------------------------------+ */ -/* $Revision: 272370 $ */ +/* $Revision: 293978 $ */ #ifndef PHP_ICONV_H #define PHP_ICONV_H #ifdef PHP_WIN32 -# ifdef PHP_ICONV_EXPORTS -# define PHP_ICONV_API __declspec(dllexport) -# else -# define PHP_ICONV_API __declspec(dllimport) -# endif +# ifdef PHP_ICONV_EXPORTS +# define PHP_ICONV_API __declspec(dllexport) +# else +# define PHP_ICONV_API __declspec(dllimport) +# endif #elif defined(__GNUC__) && __GNUC__ >= 4 -# define PHP_ICONV_API __attribute__ ((visibility("default"))) +# define PHP_ICONV_API __attribute__ ((visibility("default"))) #else -# define PHP_ICONV_API +# define PHP_ICONV_API #endif #ifdef PHP_ATOM_INC @@ -45,7 +45,6 @@ #include "ext/iconv/php_php_iconv_h_path.h" #endif - #ifdef HAVE_ICONV extern zend_module_entry iconv_module_entry; #define iconv_module_ptr &iconv_module_entry @@ -73,9 +72,9 @@ ZEND_BEGIN_MODULE_GLOBALS(iconv) ZEND_END_MODULE_GLOBALS(iconv) #ifdef ZTS -#define ICONVG(v) TSRMG(iconv_globals_id, zend_iconv_globals *, v) +# define ICONVG(v) TSRMG(iconv_globals_id, zend_iconv_globals *, v) #else -#define ICONVG(v) (iconv_globals.v) +# define ICONVG(v) (iconv_globals.v) #endif #ifdef HAVE_IBM_ICONV @@ -122,7 +121,6 @@ PHP_ICONV_API php_iconv_err_t php_iconv_string(const char * in_p, size_t in_len, #endif /* PHP_ICONV_H */ - /* * Local variables: * tab-width: 4 diff --git a/ext/iconv/tests/iconv_encoding_basic.phpt b/ext/iconv/tests/iconv_encoding_basic.phpt index 150f49b59..746858161 100644 --- a/ext/iconv/tests/iconv_encoding_basic.phpt +++ b/ext/iconv/tests/iconv_encoding_basic.phpt @@ -5,6 +5,10 @@ Test iconv_get_encoding()/iconv_set_encoding() function : basic functionality extension_loaded('iconv') or die('skip'); function_exists('iconv_get_encoding') or die("skip iconv_get_encoding() is not available in this build"); ?> +--INI-- +iconv.input_encoding=ISO-8859-1 +iconv.internal_encoding=ISO-8859-1 +iconv.output_encoding=ISO-8859-1 --FILE-- string(5) "UTF-8" } -Done \ No newline at end of file +Done diff --git a/ext/iconv/tests/iconv_substr_basic.phpt b/ext/iconv/tests/iconv_substr_basic.phpt index b8db8a124..0754fc877 100644 --- a/ext/iconv/tests/iconv_substr_basic.phpt +++ b/ext/iconv/tests/iconv_substr_basic.phpt @@ -5,6 +5,10 @@ Test iconv_substr() function : basic functionality extension_loaded('iconv') or die('skip'); function_exists('iconv_substr') or die("skip iconv_substr() is not available in this build"); ?> +--INI-- +iconv.input_encoding=ISO-8859-1 +iconv.internal_encoding=ISO-8859-1 +iconv.output_encoding=ISO-8859-1 --FILE-- ],[ int i = U8T_CANONICAL; ],[ - ac_cv_u8t_canonical=yes + ac_cv_u8t_decompose=yes ],[ - ac_cv_u8t_canonical=no + ac_cv_u8t_decompose=no ]) ) CFLAGS=$old_CFLAGS - if test "$ac_cv_u8t_canonical" = "no" && test "$ac_cv_utf8_mime2text" = "new"; then + if test "$ac_cv_u8t_decompose" = "no" && test "$ac_cv_utf8_mime2text" = "new"; then AC_MSG_ERROR([utf8_mime2text() has new signature, but U8T_CANONICAL is missing. This should not happen. Check config.log for additional information.]) fi - if test "$ac_cv_u8t_canonical" = "yes" && test "$ac_cv_utf8_mime2text" = "old"; then + if test "$ac_cv_u8t_decompose" = "yes" && test "$ac_cv_utf8_mime2text" = "old"; then AC_MSG_ERROR([utf8_mime2text() has old signature, but U8T_CANONICAL is present. This should not happen. Check config.log for additional information.]) fi diff --git a/ext/imap/config.w32 b/ext/imap/config.w32 index 41c1b46f8..c9742b174 100644 --- a/ext/imap/config.w32 +++ b/ext/imap/config.w32 @@ -1,4 +1,4 @@ -// $Id: config.w32 279950 2009-05-05 01:51:13Z jani $ +// $Id: config.w32 294699 2010-02-07 13:06:54Z pajoye $ // vim:ft=javascript ARG_WITH("imap", "IMAP Support", "no"); @@ -21,6 +21,7 @@ if (PHP_IMAP == "yes") { AC_DEFINE('HAVE_NEW_MIME2TEXT', 1, 'Have utf8_mime2text', true); AC_DEFINE('HAVE_RFC822_OUTPUT_ADDRESS_LIST', 1, 'Have rfc822_output_address_list', true); AC_DEFINE('HAVE_IMAP_MUTF7', 1, 'Have modified utf7 support', true); + AC_DEFINE('HAVE_NEW_MIME2TEXT', 1, 'Whether utf8_mime2text() has new signature'); } else { WARNING("imap not enabled; libraries and headers not found"); } diff --git a/ext/imap/php_imap.c b/ext/imap/php_imap.c index f82194290..34e55fca4 100644 --- a/ext/imap/php_imap.c +++ b/ext/imap/php_imap.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -26,7 +26,7 @@ | PHP 4.0 updates: Zeev Suraski | +----------------------------------------------------------------------+ */ -/* $Id: php_imap.c 289435 2009-10-09 17:38:19Z pajoye $ */ +/* $Id: php_imap.c 294699 2010-02-07 13:06:54Z pajoye $ */ #define IMAP41 @@ -41,6 +41,7 @@ #include "ext/standard/info.h" #include "ext/standard/file.h" #include "ext/standard/php_smart_str.h" +#include "ext/pcre/php_pcre.h" #ifdef ERROR #undef ERROR @@ -104,6 +105,7 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_imap_open, 0, 0, 3) ZEND_ARG_INFO(0, password) ZEND_ARG_INFO(0, options) ZEND_ARG_INFO(0, n_retries) + ZEND_ARG_INFO(0, params) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_imap_reopen, 0, 0, 2) @@ -118,6 +120,7 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_imap_append, 0, 0, 3) ZEND_ARG_INFO(0, folder) ZEND_ARG_INFO(0, message) ZEND_ARG_INFO(0, options) + ZEND_ARG_INFO(0, date) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_imap_num_msg, 0, 0, 1) @@ -1146,10 +1149,11 @@ static void php_imap_do_open(INTERNAL_FUNCTION_PARAMETERS, int persistent) long retries = 0, flags = NIL, cl_flags = NIL; MAILSTREAM *imap_stream; pils *imap_le_struct; + zval *params = NULL; int argc = ZEND_NUM_ARGS(); - if (zend_parse_parameters(argc TSRMLS_CC, "sss|ll", &mailbox, &mailbox_len, &user, &user_len, - &passwd, &passwd_len, &flags, &retries) == FAILURE) { + if (zend_parse_parameters(argc TSRMLS_CC, "sss|lla", &mailbox, &mailbox_len, &user, &user_len, + &passwd, &passwd_len, &flags, &retries, ¶ms) == FAILURE) { return; } @@ -1163,6 +1167,46 @@ static void php_imap_do_open(INTERNAL_FUNCTION_PARAMETERS, int persistent) } } + if (params) { + zval **disabled_auth_method; + + if (zend_hash_find(HASH_OF(params), "DISABLE_AUTHENTICATOR", sizeof("DISABLE_AUTHENTICATOR"), (void **)&disabled_auth_method) == SUCCESS) { + switch (Z_TYPE_PP(disabled_auth_method)) { + case IS_STRING: + if (Z_STRLEN_PP(disabled_auth_method) > 1) { + mail_parameters (NIL, DISABLE_AUTHENTICATOR, (void *)Z_STRVAL_PP(disabled_auth_method)); + } + break; + case IS_ARRAY: + { + zval **z_auth_method; + int i; + int nelems = zend_hash_num_elements(Z_ARRVAL_PP(disabled_auth_method)); + + if (nelems == 0 ) { + break; + } + for (i = 0; i < nelems; i++) { + if (zend_hash_index_find(Z_ARRVAL_PP(disabled_auth_method), i, (void **) &z_auth_method) == SUCCESS) { + if (Z_TYPE_PP(z_auth_method) == IS_STRING) { + if (Z_STRLEN_PP(z_auth_method) > 1) { + mail_parameters (NIL, DISABLE_AUTHENTICATOR, (void *)Z_STRVAL_PP(disabled_auth_method)); + } + } else { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid argument, expect string or array of strings"); + } + } + } + } + break; + case IS_LONG: + default: + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid argument, expect string or array of strings"); + break; + } + } + } + if (IMAPG(imap_user)) { efree(IMAPG(imap_user)); } @@ -1265,25 +1309,47 @@ PHP_FUNCTION(imap_reopen) } /* }}} */ -/* {{{ proto bool imap_append(resource stream_id, string folder, string message [, string options]) +/* {{{ proto bool imap_append(resource stream_id, string folder, string message [, string options [, string internal_date]]) Append a new message to a specified mailbox */ PHP_FUNCTION(imap_append) { zval *streamind; - char *folder, *message, *flags = NULL; - int folder_len, message_len, flags_len = 0; + char *folder, *message, *internal_date = NULL, *flags = NULL; + int folder_len, message_len, internal_date_len = 0, flags_len = 0; pils *imap_le_struct; STRING st; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rss|s", &streamind, &folder, &folder_len, &message, &message_len, &flags, &flags_len) == FAILURE) { + char* regex = "/[0-3][0-9]-((Jan)|(Feb)|(Mar)|(Apr)|(May)|(Jun)|(Jul)|(Aug)|(Sep)|(Oct)|(Nov)|(Dec))-[0-9]{4} [0-2][0-9]:[0-5][0-9]:[0-5][0-9] [+-][0-9]{4}/"; + const int regex_len = strlen(regex); + pcre_cache_entry *pce; /* Compiled regex */ + zval *subpats = NULL; /* Parts (not used) */ + long regex_flags = 0; /* Flags (not used) */ + long start_offset = 0; /* Start offset (not used) */ + int global = 0; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rss|ss", &streamind, &folder, &folder_len, &message, &message_len, &flags, &flags_len, &internal_date, &internal_date_len) == FAILURE) { return; } + if (internal_date) { + /* Make sure the given internal_date string matches the RFC specifiedformat */ + if ((pce = pcre_get_compiled_regex_cache(regex, regex_len TSRMLS_CC))== NULL) { + RETURN_FALSE; + } + + php_pcre_match_impl(pce, internal_date, internal_date_len, return_value, subpats, global, + 0, regex_flags, start_offset TSRMLS_CC); + + if (!Z_LVAL_P(return_value)) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "internal date not correctly formatted"); + internal_date = NULL; + } + } + ZEND_FETCH_RESOURCE(imap_le_struct, pils *, &streamind, -1, "imap", le_imap); INIT (&st, mail_string, (void *) message, message_len); - if (mail_append_full(imap_le_struct->imap_stream, folder, (flags ? flags : NIL), NIL, &st)) { + if (mail_append_full(imap_le_struct->imap_stream, folder, (flags ? flags : NIL), (internal_date ? internal_date : NIL), &st)) { RETURN_TRUE; } else { RETURN_FALSE; @@ -2598,7 +2664,7 @@ PHP_FUNCTION(imap_utf8) #ifndef HAVE_NEW_MIME2TEXT utf8_mime2text(&src, &dest); #else - utf8_mime2text(&src, &dest, U8T_CANONICAL); + utf8_mime2text(&src, &dest, U8T_DECOMPOSE); #endif RETVAL_STRINGL(dest.data, dest.size, 1); if (dest.data) { diff --git a/ext/imap/php_imap.h b/ext/imap/php_imap.h index 5b7524b86..9d869d238 100644 --- a/ext/imap/php_imap.h +++ b/ext/imap/php_imap.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -27,7 +27,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_imap.h 279937 2009-05-05 01:22:44Z jani $ */ +/* $Id: php_imap.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_IMAP_H #define PHP_IMAP_H diff --git a/ext/imap/tests/bug44098.phpt b/ext/imap/tests/bug44098.phpt new file mode 100644 index 000000000..f758c117b --- /dev/null +++ b/ext/imap/tests/bug44098.phpt @@ -0,0 +1,20 @@ +--TEST-- +Bug #44098 (imap_utf8() returns only capital letters) +--SKIPIF-- + +--FILE-- +, expected \n"; +} else { + echo "ok"; +} +?> +--EXPECT-- +ok diff --git a/ext/imap/tests/imap_body.phpt b/ext/imap/tests/imap_body.phpt index 08f63db47..40f35f07a 100644 --- a/ext/imap/tests/imap_body.phpt +++ b/ext/imap/tests/imap_body.phpt @@ -15,6 +15,18 @@ imap_body(); echo "Checking with incorrect parameter type\n"; imap_body(''); imap_body(false); +require_once(dirname(__FILE__).'/imap_include.inc'); +$stream_id = imap_open($default_mailbox, $username, $password) or + die("Cannot connect to mailbox $default_mailbox: " . imap_last_error()); +imap_body($stream_id); +imap_body($stream_id,-1); +imap_body($stream_id,1,-1); + +//Access not existing +var_dump(imap_body($stream_id, 999, FT_UID)); + +imap_close($stream_id); + ?> --EXPECTF-- Checking with no parameters @@ -25,3 +37,12 @@ Checking with incorrect parameter type Warning: imap_body() expects at least 2 parameters, 1 given in %s on line %d Warning: imap_body() expects at least 2 parameters, 1 given in %s on line %d + +Warning: imap_body() expects at least 2 parameters, 1 given in %s on line %d + +Warning: imap_body(): Bad message number in %s on line %d + +Warning: imap_body(): invalid value for the options parameter in %s on line %d + +Warning: imap_body(): Bad message number in %s on line %d +bool(false) \ No newline at end of file diff --git a/ext/imap/tests/imap_body_basic.phpt b/ext/imap/tests/imap_body_basic.phpt index 7cd518111..0eb4a2b83 100644 --- a/ext/imap/tests/imap_body_basic.phpt +++ b/ext/imap/tests/imap_body_basic.phpt @@ -27,6 +27,9 @@ echo "Msg Count in new mailbox: ". $check->Nmsgs . "\n"; // show body for msg 1 var_dump(imap_body($imap_stream, 1)); +//Access via FT_UID +var_dump(imap_body($imap_stream, 1, FT_UID)); + imap_close($imap_stream); ?> ===Done=== @@ -40,5 +43,6 @@ Create a new mailbox for test Create a temporary mailbox and add 1 msgs .. mailbox '%s' created Msg Count in new mailbox: 1 -string(%d) "1: this is a test message, please ignore%a" -===Done=== \ No newline at end of file +%unicode|string%(%d) "1: this is a test message, please ignore%a" +%unicode|string%(%d) "1: this is a test message, please ignore%a" +===Done=== diff --git a/ext/imap/tests/imap_bodystruct_basic.phpt b/ext/imap/tests/imap_bodystruct_basic.phpt index 4edc753b6..cc643a6b5 100644 --- a/ext/imap/tests/imap_bodystruct_basic.phpt +++ b/ext/imap/tests/imap_bodystruct_basic.phpt @@ -77,7 +77,7 @@ require_once('clean.inc'); *** Testing string imap_bodystruct : basic functionality *** Create a new mailbox for test and add a multipart msgs Create a temporary mailbox and add 1 msgs -.. mailbox '{localhost/norsh}INBOX.phpttest' created +.. mailbox '{%s}%s' created Get and validate structure of body part 1 ifsubtype is 0 or 1 diff --git a/ext/imap/tests/imap_clearflag_full_basic.phpt b/ext/imap/tests/imap_clearflag_full_basic.phpt index fb7465dc4..4269688e1 100644 --- a/ext/imap/tests/imap_clearflag_full_basic.phpt +++ b/ext/imap/tests/imap_clearflag_full_basic.phpt @@ -56,7 +56,7 @@ require_once('clean.inc'); *** Testing imap_clearflag_full() : basic functionality *** Create a new mailbox for test Create a temporary mailbox and add 10 msgs -.. mailbox '{localhost/norsh}INBOX.%s' created +.. mailbox '{%s}%s' created Initial msg count in new_mailbox : 10 Set some flags bool(true) diff --git a/ext/imap/tests/imap_close_variation2.phpt b/ext/imap/tests/imap_close_variation2.phpt index 6378e88ad..feadfed5f 100644 --- a/ext/imap/tests/imap_close_variation2.phpt +++ b/ext/imap/tests/imap_close_variation2.phpt @@ -118,7 +118,7 @@ require_once(dirname(__FILE__).'/clean.inc'); --EXPECTF-- *** Testing imap_close() : usage variations *** Create a temporary mailbox and add 3 msgs -.. mailbox '{localhost/norsh}INBOX.phpttest' created +.. mailbox '{%s}%s' created -- Iteration 1 -- bool(true) diff --git a/ext/imap/tests/imap_close_variation4.phpt b/ext/imap/tests/imap_close_variation4.phpt index 65b05786f..ca82619d4 100644 --- a/ext/imap/tests/imap_close_variation4.phpt +++ b/ext/imap/tests/imap_close_variation4.phpt @@ -66,7 +66,7 @@ require_once(dirname(__FILE__).'/clean.inc'); --EXPECTF-- *** Testing imap_close() : usage variations *** Create a temporary mailbox and add 3 msgs -.. mailbox '{localhost/norsh}INBOX.phpttest' created +.. mailbox '{%s}%s' created -- Iteration 1 -- bool(true) diff --git a/ext/imap/tests/imap_fetch_overview_basic.phpt b/ext/imap/tests/imap_fetch_overview_basic.phpt index 80d5c69f1..2b4623feb 100644 --- a/ext/imap/tests/imap_fetch_overview_basic.phpt +++ b/ext/imap/tests/imap_fetch_overview_basic.phpt @@ -77,7 +77,7 @@ require_once(dirname(__FILE__).'/clean.inc'); --EXPECTF-- *** Testing imap_fetch_overview() : basic functionality *** Create a temporary mailbox and add 2 msgs -.. mailbox '{localhost/norsh}INBOX.phpttest' created +.. mailbox '{%s}%s' created -- All possible arguments -- diff --git a/ext/imap/tests/imap_fetch_overview_error.phpt b/ext/imap/tests/imap_fetch_overview_error.phpt index 2fc0f343c..e300e6292 100644 --- a/ext/imap/tests/imap_fetch_overview_error.phpt +++ b/ext/imap/tests/imap_fetch_overview_error.phpt @@ -42,7 +42,7 @@ require_once(dirname(__FILE__).'/clean.inc'); -- Testing imap_fetch_overview() function with more than expected no. of arguments -- Create a temporary mailbox and add 2 msgs -.. mailbox '{localhost/norsh}INBOX.phpttest' created +.. mailbox '{%s}%s' created Warning: imap_fetch_overview() expects at most 3 parameters, 4 given in %s on line %d NULL diff --git a/ext/imap/tests/imap_fetch_overview_variation2.phpt b/ext/imap/tests/imap_fetch_overview_variation2.phpt index dfc3783d0..8634cefab 100644 --- a/ext/imap/tests/imap_fetch_overview_variation2.phpt +++ b/ext/imap/tests/imap_fetch_overview_variation2.phpt @@ -136,7 +136,7 @@ require_once(dirname(__FILE__).'/clean.inc'); --EXPECTF-- *** Testing imap_fetch_overview() : usage variations *** Create a temporary mailbox and add 1 msgs -.. mailbox '{localhost/norsh}INBOX.phpttest' created +.. mailbox '{%s}%s' created -- Testing with second argument value: int(0) Sequence out of range diff --git a/ext/imap/tests/imap_fetch_overview_variation3.phpt b/ext/imap/tests/imap_fetch_overview_variation3.phpt index 5fa56b5f7..7bd78d899 100644 --- a/ext/imap/tests/imap_fetch_overview_variation3.phpt +++ b/ext/imap/tests/imap_fetch_overview_variation3.phpt @@ -56,7 +56,7 @@ require_once(dirname(__FILE__).'/clean.inc'); --EXPECTF-- *** Testing imap_fetch_overview() : usage variations *** Create a temporary mailbox and add 1 msgs -.. mailbox '{localhost/norsh}INBOX.phpttest' created +.. mailbox '{%s}%s' created Testing with option value:%string|unicode%(1) "1" imap_fetch_overview() returns an object diff --git a/ext/imap/tests/imap_fetch_overview_variation5.phpt b/ext/imap/tests/imap_fetch_overview_variation5.phpt index 79861be7a..d5bc88858 100644 --- a/ext/imap/tests/imap_fetch_overview_variation5.phpt +++ b/ext/imap/tests/imap_fetch_overview_variation5.phpt @@ -67,7 +67,7 @@ require_once(dirname(__FILE__).'/clean.inc'); --EXPECTF-- *** Testing imap_fetch_overview() : usage variations *** Create a temporary mailbox and add 3 msgs -.. mailbox '{localhost/norsh}INBOX.phpttest' created +.. mailbox '{%s}%s' created -- $msg_no is 0 -- Sequence out of range diff --git a/ext/imap/tests/imap_fetch_overview_variation6.phpt b/ext/imap/tests/imap_fetch_overview_variation6.phpt index fda937e24..6ee65f68f 100644 --- a/ext/imap/tests/imap_fetch_overview_variation6.phpt +++ b/ext/imap/tests/imap_fetch_overview_variation6.phpt @@ -110,7 +110,7 @@ require_once(dirname(__FILE__).'/clean.inc'); --EXPECTF-- *** Testing imap_fetch_overview() : usage variations *** Create a temporary mailbox and add 0 msgs -.. mailbox '{localhost/norsh}INBOX.phpttest' created +.. mailbox '{%s}%s' created --> Object #1 size is %d diff --git a/ext/imap/tests/imap_fetchbody_basic.phpt b/ext/imap/tests/imap_fetchbody_basic.phpt index 469d498f1..66b84b165 100644 --- a/ext/imap/tests/imap_fetchbody_basic.phpt +++ b/ext/imap/tests/imap_fetchbody_basic.phpt @@ -64,7 +64,7 @@ require_once(dirname(__FILE__).'/clean.inc'); --EXPECTF-- *** Testing imap_fetchbody() : basic functionality *** Create a temporary mailbox and add 1 msgs -.. mailbox '{localhost/norsh}INBOX.phpttest' created +.. mailbox '{%s}%s' created -- All possible arguments -- -- Option is FT_UID -- diff --git a/ext/imap/tests/imap_fetchbody_error.phpt b/ext/imap/tests/imap_fetchbody_error.phpt index 77b71644f..f496fbd76 100644 --- a/ext/imap/tests/imap_fetchbody_error.phpt +++ b/ext/imap/tests/imap_fetchbody_error.phpt @@ -45,7 +45,7 @@ require_once(dirname(__FILE__).'/clean.inc'); -- Testing imap_fetchbody() function with more than expected no. of arguments -- Create a temporary mailbox and add 1 msgs -.. mailbox '{localhost/norsh}INBOX.phpttest' created +.. mailbox '{%s}%s' created Warning: imap_fetchbody() expects at most 4 parameters, 5 given in %s on line %d NULL diff --git a/ext/imap/tests/imap_fetchbody_variation2.phpt b/ext/imap/tests/imap_fetchbody_variation2.phpt index e80ac3915..64b7a3284 100644 --- a/ext/imap/tests/imap_fetchbody_variation2.phpt +++ b/ext/imap/tests/imap_fetchbody_variation2.phpt @@ -103,7 +103,7 @@ require_once(dirname(__FILE__).'/clean.inc'); --EXPECTF-- *** Testing imap_fetchbody() : usage variations *** Create a temporary mailbox and add 1 msgs -.. mailbox '{localhost/norsh}INBOX.phpttest' created +.. mailbox '{%s}%s' created -- Iteration 1 -- diff --git a/ext/imap/tests/imap_fetchbody_variation4.phpt b/ext/imap/tests/imap_fetchbody_variation4.phpt index 6b9579abd..d8126bce0 100644 --- a/ext/imap/tests/imap_fetchbody_variation4.phpt +++ b/ext/imap/tests/imap_fetchbody_variation4.phpt @@ -53,7 +53,7 @@ require_once(dirname(__FILE__).'/clean.inc'); --EXPECTF-- *** Testing imap_fetchbody() : usage variations *** Create a temporary mailbox and add 1 msgs -.. mailbox '{localhost/norsh}INBOX.phpttest' created +.. mailbox '{%s}%s' created -- Iteration 1 -- FT_UID valid diff --git a/ext/imap/tests/imap_fetchbody_variation6.phpt b/ext/imap/tests/imap_fetchbody_variation6.phpt index 608a0459d..52a50a77d 100644 --- a/ext/imap/tests/imap_fetchbody_variation6.phpt +++ b/ext/imap/tests/imap_fetchbody_variation6.phpt @@ -44,7 +44,7 @@ require_once(dirname(__FILE__).'/clean.inc'); --EXPECTF-- *** Testing imap_fetchbody() : usage variations *** Create a temporary mailbox and add 3 msgs -.. mailbox '{localhost/norsh}INBOX.phpttest' created +.. mailbox '{%s}%s' created -- $msg_no is 0 -- diff --git a/ext/imap/tests/imap_fetchheader_variation2.phpt b/ext/imap/tests/imap_fetchheader_variation2.phpt index d2269adf8..fe115779f 100644 --- a/ext/imap/tests/imap_fetchheader_variation2.phpt +++ b/ext/imap/tests/imap_fetchheader_variation2.phpt @@ -118,7 +118,7 @@ require_once(dirname(__FILE__).'/clean.inc'); --EXPECTF-- *** Testing imap_fetchheader() : usage variations *** Create a temporary mailbox and add 1 msgs -.. mailbox '{localhost/norsh}INBOX.phpttest' created +.. mailbox '{%s}%s' created -- Iteration 1 -- @@ -128,7 +128,7 @@ bool(false) -- Iteration 2 -- %unicode|string%(%d) "From: foo@anywhere.com Subject: Test msg 1 -To: webmaster@something.com +To: %s MIME-Version: 1.0 Content-Type: MULTIPART/mixed; BOUNDARY="%s" @@ -182,7 +182,7 @@ bool(false) -- Iteration 12 -- %unicode|string%(%d) "From: foo@anywhere.com Subject: Test msg 1 -To: webmaster@something.com +To: %s MIME-Version: 1.0 Content-Type: MULTIPART/mixed; BOUNDARY="%s" @@ -196,7 +196,7 @@ bool(false) -- Iteration 14 -- %unicode|string%(%d) "From: foo@anywhere.com Subject: Test msg 1 -To: webmaster@something.com +To: %s MIME-Version: 1.0 Content-Type: MULTIPART/mixed; BOUNDARY="%s" diff --git a/ext/imap/tests/imap_fetchheader_variation3.phpt b/ext/imap/tests/imap_fetchheader_variation3.phpt index e21c1a966..feba766e6 100644 --- a/ext/imap/tests/imap_fetchheader_variation3.phpt +++ b/ext/imap/tests/imap_fetchheader_variation3.phpt @@ -51,7 +51,7 @@ require_once(dirname(__FILE__).'/clean.inc'); --EXPECTF-- *** Testing imap_fetchheader() : usage variations *** Create a temporary mailbox and add 1 msgs -.. mailbox '{localhost/norsh}INBOX.phpttest' created +.. mailbox '{%s}%s' created -- Iteration 1 -- FT_UID valid diff --git a/ext/imap/tests/imap_fetchheader_variation5.phpt b/ext/imap/tests/imap_fetchheader_variation5.phpt index 6f5b426d3..ed2aa84dc 100644 --- a/ext/imap/tests/imap_fetchheader_variation5.phpt +++ b/ext/imap/tests/imap_fetchheader_variation5.phpt @@ -45,7 +45,7 @@ require_once(dirname(__FILE__).'/clean.inc'); --EXPECTF-- *** Testing imap_fetchheader() : usage variations *** Create a temporary mailbox and add 3 msgs -.. mailbox '{localhost/norsh}INBOX.phpttest' created +.. mailbox '{%s}%s' created -- $msg_no is 0 -- @@ -64,7 +64,7 @@ bool(false) Notice: A non well formed numeric value encountered in %s on line %d %unicode|string%(%d) "From: foo@anywhere.com Subject: Test msg 1 -To: webmaster@something.com +To: %s MIME-Version: 1.0 Content-Type: MULTIPART/mixed; BOUNDARY="%s" @@ -75,7 +75,7 @@ Content-Type: MULTIPART/mixed; BOUNDARY="%s" Notice: A non well formed numeric value encountered in %s on line %d %unicode|string%(%d) "From: foo@anywhere.com Subject: Test msg 1 -To: webmaster@something.com +To: %s MIME-Version: 1.0 Content-Type: MULTIPART/mixed; BOUNDARY="%s" diff --git a/ext/imap/tests/imap_fetchstructure_basic.phpt b/ext/imap/tests/imap_fetchstructure_basic.phpt new file mode 100644 index 000000000..7ad4fc562 --- /dev/null +++ b/ext/imap/tests/imap_fetchstructure_basic.phpt @@ -0,0 +1,70 @@ +--TEST-- +imap_fetchstructure() function : basic functionality +--CREDITS-- +Olivier Doucet +--SKIPIF-- + +--FILE-- +$key)); +} +var_dump($z->type); +var_dump($z->encoding); +var_dump($z->bytes); +var_dump($z->lines); +var_dump(is_object($z->parameters)); + +imap_close($stream_id); +?> +--CLEAN-- + +--EXPECTF-- +Checking with no parameters + +Warning: imap_fetchstructure() expects at least 2 parameters, 0 given in %s on line %d +Checking with incorrect parameter type + +Warning: imap_fetchstructure() expects at least 2 parameters, 1 given in %s on line %d + +Warning: imap_fetchstructure() expects at least 2 parameters, 1 given in %s on line %d +Create a temporary mailbox and add 1 msgs +.. mailbox '{%s}%s' created + +Warning: imap_fetchstructure() expects at least 2 parameters, 1 given in %s on line %d +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +int(%d) +int(%d) +int(%d) +int(%d) +bool(true) \ No newline at end of file diff --git a/ext/imap/tests/imap_gc_error.phpt b/ext/imap/tests/imap_gc_error.phpt index c0830c000..f8e6201eb 100644 --- a/ext/imap/tests/imap_gc_error.phpt +++ b/ext/imap/tests/imap_gc_error.phpt @@ -16,6 +16,11 @@ echo "Checking with incorrect parameter type\n"; imap_gc('', false); imap_gc(false, false); +require_once(dirname(__FILE__).'/imap_include.inc'); +$stream_id = imap_open($default_mailbox, $username, $password) or + die("Cannot connect to mailbox $default_mailbox: " . imap_last_error()); +imap_gc($stream_id, -1); + ?> --EXPECTF-- Checking with no parameters @@ -26,3 +31,5 @@ Checking with incorrect parameter type Warning: imap_gc() expects parameter 1 to be resource, %unicode_string_optional% given in %s on line %d Warning: imap_gc() expects parameter 1 to be resource, boolean given in %s on line %d + +Warning: imap_gc(): invalid value for the flags parameter in %s on line %d diff --git a/ext/imap/tests/imap_getsubscribed_basic.phpt b/ext/imap/tests/imap_getsubscribed_basic.phpt new file mode 100644 index 000000000..ba8a42daa --- /dev/null +++ b/ext/imap/tests/imap_getsubscribed_basic.phpt @@ -0,0 +1,68 @@ +--TEST-- +imap_getsubscribed() function : basic functionality +--CREDITS-- +Olivier Doucet +--SKIPIF-- + +--FILE-- + +--CLEAN-- + +--EXPECTF-- +Checking with no parameters + +Warning: imap_getsubscribed() expects exactly 3 parameters, 0 given in %s on line %d +Checking with incorrect parameter type + +Warning: imap_getsubscribed() expects exactly 3 parameters, 1 given in %s on line %d + +Warning: imap_getsubscribed() expects exactly 3 parameters, 1 given in %s on line %d + +Warning: imap_getsubscribed() expects exactly 3 parameters, 1 given in %s on line %d + +Warning: imap_getsubscribed() expects exactly 3 parameters, 2 given in %s on line %d +bool(false) +Checking OK +bool(true) +object(stdClass)#%d (%d) { + [%sname"]=> + string(%d) "{%s}%s" + [%sattributes"]=> + int(%d) + [%sdelimiter"]=> + string(%d) "%s" +} \ No newline at end of file diff --git a/ext/imap/tests/imap_headerinfo_basic.phpt b/ext/imap/tests/imap_headerinfo_basic.phpt new file mode 100644 index 000000000..b772476af --- /dev/null +++ b/ext/imap/tests/imap_headerinfo_basic.phpt @@ -0,0 +1,129 @@ +--TEST-- +imap_headerinfo() function : basic functionality +--CREDITS-- +Olivier Doucet +--SKIPIF-- + +--FILE-- +$key)); +} + +echo "Check type\n"; +var_dump($z->toaddress); +var_dump($z->fromaddress); +var_dump($z->reply_toaddress); +var_dump($z->senderaddress); +var_dump($z->subject); +var_dump($z->Subject); + +if ($z->Recent == 'R' || $z->Recent == 'N' || $z->Recent == ' ') { + echo "Recent: OK"; +} else { + echo "Recent: error: ".$z->Recent; +} +echo "\n"; + +if ($z->Unseen == 'U' || $z->Unseen == ' ') { + echo "Unseen: OK"; +} else { + echo "Unseen: error: ".$z->Unseen; +} +echo "\n"; + +if ($z->Flagged == 'F' || $z->Flagged == ' ') { + echo "Flagged: OK"; +} else { + echo "Flagged: error: ".$z->Flagged; +} +echo "\n"; + +if ($z->Answered == 'A' || $z->Answered == ' ') { + echo "Answered: OK"; +} else { + echo "Answered: error"; +} +echo "\n"; + +if ($z->Deleted == 'D' || $z->Deleted == ' ') { + echo "Deleted: OK"; +} else { + echo "Deleted: error"; +} +echo "\n"; + +if ($z->Draft == 'X' || $z->Draft == ' ') { + echo "Draft: OK"; +} else { + echo "Draft: error"; +} +echo "\n"; + +var_dump($z->Msgno); +var_dump($z->Size); +var_dump($z->udate); + +imap_close($stream_id); + +?> +--CLEAN-- + +--EXPECTF-- +Create a temporary mailbox and add 1 msgs +.. mailbox '{%s}%s' created +Check general fields +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +Check type +string(%d) "%s" +string(%d) "%s" +string(%d) "%s" +string(%d) "%s" +string(%d) "%s" +string(%d) "%s" +Recent: OK +Unseen: OK +Flagged: OK +Answered: OK +Deleted: OK +Draft: OK +string(%d) "%s" +string(%d) "%d" +int(%d) \ No newline at end of file diff --git a/ext/imap/tests/imap_headerinfo_error.phpt b/ext/imap/tests/imap_headerinfo_error.phpt new file mode 100644 index 000000000..b526096fe --- /dev/null +++ b/ext/imap/tests/imap_headerinfo_error.phpt @@ -0,0 +1,36 @@ +--TEST-- +imap_headerinfo() incorrect parameter count +--CREDITS-- +Olivier Doucet +--SKIPIF-- + +--FILE-- + +--EXPECTF-- +Checking with no parameters + +Warning: imap_headerinfo() expects at least 2 parameters, 0 given in %s on line %d +Checking with incorrect parameter type + +Warning: imap_headerinfo() expects at least 2 parameters, 1 given in %s on line %d + +Warning: imap_headerinfo() expects at least 2 parameters, 1 given in %s on line %d + +Warning: imap_headerinfo() expects at least 2 parameters, 1 given in %s on line %d diff --git a/ext/imap/tests/imap_list_basic.phpt b/ext/imap/tests/imap_list_basic.phpt new file mode 100644 index 000000000..36f07f755 --- /dev/null +++ b/ext/imap/tests/imap_list_basic.phpt @@ -0,0 +1,47 @@ +--TEST-- +imap_list() function : basic functionality +--CREDITS-- +Olivier Doucet +--SKIPIF-- + +--FILE-- + +--EXPECTF-- +Checking with no parameters + +Warning: imap_list() expects exactly 3 parameters, 0 given in %s on line %d +Checking with incorrect parameter type + +Warning: imap_list() expects exactly 3 parameters, 1 given in %s on line %d + +Warning: imap_list() expects exactly 3 parameters, 1 given in %s on line %d + +Warning: imap_list() expects exactly 3 parameters, 1 given in %s on line %d + +Warning: imap_list() expects exactly 3 parameters, 2 given in %s on line %d +bool(true) +string(%s) "{%s}%s" \ No newline at end of file diff --git a/ext/imap/tests/imap_lsub_basic.phpt b/ext/imap/tests/imap_lsub_basic.phpt new file mode 100644 index 000000000..153ca2a1b --- /dev/null +++ b/ext/imap/tests/imap_lsub_basic.phpt @@ -0,0 +1,61 @@ +--TEST-- +imap_lsub() function : basic functionality +--CREDITS-- +Olivier Doucet +--SKIPIF-- + +--FILE-- + +--CLEAN-- + +--EXPECTF-- +Checking with no parameters + +Warning: imap_lsub() expects exactly 3 parameters, 0 given in %s on line %d +Checking with incorrect parameter type + +Warning: imap_lsub() expects exactly 3 parameters, 1 given in %s on line %d + +Warning: imap_lsub() expects exactly 3 parameters, 1 given in %s on line %d + +Warning: imap_lsub() expects exactly 3 parameters, 1 given in %s on line %d + +Warning: imap_lsub() expects exactly 3 parameters, 2 given in %s on line %d +bool(false) +Checking OK +bool(true) +string(%s) "{%s}%s" \ No newline at end of file diff --git a/ext/imap/tests/imap_mail_copy.phpt b/ext/imap/tests/imap_mail_copy.phpt new file mode 100644 index 000000000..47c5e61bb --- /dev/null +++ b/ext/imap/tests/imap_mail_copy.phpt @@ -0,0 +1,54 @@ +--TEST-- +Test imap_mail_copy() incorrect parameters +--CREDITS-- +Olivier Doucet +--SKIPIF-- + +--FILE-- + +===Done=== +--EXPECTF-- +Checking with no parameters + +Warning: imap_mail_copy() expects at least 3 parameters, 0 given in %s on line %d +Checking with incorrect parameter type + +Warning: imap_mail_copy() expects at least 3 parameters, 1 given in %s on line %d + +Warning: imap_mail_copy() expects at least 3 parameters, 1 given in %s on line %d +Test with IMAP server + +Warning: imap_mail_copy() expects at least 3 parameters, 1 given in %s on line %d +NULL + +Warning: imap_mail_copy() expects at least 3 parameters, 2 given in %s on line %d +NULL + +Warning: imap_mail_copy() expects at least 3 parameters, 2 given in %s on line %d +NULL +===Done=== \ No newline at end of file diff --git a/ext/imap/tests/imap_mail_copy_basic.phpt b/ext/imap/tests/imap_mail_copy_basic.phpt new file mode 100644 index 000000000..a7b9421e3 --- /dev/null +++ b/ext/imap/tests/imap_mail_copy_basic.phpt @@ -0,0 +1,46 @@ +--TEST-- +Test imap_mail_copy() function : basic functionality +--CREDITS-- +Olivier Doucet +--SKIPIF-- + +--FILE-- +Nmsgs . "\n"; + +var_dump(imap_mail_copy($imap_stream, '1', 'INBOX.'.$mailbox_prefix)); + +imap_close($imap_stream); +?> +===Done=== +--CLEAN-- + +--EXPECTF-- +*** Testing imap_mail_copy() : basic functionality *** +Create a new mailbox for test +Create a temporary mailbox and add 1 msgs +.. mailbox '%s' created +Msg Count in new mailbox: 1 +bool(true) +===Done=== \ No newline at end of file diff --git a/ext/imap/tests/imap_mail_move.phpt b/ext/imap/tests/imap_mail_move.phpt new file mode 100644 index 000000000..67ddea713 --- /dev/null +++ b/ext/imap/tests/imap_mail_move.phpt @@ -0,0 +1,54 @@ +--TEST-- +Test imap_mail_move() incorrect parameters +--CREDITS-- +Olivier Doucet +--SKIPIF-- + +--FILE-- + +===Done=== +--EXPECTF-- +Checking with no parameters + +Warning: imap_mail_move() expects at least 3 parameters, 0 given in %s on line %d +Checking with incorrect parameter type + +Warning: imap_mail_move() expects at least 3 parameters, 1 given in %s on line %d + +Warning: imap_mail_move() expects at least 3 parameters, 1 given in %s on line %d +Test with IMAP server + +Warning: imap_mail_move() expects at least 3 parameters, 1 given in %s on line %d +NULL + +Warning: imap_mail_move() expects at least 3 parameters, 2 given in %s on line %d +NULL + +Warning: imap_mail_move() expects at least 3 parameters, 2 given in %s on line %d +NULL +===Done=== \ No newline at end of file diff --git a/ext/imap/tests/imap_mail_move_basic.phpt b/ext/imap/tests/imap_mail_move_basic.phpt new file mode 100644 index 000000000..a54358256 --- /dev/null +++ b/ext/imap/tests/imap_mail_move_basic.phpt @@ -0,0 +1,46 @@ +--TEST-- +Test imap_mail_move() function : basic functionality +--CREDITS-- +Olivier Doucet +--SKIPIF-- + +--FILE-- +Nmsgs . "\n"; + +var_dump(imap_mail_move($imap_stream, '1', 'INBOX.'.$mailbox_prefix)); + +imap_close($imap_stream); +?> +===Done=== +--CLEAN-- + +--EXPECTF-- +*** Testing imap_mail_move() : basic functionality *** +Create a new mailbox for test +Create a temporary mailbox and add 1 msgs +.. mailbox '%s' created +Msg Count in new mailbox: 1 +bool(true) +===Done=== \ No newline at end of file diff --git a/ext/imap/tests/imap_open_error.phpt b/ext/imap/tests/imap_open_error.phpt index 7934ee2ef..83b0eba80 100644 --- a/ext/imap/tests/imap_open_error.phpt +++ b/ext/imap/tests/imap_open_error.phpt @@ -20,6 +20,9 @@ echo "Checking with incorrect parameters\n" ; imap_open('', '', ''); imap_open('', '', '', -1); +require_once(dirname(__FILE__).'/imap_include.inc'); +imap_open($default_mailbox, $username, $password, NIL, -1); + ?> --EXPECTF-- Checking with no parameters @@ -39,4 +42,6 @@ Warning: imap_open(): Couldn't open stream in %s on line %d Warning: imap_open(): Couldn't open stream in %s on line %d +Warning: imap_open(): Retries must be greater or equal to 0 in %s on line %d + Notice: Unknown: Can't open mailbox : no such mailbox (errflg=2) in Unknown on line 0 diff --git a/ext/imap/tests/imap_renamemailbox_basic.phpt b/ext/imap/tests/imap_renamemailbox_basic.phpt new file mode 100644 index 000000000..b445f1d3e --- /dev/null +++ b/ext/imap/tests/imap_renamemailbox_basic.phpt @@ -0,0 +1,66 @@ +--TEST-- +imap_renamemailbox() function : basic functionality +--CREDITS-- +Olivier Doucet +--SKIPIF-- + +--FILE-- + +--CLEAN-- + +--EXPECTF-- +Checking with no parameters + +Warning: imap_renamemailbox() expects exactly 3 parameters, 0 given in %s on line %d +Checking with incorrect parameter type + +Warning: imap_renamemailbox() expects exactly 3 parameters, 1 given in %s on line %d + +Warning: imap_renamemailbox() expects exactly 3 parameters, 1 given in %s on line %d +Create a temporary mailbox and add 1 msgs +.. mailbox '{%s}%s' created + +Warning: imap_renamemailbox() expects exactly 3 parameters, 2 given in %s on line %d + +Warning: imap_renamemailbox() expects exactly 3 parameters, 2 given in %s on line %d +Checking OK +bool(true) +bool(true) diff --git a/ext/imap/tests/imap_rfc822_parse_headers_basic.phpt b/ext/imap/tests/imap_rfc822_parse_headers_basic.phpt new file mode 100644 index 000000000..e4253925d --- /dev/null +++ b/ext/imap/tests/imap_rfc822_parse_headers_basic.phpt @@ -0,0 +1,122 @@ +--TEST-- +imap_rfc822_parse_headers() function : basic functionality +--CREDITS-- +Olivier Doucet +--SKIPIF-- + +--FILE-- +$key)); +} + +echo "Check type\n"; +var_dump($z->toaddress); +var_dump($z->fromaddress); +var_dump($z->reply_toaddress); +var_dump($z->senderaddress); +var_dump($z->subject); +var_dump($z->Subject); + +if ($z->Recent == 'R' || $z->Recent == 'N' || $z->Recent == ' ') { + echo "Recent: OK"; +} else { + echo "Recent: error"; +} +echo "\n"; + +if ($z->Unseen == 'U' || $z->Unseen == ' ') { + echo "Unseen: OK"; +} else { + echo "Unseen: error"; +} +echo "\n"; + +if ($z->Flagged == 'F' || $z->Flagged == ' ') { + echo "Flagged: OK"; +} else { + echo "Flagged: error"; +} +echo "\n"; + +if ($z->Answered == 'A' || $z->Answered == ' ') { + echo "Answered: OK"; +} else { + echo "Answered: error"; +} +echo "\n"; + +if ($z->Deleted == 'D' || $z->Deleted == ' ') { + echo "Deleted: OK"; +} else { + echo "Deleted: error"; +} +echo "\n"; + +if ($z->Draft == 'X' || $z->Draft == ' ') { + echo "Draft: OK"; +} else { + echo "Draft: error"; +} +echo "\n"; + +var_dump($z->Msgno); +var_dump($z->Size); +var_dump($z->udate); + +imap_close($stream_id); + +?> +--CLEAN-- + +--EXPECTF-- +Create a temporary mailbox and add 1 msgs +.. mailbox '{%s}%s' created +Check general fields +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +Check type +string(%d) "%s" +string(%d) "%s" +string(%d) "%s" +string(%d) "%s" +string(%d) "%s" +string(%d) "%s" +Recent: OK +Unseen: OK +Flagged: OK +Answered: OK +Deleted: OK +Draft: OK +string(%d) "%s" +string(%d) "%d" +int(%d) \ No newline at end of file diff --git a/ext/imap/tests/imap_savebody_basic.phpt b/ext/imap/tests/imap_savebody_basic.phpt new file mode 100644 index 000000000..91e6ce03e --- /dev/null +++ b/ext/imap/tests/imap_savebody_basic.phpt @@ -0,0 +1,61 @@ +--TEST-- +imap_savebody() function : basic functionality +--CREDITS-- +Olivier Doucet +--SKIPIF-- + +--FILE-- + +--CLEAN-- + +--EXPECTF-- +Checking with no parameters + +Warning: imap_savebody() expects at least 3 parameters, 0 given in %s on line %d +Checking with incorrect parameter type + +Warning: imap_savebody() expects at least 3 parameters, 1 given in %s on line %d + +Warning: imap_savebody() expects at least 3 parameters, 1 given in %s on line %d +Create a temporary mailbox and add 1 msgs +.. mailbox '{%s}%s' created + +Warning: imap_savebody() expects at least 3 parameters, 1 given in %s on line %d +bool(true) +Size: %d +bool(true) +Size: %d + diff --git a/ext/imap/tests/imap_timeout_basic.phpt b/ext/imap/tests/imap_timeout_basic.phpt new file mode 100644 index 000000000..c2727e56b --- /dev/null +++ b/ext/imap/tests/imap_timeout_basic.phpt @@ -0,0 +1,60 @@ +--TEST-- +imap_timeout() function : basic functionality +--CREDITS-- +Olivier Doucet +--SKIPIF-- + +--FILE-- + +--EXPECTF-- +Checking with no parameters + +Warning: imap_timeout() expects at least 1 parameter, 0 given in %s on line %d +Checking with incorrect parameter type + +Warning: imap_timeout() expects parameter 1 to be long, %s given in %s on line %d +GET values: +int(%d) +int(%d) +int(%d) +int(%d) +SET values: +bool(true) +bool(true) +bool(true) +CHECK values: +int(10) +int(10) +int(10) diff --git a/ext/imap/tests/imap_undelete_basic.phpt b/ext/imap/tests/imap_undelete_basic.phpt new file mode 100644 index 000000000..4b48b1b09 --- /dev/null +++ b/ext/imap/tests/imap_undelete_basic.phpt @@ -0,0 +1,29 @@ +--TEST-- +imap_undelete() function : basic functionality +--CREDITS-- +Olivier Doucet +--SKIPIF-- + +--FILE-- + +--CLEAN-- + +--EXPECTF-- +Create a temporary mailbox and add 1 msgs +.. mailbox '{%s}%s' created +bool(true) \ No newline at end of file diff --git a/ext/imap/tests/imap_undelete_error.phpt b/ext/imap/tests/imap_undelete_error.phpt new file mode 100644 index 000000000..c82801e15 --- /dev/null +++ b/ext/imap/tests/imap_undelete_error.phpt @@ -0,0 +1,36 @@ +--TEST-- +imap_undelete() incorrect parameter count +--CREDITS-- +Olivier Doucet +--SKIPIF-- + +--FILE-- + +--EXPECTF-- +Checking with no parameters + +Warning: imap_undelete() expects at least 2 parameters, 0 given in %s on line %d +Checking with incorrect parameter type + +Warning: imap_undelete() expects at least 2 parameters, 1 given in %s on line %d + +Warning: imap_undelete() expects at least 2 parameters, 1 given in %s on line %d + +Warning: imap_undelete() expects at least 2 parameters, 1 given in %s on line %d diff --git a/ext/interbase/ibase_blobs.c b/ext/interbase/ibase_blobs.c index bbbddbd8d..91c3d2567 100644 --- a/ext/interbase/ibase_blobs.c +++ b/ext/interbase/ibase_blobs.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: ibase_blobs.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: ibase_blobs.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/interbase/ibase_events.c b/ext/interbase/ibase_events.c index 51ff0ccff..77b33add7 100644 --- a/ext/interbase/ibase_events.c +++ b/ext/interbase/ibase_events.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: ibase_events.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: ibase_events.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/interbase/ibase_query.c b/ext/interbase/ibase_query.c index 6ef830144..8a58593d7 100644 --- a/ext/interbase/ibase_query.c +++ b/ext/interbase/ibase_query.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: ibase_query.c 286330 2009-07-25 23:37:47Z kalle $ */ +/* $Id: ibase_query.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/interbase/ibase_service.c b/ext/interbase/ibase_service.c index 0801afccd..92060d289 100644 --- a/ext/interbase/ibase_service.c +++ b/ext/interbase/ibase_service.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: ibase_service.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: ibase_service.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/interbase/interbase.c b/ext/interbase/interbase.c index 054c4abd6..18ffbf271 100644 --- a/ext/interbase/interbase.c +++ b/ext/interbase/interbase.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: interbase.c 284159 2009-07-16 00:04:59Z rasmus $ */ +/* $Id: interbase.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/interbase/php_ibase_includes.h b/ext/interbase/php_ibase_includes.h index 4f0216420..b83a32db3 100755 --- a/ext/interbase/php_ibase_includes.h +++ b/ext/interbase/php_ibase_includes.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_ibase_includes.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_ibase_includes.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_IBASE_INCLUDES_H #define PHP_IBASE_INCLUDES_H diff --git a/ext/interbase/php_ibase_udf.c b/ext/interbase/php_ibase_udf.c index 2816e950c..d285ddc0e 100644 --- a/ext/interbase/php_ibase_udf.c +++ b/ext/interbase/php_ibase_udf.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_ibase_udf.c 281727 2009-06-05 18:50:32Z mattwil $ */ +/* $Id: php_ibase_udf.c 293036 2010-01-03 09:23:27Z sebastian $ */ /** * This UDF library adds the ability to call PHP functions from SQL diff --git a/ext/interbase/php_interbase.h b/ext/interbase/php_interbase.h index 785cee865..2aa60ff2d 100644 --- a/ext/interbase/php_interbase.h +++ b/ext/interbase/php_interbase.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_interbase.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_interbase.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_INTERBASE_H #define PHP_INTERBASE_H diff --git a/ext/intl/collator/collator_class.c b/ext/intl/collator/collator_class.c index d064a2bd5..ee16ee03e 100755 --- a/ext/intl/collator/collator_class.c +++ b/ext/intl/collator/collator_class.c @@ -125,6 +125,7 @@ function_entry Collator_class_functions[] = { PHP_NAMED_FE( getLocale, ZEND_FN( collator_get_locale ), collator_1_arg ) PHP_NAMED_FE( getErrorCode, ZEND_FN( collator_get_error_code ), collator_0_args ) PHP_NAMED_FE( getErrorMessage, ZEND_FN( collator_get_error_message ), collator_0_args ) + PHP_NAMED_FE( getSortKey, ZEND_FN( collator_get_sort_key ), collator_2_args ) { NULL, NULL, NULL } }; /* }}} */ diff --git a/ext/intl/collator/collator_sort.c b/ext/intl/collator/collator_sort.c index efe4ca6e1..929a9c09d 100755 --- a/ext/intl/collator/collator_sort.c +++ b/ext/intl/collator/collator_sort.c @@ -523,6 +523,69 @@ PHP_FUNCTION( collator_asort ) } /* }}} */ +/* {{{ proto bool Collator::getSortKey( Collator $coll, string $str ) + * Get a sort key for a string from a Collator. }}} */ +/* {{{ proto bool collator_get_sort_key( Collator $coll, string $str ) + * Get a sort key for a string from a Collator. }}} */ +PHP_FUNCTION( collator_get_sort_key ) +{ + char* str = NULL; + int str_len = 0; + UChar* ustr = NULL; + int ustr_len = 0; + uint8_t* key = NULL; + int key_len = 0; + + COLLATOR_METHOD_INIT_VARS + + /* Parse parameters. */ + if( zend_parse_method_parameters( ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", + &object, Collator_ce_ptr, &str, &str_len ) == FAILURE ) + { + intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, + "collator_get_sort_key: unable to parse input params", 0 TSRMLS_CC ); + + RETURN_FALSE; + } + + /* Fetch the object. */ + COLLATOR_METHOD_FETCH_OBJECT; + + + /* + * Compare given strings (converting them to UTF-16 first). + */ + + /* First convert the strings to UTF-16. */ + intl_convert_utf8_to_utf16( + &ustr, &ustr_len, str, str_len, COLLATOR_ERROR_CODE_P( co ) ); + if( U_FAILURE( COLLATOR_ERROR_CODE( co ) ) ) + { + /* Set global error code. */ + intl_error_set_code( NULL, COLLATOR_ERROR_CODE( co ) TSRMLS_CC ); + + /* Set error messages. */ + intl_errors_set_custom_msg( COLLATOR_ERROR_P( co ), + "Error converting first argument to UTF-16", 0 TSRMLS_CC ); + efree( ustr ); + RETURN_FALSE; + } + + key_len = ucol_getSortKey(co->ucoll, ustr, ustr_len, key, 0); + if(!key_len) { + efree( ustr ); + RETURN_FALSE; + } + key = emalloc(key_len); + key_len = ucol_getSortKey(co->ucoll, ustr, ustr_len, key, key_len); + efree( ustr ); + if(!key_len) { + RETURN_FALSE; + } + RETURN_STRINGL((char *)key, key_len, 0); +} +/* }}} */ + /* * Local variables: * tab-width: 4 diff --git a/ext/intl/collator/collator_sort.h b/ext/intl/collator/collator_sort.h index 0fafb9f35..a990cdf08 100755 --- a/ext/intl/collator/collator_sort.h +++ b/ext/intl/collator/collator_sort.h @@ -24,6 +24,7 @@ typedef int (*collator_compare_func_t)( zval *result, zval *op1, zval *op2 TSRML PHP_FUNCTION( collator_sort ); PHP_FUNCTION( collator_sort_with_sort_keys ); +PHP_FUNCTION( collator_get_sort_key ); PHP_FUNCTION( collator_asort ); #endif // COLLATOR_SORT_H diff --git a/ext/intl/config.m4 b/ext/intl/config.m4 index 9735b4450..dc235db08 100755 --- a/ext/intl/config.m4 +++ b/ext/intl/config.m4 @@ -52,6 +52,9 @@ if test "$PHP_INTL" != "no"; then msgformat/msgformat_parse.c \ grapheme/grapheme_string.c \ grapheme/grapheme_util.c \ + resourcebundle/resourcebundle.c \ + resourcebundle/resourcebundle_class.c \ + resourcebundle/resourcebundle_iterator.c \ idn/idn.c, $ext_shared,,$ICU_INCS) PHP_ADD_BUILD_DIR($ext_builddir/collator) @@ -62,5 +65,6 @@ if test "$PHP_INTL" != "no"; then PHP_ADD_BUILD_DIR($ext_builddir/locale) PHP_ADD_BUILD_DIR($ext_builddir/msgformat) PHP_ADD_BUILD_DIR($ext_builddir/grapheme) + PHP_ADD_BUILD_DIR($ext_builddir/resourcebundle) PHP_ADD_BUILD_DIR($ext_builddir/idn) fi diff --git a/ext/intl/config.w32 b/ext/intl/config.w32 index e7b61299c..6635b8903 100755 --- a/ext/intl/config.w32 +++ b/ext/intl/config.w32 @@ -1,4 +1,4 @@ -// $Id: config.w32 274681 2009-01-26 22:34:49Z pajoye $ +// $Id: config.w32 294108 2010-01-27 17:29:38Z johannes $ // vim:ft=javascript ARG_ENABLE("intl", "Enable internationalization support", "no"); @@ -66,6 +66,11 @@ if (PHP_INTL != "no") { ADD_SOURCES(configure_module_dirname + "/idn", "\ idn.c", "intl"); + ADD_SOURCES(configure_module_dirname + "/resourcebundle", "\ + resourcebundle.c \ + resourcebundle_class.c \ + resourcebundle_iterator.c", + "intl"); ADD_FLAG("LIBS_INTL", "icudt.lib icuin.lib icuio.lib icule.lib iculx.lib"); AC_DEFINE("HAVE_INTL", 1, "Internationalization support enabled"); } else { diff --git a/ext/intl/dateformat/dateformat.c b/ext/intl/dateformat/dateformat.c index 0eac9e9c7..6f7432254 100755 --- a/ext/intl/dateformat/dateformat.c +++ b/ext/intl/dateformat/dateformat.c @@ -181,8 +181,7 @@ PHP_METHOD( IntlDateFormatter, __construct ) */ PHP_FUNCTION( datefmt_get_error_code ) { - zval* object = NULL; - IntlDateFormatter_object* dfo = NULL; + DATE_FORMAT_METHOD_INIT_VARS; /* Parse parameters. */ if( zend_parse_method_parameters( ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", @@ -208,8 +207,7 @@ PHP_FUNCTION( datefmt_get_error_code ) PHP_FUNCTION( datefmt_get_error_message ) { char* message = NULL; - zval* object = NULL; - IntlDateFormatter_object* dfo = NULL; + DATE_FORMAT_METHOD_INIT_VARS; /* Parse parameters. */ if( zend_parse_method_parameters( ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", @@ -224,7 +222,7 @@ PHP_FUNCTION( datefmt_get_error_message ) dfo = (IntlDateFormatter_object *) zend_object_store_get_object( object TSRMLS_CC ); /* Return last error message. */ - message = intl_error_get_message( &dfo->datef_data.error TSRMLS_CC ); + message = intl_error_get_message( INTL_DATA_ERROR_P(dfo) TSRMLS_CC ); RETURN_STRING( message, 0); } /* }}} */ diff --git a/ext/intl/formatter/formatter_main.c b/ext/intl/formatter/formatter_main.c index e2454d505..8fa17560b 100755 --- a/ext/intl/formatter/formatter_main.c +++ b/ext/intl/formatter/formatter_main.c @@ -141,7 +141,7 @@ PHP_FUNCTION( numfmt_get_error_message ) nfo = (NumberFormatter_object *) zend_object_store_get_object( object TSRMLS_CC ); /* Return last error message. */ - message = intl_error_get_message( &INTL_DATA_ERROR(nfo) TSRMLS_CC ); + message = intl_error_get_message( INTL_DATA_ERROR_P(nfo) TSRMLS_CC ); RETURN_STRING( message, 0); } /* }}} */ diff --git a/ext/intl/grapheme/grapheme_string.c b/ext/intl/grapheme/grapheme_string.c index edac518c6..ba883f34a 100755 --- a/ext/intl/grapheme/grapheme_string.c +++ b/ext/intl/grapheme/grapheme_string.c @@ -83,7 +83,7 @@ PHP_FUNCTION(grapheme_strlen) intl_error_set_code( NULL, status TSRMLS_CC ); /* Set error messages. */ - intl_error_set_custom_msg( NULL, "Error converting input string to UTF-16", 1 TSRMLS_CC ); + intl_error_set_custom_msg( NULL, "Error converting input string to UTF-16", 0 TSRMLS_CC ); efree( ustring ); RETURN_NULL(); } @@ -446,7 +446,7 @@ PHP_FUNCTION(grapheme_substr) intl_error_set_code( NULL, status TSRMLS_CC ); /* Set error messages. */ - intl_error_set_custom_msg( NULL, "Error converting input string to UTF-16", 1 TSRMLS_CC ); + intl_error_set_custom_msg( NULL, "Error converting input string to UTF-16", 0 TSRMLS_CC ); efree( ustr ); RETURN_FALSE; } @@ -507,7 +507,7 @@ PHP_FUNCTION(grapheme_substr) intl_error_set_code( NULL, status TSRMLS_CC ); /* Set error messages. */ - intl_error_set_custom_msg( NULL, "Error converting output string to UTF-8", 1 TSRMLS_CC ); + intl_error_set_custom_msg( NULL, "Error converting output string to UTF-8", 0 TSRMLS_CC ); efree( sub_str ); @@ -563,7 +563,7 @@ PHP_FUNCTION(grapheme_substr) intl_error_set_code( NULL, status TSRMLS_CC ); /* Set error messages. */ - intl_error_set_custom_msg( NULL, "Error converting output string to UTF-8", 1 TSRMLS_CC ); + intl_error_set_custom_msg( NULL, "Error converting output string to UTF-8", 0 TSRMLS_CC ); if ( NULL != sub_str ) efree( sub_str ); @@ -870,7 +870,7 @@ PHP_FUNCTION(grapheme_extract) intl_error_set_code( NULL, status TSRMLS_CC ); /* Set error messages. */ - intl_error_set_custom_msg( NULL, "Error converting input string to UTF-16", 1 TSRMLS_CC ); + intl_error_set_custom_msg( NULL, "Error converting input string to UTF-16", 0 TSRMLS_CC ); if ( NULL != ustr ) efree( ustr ); diff --git a/ext/intl/grapheme/grapheme_util.c b/ext/intl/grapheme/grapheme_util.c index 375c695b7..1978d274a 100755 --- a/ext/intl/grapheme/grapheme_util.c +++ b/ext/intl/grapheme/grapheme_util.c @@ -169,7 +169,7 @@ grapheme_strrpos_utf16(unsigned char *haystack, int32_t haystack_len, unsigned c intl_error_set_code( NULL, status TSRMLS_CC ); /* Set error messages. */ - intl_error_set_custom_msg( NULL, "Error converting input string to UTF-16", 1 TSRMLS_CC ); + intl_error_set_custom_msg( NULL, "Error converting input string to UTF-16", 0 TSRMLS_CC ); efree( uhaystack ); return -1; } @@ -202,7 +202,7 @@ grapheme_strrpos_utf16(unsigned char *haystack, int32_t haystack_len, unsigned c intl_error_set_code( NULL, status TSRMLS_CC ); /* Set error messages. */ - intl_error_set_custom_msg( NULL, "Error converting input string to UTF-16", 1 TSRMLS_CC ); + intl_error_set_custom_msg( NULL, "Error converting input string to UTF-16", 0 TSRMLS_CC ); efree( uhaystack ); efree( uneedle ); ubrk_close (bi); @@ -294,7 +294,7 @@ grapheme_strpos_utf16(unsigned char *haystack, int32_t haystack_len, unsigned ch intl_error_set_code( NULL, status TSRMLS_CC ); /* Set error messages. */ - intl_error_set_custom_msg( NULL, "Error converting input string to UTF-16", 1 TSRMLS_CC ); + intl_error_set_custom_msg( NULL, "Error converting input string to UTF-16", 0 TSRMLS_CC ); efree( uhaystack ); return -1; } @@ -331,7 +331,7 @@ grapheme_strpos_utf16(unsigned char *haystack, int32_t haystack_len, unsigned ch intl_error_set_code( NULL, status TSRMLS_CC ); /* Set error messages. */ - intl_error_set_custom_msg( NULL, "Error converting input string to UTF-16", 1 TSRMLS_CC ); + intl_error_set_custom_msg( NULL, "Error converting input string to UTF-16", 0 TSRMLS_CC ); efree( uhaystack ); efree( uneedle ); ubrk_close (bi); diff --git a/ext/intl/idn/idn.c b/ext/intl/idn/idn.c index ca7e9e7ba..158b76e85 100644 --- a/ext/intl/idn/idn.c +++ b/ext/intl/idn/idn.c @@ -15,7 +15,7 @@ | Author: Pierre A. Joye | +----------------------------------------------------------------------+ */ -/* $Id: idn.c 283618 2009-07-06 23:48:27Z stas $ */ +/* $Id: idn.c 293979 2010-01-25 13:59:35Z johannes $ */ /* {{{ includes */ #ifdef HAVE_CONFIG_H @@ -84,7 +84,7 @@ static void php_intl_idn_to(INTERNAL_FUNCTION_PARAMETERS, int mode) intl_error_set_code(NULL, status TSRMLS_CC); /* Set error messages. */ - intl_error_set_custom_msg( NULL, "Error converting input string to UTF-16", 1 TSRMLS_CC ); + intl_error_set_custom_msg( NULL, "Error converting input string to UTF-16", 0 TSRMLS_CC ); efree(ustring); RETURN_FALSE; } else { @@ -111,7 +111,7 @@ static void php_intl_idn_to(INTERNAL_FUNCTION_PARAMETERS, int mode) intl_error_set_code(NULL, status TSRMLS_CC); /* Set error messages. */ - intl_error_set_custom_msg( NULL, "Error converting output string to UTF-8", 1 TSRMLS_CC ); + intl_error_set_custom_msg( NULL, "Error converting output string to UTF-8", 0 TSRMLS_CC ); efree(converted_utf8); RETURN_FALSE; } diff --git a/ext/intl/intl_error.c b/ext/intl/intl_error.c index 79ae153bb..9c2e13dfd 100755 --- a/ext/intl/intl_error.c +++ b/ext/intl/intl_error.c @@ -44,10 +44,9 @@ static void intl_free_custom_error_msg( intl_error* err TSRMLS_DC ) if( !err && !( err = intl_g_error_get( TSRMLS_C ) ) ) return; - if( !err->free_custom_error_message ) - return; - - efree( err->custom_error_message ); + if(err->free_custom_error_message ) { + efree( err->custom_error_message ); + } err->custom_error_message = NULL; err->free_custom_error_message = 0; @@ -181,6 +180,16 @@ void intl_error_set( intl_error* err, UErrorCode code, char* msg, int copyMsg TS } /* }}} */ +/* {{{ void intl_errors_set( intl_error* err, UErrorCode code, char* msg, int copyMsg ) + * Set error code and message. + */ +void intl_errors_set( intl_error* err, UErrorCode code, char* msg, int copyMsg TSRMLS_DC ) +{ + intl_errors_set_code( err, code TSRMLS_CC ); + intl_errors_set_custom_msg( err, msg, copyMsg TSRMLS_CC ); +} +/* }}} */ + /* {{{ void intl_errors_reset( intl_error* err ) */ void intl_errors_reset( intl_error* err TSRMLS_DC ) diff --git a/ext/intl/intl_error.h b/ext/intl/intl_error.h index 5c469e1fc..3adae8547 100755 --- a/ext/intl/intl_error.h +++ b/ext/intl/intl_error.h @@ -42,5 +42,6 @@ char* intl_error_get_message( intl_error* err TSRMLS_DC ); void intl_errors_reset( intl_error* err TSRMLS_DC ); void intl_errors_set_custom_msg( intl_error* err, char* msg, int copyMsg TSRMLS_DC ); void intl_errors_set_code( intl_error* err, UErrorCode err_code TSRMLS_DC ); +void intl_errors_set( intl_error* err, UErrorCode code, char* msg, int copyMsg TSRMLS_DC ); #endif // INTL_ERROR_H diff --git a/ext/intl/locale/locale_methods.c b/ext/intl/locale/locale_methods.c index 9abdcdf3f..438e905f9 100755 --- a/ext/intl/locale/locale_methods.c +++ b/ext/intl/locale/locale_methods.c @@ -14,7 +14,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: locale_methods.c 283367 2009-07-02 22:36:16Z stas $ */ +/* $Id: locale_methods.c 293979 2010-01-25 13:59:35Z johannes $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -389,7 +389,7 @@ static void get_icu_value_src_php( char* tag_name, INTERNAL_FUNCTION_PARAMETERS) intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, msg , 1 TSRMLS_CC ); efree(msg); - RETURN_NULL(); + RETURN_FALSE; } if(loc_name_len == 0) { @@ -1129,10 +1129,10 @@ PHP_FUNCTION(locale_get_all_variants) if(zend_parse_parameters( ZEND_NUM_ARGS() TSRMLS_CC, "s", &loc_name, &loc_name_len ) == FAILURE) { - intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, + intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, "locale_parse: unable to parse input params", 0 TSRMLS_CC ); - RETURN_FALSE; + RETURN_FALSE; } if(loc_name_len == 0) { @@ -1524,7 +1524,7 @@ PHP_FUNCTION(locale_lookup) if(zend_parse_parameters( ZEND_NUM_ARGS() TSRMLS_CC, "as|bs", &arr, &loc_range, &loc_range_len, &boolCanonical, &fallback_loc, &fallback_loc_len) == FAILURE) { intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, "locale_lookup: unable to parse input params", 0 TSRMLS_CC ); - RETURN_NULL(); + RETURN_FALSE; } if(loc_range_len == 0) { @@ -1571,7 +1571,7 @@ PHP_FUNCTION(locale_accept_from_http) { intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, "locale_accept_from_http: unable to parse input parameters", 0 TSRMLS_CC ); - RETURN_NULL(); + RETURN_FALSE; } available = ures_openAvailableLocales(NULL, &status); diff --git a/ext/intl/normalizer/normalizer_class.h b/ext/intl/normalizer/normalizer_class.h index 1d21b7a41..4d3f7d234 100755 --- a/ext/intl/normalizer/normalizer_class.h +++ b/ext/intl/normalizer/normalizer_class.h @@ -39,14 +39,5 @@ typedef struct { #define NORMALIZER_ERROR_CODE_P(co) &(INTL_ERROR_CODE(NORMALIZER_ERROR(co))) void normalizer_register_Normalizer_class( TSRMLS_D ); -void normalizer_object_init( Normalizer_object* co TSRMLS_DC ); -void normalizer_object_destroy( Normalizer_object* co TSRMLS_DC ); - extern zend_class_entry *Normalizer_ce_ptr; - -/* Auxiliary macros */ - -#define NORMALIZER_METHOD_INIT_VARS \ - intl_error_reset( NULL TSRMLS_CC ); \ - #endif // #ifndef NORMALIZER_CLASS_H diff --git a/ext/intl/normalizer/normalizer_normalize.c b/ext/intl/normalizer/normalizer_normalize.c index eb1451410..482c4a01e 100755 --- a/ext/intl/normalizer/normalizer_normalize.c +++ b/ext/intl/normalizer/normalizer_normalize.c @@ -50,8 +50,6 @@ PHP_FUNCTION( normalizer_normalize ) int32_t size_needed; - NORMALIZER_METHOD_INIT_VARS - intl_error_reset( NULL TSRMLS_CC ); /* Parse parameters. */ @@ -59,9 +57,9 @@ PHP_FUNCTION( normalizer_normalize ) &input, &input_len, &form ) == FAILURE ) { intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, - "normalizer_normalize: unable to parse input params", 1 TSRMLS_CC ); + "normalizer_normalize: unable to parse input params", 0 TSRMLS_CC ); - RETURN_NULL(); + RETURN_FALSE; } expansion_factor = 1; @@ -80,8 +78,8 @@ PHP_FUNCTION( normalizer_normalize ) break; default: intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, - "normalizer_normalize: illegal normalization form", 1 TSRMLS_CC ); - RETURN_NULL(); + "normalizer_normalize: illegal normalization form", 0 TSRMLS_CC ); + RETURN_FALSE; } /* @@ -97,9 +95,9 @@ PHP_FUNCTION( normalizer_normalize ) intl_error_set_code( NULL, status TSRMLS_CC ); /* Set error messages. */ - intl_error_set_custom_msg( NULL, "Error converting input string to UTF-16", 1 TSRMLS_CC ); + intl_error_set_custom_msg( NULL, "Error converting input string to UTF-16", 0 TSRMLS_CC ); efree( uinput ); - RETURN_NULL(); + RETURN_FALSE; } @@ -136,10 +134,10 @@ PHP_FUNCTION( normalizer_normalize ) /* Bail out if an unexpected error occured. */ if( U_FAILURE(status) ) { /* Set error messages. */ - intl_error_set_custom_msg( NULL,"Error normalizing string", 1 TSRMLS_CC ); + intl_error_set_custom_msg( NULL,"Error normalizing string", 0 TSRMLS_CC ); efree( uret_buf ); efree( uinput ); - RETURN_NULL(); + RETURN_FALSE; } } @@ -154,8 +152,8 @@ PHP_FUNCTION( normalizer_normalize ) if( U_FAILURE( status ) ) { intl_error_set( NULL, status, - "normalizer_normalize: error converting normalized text UTF-8", 1 TSRMLS_CC ); - RETURN_NULL(); + "normalizer_normalize: error converting normalized text UTF-8", 0 TSRMLS_CC ); + RETURN_FALSE; } /* Return it. */ @@ -181,8 +179,6 @@ PHP_FUNCTION( normalizer_is_normalized ) UBool uret = FALSE; - NORMALIZER_METHOD_INIT_VARS - intl_error_reset( NULL TSRMLS_CC ); /* Parse parameters. */ @@ -190,7 +186,7 @@ PHP_FUNCTION( normalizer_is_normalized ) &input, &input_len, &form) == FAILURE ) { intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, - "normalizer_is_normalized: unable to parse input params", 1 TSRMLS_CC ); + "normalizer_is_normalized: unable to parse input params", 0 TSRMLS_CC ); RETURN_FALSE; } @@ -205,8 +201,8 @@ PHP_FUNCTION( normalizer_is_normalized ) break; default: intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, - "normalizer_normalize: illegal normalization form", 1 TSRMLS_CC ); - RETURN_NULL(); + "normalizer_normalize: illegal normalization form", 0 TSRMLS_CC ); + RETURN_FALSE; } @@ -223,7 +219,7 @@ PHP_FUNCTION( normalizer_is_normalized ) intl_error_set_code( NULL, status TSRMLS_CC ); /* Set error messages. */ - intl_error_set_custom_msg( NULL, "Error converting string to UTF-16.", 1 TSRMLS_CC ); + intl_error_set_custom_msg( NULL, "Error converting string to UTF-16.", 0 TSRMLS_CC ); efree( uinput ); RETURN_FALSE; } @@ -237,7 +233,7 @@ PHP_FUNCTION( normalizer_is_normalized ) /* Bail out if an unexpected error occured. */ if( U_FAILURE(status) ) { /* Set error messages. */ - intl_error_set_custom_msg( NULL,"Error testing if string is the given normalization form.", 1 TSRMLS_CC ); + intl_error_set_custom_msg( NULL,"Error testing if string is the given normalization form.", 0 TSRMLS_CC ); RETURN_FALSE; } diff --git a/ext/intl/php_intl.c b/ext/intl/php_intl.c index 831ace4d5..a9bfefd14 100755 --- a/ext/intl/php_intl.c +++ b/ext/intl/php_intl.c @@ -62,6 +62,8 @@ #include "dateformat/dateformat_parse.h" #include "dateformat/dateformat_data.h" +#include "resourcebundle/resourcebundle_class.h" + #include "idn/idn.h" #include "msgformat/msgformat.h" @@ -74,11 +76,11 @@ #define INTL_MODULE_VERSION PHP_INTL_VERSION /* - * locale_get_default has a conflict since ICU also has + * locale_get_default has a conflict since ICU also has * a function with the same name * in fact ICU appends the version no. to it also * Hence the following undef for ICU version - * Same true for the locale_set_default function + * Same true for the locale_set_default function */ #undef locale_get_default #undef locale_set_default @@ -330,6 +332,36 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_idn_to_utf8, 0, 0, 1) ZEND_ARG_INFO(0, option) ZEND_ARG_INFO(0, status) ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX( arginfo_resourcebundle_create_proc, 0, 0, 2 ) + ZEND_ARG_INFO( 0, locale ) + ZEND_ARG_INFO( 0, bundlename ) + ZEND_ARG_INFO( 0, fallback ) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX( arginfo_resourcebundle_get_proc, 0, 0, 2 ) + ZEND_ARG_INFO( 0, bundle ) + ZEND_ARG_INFO( 0, index ) + ZEND_ARG_INFO( 0, fallback ) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX( arginfo_resourcebundle_count_proc, 0, 0, 1 ) + ZEND_ARG_INFO( 0, bundle ) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX( arginfo_resourcebundle_locales_proc, 0, 0, 1 ) + ZEND_ARG_INFO( 0, bundlename ) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX( arginfo_resourcebundle_get_error_code_proc, 0, 0, 1 ) + ZEND_ARG_INFO( 0, bundle ) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX( arginfo_resourcebundle_get_error_message_proc, 0, 0, 1 ) + ZEND_ARG_INFO( 0, bundle ) +ZEND_END_ARG_INFO() + + /* }}} */ /* {{{ intl_functions @@ -351,6 +383,7 @@ zend_function_entry intl_functions[] = { PHP_FE( collator_get_locale, collator_1_arg ) PHP_FE( collator_get_error_code, collator_0_args ) PHP_FE( collator_get_error_message, collator_0_args ) + PHP_FE( collator_get_sort_key, collator_2_args ) /* formatter functions */ PHP_FE( numfmt_create, arginfo_numfmt_create ) @@ -421,7 +454,7 @@ zend_function_entry intl_functions[] = { PHP_FE( datefmt_set_lenient, arginfo_msgfmt_get_locale ) PHP_FE( datefmt_format, arginfo_datefmt_format ) PHP_FE( datefmt_parse, datefmt_parse_args ) - PHP_FE( datefmt_localtime , datefmt_parse_args ) + PHP_FE( datefmt_localtime , datefmt_parse_args ) PHP_FE( datefmt_get_error_code, arginfo_msgfmt_get_error_code ) PHP_FE( datefmt_get_error_message, arginfo_msgfmt_get_error_message ) @@ -437,8 +470,16 @@ zend_function_entry intl_functions[] = { PHP_FE( grapheme_extract, grapheme_extract_args ) /* IDN functions */ - PHP_FE(idn_to_ascii, arginfo_idn_to_ascii) - PHP_FE(idn_to_utf8, arginfo_idn_to_ascii) + PHP_FE( idn_to_ascii, arginfo_idn_to_ascii) + PHP_FE( idn_to_utf8, arginfo_idn_to_ascii) + + /* ResourceBundle functions */ + PHP_FE( resourcebundle_create, arginfo_resourcebundle_create_proc ) + PHP_FE( resourcebundle_get, arginfo_resourcebundle_get_proc ) + PHP_FE( resourcebundle_count, arginfo_resourcebundle_count_proc ) + PHP_FE( resourcebundle_locales, arginfo_resourcebundle_locales_proc ) + PHP_FE( resourcebundle_get_error_code, arginfo_resourcebundle_get_error_code_proc ) + PHP_FE( resourcebundle_get_error_message, arginfo_resourcebundle_get_error_message_proc ) /* common functions */ PHP_FE( intl_get_error_code, intl_0_args ) @@ -520,7 +561,7 @@ PHP_MINIT_FUNCTION( intl ) /* Expose Normalizer constants to PHP scripts */ normalizer_register_constants( INIT_FUNC_ARGS_PASSTHRU ); - + /* Register 'Locale' PHP class */ locale_register_Locale_class( TSRMLS_C ); @@ -537,6 +578,9 @@ PHP_MINIT_FUNCTION( intl ) /* Expose DateFormat constants to PHP scripts */ dateformat_register_constants( INIT_FUNC_ARGS_PASSTHRU ); + /* Register 'ResourceBundle' PHP class */ + resourcebundle_register_class( TSRMLS_C); + /* Expose ICU error codes to PHP scripts. */ intl_expose_icu_error_codes( INIT_FUNC_ARGS_PASSTHRU ); diff --git a/ext/intl/php_intl.h b/ext/intl/php_intl.h index 61455b6fb..3ae530a0a 100755 --- a/ext/intl/php_intl.h +++ b/ext/intl/php_intl.h @@ -63,7 +63,7 @@ PHP_RINIT_FUNCTION(intl); PHP_RSHUTDOWN_FUNCTION(intl); PHP_MINFO_FUNCTION(intl); -#define PHP_INTL_VERSION "1.0.0" +#define PHP_INTL_VERSION "1.0.3" #endif /* PHP_INTL_H */ diff --git a/ext/intl/resourcebundle/TODO b/ext/intl/resourcebundle/TODO new file mode 100755 index 000000000..ace4ceb25 --- /dev/null +++ b/ext/intl/resourcebundle/TODO @@ -0,0 +1 @@ +- var_dump support diff --git a/ext/intl/resourcebundle/resourcebundle.c b/ext/intl/resourcebundle/resourcebundle.c new file mode 100644 index 000000000..3d881a229 --- /dev/null +++ b/ext/intl/resourcebundle/resourcebundle.c @@ -0,0 +1,93 @@ +/* + +----------------------------------------------------------------------+ + | PHP Version 5 | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.01 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_01.txt | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Hans-Peter Oeri (University of St.Gallen) | + +----------------------------------------------------------------------+ + */ + +#include + +#include +#include + +#include "intl_convert.h" +#include "intl_data.h" +#include "resourcebundle/resourcebundle_class.h" + +/* {{{ ResourceBundle_extract_value */ +void resourcebundle_extract_value( zval *return_value, ResourceBundle_object *source TSRMLS_DC ) +{ + UResType restype; + const UChar* ufield; + const uint8_t* bfield; + char * cfield; + const int32_t* vfield; + int32_t ilen; + int i; + long lfield; + ResourceBundle_object* newrb; + + restype = ures_getType( source->child ); + switch (restype) + { + case URES_STRING: + ufield = ures_getString( source->child, &ilen, &INTL_DATA_ERROR_CODE(source) ); + INTL_METHOD_CHECK_STATUS(source, "Failed to retrieve string value"); + INTL_METHOD_RETVAL_UTF8(source, ufield, ilen, 0); + break; + + case URES_BINARY: + bfield = ures_getBinary( source->child, &ilen, &INTL_DATA_ERROR_CODE(source) ); + INTL_METHOD_CHECK_STATUS(source, "Failed to retrieve binary value"); + ZVAL_STRINGL( return_value, (char *) bfield, ilen, 1 ); + break; + + case URES_INT: + lfield = ures_getInt( source->child, &INTL_DATA_ERROR_CODE(source) ); + INTL_METHOD_CHECK_STATUS(source, "Failed to retrieve integer value"); + ZVAL_LONG( return_value, lfield ); + break; + + case URES_INT_VECTOR: + vfield = ures_getIntVector( source->child, &ilen, &INTL_DATA_ERROR_CODE(source) ); + INTL_METHOD_CHECK_STATUS(source, "Failed to retrieve vector value"); + array_init( return_value ); + for (i=0; ime = source->child; + source->child = NULL; + intl_errors_reset(INTL_DATA_ERROR_P(source) TSRMLS_CC); + break; + + default: + intl_errors_set(INTL_DATA_ERROR_P(source), U_ILLEGAL_ARGUMENT_ERROR, "Unknown resource type", 0 TSRMLS_CC); + RETURN_FALSE; + break; + } +} +/* }}} */ + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + * vim600: noet sw=4 ts=4 fdm=marker + * vim<600: noet sw=4 ts=4 + */ diff --git a/ext/intl/resourcebundle/resourcebundle.h b/ext/intl/resourcebundle/resourcebundle.h new file mode 100644 index 000000000..607ece98b --- /dev/null +++ b/ext/intl/resourcebundle/resourcebundle.h @@ -0,0 +1,28 @@ +/* + +----------------------------------------------------------------------+ + | PHP Version 5 | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.01 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_01.txt | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Hans-Peter Oeri (University of St.Gallen) | + +----------------------------------------------------------------------+ + */ + +#ifndef RESOURCEBUNDLE_H +#define RESOURCEBUNDLE_H + +#include + +#include + +#include "resourcebundle/resourcebundle_class.h" + +void resourcebundle_extract_value( zval *target, ResourceBundle_object *source TSRMLS_DC); + +#endif // #ifndef RESOURCEBUNDLE_CLASS_H diff --git a/ext/intl/resourcebundle/resourcebundle_class.c b/ext/intl/resourcebundle/resourcebundle_class.c new file mode 100644 index 000000000..1c9a689b2 --- /dev/null +++ b/ext/intl/resourcebundle/resourcebundle_class.c @@ -0,0 +1,434 @@ +/* + +----------------------------------------------------------------------+ + | PHP Version 5 | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.01 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_01.txt | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Hans-Peter Oeri (University of St.Gallen) | + +----------------------------------------------------------------------+ + */ + +#include +#include +#include + +#include +#include +#include +#include + +#include "php_intl.h" +#include "intl_data.h" + +#include "resourcebundle/resourcebundle.h" +#include "resourcebundle/resourcebundle_iterator.h" +#include "resourcebundle/resourcebundle_class.h" + +zend_class_entry *ResourceBundle_ce_ptr = NULL; + +static zend_object_handlers ResourceBundle_object_handlers; + +/* {{{ ResourceBundle_object_dtor */ +static void ResourceBundle_object_destroy( void *object, zend_object_handle handle TSRMLS_DC ) +{ + ResourceBundle_object *rb = (ResourceBundle_object *) object; + + // only free local errors + intl_error_reset( INTL_DATA_ERROR_P(rb) TSRMLS_CC ); + + if (rb->me) { + ures_close( rb->me ); + } + if (rb->child) { + ures_close( rb->child ); + } + + zend_object_std_dtor( object TSRMLS_CC ); + efree(object); +} +/* }}} */ + +/* {{{ ResourceBundle_object_create */ +static zend_object_value ResourceBundle_object_create( zend_class_entry *ce TSRMLS_DC ) +{ + zend_object_value retval; + ResourceBundle_object *rb; + + rb = ecalloc( 1, sizeof(ResourceBundle_object) ); + + zend_object_std_init( (zend_object *) rb, ce TSRMLS_CC ); + + intl_error_init( INTL_DATA_ERROR_P(rb) TSRMLS_CC ); + rb->me = NULL; + rb->child = NULL; + + retval.handlers = &ResourceBundle_object_handlers; + retval.handle = zend_objects_store_put( rb, ResourceBundle_object_destroy, NULL, NULL TSRMLS_CC ); + + return retval; +} +/* }}} */ + +/* {{{ ResourceBundle_ctor */ +static void resourcebundle_ctor(INTERNAL_FUNCTION_PARAMETERS) +{ + char * bundlename; + int bundlename_len = 0; + char * locale; + int locale_len = 0; + zend_bool fallback = 1; + + char * pbuf; + + zval *object = return_value; + ResourceBundle_object *rb = (ResourceBundle_object *) zend_object_store_get_object( object TSRMLS_CC); + + intl_error_reset( NULL TSRMLS_CC ); + + if( zend_parse_parameters( ZEND_NUM_ARGS() TSRMLS_CC, "ss|b", + &locale, &locale_len, &bundlename, &bundlename_len, &fallback ) == FAILURE ) + { + intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, + "resourcebundle_ctor: unable to parse input parameters", 0 TSRMLS_CC ); + zval_dtor( return_value ); + RETURN_NULL(); + } + + INTL_CHECK_LOCALE_LEN_OBJ(locale_len, return_value); + + rb->me = ures_open(bundlename, locale, &INTL_DATA_ERROR_CODE(rb)); + + INTL_CTOR_CHECK_STATUS(rb, "resourcebundle_ctor: Cannot load libICU resource bundle"); + + if (!fallback && (INTL_DATA_ERROR_CODE(rb) == U_USING_FALLBACK_WARNING || INTL_DATA_ERROR_CODE(rb) == U_USING_DEFAULT_WARNING)) { + intl_errors_set_code( NULL, INTL_DATA_ERROR_CODE(rb) TSRMLS_CC ); + spprintf( &pbuf, 0, "resourcebundle_ctor: Cannot load libICU resource '%s' without fallback from %s to %s", + bundlename, locale, ures_getLocale( rb->me, &INTL_DATA_ERROR_CODE(rb)) ); + intl_errors_set_custom_msg( INTL_DATA_ERROR_P(rb), pbuf, 1 TSRMLS_CC ); + efree(pbuf); + zval_dtor( return_value ); + RETURN_NULL(); + } +} +/* }}} */ + +/* {{{ arginfo_resourcebundle__construct */ +ZEND_BEGIN_ARG_INFO_EX( arginfo_resourcebundle___construct, 0, 0, 2 ) + ZEND_ARG_INFO( 0, locale ) + ZEND_ARG_INFO( 0, bundlename ) + ZEND_ARG_INFO( 0, fallback ) +ZEND_END_ARG_INFO() +/* }}} */ + +/* {{{ proto void ResourceBundle::__construct( string $bundlename [, string $locale [, bool $fallback = true ]] ) + * ResourceBundle object constructor + */ +PHP_METHOD( ResourceBundle, __construct ) +{ + return_value = getThis(); + resourcebundle_ctor(INTERNAL_FUNCTION_PARAM_PASSTHRU); +} +/* }}} */ + +/* {{{ proto ResourceBundle ResourceBundle::create( string $bundlename [, string $locale [, bool $fallback = true ]] ) +proto ResourceBundle resourcebundle_create( string $bundlename [, string $locale [, bool $fallback = true ]] ) */ +PHP_FUNCTION( resourcebundle_create ) +{ + object_init_ex( return_value, ResourceBundle_ce_ptr ); + resourcebundle_ctor(INTERNAL_FUNCTION_PARAM_PASSTHRU); +} +/* }}} */ + +/* {{{ resourcebundle_array_fetch */ +static void resourcebundle_array_fetch(zval *object, zval *offset, zval *return_value, int fallback TSRMLS_DC) +{ + int32_t meindex; + char * mekey; + long mekeylen; + zend_bool is_numeric = 0; + char *pbuf; + ResourceBundle_object *rb; + + intl_error_reset( NULL TSRMLS_CC ); + RESOURCEBUNDLE_METHOD_FETCH_OBJECT; + + if(Z_TYPE_P(offset) == IS_LONG) { + is_numeric = 1; + meindex = Z_LVAL_P(offset); + rb->child = ures_getByIndex( rb->me, meindex, rb->child, &INTL_DATA_ERROR_CODE(rb) ); + } else if(Z_TYPE_P(offset) == IS_STRING) { + mekey = Z_STRVAL_P(offset); + mekeylen = Z_STRLEN_P(offset); + rb->child = ures_getByKey(rb->me, mekey, rb->child, &INTL_DATA_ERROR_CODE(rb) ); + } else { + intl_errors_set(INTL_DATA_ERROR_P(rb), U_ILLEGAL_ARGUMENT_ERROR, + "resourcebundle_get: index should be integer or string", 0 TSRMLS_CC); + RETURN_NULL(); + } + + intl_error_set_code( NULL, INTL_DATA_ERROR_CODE(rb) TSRMLS_CC ); + if (U_FAILURE(INTL_DATA_ERROR_CODE(rb))) { + if (is_numeric) { + spprintf( &pbuf, 0, "Cannot load resource element %d", meindex ); + } else { + spprintf( &pbuf, 0, "Cannot load resource element '%s'", mekey ); + } + intl_errors_set_custom_msg( INTL_DATA_ERROR_P(rb), pbuf, 1 TSRMLS_CC ); + efree(pbuf); + RETURN_NULL(); + } + + if (!fallback && (INTL_DATA_ERROR_CODE(rb) == U_USING_FALLBACK_WARNING || INTL_DATA_ERROR_CODE(rb) == U_USING_DEFAULT_WARNING)) { + UErrorCode icuerror; + const char * locale = ures_getLocale( rb->me, &icuerror ); + if (is_numeric) { + spprintf( &pbuf, 0, "Cannot load element %d without fallback from to %s", meindex, locale ); + } else { + spprintf( &pbuf, 0, "Cannot load element '%s' without fallback from to %s", mekey, locale ); + } + intl_errors_set_custom_msg( INTL_DATA_ERROR_P(rb), pbuf, 1 TSRMLS_CC ); + efree(pbuf); + RETURN_NULL(); + } + + resourcebundle_extract_value( return_value, rb TSRMLS_CC ); +} +/* }}} */ + +/* {{{ resourcebundle_array_get */ +zval *resourcebundle_array_get(zval *object, zval *offset, int type TSRMLS_DC) +{ + zval *retval; + + if(offset == NULL) { + php_error( E_ERROR, "Cannot apply [] to ResourceBundle object" ); + } + MAKE_STD_ZVAL(retval); + + resourcebundle_array_fetch(object, offset, retval, 1 TSRMLS_CC); + Z_DELREF_P(retval); + return retval; +} +/* }}} */ + +/* {{{ arginfo_resourcebundle_get */ +ZEND_BEGIN_ARG_INFO_EX( arginfo_resourcebundle_get, 0, 0, 1 ) + ZEND_ARG_INFO( 0, index ) + ZEND_ARG_INFO( 0, fallback ) +ZEND_END_ARG_INFO() +/* }}} */ + +/* {{{ proto mixed ResourceBundle::get( integer|string $resindex [, bool $fallback = true ] ) + * proto mixed resourcebundle_get( ResourceBundle $rb, integer|string $resindex [, bool $fallback = true ] ) + * Get resource identified by numerical index or key name. + */ +PHP_FUNCTION( resourcebundle_get ) +{ + zend_bool fallback = 1; + zval * offset; + zval * object; + + if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Oz|b", &object, ResourceBundle_ce_ptr, &offset, &fallback ) == FAILURE) { + intl_error_set(NULL, U_ILLEGAL_ARGUMENT_ERROR, + "resourcebundle_get: unable to parse input params", 0 TSRMLS_CC); + RETURN_FALSE; + } + + resourcebundle_array_fetch(object, offset, return_value, fallback TSRMLS_CC); +} +/* }}} */ + +/* {{{ resourcebundle_array_count */ +int resourcebundle_array_count(zval *object, long *count TSRMLS_DC) +{ + ResourceBundle_object *rb = (ResourceBundle_object *) zend_object_store_get_object( object TSRMLS_CC); + + *count = ures_getSize( rb->me ); + + return SUCCESS; +} +/* }}} */ + +/* {{{ arginfo_resourcebundle_count */ +ZEND_BEGIN_ARG_INFO_EX( arginfo_resourcebundle_count, 0, 0, 0 ) +ZEND_END_ARG_INFO() +/* }}} */ + +/* {{{ proto int ResourceBundle::count() + * proto int resourcebundle_count( ResourceBundle $bundle ) + * Get resources count + */ +PHP_FUNCTION( resourcebundle_count ) +{ + int32_t len; + RESOURCEBUNDLE_METHOD_INIT_VARS; + + if( zend_parse_method_parameters( ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &object, ResourceBundle_ce_ptr ) == FAILURE ) { + intl_error_set(NULL, U_ILLEGAL_ARGUMENT_ERROR, + "resourcebundle_count: unable to parse input params", 0 TSRMLS_CC); + RETURN_FALSE; + } + + RESOURCEBUNDLE_METHOD_FETCH_OBJECT; + + len = ures_getSize( rb->me ); + RETURN_LONG( len ); +} + +/* {{{ arginfo_resourcebundle_getlocales */ +ZEND_BEGIN_ARG_INFO_EX( arginfo_resourcebundle_getlocales, 0, 0, 1 ) + ZEND_ARG_INFO( 0, bundlename ) +ZEND_END_ARG_INFO() +/* }}} */ + +/* {{{ proto array ResourceBundle::getLocales( string $bundlename ) + * proto array resourcebundle_locales( string $bundlename ) + * Get available locales from ResourceBundle name + */ +PHP_FUNCTION( resourcebundle_locales ) +{ + char * bundlename; + int bundlename_len = 0; + const char * entry; + int entry_len; + UEnumeration *icuenum; + UErrorCode icuerror = U_ZERO_ERROR; + + intl_errors_reset( NULL TSRMLS_CC ); + + if( zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &bundlename, &bundlename_len ) == FAILURE ) + { + intl_error_set(NULL, U_ILLEGAL_ARGUMENT_ERROR, + "resourcebundle_locales: unable to parse input params", 0 TSRMLS_CC); + RETURN_FALSE; + } + + if(bundlename_len == 0) { + // fetch default locales list + bundlename = NULL; + } + + icuenum = ures_openAvailableLocales( bundlename, &icuerror ); + INTL_CHECK_STATUS(icuerror, "Cannot fetch locales list"); + + uenum_reset( icuenum, &icuerror ); + INTL_CHECK_STATUS(icuerror, "Cannot iterate locales list"); + + array_init( return_value ); + while ((entry = uenum_next( icuenum, &entry_len, &icuerror ))) { + add_next_index_stringl( return_value, (char *) entry, entry_len, 1 ); + } + uenum_close( icuenum ); +} +/* }}} */ + +/* {{{ arginfo_resourcebundle_get_error_code */ +ZEND_BEGIN_ARG_INFO_EX( arginfo_resourcebundle_get_error_code, 0, 0, 0 ) +ZEND_END_ARG_INFO() +/* }}} */ + +/* {{{ proto string ResourceBundle::getErrorCode( ) + * proto string resourcebundle_get_error_code( ResourceBundle $bundle ) + * Get text description for ResourceBundle's last error code. + */ +PHP_FUNCTION( resourcebundle_get_error_code ) +{ + RESOURCEBUNDLE_METHOD_INIT_VARS; + + if( zend_parse_method_parameters( ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", + &object, ResourceBundle_ce_ptr ) == FAILURE ) + { + intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, + "resourcebundle_get_error_code: unable to parse input params", 0 TSRMLS_CC ); + RETURN_FALSE; + } + + rb = (ResourceBundle_object *) zend_object_store_get_object( object TSRMLS_CC ); + + RETURN_LONG(INTL_DATA_ERROR_CODE(rb)); +} +/* }}} */ + +/* {{{ arginfo_resourcebundle_get_error_message */ +ZEND_BEGIN_ARG_INFO_EX( arginfo_resourcebundle_get_error_message, 0, 0, 0 ) +ZEND_END_ARG_INFO() +/* }}} */ + +/* {{{ proto string ResourceBundle::getErrorMessage( ) + * proto string resourcebundle_get_error_message( ResourceBundle $bundle ) + * Get text description for ResourceBundle's last error. + */ +PHP_FUNCTION( resourcebundle_get_error_message ) +{ + char* message = NULL; + RESOURCEBUNDLE_METHOD_INIT_VARS; + + if( zend_parse_method_parameters( ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", + &object, ResourceBundle_ce_ptr ) == FAILURE ) + { + intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, + "resourcebundle_get_error_message: unable to parse input params", 0 TSRMLS_CC ); + RETURN_FALSE; + } + + rb = (ResourceBundle_object *) zend_object_store_get_object( object TSRMLS_CC ); + message = (char *)intl_error_get_message(INTL_DATA_ERROR_P(rb) TSRMLS_CC); + RETURN_STRING(message, 0); +} +/* }}} */ + +/* {{{ ResourceBundle_class_functions + * Every 'ResourceBundle' class method has an entry in this table + */ +static function_entry ResourceBundle_class_functions[] = { + PHP_ME( ResourceBundle, __construct, arginfo_resourcebundle___construct, ZEND_ACC_PUBLIC|ZEND_ACC_CTOR ) + ZEND_NAMED_ME( create, ZEND_FN( resourcebundle_create ), arginfo_resourcebundle___construct, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC ) + ZEND_NAMED_ME( get, ZEND_FN(resourcebundle_get), arginfo_resourcebundle_get, ZEND_ACC_PUBLIC ) + ZEND_NAMED_ME( count, ZEND_FN(resourcebundle_count), arginfo_resourcebundle_count, ZEND_ACC_PUBLIC ) + ZEND_NAMED_ME( getLocales, ZEND_FN(resourcebundle_locales), arginfo_resourcebundle_getlocales, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC ) + ZEND_NAMED_ME( getErrorCode, ZEND_FN(resourcebundle_get_error_code), arginfo_resourcebundle_get_error_code, ZEND_ACC_PUBLIC ) + ZEND_NAMED_ME( getErrorMessage, ZEND_FN(resourcebundle_get_error_message), arginfo_resourcebundle_get_error_message, ZEND_ACC_PUBLIC ) + { NULL, NULL, NULL } +}; +/* }}} */ + +/* {{{ resourcebundle_register_class + * Initialize 'ResourceBundle' class + */ +void resourcebundle_register_class( TSRMLS_D ) +{ + zend_class_entry ce; + + INIT_CLASS_ENTRY( ce, "ResourceBundle", ResourceBundle_class_functions ); + + ce.create_object = ResourceBundle_object_create; + ce.get_iterator = resourcebundle_get_iterator; + + ResourceBundle_ce_ptr = zend_register_internal_class( &ce TSRMLS_CC ); + + if( !ResourceBundle_ce_ptr ) + { + zend_error(E_ERROR, "Failed to register ResourceBundle class"); + return; + } + + ResourceBundle_object_handlers = std_object_handlers; + ResourceBundle_object_handlers.read_dimension = resourcebundle_array_get; + ResourceBundle_object_handlers.count_elements = resourcebundle_array_count; +} +/* }}} */ + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + * vim600: noet sw=4 ts=4 fdm=marker + * vim<600: noet sw=4 ts=4 + */ diff --git a/ext/intl/resourcebundle/resourcebundle_class.h b/ext/intl/resourcebundle/resourcebundle_class.h new file mode 100644 index 000000000..65330dd16 --- /dev/null +++ b/ext/intl/resourcebundle/resourcebundle_class.h @@ -0,0 +1,48 @@ +/* + +----------------------------------------------------------------------+ + | PHP Version 5 | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.01 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_01.txt | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Hans-Peter Oeri (University of St.Gallen) | + +----------------------------------------------------------------------+ + */ + +#ifndef RESOURCEBUNDLE_CLASS_H +#define RESOURCEBUNDLE_CLASS_H + +#include + +#include + +#include "intl_error.h" + +typedef struct { + zend_object zend; + intl_error error; + + UResourceBundle *me; + UResourceBundle *child; +} ResourceBundle_object; + +#define RESOURCEBUNDLE_METHOD_INIT_VARS INTL_METHOD_INIT_VARS(ResourceBundle, rb) +#define RESOURCEBUNDLE_METHOD_FETCH_OBJECT INTL_METHOD_FETCH_OBJECT(ResourceBundle, rb) +#define RESOURCEBUNDLE_OBJECT(rb) (rb)->me + +void resourcebundle_register_class( TSRMLS_D ); +extern zend_class_entry *ResourceBundle_ce_ptr; + +PHP_FUNCTION( resourcebundle_create ); +PHP_FUNCTION( resourcebundle_get ); +PHP_FUNCTION( resourcebundle_count ); +PHP_FUNCTION( resourcebundle_locales ); +PHP_FUNCTION( resourcebundle_get_error_code ); +PHP_FUNCTION( resourcebundle_get_error_message ); + +#endif // #ifndef RESOURCEBUNDLE_CLASS_H diff --git a/ext/intl/resourcebundle/resourcebundle_iterator.c b/ext/intl/resourcebundle/resourcebundle_iterator.c new file mode 100644 index 000000000..16e1b9287 --- /dev/null +++ b/ext/intl/resourcebundle/resourcebundle_iterator.c @@ -0,0 +1,192 @@ +/* + +----------------------------------------------------------------------+ + | PHP Version 5 | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.01 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_01.txt | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Hans-Peter Oeri (University of St.Gallen) | + +----------------------------------------------------------------------+ + */ + +#include +#include +#include + +#include "resourcebundle/resourcebundle.h" +#include "resourcebundle/resourcebundle_class.h" +#include "resourcebundle/resourcebundle_iterator.h" + +/* + * Although libicu offers iterator functions, they are not used here: libicu does iterate + * irrespective of array indices. Those cannot be recreated afterwards. Arrays as well as tables + * can however be accessed by numerical index, with table keys readable ex post. + */ + +/* {{{ resourcebundle_iterator_read */ +static void resourcebundle_iterator_read( ResourceBundle_iterator *iterator TSRMLS_DC ) +{ + UErrorCode icuerror = U_ZERO_ERROR; + ResourceBundle_object *rb = iterator->subject; + + rb->child = ures_getByIndex( rb->me, iterator->i, rb->child, &icuerror ); + + if (U_SUCCESS(icuerror)) { + /* ATTN: key extraction must be the first thing to do... rb->child might be reset in read! */ + if (iterator->is_table) { + iterator->currentkey = estrdup( ures_getKey( rb->child ) ); + } + MAKE_STD_ZVAL( iterator->current ); + resourcebundle_extract_value( iterator->current, rb TSRMLS_CC ); + } + else { + // zend_throw_exception( spl_ce_OutOfRangeException, "Running past end of ResourceBundle", 0 TSRMLS_CC); + iterator->current = NULL; + } +} +/* }}} */ + +/* {{{ resourcebundle_iterator_invalidate */ +static void resourcebundle_iterator_invalidate( zend_object_iterator *iter TSRMLS_DC ) +{ + ResourceBundle_iterator *iterator = (ResourceBundle_iterator *) iter; + + if (iterator->current) { + zval_ptr_dtor( &iterator->current ); + iterator->current = NULL; + } + if (iterator->currentkey) { + efree( iterator->currentkey ); + iterator->currentkey = NULL; + } +} +/* }}} */ + +/* {{{ resourcebundle_iterator_dtor */ +static void resourcebundle_iterator_dtor( zend_object_iterator *iter TSRMLS_DC ) +{ + ResourceBundle_iterator *iterator = (ResourceBundle_iterator *) iter; + zval *object = (zval *)iterator->intern.data; + + resourcebundle_iterator_invalidate( iter TSRMLS_CC ); + + Z_DELREF_P(object); + + efree(iterator); +} +/* }}} */ + +/* {{{ resourcebundle_iterator_has_more */ +static int resourcebundle_iterator_has_more( zend_object_iterator *iter TSRMLS_DC ) +{ + ResourceBundle_iterator *iterator = (ResourceBundle_iterator *) iter; + return (iterator->i < iterator->length) ? SUCCESS : FAILURE; +} +/* }}} */ + +/* {{{ resourcebundle_iterator_current */ +static void resourcebundle_iterator_current( zend_object_iterator *iter, zval ***data TSRMLS_DC ) +{ + ResourceBundle_iterator *iterator = (ResourceBundle_iterator *) iter; + if (!iterator->current) { + resourcebundle_iterator_read( iterator TSRMLS_CC); + } + *data = &iterator->current; +} +/* }}} */ + +/* {{{ resourcebundle_iterator_key */ +static int resourcebundle_iterator_key( zend_object_iterator *iter, char **str_key, uint *str_key_len, ulong *int_key TSRMLS_DC ) +{ + ResourceBundle_iterator *iterator = (ResourceBundle_iterator *) iter; + + if (!iterator->current) { + resourcebundle_iterator_read( iterator TSRMLS_CC); + } + if (iterator->is_table) { + *str_key = estrdup( iterator->currentkey ); + *str_key_len = strlen( iterator->currentkey ) + 1; + return HASH_KEY_IS_STRING; + } + else { + *int_key = iterator->i; + return HASH_KEY_IS_LONG; + } +} +/* }}} */ + +/* {{{ resourcebundle_iterator_has_more */ +static void resourcebundle_iterator_step( zend_object_iterator *iter TSRMLS_DC ) +{ + ResourceBundle_iterator *iterator = (ResourceBundle_iterator *) iter; + + iterator->i++; + resourcebundle_iterator_invalidate( iter TSRMLS_CC ); +} +/* }}} */ + +/* {{{ resourcebundle_iterator_has_reset */ +static void resourcebundle_iterator_reset( zend_object_iterator *iter TSRMLS_DC ) +{ + ResourceBundle_iterator *iterator = (ResourceBundle_iterator *) iter; + + iterator->i = 0; + resourcebundle_iterator_invalidate( iter TSRMLS_CC ); +} +/* }}} */ + +/* {{{ resourcebundle_iterator_funcs */ +static zend_object_iterator_funcs resourcebundle_iterator_funcs = { + resourcebundle_iterator_dtor, + resourcebundle_iterator_has_more, + resourcebundle_iterator_current, + resourcebundle_iterator_key, + resourcebundle_iterator_step, + resourcebundle_iterator_reset, + resourcebundle_iterator_invalidate +}; +/* }}} */ + +/* {{{ resourcebundle_get_iterator */ +zend_object_iterator *resourcebundle_get_iterator( zend_class_entry *ce, zval *object, int byref TSRMLS_DC ) +{ + ResourceBundle_object *rb = (ResourceBundle_object *) zend_object_store_get_object( object TSRMLS_CC ); + ResourceBundle_iterator *iterator = emalloc( sizeof( ResourceBundle_iterator ) ); + + if (byref) { + php_error( E_ERROR, "ResourceBundle does not support writable iterators" ); + } + + Z_ADDREF_P(object); + iterator->intern.data = (void *) object; + iterator->intern.funcs = &resourcebundle_iterator_funcs; + + iterator->subject = rb; + + /* The iterated rb can only be either URES_TABLE or URES_ARRAY + * All other types are returned as php primitives! + */ + iterator->is_table = (ures_getType( rb->me ) == URES_TABLE); + iterator->length = ures_getSize( rb->me ); + + iterator->current = NULL; + iterator->currentkey = NULL; + iterator->i = 0; + + return (zend_object_iterator *) iterator; +} +/* }}} */ + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + * vim600: noet sw=4 ts=4 fdm=marker + * vim<600: noet sw=4 ts=4 + */ diff --git a/ext/intl/resourcebundle/resourcebundle_iterator.h b/ext/intl/resourcebundle/resourcebundle_iterator.h new file mode 100644 index 000000000..90dba86d8 --- /dev/null +++ b/ext/intl/resourcebundle/resourcebundle_iterator.h @@ -0,0 +1,36 @@ +/* + +----------------------------------------------------------------------+ + | PHP Version 5 | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.01 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_01.txt | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Hans-Peter Oeri (University of St.Gallen) | + +----------------------------------------------------------------------+ + */ + +#ifndef RESOURCEBUNDLE_ITERATOR_H +#define RESOURCEBUNDLE_ITERATOR_H + +#include + +#include "resourcebundle/resourcebundle_class.h" + +typedef struct { + zend_object_iterator intern; + ResourceBundle_object *subject; + zend_bool is_table; + long length; + zval *current; + char *currentkey; + long i; +} ResourceBundle_iterator; + +zend_object_iterator *resourcebundle_get_iterator( zend_class_entry *ce, zval *object, int byref TSRMLS_DC ); + +#endif // #ifndef RESOURCEBUNDLE_ITERATOR_H diff --git a/ext/intl/tests/_files/es-bundle.txt b/ext/intl/tests/_files/es-bundle.txt new file mode 100755 index 000000000..46399a771 --- /dev/null +++ b/ext/intl/tests/_files/es-bundle.txt @@ -0,0 +1,21 @@ +es { + teststring:string { "Hola Mundo!" } + + testint:int { 2 } + + testvector:intvector { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 } + + testbin:bin { a1b2c3d4e5f67890 } + + testtable:table { + major:int { 3 } + minor:int { 4 } + patch:int { 7 } + } + + testarray:array { + "cadena 1", + "cadena 2", + "cadena 3" + } +} diff --git a/ext/intl/tests/_files/res_index.txt b/ext/intl/tests/_files/res_index.txt new file mode 100755 index 000000000..a39bea58e --- /dev/null +++ b/ext/intl/tests/_files/res_index.txt @@ -0,0 +1,6 @@ +res_index:table(nofallback) { + InstalledLocales { +es {""} +root {""} + } +} \ No newline at end of file diff --git a/ext/intl/tests/_files/resourcebundle.txt b/ext/intl/tests/_files/resourcebundle.txt new file mode 100755 index 000000000..5b081da6c --- /dev/null +++ b/ext/intl/tests/_files/resourcebundle.txt @@ -0,0 +1,21 @@ +root { + teststring:string { "Hello World!" } + + testint:int { 2 } + + testvector:intvector { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 } + + testbin:bin { a1b2c3d4e5f67890 } + + testtable:table { + major:int { 3 } + minor:int { 4 } + patch:int { 7 } + } + + testarray:array { + "string 1", + "string 2", + "string 3" + } +} diff --git a/ext/intl/tests/_files/resourcebundle/es.res b/ext/intl/tests/_files/resourcebundle/es.res new file mode 100755 index 000000000..f9d891d6b Binary files /dev/null and b/ext/intl/tests/_files/resourcebundle/es.res differ diff --git a/ext/intl/tests/_files/resourcebundle/res_index.res b/ext/intl/tests/_files/resourcebundle/res_index.res new file mode 100755 index 000000000..9dd3df2de Binary files /dev/null and b/ext/intl/tests/_files/resourcebundle/res_index.res differ diff --git a/ext/intl/tests/_files/resourcebundle/root.res b/ext/intl/tests/_files/resourcebundle/root.res new file mode 100755 index 000000000..62cb48c45 Binary files /dev/null and b/ext/intl/tests/_files/resourcebundle/root.res differ diff --git a/ext/intl/tests/badargs.phpt b/ext/intl/tests/badargs.phpt new file mode 100755 index 000000000..9232bbf0c --- /dev/null +++ b/ext/intl/tests/badargs.phpt @@ -0,0 +1,25 @@ +--TEST-- +Check that bad argumens return the same +--SKIPIF-- + +--FILE-- +getNumberOfRequiredParameters() == 0) { + continue; + } + $res = $func($arg); + if($res != false) { + echo "$func: "; + var_dump($res); + } +} +echo "OK!\n"; +?> +--EXPECT-- +OK! diff --git a/ext/intl/tests/collator_get_sort_key.phpt b/ext/intl/tests/collator_get_sort_key.phpt new file mode 100755 index 000000000..0186c26f6 --- /dev/null +++ b/ext/intl/tests/collator_get_sort_key.phpt @@ -0,0 +1,97 @@ +--TEST-- +collator_get_sort_key() +--SKIPIF-- + +--FILE-- + +--EXPECT-- +source: abc +key: %29%2B-%01%07%01%07%00 +source: abd +key: %29%2B%2F%01%07%01%07%00 +source: aaa +key: %29%29%29%01%07%01%07%00 +source: %D0%B0%D0%B0 +key: _++%01%06%01%06%00 +source: %D0%B0 +key: _+%01%05%01%05%00 +source: z +key: %5B%01%05%01%05%00 +source: +key: %01%01%00 +source: +key: %01%01%00 +source: 3 +key: %26%80%01%05%01%05%00 +source: y +key: Y%01%05%01%05%00 +source: i +key: 9%01%05%01%05%00 +source: k +key: %3D%01%05%01%05%00 +source: %D0%B0%D0%B1%D0%B3 +key: _+%2C0%01%07%01%07%00 +source: %D0%B0%D0%B1%D0%B2 +key: _+%2C.%01%07%01%07%00 +source: %D0%B6%D0%B6%D0%B6 +key: _LLL%01%07%01%07%00 +source: %D1%8D%D1%8E%D1%8F +key: %60%05%09%0B%01%07%01%07%00 +source: %D0%B0%D0%B1%D0%B3 +key: _+%2C0%01%07%01%07%00 +source: %D0%B0%D0%B1%D0%B2 +key: _+%2C.%01%07%01%07%00 +source: %D0%B6%D0%B6%D0%B6 +key: _LLL%01%07%01%07%00 +source: %D1%8D%D1%8E%D1%8F +key: %60%05%09%0B%01%07%01%07%00 \ No newline at end of file diff --git a/ext/intl/tests/resourcebundle.build b/ext/intl/tests/resourcebundle.build new file mode 100755 index 000000000..6a7eeae5e --- /dev/null +++ b/ext/intl/tests/resourcebundle.build @@ -0,0 +1,33 @@ +getFileName()); +} + +$dir = new GlobIterator("$here/_files/resourcebundle/*.res", FilesystemIterator::KEY_AS_FILENAME); +foreach($dir as $file) { + if($file->getFileName() == "res_index.res") continue; + $list[] = str_replace(".res", "", $file->getFileName()); +} + +$filelist = join(" {\"\"}\n", $list); +$res_index = << +--EXPECT-- +length: 6 +teststring: Hello World! +testint: 2 +Array +( + [0] => 1 + [1] => 2 + [2] => 3 + [3] => 4 + [4] => 5 + [5] => 6 + [6] => 7 + [7] => 8 + [8] => 9 + [9] => 0 +) +testbin: a1b2c3d4e5f67890 +testtable: 3 +testarray: string 3 +NULL + 2: Cannot load resource element 'nonexisting': U_MISSING_RESOURCE_ERROR diff --git a/ext/intl/tests/resourcebundle_create.phpt b/ext/intl/tests/resourcebundle_create.phpt new file mode 100644 index 000000000..4d96d3eff --- /dev/null +++ b/ext/intl/tests/resourcebundle_create.phpt @@ -0,0 +1,62 @@ +--TEST-- +Test ResourceBundle::__construct() - existing/missing bundles/locales +--SKIPIF-- + +--FILE-- + +--EXPECTF-- +ResourceBundle Object +( +) + + 0: U_ZERO_ERROR +Hello World! +ResourceBundle Object +( +) + + 0: U_ZERO_ERROR +Hola Mundo! +ResourceBundle Object +( +) + + -127: U_USING_DEFAULT_WARNING +NULL + -127: resourcebundle_ctor: Cannot load libICU resource '%s/resourcebundle' without fallback from en_US to root: U_USING_DEFAULT_WARNING +NULL + 2: resourcebundle_ctor: Cannot load libICU resource bundle: U_MISSING_RESOURCE_ERROR diff --git a/ext/intl/tests/resourcebundle_individual.phpt b/ext/intl/tests/resourcebundle_individual.phpt new file mode 100644 index 000000000..182cbf325 --- /dev/null +++ b/ext/intl/tests/resourcebundle_individual.phpt @@ -0,0 +1,55 @@ +--TEST-- +Test ResourceBundle::get() and length() - existing/missing keys +--FILE-- + +--EXPECT-- +length: 6 +teststring: Hello World! +testint: 2 +Array +( + [0] => 1 + [1] => 2 + [2] => 3 + [3] => 4 + [4] => 5 + [5] => 6 + [6] => 7 + [7] => 8 + [8] => 9 + [9] => 0 +) +testbin: a1b2c3d4e5f67890 +testtable: 3 +testarray: string 3 +NULL + 2: Cannot load resource element 'nonexisting': U_MISSING_RESOURCE_ERROR diff --git a/ext/intl/tests/resourcebundle_iterator.phpt b/ext/intl/tests/resourcebundle_iterator.phpt new file mode 100644 index 000000000..31b0768bf --- /dev/null +++ b/ext/intl/tests/resourcebundle_iterator.phpt @@ -0,0 +1,71 @@ +--TEST-- +Test ResourceBundle iterator +--FILE-- + $oneval) { + echo "Here comes $onekey:\n"; + switch (gettype($oneval)) { + case 'string': + echo bin2hex( $oneval ) . "\n"; + break; + + case 'integer': + echo "$oneval\n"; + break; + + default: + print_r( $oneval ); + } + echo "\n"; + } + + echo "Testarray Contents:\n"; + $r = $r->get( 'testarray' ); + foreach ($r as $onekey => $oneval) { + echo "$onekey => $oneval\n"; + } +?> +--EXPECTF-- +Here comes testarray: +ResourceBundle Object +( +) + +Here comes testbin: +a1b2c3d4e5f67890 + +Here comes testint: +2 + +Here comes teststring: +48656c6c6f20576f726c6421 + +Here comes testtable: +ResourceBundle Object +( +) + +Here comes testvector: +Array +( + [0] => 1 + [1] => 2 + [2] => 3 + [3] => 4 + [4] => 5 + [5] => 6 + [6] => 7 + [7] => 8 + [8] => 9 + [9] => 0 +) + +Testarray Contents: +0 => string 1 +1 => string 2 +2 => string 3 diff --git a/ext/intl/tests/resourcebundle_locales.phpt b/ext/intl/tests/resourcebundle_locales.phpt new file mode 100755 index 000000000..e14a7e5aa --- /dev/null +++ b/ext/intl/tests/resourcebundle_locales.phpt @@ -0,0 +1,23 @@ +--TEST-- +Test ResourceBundle::getLocales +--SKIPIF-- + +--FILE-- + +--EXPECT-- +es +root diff --git a/ext/intl/tests/ut_common.inc b/ext/intl/tests/ut_common.inc index 4f2036123..09be22bf5 100755 --- a/ext/intl/tests/ut_common.inc +++ b/ext/intl/tests/ut_common.inc @@ -59,6 +59,10 @@ function ut_coll_sort_with_sort_keys( $coll, &$arr ) { return $GLOBALS['oo-mode'] ? $coll->sortWithSortKeys( $arr ) : collator_sort_with_sort_keys( $coll, $arr ); } +function ut_coll_get_sort_key( $coll, $str ) +{ + return $GLOBALS['oo-mode'] ? $coll->getSortKey( $str ) : collator_get_sort_key( $coll, $str ); +} function ut_coll_asort( $coll, &$arr, $sort_flag = Collator::SORT_REGULAR ) { return $GLOBALS['oo-mode'] ? $coll->asort( $arr, $sort_flag ) : collator_asort( $coll, $arr, $sort_flag ); @@ -385,4 +389,28 @@ function ut_datefmt_localtime( $fmt , $value , &$parse_pos=0 ) { return $GLOBALS['oo-mode'] ? $fmt->localtime( $value , $parse_pos ) : datefmt_localtime( $fmt , $value , $parse_pos ); } -?> + +function ut_resourcebundle_create( $locale, $bundle, $fallback=true ) +{ + return $GLOBALS['oo-mode'] ? new ResourceBundle($locale, $bundle, $fallback): resourcebundle_create($locale, $bundle, $fallback); +} +function ut_resourcebundle_count($bundle ) +{ + return $GLOBALS['oo-mode'] ? $bundle->count():resourcebundle_count($bundle); +} +function ut_resourcebundle_locales($bundle ) +{ + return $GLOBALS['oo-mode'] ? ResourceBundle::getLocales($bundle):resourcebundle_locales($bundle); +} +function ut_resourcebundle_get($bundle, $idx ) +{ + return $GLOBALS['oo-mode'] ? $bundle->get($idx):resourcebundle_get($bundle, $idx); +} +function ut_resourcebundle_get_error_code($bundle ) +{ + return $GLOBALS['oo-mode'] ? $bundle->getErrorCode():resourcebundle_get_error_code($bundle); +} +function ut_resourcebundle_get_error_message($bundle ) +{ + return $GLOBALS['oo-mode'] ? $bundle->getErrorMessage():resourcebundle_get_error_message($bundle); +} diff --git a/ext/json/json.c b/ext/json/json.c index 1c2d63e40..c43401868 100644 --- a/ext/json/json.c +++ b/ext/json/json.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: json.c 286385 2009-07-27 03:43:38Z scottmac $ */ +/* $Id: json.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/json/php_json.h b/ext/json/php_json.h index dacacc1b3..44c876f21 100644 --- a/ext/json/php_json.h +++ b/ext/json/php_json.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_json.h 283185 2009-06-30 17:52:21Z stas $ */ +/* $Id: php_json.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_JSON_H #define PHP_JSON_H diff --git a/ext/ldap/ldap.c b/ext/ldap/ldap.c index 4a8941cf1..c13912496 100644 --- a/ext/ldap/ldap.c +++ b/ext/ldap/ldap.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -23,7 +23,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: ldap.c 287897 2009-08-30 15:33:59Z iliaa $ */ +/* $Id: ldap.c 293036 2010-01-03 09:23:27Z sebastian $ */ #define IS_EXT_MODULE #ifdef HAVE_CONFIG_H @@ -225,7 +225,7 @@ PHP_MINFO_FUNCTION(ldap) php_info_print_table_start(); php_info_print_table_row(2, "LDAP Support", "enabled"); - php_info_print_table_row(2, "RCS Version", "$Id: ldap.c 287897 2009-08-30 15:33:59Z iliaa $"); + php_info_print_table_row(2, "RCS Version", "$Id: ldap.c 293036 2010-01-03 09:23:27Z sebastian $"); if (LDAPG(max_links) == -1) { snprintf(tmp, 31, "%ld/unlimited", LDAPG(num_links)); @@ -936,21 +936,21 @@ PHP_FUNCTION(ldap_get_entries) ldap = ld->link; num_entries = ldap_count_entries(ldap, ldap_result); + array_init(return_value); + add_assoc_long(return_value, "count", num_entries); + if (num_entries == 0) { - RETURN_NULL(); + return; } - num_entries = 0; ldap_result_entry = ldap_first_entry(ldap, ldap_result); if (ldap_result_entry == NULL) { + zval_dtor(return_value); RETURN_FALSE; } - array_init(return_value); - add_assoc_long(return_value, "count", num_entries); - + num_entries = 0; while (ldap_result_entry != NULL) { - MAKE_STD_ZVAL(tmp1); array_init(tmp1); @@ -1583,14 +1583,17 @@ PHP_FUNCTION(ldap_get_option) #ifdef LDAP_OPT_NETWORK_TIMEOUT case LDAP_OPT_NETWORK_TIMEOUT: { - struct timeval *timeout; + struct timeval *timeout = NULL; if (ldap_get_option(ld->link, LDAP_OPT_NETWORK_TIMEOUT, (void *) &timeout)) { if (timeout) { ldap_memfree(timeout); } RETURN_FALSE; - } + } + if (!timeout) { + RETURN_FALSE; + } zval_dtor(retval); ZVAL_LONG(retval, timeout->tv_sec); ldap_memfree(timeout); @@ -1908,6 +1911,7 @@ PHP_FUNCTION(ldap_first_reference) resultentry->id = Z_LVAL_P(result); zend_list_addref(resultentry->id); resultentry->data = entry; + resultentry->ber = NULL; } } /* }}} */ @@ -1936,6 +1940,7 @@ PHP_FUNCTION(ldap_next_reference) resultentry_next->id = resultentry->id; zend_list_addref(resultentry->id); resultentry_next->data = entry_next; + resultentry_next->ber = NULL; } } /* }}} */ diff --git a/ext/ldap/php_ldap.h b/ext/ldap/php_ldap.h index c30218a70..fc4e3e8f2 100644 --- a/ext/ldap/php_ldap.h +++ b/ext/ldap/php_ldap.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_ldap.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_ldap.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_LDAP_H #define PHP_LDAP_H diff --git a/ext/ldap/tests/ldap_bind_basic.phpt b/ext/ldap/tests/ldap_bind_basic.phpt index bac8d0d11..b0babaef1 100644 --- a/ext/ldap/tests/ldap_bind_basic.phpt +++ b/ext/ldap/tests/ldap_bind_basic.phpt @@ -4,7 +4,8 @@ ldap_bind() - Basic anonymous binding Patrick Allaert # Belgian PHP Testfest 2009 --SKIPIF-- - + + --FILE-- # Belgian PHP Testfest 2009 --SKIPIF-- - + + --FILE-- --EXPECT-- -NULL +array(1) { + ["count"]=> + int(0) +} ===DONE=== diff --git a/ext/ldap/tests/ldap_mod_del_basic.phpt b/ext/ldap/tests/ldap_mod_del_basic.phpt index 0d002bd15..c7daba44d 100644 --- a/ext/ldap/tests/ldap_mod_del_basic.phpt +++ b/ext/ldap/tests/ldap_mod_del_basic.phpt @@ -36,5 +36,8 @@ remove_dummy_data($link); ?> --EXPECT-- bool(true) -NULL +array(1) { + ["count"]=> + int(0) +} ===DONE=== diff --git a/ext/ldap/tests/ldap_search_error.phpt b/ext/ldap/tests/ldap_search_error.phpt index c03bd2ca8..7e9461343 100644 --- a/ext/ldap/tests/ldap_search_error.phpt +++ b/ext/ldap/tests/ldap_search_error.phpt @@ -4,9 +4,8 @@ ldap_search() - operation that should fail Davide Mendolia Belgian PHP Testfest 2009 --SKIPIF-- - + + --FILE-- # Belgian PHP Testfest 2009 --SKIPIF-- - + + --FILE-- = 20621 REGISTER_LONG_CONSTANT("LIBXML_COMPACT", XML_PARSE_COMPACT, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("LIBXML_NOXMLDECL", XML_SAVE_NO_DECL, CONST_CS | CONST_PERSISTENT); +#endif +#if LIBXML_VERSION >= 20703 + REGISTER_LONG_CONSTANT("LIBXML_PARSEHUGE", XML_PARSE_HUGE, CONST_CS | CONST_PERSISTENT); #endif REGISTER_LONG_CONSTANT("LIBXML_NOEMPTYTAG", LIBXML_SAVE_NOEMPTYTAG, CONST_CS | CONST_PERSISTENT); diff --git a/ext/libxml/php_libxml.h b/ext/libxml/php_libxml.h index 8a1082273..246882ead 100644 --- a/ext/libxml/php_libxml.h +++ b/ext/libxml/php_libxml.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_libxml.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_libxml.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_LIBXML_H #define PHP_LIBXML_H diff --git a/ext/mbstring/config.m4 b/ext/mbstring/config.m4 index ad0c16c41..ef7678347 100644 --- a/ext/mbstring/config.m4 +++ b/ext/mbstring/config.m4 @@ -1,5 +1,5 @@ dnl -dnl $Id: config.m4 279059 2009-04-20 15:39:48Z jani $ +dnl $Id: config.m4 291283 2009-11-25 01:30:06Z rasmus $ dnl AC_DEFUN([PHP_MBSTRING_ADD_SOURCES], [ @@ -74,7 +74,7 @@ AC_DEFUN([PHP_MBSTRING_SETUP_MBREGEX], [ AC_DEFINE([USE_COMBINATION_EXPLOSION_CHECK],1,[whether to check multibyte regex backtrack]) fi - AC_CACHE_CHECK(for variable length prototypes and stdarg.h, cv_php_mbstring_stdarg, [ + AC_CACHE_CHECK(for variable length prototypes and stdarg.h, php_cv_mbstring_stdarg, [ AC_TRY_RUN([ #include int foo(int x, ...) { @@ -86,14 +86,14 @@ int foo(int x, ...) { return 0; } int main() { return foo(10, "", 3.14); } - ], [cv_php_mbstring_stdarg=yes], [cv_php_mbstring_stdarg=no], [ + ], [php_cv_mbstring_stdarg=yes], [php_cv_mbstring_stdarg=no], [ dnl cross-compile needs something here case $host_alias in *netware*) - cv_php_mbstring_stdarg=yes + php_cv_mbstring_stdarg=yes ;; *) - cv_php_mbstring_stdarg=no + php_cv_mbstring_stdarg=no ;; esac ]) diff --git a/ext/mbstring/libmbfl/filters/mbfilter_utf16.c b/ext/mbstring/libmbfl/filters/mbfilter_utf16.c index b6c2aeda5..5df6551d4 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_utf16.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_utf16.c @@ -127,7 +127,7 @@ int mbfl_filt_conv_utf16_wchar(int c, mbfl_convert_filter *filter) int n, endian; endian = filter->status & 0xff00; - switch (filter->status & 0xff) { + switch (filter->status & 0x0f) { case 0: if (endian) { n = c & 0xff; @@ -144,15 +144,8 @@ int mbfl_filt_conv_utf16_wchar(int c, mbfl_convert_filter *filter) n = c & 0xff; } n |= filter->cache & 0xffff; - filter->status &= ~0xff; - if (n == 0xfffe) { - if (endian) { - filter->status = 0; /* big-endian */ - } else { - filter->status = 0x100; /* little-endian */ - } - CK((*filter->output_function)(0xfeff, filter->data)); - } else if (n >= 0xd800 && n < 0xdc00) { + filter->status &= ~0x0f; + if (n >= 0xd800 && n < 0xdc00) { filter->cache = ((n & 0x3ff) << 16) + 0x400000; } else if (n >= 0xdc00 && n < 0xe000) { n &= 0x3ff; @@ -166,7 +159,21 @@ int mbfl_filt_conv_utf16_wchar(int c, mbfl_convert_filter *filter) CK((*filter->output_function)(n, filter->data)); } } else { + int is_first = filter->status & 0x10; filter->cache = 0; + filter->status |= 0x10; + if (!is_first) { + if (n == 0xfffe) { + if (endian) { + filter->status &= ~0x100; /* big-endian */ + } else { + filter->status |= 0x100; /* little-endian */ + } + break; + } else if (n == 0xfeff) { + break; + } + } CK((*filter->output_function)(n, filter->data)); } break; diff --git a/ext/mbstring/libmbfl/filters/mbfilter_utf8.c b/ext/mbstring/libmbfl/filters/mbfilter_utf8.c index 20ff983e1..c6777b29f 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_utf8.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_utf8.c @@ -220,7 +220,7 @@ static int mbfl_filt_ident_utf8(int c, mbfl_identify_filter *filter) if (c < 0x80) { if (c < 0) { filter->flag = 1; /* bad */ - } else if (c != 0 && filter->status) { + } else if (filter->status) { filter->flag = 1; /* bad */ } filter->status = 0; diff --git a/ext/mbstring/libmbfl/mbfl/mbfilter.c b/ext/mbstring/libmbfl/mbfl/mbfilter.c index 1aeb38cc9..4997c5a88 100644 --- a/ext/mbstring/libmbfl/mbfl/mbfilter.c +++ b/ext/mbstring/libmbfl/mbfl/mbfilter.c @@ -622,7 +622,7 @@ mbfl_identify_encoding(mbfl_string *string, enum mbfl_no_encoding *elist, int el if (!encoding) { for (i = 0; i < num; i++) { filter = &flist[i]; - if (!filter->flag) { + if (!filter->flag && (!strict || !filter->status)) { encoding = filter->encoding; break; } diff --git a/ext/mbstring/mb_gpc.c b/ext/mbstring/mb_gpc.c index b7dfd57dd..688a55dea 100644 --- a/ext/mbstring/mb_gpc.c +++ b/ext/mbstring/mb_gpc.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: mb_gpc.c 284727 2009-07-24 23:48:58Z moriyoshi $ */ +/* $Id: mb_gpc.c 293036 2010-01-03 09:23:27Z sebastian $ */ /* {{{ includes */ #ifdef HAVE_CONFIG_H diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index 3e46e8239..2d245979e 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: mbstring.c 281226 2009-05-27 13:42:17Z tony2001 $ */ +/* $Id: mbstring.c 293036 2010-01-03 09:23:27Z sebastian $ */ /* * PHP 4 Multibyte String module "mbstring" @@ -2665,10 +2665,6 @@ PHP_FUNCTION(mb_strcut) RETURN_FALSE; } - if (((unsigned int)from + (unsigned int)len) > string.len) { - len = string.len - from; - } - ret = mbfl_strcut(&string, &result, from, len); if (ret == NULL) { RETURN_FALSE; diff --git a/ext/mbstring/mbstring.h b/ext/mbstring/mbstring.h index ee0f8b8d2..52d0b40c7 100644 --- a/ext/mbstring/mbstring.h +++ b/ext/mbstring/mbstring.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: mbstring.h 277211 2009-03-15 20:42:56Z moriyoshi $ */ +/* $Id: mbstring.h 293036 2010-01-03 09:23:27Z sebastian $ */ /* * PHP 4 Multibyte String module "mbstring" (currently only for Japanese) diff --git a/ext/mbstring/php_mbregex.c b/ext/mbstring/php_mbregex.c index a3c577848..d9bac43f8 100644 --- a/ext/mbstring/php_mbregex.c +++ b/ext/mbstring/php_mbregex.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_mbregex.c 281727 2009-06-05 18:50:32Z mattwil $ */ +/* $Id: php_mbregex.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H diff --git a/ext/mbstring/php_mbregex.h b/ext/mbstring/php_mbregex.h index c9201df3f..dcc840f42 100644 --- a/ext/mbstring/php_mbregex.h +++ b/ext/mbstring/php_mbregex.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_mbregex.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_mbregex.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef _PHP_MBREGEX_H #define _PHP_MBREGEX_H diff --git a/ext/mbstring/php_unicode.c b/ext/mbstring/php_unicode.c index bb17c166d..55d7d5128 100644 --- a/ext/mbstring/php_unicode.c +++ b/ext/mbstring/php_unicode.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | diff --git a/ext/mbstring/php_unicode.h b/ext/mbstring/php_unicode.h index e35193df1..1afd3f974 100644 --- a/ext/mbstring/php_unicode.h +++ b/ext/mbstring/php_unicode.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | diff --git a/ext/mbstring/tests/bug43994.phpt b/ext/mbstring/tests/bug43994.phpt index 39a39f642..8fdb904a7 100644 --- a/ext/mbstring/tests/bug43994.phpt +++ b/ext/mbstring/tests/bug43994.phpt @@ -38,7 +38,7 @@ foreach($inputs as $input) { }; ?> ---EXPECTF---- +--EXPECTF-- -- Iteration 1 -- Without $regs arg: diff --git a/ext/mbstring/tests/bug45722.phpt b/ext/mbstring/tests/bug45722.phpt index c05a010a8..97f6fe5d9 100644 --- a/ext/mbstring/tests/bug45722.phpt +++ b/ext/mbstring/tests/bug45722.phpt @@ -1,5 +1,7 @@ --TEST-- Bug #45722 (mb_check_encoding() crashes) +--SKIPIF-- + --FILE-- --FILE-- +--FILE-- + +--EXPECT-- +string(11) "ISO-8859-15" +string(5) "UTF-8" +string(5) "UTF-8" +string(5) "UTF-8" +string(5) "UTF-8" diff --git a/ext/mbstring/tests/bug49354.phpt b/ext/mbstring/tests/bug49354.phpt new file mode 100644 index 000000000..c25b405d8 --- /dev/null +++ b/ext/mbstring/tests/bug49354.phpt @@ -0,0 +1,21 @@ +--TEST-- +Bug #49354 (mb_strcut() cuts wrong length when offset is in the middle of a multibyte character) +--SKIPIF-- + +--FILE-- + +--EXPECT-- +string(12) "AåBäCöDü" +string(11) "åBäCöDü" +string(11) "åBäCöDü" +string(9) "BäCöDü" +string(0) "" +bool(false) diff --git a/ext/mbstring/tests/bug49528.phpt b/ext/mbstring/tests/bug49528.phpt new file mode 100644 index 000000000..b06c35f85 --- /dev/null +++ b/ext/mbstring/tests/bug49528.phpt @@ -0,0 +1,20 @@ +--TEST-- +Bug #49528 (UTF-16 strings prefixed by BOM wrongly converted) +--SKIPIF-- + +--FILE-- + +--EXPECT-- +string(8) "02010403" +string(8) "01020304" +string(12) "feff02010403" +string(12) "fffe02010403" +string(12) "fffe01020304" +string(12) "feff01020304" diff --git a/ext/mbstring/tests/bug49536.phpt b/ext/mbstring/tests/bug49536.phpt new file mode 100644 index 000000000..32685d226 --- /dev/null +++ b/ext/mbstring/tests/bug49536.phpt @@ -0,0 +1,20 @@ +--TEST-- +Bug #49536 (mb_detect_encoding() returns incorrect results when strict_mode is turned on) +--SKIPIF-- + +--FILE-- + +--EXPECT-- +string(4) "SJIS" +bool(false) +string(5) "UTF-8" +bool(false) diff --git a/ext/mbstring/tests/mb_encoding_aliases.phpt b/ext/mbstring/tests/mb_encoding_aliases.phpt index 7b87045d0..2159481ef 100644 --- a/ext/mbstring/tests/mb_encoding_aliases.phpt +++ b/ext/mbstring/tests/mb_encoding_aliases.phpt @@ -1,5 +1,7 @@ --TEST-- mb_encoding_aliases() +--SKIPIF-- + --FILE-- --FILE-- | +----------------------------------------------------------------------+ */ -/* $Id: mcrypt.c 289433 2009-10-09 17:28:52Z pajoye $ */ +/* $Id: mcrypt.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/mcrypt/php_mcrypt.h b/ext/mcrypt/php_mcrypt.h index 95610560d..f90c3596a 100644 --- a/ext/mcrypt/php_mcrypt.h +++ b/ext/mcrypt/php_mcrypt.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ | Derick Rethans | +----------------------------------------------------------------------+ */ -/* $Id: php_mcrypt.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_mcrypt.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_MCRYPT_H #define PHP_MCRYPT_H diff --git a/ext/mcrypt/tests/bug46010.phpt b/ext/mcrypt/tests/bug46010.phpt index 5aeb3119d..bacfb5975 100644 --- a/ext/mcrypt/tests/bug46010.phpt +++ b/ext/mcrypt/tests/bug46010.phpt @@ -1,4 +1,4 @@ ---TEST--- +--TEST-- Bug #46010 (warnings incorrectly generated for iv in ecb mode) --FILE-- = 40101 #define MYSQL_DISABLE_MQ if (mysql->multi_query) { \ @@ -411,9 +407,6 @@ PHP_INI_BEGIN() STD_PHP_INI_ENTRY("mysql.connect_timeout", "60", PHP_INI_ALL, OnUpdateLong, connect_timeout, zend_mysql_globals, mysql_globals) STD_PHP_INI_BOOLEAN("mysql.trace_mode", "0", PHP_INI_ALL, OnUpdateLong, trace_mode, zend_mysql_globals, mysql_globals) STD_PHP_INI_BOOLEAN("mysql.allow_local_infile", "1", PHP_INI_SYSTEM, OnUpdateLong, allow_local_infile, zend_mysql_globals, mysql_globals) -#ifdef MYSQL_USE_MYSQLND - STD_PHP_INI_ENTRY("mysql.cache_size", "2000", PHP_INI_SYSTEM, OnUpdateLong, cache_size, zend_mysql_globals, mysql_globals) -#endif PHP_INI_END() /* }}} */ @@ -432,10 +425,6 @@ static PHP_GINIT_FUNCTION(mysql) mysql_globals->trace_mode = 0; mysql_globals->allow_local_infile = 1; mysql_globals->result_allocated = 0; -#ifdef MYSQL_USE_MYSQLND - mysql_globals->cache_size = 0; - mysql_globals->mysqlnd_thd_zval_cache = NULL; -#endif } /* }}} */ @@ -465,9 +454,6 @@ ZEND_MODULE_STARTUP_D(mysql) return FAILURE; } #endif -#else - mysql_mysqlnd_zval_cache = mysqlnd_palloc_init_cache(MySG(cache_size)); - mysql_mysqlnd_qcache = mysqlnd_qcache_init_cache(); #endif return SUCCESS; @@ -493,9 +479,6 @@ PHP_MSHUTDOWN_FUNCTION(mysql) mysql_server_end(); #endif #endif -#else - mysqlnd_palloc_free_cache(mysql_mysqlnd_zval_cache); - mysqlnd_qcache_free_cache_reference(&mysql_mysqlnd_qcache); #endif UNREGISTER_INI_ENTRIES(); @@ -519,10 +502,6 @@ PHP_RINIT_FUNCTION(mysql) MySG(connect_errno) =0; MySG(result_allocated) = 0; -#ifdef MYSQL_USE_MYSQLND - MySG(mysqlnd_thd_zval_cache) = mysqlnd_palloc_rinit(mysql_mysqlnd_zval_cache); -#endif - return SUCCESS; } /* }}} */ @@ -559,7 +538,6 @@ PHP_RSHUTDOWN_FUNCTION(mysql) #ifdef MYSQL_USE_MYSQLND zend_hash_apply(&EG(persistent_list), (apply_func_t) php_mysql_persistent_helper TSRMLS_CC); - mysqlnd_palloc_rshutdown(MySG(mysqlnd_thd_zval_cache)); #endif return SUCCESS; @@ -585,20 +563,6 @@ PHP_MINFO_FUNCTION(mysql) php_info_print_table_row(2, "MYSQL_INCLUDE", PHP_MYSQL_INCLUDE); php_info_print_table_row(2, "MYSQL_LIBS", PHP_MYSQL_LIBS); #endif -#if defined(MYSQL_USE_MYSQLND) - { - zval values; - - php_info_print_table_header(2, "Persistent cache", mysql_mysqlnd_zval_cache? "enabled":"disabled"); - - if (mysql_mysqlnd_zval_cache) { - /* Now report cache status */ - mysqlnd_palloc_stats(mysql_mysqlnd_zval_cache, &values); - mysqlnd_minfo_print_hash(&values); - zval_dtor(&values); - } - } -#endif php_info_print_table_end(); @@ -704,6 +668,9 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) client_flags ^= CLIENT_LOCAL_FILES; } +#ifdef CLIENT_MULTI_RESULTS + client_flags |= CLIENT_MULTI_RESULTS; /* compatibility with 5.2, see bug#50416 */ +#endif #ifdef CLIENT_MULTI_STATEMENTS client_flags &= ~CLIENT_MULTI_STATEMENTS; /* don't allow multi_queries via connect parameter */ #endif @@ -776,8 +743,7 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) #ifndef MYSQL_USE_MYSQLND if (mysql_real_connect(mysql->conn, host, user, passwd, NULL, port, socket, client_flags)==NULL) #else - if (mysqlnd_connect(mysql->conn, host, user, passwd, 0, NULL, 0, - port, socket, client_flags, MySG(mysqlnd_thd_zval_cache) TSRMLS_CC) == NULL) + if (mysqlnd_connect(mysql->conn, host, user, passwd, 0, NULL, 0, port, socket, client_flags TSRMLS_CC) == NULL) #endif { /* Populate connect error globals so that the error functions can read them */ @@ -825,8 +791,7 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) #ifndef MYSQL_USE_MYSQLND if (mysql_real_connect(mysql->conn, host, user, passwd, NULL, port, socket, client_flags)==NULL) #else - if (mysqlnd_connect(mysql->conn, host, user, passwd, 0, NULL, 0, - port, socket, client_flags, MySG(mysqlnd_thd_zval_cache) TSRMLS_CC) == NULL) + if (mysqlnd_connect(mysql->conn, host, user, passwd, 0, NULL, 0, port, socket, client_flags TSRMLS_CC) == NULL) #endif { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Link to server lost, unable to reconnect"); @@ -838,7 +803,7 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) } } else { #ifdef MYSQL_USE_MYSQLND - mysqlnd_restart_psession(mysql->conn, MySG(mysqlnd_thd_zval_cache)); + mysqlnd_restart_psession(mysql->conn); #endif } } @@ -897,8 +862,7 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) #ifndef MYSQL_USE_MYSQLND if (mysql_real_connect(mysql->conn, host, user, passwd, NULL, port, socket, client_flags)==NULL) #else - if (mysqlnd_connect(mysql->conn, host, user, passwd, 0, NULL, 0, - port, socket, client_flags, MySG(mysqlnd_thd_zval_cache) TSRMLS_CC) == NULL) + if (mysqlnd_connect(mysql->conn, host, user, passwd, 0, NULL, 0, port, socket, client_flags TSRMLS_CC) == NULL) #endif { /* Populate connect error globals so that the error functions can read them */ diff --git a/ext/mysql/php_mysql.h b/ext/mysql/php_mysql.h index 33c3b2ed5..cef76ac5e 100644 --- a/ext/mysql/php_mysql.h +++ b/ext/mysql/php_mysql.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ */ -/* $Id: php_mysql.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_mysql.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_MYSQL_H #define PHP_MYSQL_H diff --git a/ext/mysql/php_mysql_structs.h b/ext/mysql/php_mysql_structs.h index d74eadc04..0247dc862 100644 --- a/ext/mysql/php_mysql_structs.h +++ b/ext/mysql/php_mysql_structs.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -18,7 +18,7 @@ */ -/* $Id: php_mysql_structs.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_mysql_structs.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_MYSQL_STRUCTS_H #define PHP_MYSQL_STRUCTS_H @@ -124,11 +124,6 @@ ZEND_BEGIN_MODULE_GLOBALS(mysql) long result_allocated; long trace_mode; long allow_local_infile; -#ifdef MYSQL_USE_MYSQLND - MYSQLND_THD_ZVAL_PCACHE *mysqlnd_thd_zval_cache; - MYSQLND_QCACHE *mysqlnd_qcache; - long cache_size; -#endif ZEND_END_MODULE_GLOBALS(mysql) #ifdef ZTS diff --git a/ext/mysql/tests/connect.inc b/ext/mysql/tests/connect.inc index 86c0ee674..b5cc03ecb 100755 --- a/ext/mysql/tests/connect.inc +++ b/ext/mysql/tests/connect.inc @@ -19,30 +19,40 @@ if (!function_exists('sys_get_temp_dir')) { } } -/* wrapper to simplify test porting */ -function my_mysql_connect($host, $user, $passwd, $db, $port, $socket, $flags = NULL) { - global $connect_flags; +if (!function_exists('my_mysql_connect')) { + /* wrapper to simplify test porting */ + function my_mysql_connect($host, $user, $passwd, $db, $port, $socket, $flags = NULL, $persistent = false) { + global $connect_flags; - $flags = ($flags === NULL) ? $connect_flags : $flags; + $flags = ($flags === NULL) ? $connect_flags : $flags; - if ($socket) - $host = sprintf("%s:%s", $host, $socket); - else if ($port) - $host = sprintf("%s:%s", $host, $port); + if ($socket) + $host = sprintf("%s:%s", $host, $socket); + else if ($port) + $host = sprintf("%s:%s", $host, $port); - if (!$link = mysql_connect($host, $user, $passwd, true, $flags)) { - printf("[000-a] Cannot connect using host '%s', user '%s', password '****', [%d] %s\n", - $host, $user, $passwd, - mysql_errno(), mysql_error()); - return false; - } + if ($persistent) { + $link = mysql_pconnect($host, $user, $passwd, $flags); + } else { + $link = mysql_connect($host, $user, $passwd, true, $flags); + } - if (!mysql_select_db($db, $link)) { - printf("[000-b] [%d] %s\n", mysql_errno($link), mysql_error($link)); - return false; - } + if (!$link) { + printf("[000-a] Cannot connect using host '%s', user '%s', password '****', persistent = %d, [%d] %s\n", + $host, $user, ($persistent) ? 1 : 0, + mysql_errno(), mysql_error()); + return false; + } - return $link; + if (!mysql_select_db($db, $link)) { + printf("[000-b] [%d] %s\n", mysql_errno($link), mysql_error($link)); + return false; + } + + return $link; + } +} else { + printf("skip Eeeek/BUG/FIXME - connect.inc included twice! skipif bug?\n"); } /* diff --git a/ext/mysql/tests/mysql_connect.phpt b/ext/mysql/tests/mysql_connect.phpt index be094cce2..773264e5a 100644 --- a/ext/mysql/tests/mysql_connect.phpt +++ b/ext/mysql/tests/mysql_connect.phpt @@ -35,19 +35,23 @@ printf("[005] Expecting boolean/false, got %s/%s\n", gettype($link), $link); // Run the following tests without an anoynmous MySQL user and use a password for the test user! ini_set('mysql.default_socket', $socket); -if (!is_resource($link = mysql_connect($host, $user, $passwd, true))) { - printf("[006] Usage of mysql.default_socket failed\n"); -} else { - mysql_close($link); +if (!is_null($socket)) { + if (!is_resource($link = mysql_connect($host, $user, $passwd, true))) { + printf("[006] Usage of mysql.default_socket failed\n"); + } else { + mysql_close($link); + } } if (!ini_get('sql.safe_mode')) { ini_set('mysql.default_port', $port); - if (!is_resource($link = mysql_connect($host, $user, $passwd, true))) { - printf("[007] Usage of mysql.default_port failed\n"); - } else { - mysql_close($link); + if (!is_null($port)) { + if (!is_resource($link = mysql_connect($host, $user, $passwd, true))) { + printf("[007] Usage of mysql.default_port failed\n"); + } else { + mysql_close($link); + } } ini_set('mysql.default_password', $passwd); diff --git a/ext/mysql/tests/mysql_pconn_disable.phpt b/ext/mysql/tests/mysql_pconn_disable.phpt index dfb04eeef..532e2e578 100644 --- a/ext/mysql/tests/mysql_pconn_disable.phpt +++ b/ext/mysql/tests/mysql_pconn_disable.phpt @@ -13,19 +13,11 @@ mysql.max_links=2 --FILE-- @@ -62,8 +62,7 @@ if ($IS_MYSQLND) { 'connect_failure', 'connection_reused', 'explicit_close', 'implicit_close', 'disconnect_close', 'in_middle_of_command_close', 'explicit_free_result', 'implicit_free_result', 'explicit_stmt_close', 'implicit_stmt_close', - 'put_hits', 'put_misses', 'get_hits', 'get_misses', - 'size', 'free_items', 'references', 'mysql.cache_size', + 'size', ); foreach ($expected as $k => $entry) if (!stristr($phpinfo, $entry)) diff --git a/ext/mysql/tests/mysql_query_load_data_openbasedir.phpt b/ext/mysql/tests/mysql_query_load_data_openbasedir.phpt index 577ede375..a257f5fb8 100644 --- a/ext/mysql/tests/mysql_query_load_data_openbasedir.phpt +++ b/ext/mysql/tests/mysql_query_load_data_openbasedir.phpt @@ -4,6 +4,10 @@ LOAD DATA INFILE - open_basedir --INI-- safe_mode=0 diff --git a/ext/mysqli/mysqli.c b/ext/mysqli/mysqli.c index a3407b9d4..3ba50a17f 100644 --- a/ext/mysqli/mysqli.c +++ b/ext/mysqli/mysqli.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ | Ulf Wendel | +----------------------------------------------------------------------+ - $Id: mysqli.c 289630 2009-10-14 13:51:25Z johannes $ + $Id: mysqli.c 293779 2010-01-20 17:09:28Z johannes $ */ #ifdef HAVE_CONFIG_H @@ -32,7 +32,6 @@ #include "ext/standard/php_string.h" #include "php_mysqli_structs.h" #include "zend_exceptions.h" -#include "ext/mysqlnd/mysqlnd_portability.h" ZEND_DECLARE_MODULE_GLOBALS(mysqli) static PHP_GINIT_FUNCTION(mysqli); @@ -73,11 +72,6 @@ zend_class_entry *mysqli_driver_class_entry; zend_class_entry *mysqli_warning_class_entry; zend_class_entry *mysqli_exception_class_entry; -#ifdef MYSQLI_USE_MYSQLND -MYSQLND_ZVAL_PCACHE *mysqli_mysqlnd_zval_cache; -MYSQLND_QCACHE *mysqli_mysqlnd_qcache; -#endif - typedef int (*mysqli_read_t)(mysqli_object *obj, zval **retval TSRMLS_DC); typedef int (*mysqli_write_t)(mysqli_object *obj, zval *newval TSRMLS_DC); @@ -228,22 +222,7 @@ static void mysqli_link_free_storage(void *object TSRMLS_DC) if (my_res && my_res->ptr) { MY_MYSQL *mysql = (MY_MYSQL *)my_res->ptr; if (mysql->mysql) { - if (!mysql->persistent) { - mysqli_close(mysql->mysql, MYSQLI_CLOSE_IMPLICIT); - } else { - zend_rsrc_list_entry *le; - if (zend_hash_find(&EG(persistent_list), mysql->hash_key, strlen(mysql->hash_key) + 1, (void **)&le) == SUCCESS) { - if (Z_TYPE_P(le) == php_le_pmysqli()) { - mysqli_plist_entry *plist = (mysqli_plist_entry *) le->ptr; - - zend_ptr_stack_push(&plist->free_links, mysql->mysql); - - MyG(num_links)--; - MyG(num_active_persistent)--; - MyG(num_inactive_persistent)++; - } - } - } + php_mysqli_close(mysql, MYSQLI_CLOSE_EXPLICIT TSRMLS_CC); } php_clear_mysql(mysql); efree(mysql); @@ -604,9 +583,6 @@ PHP_INI_BEGIN() #endif STD_PHP_INI_BOOLEAN("mysqli.reconnect", "0", PHP_INI_SYSTEM, OnUpdateLong, reconnect, zend_mysqli_globals, mysqli_globals) STD_PHP_INI_BOOLEAN("mysqli.allow_local_infile", "1", PHP_INI_SYSTEM, OnUpdateLong, allow_local_infile, zend_mysqli_globals, mysqli_globals) -#ifdef MYSQLI_USE_MYSQLND - STD_PHP_INI_ENTRY("mysqli.cache_size", "2000", PHP_INI_SYSTEM, OnUpdateLong, cache_size, zend_mysqli_globals, mysqli_globals) -#endif PHP_INI_END() /* }}} */ @@ -635,10 +611,6 @@ static PHP_GINIT_FUNCTION(mysqli) #else mysqli_globals->embedded = 0; #endif -#ifdef MYSQLI_USE_MYSQLND - mysqli_globals->cache_size = 0; - mysqli_globals->mysqlnd_thd_zval_cache = NULL; -#endif } /* }}} */ @@ -656,9 +628,6 @@ PHP_MINIT_FUNCTION(mysqli) return FAILURE; } #endif -#else - mysqli_mysqlnd_zval_cache = mysqlnd_palloc_init_cache(MyG(cache_size)); - mysqli_mysqlnd_qcache = mysqlnd_qcache_init_cache(); #endif memcpy(&mysqli_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); @@ -749,9 +718,6 @@ PHP_MINIT_FUNCTION(mysqli) /* for mysqli_query */ REGISTER_LONG_CONSTANT("MYSQLI_STORE_RESULT", MYSQLI_STORE_RESULT, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("MYSQLI_USE_RESULT", MYSQLI_USE_RESULT, CONST_CS | CONST_PERSISTENT); -#if defined(MYSQLI_USE_MYSQLND) && defined(MYSQLND_THREADED) - REGISTER_LONG_CONSTANT("MYSQLI_BG_STORE_RESULT", MYSQLI_BG_STORE_RESULT, CONST_CS | CONST_PERSISTENT); -#endif #if defined (MYSQLI_USE_MYSQLND) REGISTER_LONG_CONSTANT("MYSQLI_ASYNC", MYSQLI_ASYNC, CONST_CS | CONST_PERSISTENT); #endif @@ -899,9 +865,6 @@ PHP_MSHUTDOWN_FUNCTION(mysqli) mysql_server_end(); #endif #endif -#else - mysqlnd_palloc_free_cache(mysqli_mysqlnd_zval_cache); - mysqlnd_qcache_free_cache_reference(&mysqli_mysqlnd_qcache); #endif zend_hash_destroy(&mysqli_driver_properties); @@ -927,9 +890,6 @@ PHP_RINIT_FUNCTION(mysqli) #endif MyG(error_msg) = NULL; MyG(error_no) = 0; -#ifdef MYSQLI_USE_MYSQLND - MyG(mysqlnd_thd_zval_cache) = mysqlnd_palloc_rinit(mysqli_mysqlnd_zval_cache); -#endif return SUCCESS; } @@ -969,7 +929,6 @@ PHP_RSHUTDOWN_FUNCTION(mysqli) } #ifdef MYSQLI_USE_MYSQLND zend_hash_apply(&EG(persistent_list), (apply_func_t) php_mysqli_persistent_helper_once TSRMLS_CC); - mysqlnd_palloc_rshutdown(MyG(mysqlnd_thd_zval_cache)); #endif return SUCCESS; } @@ -994,19 +953,6 @@ PHP_MINFO_FUNCTION(mysqli) #if !defined(MYSQLI_USE_MYSQLND) php_info_print_table_row(2, "Client API header version", MYSQL_SERVER_VERSION); php_info_print_table_row(2, "MYSQLI_SOCKET", MYSQL_UNIX_ADDR); -#else - { - zval values; - - php_info_print_table_header(2, "Persistent cache", mysqli_mysqlnd_zval_cache? "enabled":"disabled"); - - if (mysqli_mysqlnd_zval_cache) { - /* Now report cache status */ - mysqlnd_palloc_stats(mysqli_mysqlnd_zval_cache, &values); - mysqlnd_minfo_print_hash(&values); - zval_dtor(&values); - } - } #endif php_info_print_table_end(); @@ -1108,11 +1054,6 @@ PHP_FUNCTION(mysqli_result_construct) case MYSQLI_USE_RESULT: result = mysql_use_result(mysql->mysql); break; -#if defined(MYSQLI_USE_MYSQLND) && defined(MYSQLND_THREADED) - case MYSQLI_BG_STORE_RESULT: - result = mysqli_bg_store_result(mysql->mysql); - break; -#endif default: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid value for resultmode"); } diff --git a/ext/mysqli/mysqli_api.c b/ext/mysqli/mysqli_api.c index b87b741a1..81cfeef7e 100644 --- a/ext/mysqli/mysqli_api.c +++ b/ext/mysqli/mysqli_api.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ | Ulf Wendel | +----------------------------------------------------------------------+ - $Id: mysqli_api.c 289630 2009-10-14 13:51:25Z johannes $ + $Id: mysqli_api.c 294543 2010-02-04 20:28:55Z johannes $ */ #ifdef HAVE_CONFIG_H @@ -31,7 +31,6 @@ #include "php_globals.h" #include "ext/standard/info.h" #include "php_mysqli_structs.h" -#include "ext/mysqlnd/mysqlnd_portability.h" /* {{{ proto mixed mysqli_affected_rows(object link) Get number of affected rows in previous MySQL operation */ @@ -552,22 +551,12 @@ PHP_FUNCTION(mysqli_character_set_name) } /* }}} */ -/* {{{ proto bool mysqli_close(object link) - Close connection */ -PHP_FUNCTION(mysqli_close) -{ - zval *mysql_link; - MY_MYSQL *mysql; - - if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) { - return; - } - - MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_INITIALIZED); +/* {{{ php_mysqli_close */ +void php_mysqli_close(MY_MYSQL * mysql, int close_type TSRMLS_DC) +{ if (!mysql->persistent) { - mysqli_close(mysql->mysql, MYSQLI_CLOSE_EXPLICIT); - mysql->mysql = NULL; + mysqli_close(mysql->mysql, close_type); } else { zend_rsrc_list_entry *le; if (zend_hash_find(&EG(persistent_list), mysql->hash_key, strlen(mysql->hash_key) + 1, (void **)&le) == SUCCESS) { @@ -580,9 +569,29 @@ PHP_FUNCTION(mysqli_close) MyG(num_inactive_persistent)++; } } + mysql->persistent = FALSE; } + mysql->mysql = NULL; php_clear_mysql(mysql); +} +/* }}} */ + + +/* {{{ proto bool mysqli_close(object link) + Close connection */ +PHP_FUNCTION(mysqli_close) +{ + zval *mysql_link; + MY_MYSQL *mysql; + + if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) { + return; + } + + MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_INITIALIZED); + + php_mysqli_close(mysql, MYSQLI_CLOSE_EXPLICIT TSRMLS_CC); MYSQLI_CLEAR_RESOURCE(&mysql_link); efree(mysql); @@ -1324,9 +1333,9 @@ PHP_FUNCTION(mysqli_info) } /* }}} */ -/* {{{ proto resource mysqli_init(void) - Initialize mysqli and return a resource for use with mysql_real_connect */ -PHP_FUNCTION(mysqli_init) + +/* {{{ php_mysqli_init() */ +void php_mysqli_init(INTERNAL_FUNCTION_PARAMETERS) { MYSQLI_RESOURCE *mysqli_resource; MY_MYSQL *mysql; @@ -1363,6 +1372,15 @@ PHP_FUNCTION(mysqli_init) } /* }}} */ + +/* {{{ proto resource mysqli_init(void) + Initialize mysqli and return a resource for use with mysql_real_connect */ +PHP_FUNCTION(mysqli_init) +{ + php_mysqli_init(INTERNAL_FUNCTION_PARAM_PASSTHRU); +} +/* }}} */ + /* {{{ proto mixed mysqli_insert_id(object link) Get the ID generated from the previous INSERT operation */ PHP_FUNCTION(mysqli_insert_id) @@ -1579,6 +1597,68 @@ PHP_FUNCTION(mysqli_num_rows) } /* }}} */ +/* {{{ mysqli_options_get_option_zval_type */ +static int mysqli_options_get_option_zval_type(int option) +{ + switch (option) { +#ifdef MYSQLI_USE_MYSQLND +#if PHP_MAJOR_VERSION >= 6 + case MYSQLND_OPT_NUMERIC_AND_DATETIME_AS_UNICODE: +#endif + case MYSQLND_OPT_NET_CMD_BUFFER_SIZE: + case MYSQLND_OPT_NET_READ_BUFFER_SIZE: +#ifdef MYSQLND_STRING_TO_INT_CONVERSION + case MYSQLND_OPT_INT_AND_FLOAT_NATIVE: +#endif +#endif /* MYSQLI_USE_MYSQLND */ + case MYSQL_OPT_CONNECT_TIMEOUT: +#ifdef MYSQL_REPORT_DATA_TRUNCATION + case MYSQL_REPORT_DATA_TRUNCATION: +#endif + case MYSQL_OPT_LOCAL_INFILE: + case MYSQL_OPT_NAMED_PIPE: +#ifdef MYSQL_OPT_PROTOCOL + case MYSQL_OPT_PROTOCOL: +#endif /* MySQL 4.1.0 */ +#ifdef MYSQL_OPT_READ_TIMEOUT + case MYSQL_OPT_READ_TIMEOUT: + case MYSQL_OPT_WRITE_TIMEOUT: + case MYSQL_OPT_GUESS_CONNECTION: + case MYSQL_OPT_USE_EMBEDDED_CONNECTION: + case MYSQL_OPT_USE_REMOTE_CONNECTION: + case MYSQL_SECURE_AUTH: +#endif /* MySQL 4.1.1 */ +#ifdef MYSQL_OPT_RECONNECT + case MYSQL_OPT_RECONNECT: +#endif /* MySQL 5.0.13 */ +#ifdef MYSQL_OPT_SSL_VERIFY_SERVER_CERT + case MYSQL_OPT_SSL_VERIFY_SERVER_CERT: +#endif /* MySQL 5.0.23 */ +#ifdef MYSQL_OPT_COMPRESS + case MYSQL_OPT_COMPRESS: +#endif /* mysqlnd @ PHP 5.3.2 */ + return IS_LONG; + +#ifdef MYSQL_SHARED_MEMORY_BASE_NAME + case MYSQL_SHARED_MEMORY_BASE_NAME: +#endif /* MySQL 4.1.0 */ +#ifdef MYSQL_SET_CLIENT_IP + case MYSQL_SET_CLIENT_IP: +#endif /* MySQL 4.1.1 */ + case MYSQL_READ_DEFAULT_FILE: + case MYSQL_READ_DEFAULT_GROUP: + case MYSQL_INIT_COMMAND: + case MYSQL_SET_CHARSET_NAME: + case MYSQL_SET_CHARSET_DIR: + return IS_STRING; + + default: + return IS_NULL; + } +} +/* }}} */ + + /* {{{ proto bool mysqli_options(object link, int flags, mixed values) Set options */ PHP_FUNCTION(mysqli_options) @@ -1589,6 +1669,7 @@ PHP_FUNCTION(mysqli_options) long mysql_option; unsigned int l_value; long ret; + int expected_type; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Olz", &mysql_link, mysqli_link_class_entry, &mysql_option, &mysql_value) == FAILURE) { return; @@ -1600,16 +1681,30 @@ PHP_FUNCTION(mysqli_options) RETURN_FALSE; } } - - switch (Z_TYPE_PP(&mysql_value)) { + expected_type = mysqli_options_get_option_zval_type(mysql_option); + if (expected_type != Z_TYPE_P(mysql_value)) { + switch (expected_type) { + case IS_STRING: + convert_to_string_ex(&mysql_value); + break; + case IS_LONG: + convert_to_long_ex(&mysql_value); + break; + default: + break; + } + } + switch (expected_type) { case IS_STRING: ret = mysql_options(mysql->mysql, mysql_option, Z_STRVAL_PP(&mysql_value)); break; - default: - convert_to_long_ex(&mysql_value); + case IS_LONG: l_value = Z_LVAL_PP(&mysql_value); ret = mysql_options(mysql->mysql, mysql_option, (char *)&l_value); break; + default: + ret = 1; + break; } RETURN_BOOL(!ret); @@ -1673,7 +1768,7 @@ PHP_FUNCTION(mysqli_prepare) memcpy(last_error, stmt->stmt->last_error, MYSQL_ERRMSG_SIZE); memcpy(sqlstate, mysql->mysql->net.sqlstate, SQLSTATE_LENGTH+1); #else - mysqlnd_error_info error_info = mysql->mysql->error_info; + MYSQLND_ERROR_INFO error_info = mysql->mysql->error_info; #endif mysqli_stmt_close(stmt->stmt, FALSE); stmt->stmt = NULL; diff --git a/ext/mysqli/mysqli_driver.c b/ext/mysqli/mysqli_driver.c index a30e24088..2d553f979 100644 --- a/ext/mysqli/mysqli_driver.c +++ b/ext/mysqli/mysqli_driver.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | diff --git a/ext/mysqli/mysqli_embedded.c b/ext/mysqli/mysqli_embedded.c index 5a7a0c2c0..1b3eb4749 100644 --- a/ext/mysqli/mysqli_embedded.c +++ b/ext/mysqli/mysqli_embedded.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | diff --git a/ext/mysqli/mysqli_exception.c b/ext/mysqli/mysqli_exception.c index a8707f9d2..2bf65d051 100644 --- a/ext/mysqli/mysqli_exception.c +++ b/ext/mysqli/mysqli_exception.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | diff --git a/ext/mysqli/mysqli_fe.c b/ext/mysqli/mysqli_fe.c index 90238984b..5e87842fc 100644 --- a/ext/mysqli/mysqli_fe.c +++ b/ext/mysqli/mysqli_fe.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -15,7 +15,7 @@ | Author: Georg Richter | +----------------------------------------------------------------------+ - $Id: mysqli_fe.c 274296 2009-01-22 21:01:58Z johannes $ + $Id: mysqli_fe.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H diff --git a/ext/mysqli/mysqli_libmysql.h b/ext/mysqli/mysqli_libmysql.h index 1ea1fc3bf..84fb7c81a 100644 --- a/ext/mysqli/mysqli_libmysql.h +++ b/ext/mysqli/mysqli_libmysql.h @@ -1,9 +1,9 @@ /* - +----------------------------------------------------------------------+ + ---------------------------------------------------------------------- | PHP Version 6 | - +----------------------------------------------------------------------+ + ---------------------------------------------------------------------- | Copyright (c) 2007 The PHP Group | - +----------------------------------------------------------------------+ + ---------------------------------------------------------------------- | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | | available through the world-wide-web at the following url: | @@ -11,18 +11,21 @@ | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ + ---------------------------------------------------------------------- | Authors: Georg Richter | | Andrey Hristov | | Ulf Wendel | - +----------------------------------------------------------------------+ + ---------------------------------------------------------------------- */ +#ifndef MYSQLI_LIBMYSQL_H +#define MYSQLI_LIBMYSQL_H + /* These are unused */ -#define MYSQLI_CLOSE_EXPLICIT -#define MYSQLI_CLOSE_IMPLICIT -#define MYSQLI_CLOSE_DISCONNECTED +#define MYSQLI_CLOSE_EXPLICIT 0 +#define MYSQLI_CLOSE_IMPLICIT 1 +#define MYSQLI_CLOSE_DISCONNECTED 2 #define MYSQLND_OPT_NUMERIC_AND_DATETIME_AS_UNICODE 200 #define MYSQLND_OPT_INT_AND_YEAR_AS_INT 201 @@ -34,3 +37,80 @@ #define mysqli_close(c, is_forced) mysql_close((c)) #define mysqli_stmt_close(c, implicit) mysql_stmt_close((c)) #define mysqli_free_result(r, is_forced) mysql_free_result((r)) +#define mysqli_change_user_silent(c, u, p, d) mysql_change_user((c), (u), (p), (d)) + + +/* + These functions also reside in ext/mysqlnd/mysqlnd_portability.h but since it is only made + available if one wants to build mysqli against mysqlnd and they are useful for libmysql as + well, we check whether they're not defined [build with libmysql is desired] and define them. + + Bit values are sent in reverted order of bytes, compared to normal !!! +*/ + + +#ifndef uint1korr +#define uint1korr(A) (*(((uint8_t*)(A)))) +#endif + +#ifndef bit_uint2korr +#define bit_uint2korr(A) ((uint16_t) (((uint16_t) (((unsigned char*) (A))[1])) +\ + ((uint16_t) (((unsigned char*) (A))[0]) << 8))) +#endif + +#ifndef bit_uint3korr +#define bit_uint3korr(A) ((uint32_t) (((uint32_t) (((unsigned char*) (A))[2])) +\ + (((uint32_t) (((unsigned char*) (A))[1])) << 8) +\ + (((uint32_t) (((unsigned char*) (A))[0])) << 16))) +#endif + +#ifndef bit_uint4korr +#define bit_uint4korr(A) ((uint32_t) (((uint32_t) (((unsigned char*) (A))[3])) +\ + (((uint32_t) (((unsigned char*) (A))[2])) << 8) +\ + (((uint32_t) (((unsigned char*) (A))[1])) << 16) +\ + (((uint32_t) (((unsigned char*) (A))[0])) << 24))) +#endif + +#ifndef bit_uint5korr +#define bit_uint5korr(A) ((uint64_t)(((uint32_t) (((unsigned char*) (A))[4])) +\ + (((uint32_t) (((unsigned char*) (A))[3])) << 8) +\ + (((uint32_t) (((unsigned char*) (A))[2])) << 16) +\ + (((uint32_t) (((unsigned char*) (A))[1])) << 24)) +\ + (((uint64_t) (((unsigned char*) (A))[0])) << 32)) +#endif + +#ifndef bit_uint6korr +#define bit_uint6korr(A) ((uint64_t)(((uint32_t) (((unsigned char*) (A))[5])) +\ + (((uint32_t) (((unsigned char*) (A))[4])) << 8) +\ + (((uint32_t) (((unsigned char*) (A))[3])) << 16) +\ + (((uint32_t) (((unsigned char*) (A))[2])) << 24)) +\ + (((uint64_t) (((uint32_t) (((unsigned char*) (A))[1])) +\ + (((uint32_t) (((unsigned char*) (A))[0]) << 8)))) <<\ + 32)) +#endif + +#ifndef bit_uint7korr +#define bit_uint7korr(A) ((uint64_t)(((uint32_t) (((unsigned char*) (A))[6])) +\ + (((uint32_t) (((unsigned char*) (A))[5])) << 8) +\ + (((uint32_t) (((unsigned char*) (A))[4])) << 16) +\ + (((uint32_t) (((unsigned char*) (A))[3])) << 24)) +\ + (((uint64_t) (((uint32_t) (((unsigned char*) (A))[2])) +\ + (((uint32_t) (((unsigned char*) (A))[1])) << 8) +\ + (((uint32_t) (((unsigned char*) (A))[0])) << 16))) <<\ + 32)) +#endif + +#ifndef bit_uint8korr +#define bit_uint8korr(A) ((uint64_t)(((uint32_t) (((unsigned char*) (A))[7])) +\ + (((uint32_t) (((unsigned char*) (A))[6])) << 8) +\ + (((uint32_t) (((unsigned char*) (A))[5])) << 16) +\ + (((uint32_t) (((unsigned char*) (A))[4])) << 24)) +\ + (((uint64_t) (((uint32_t) (((unsigned char*) (A))[3])) +\ + (((uint32_t) (((unsigned char*) (A))[2])) << 8) +\ + (((uint32_t) (((unsigned char*) (A))[1])) << 16) +\ + (((uint32_t) (((unsigned char*) (A))[0])) << 24))) <<\ + 32)) +#endif + +#endif /* MYSQLI_LIBMYSQL_H */ + diff --git a/ext/mysqli/mysqli_mysqlnd.h b/ext/mysqli/mysqli_mysqlnd.h index 574d95673..1468ef224 100644 --- a/ext/mysqli/mysqli_mysqlnd.h +++ b/ext/mysqli/mysqli_mysqlnd.h @@ -23,6 +23,7 @@ #define MYSQLI_MYSQLND_H #include "ext/mysqlnd/mysqlnd_libmysql_compat.h" +#include "ext/mysqlnd/mysqlnd_portability.h" /* Here comes non-libmysql API to have less ifdefs in mysqli*/ #define MYSQLI_CLOSE_EXPLICIT MYSQLND_CLOSE_EXPLICIT @@ -37,8 +38,8 @@ #define mysqli_close(c, how) mysqlnd_close((c), (how)) #define mysqli_stmt_close(c, implicit) mysqlnd_stmt_close((c), (implicit)) #define mysqli_free_result(r, implicit) mysqlnd_free_result((r), (implicit)) -#define mysqli_bg_store_result(r) mysqlnd_bg_store_result((r)) #define mysqli_async_query(c, q, l) mysqlnd_async_query((c), (q), (l)) +#define mysqli_change_user_silent(c, u, p, d) mysqlnd_change_user((c), (u), (p), (d), TRUE) #define HAVE_STMT_NEXT_RESULT diff --git a/ext/mysqli/mysqli_nonapi.c b/ext/mysqli/mysqli_nonapi.c index c56485b4a..c2d9fa2f3 100644 --- a/ext/mysqli/mysqli_nonapi.c +++ b/ext/mysqli/mysqli_nonapi.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ | Ulf Wendel | +----------------------------------------------------------------------+ - $Id: mysqli_nonapi.c 290608 2009-11-12 17:48:36Z johannes $ + $Id: mysqli_nonapi.c 294543 2010-02-04 20:28:55Z johannes $ */ #ifdef HAVE_CONFIG_H @@ -80,7 +80,8 @@ void mysqli_common_connect(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_real_conne #endif if (getThis() && !ZEND_NUM_ARGS() && in_ctor) { - RETURN_NULL(); + php_mysqli_init(INTERNAL_FUNCTION_PARAM_PASSTHRU); + return; } hostname = username = dbname = passwd = socket = NULL; @@ -93,14 +94,7 @@ void mysqli_common_connect(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_real_conne if (object && instanceof_function(Z_OBJCE_P(object), mysqli_link_class_entry TSRMLS_CC)) { mysqli_resource = ((mysqli_object *) zend_object_store_get_object(object TSRMLS_CC))->ptr; if (mysqli_resource && mysqli_resource->ptr) { - mysql = (MY_MYSQL*) mysqli_resource->ptr; - if (mysqli_resource->status > MYSQLI_STATUS_INITIALIZED) { - php_clear_mysql(mysql); - if (mysql->mysql) { - mysqli_close(mysql->mysql, MYSQLI_CLOSE_EXPLICIT); - mysql->mysql = NULL; - } - } + mysql = (MY_MYSQL*) mysqli_resource->ptr; } } if (!mysql) { @@ -126,7 +120,10 @@ void mysqli_common_connect(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_real_conne flags &= ~CLIENT_LOCAL_FILES; } } - + if (mysql->mysql && mysqli_resource && mysqli_resource->status > MYSQLI_STATUS_INITIALIZED) { + /* already connected, we should close the connection */ + php_mysqli_close(mysql, MYSQLI_CLOSE_IMPLICIT TSRMLS_CC); + } if (!socket_len || !socket) { socket = MyG(default_socket); @@ -165,15 +162,6 @@ void mysqli_common_connect(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_real_conne do { if (zend_ptr_stack_num_elements(&plist->free_links)) { - if (is_real_connect) { - /* - Gotcha! If there are some options set on the handle with mysqli_options() - they will be lost. We will fetch other handle with other options. This could - be a source of bug reports of people complaining but...nothing else could be - done, if they want PCONN! - */ - mysqli_close(mysql->mysql, MYSQLI_CLOSE_IMPLICIT); - } mysql->mysql = zend_ptr_stack_pop(&plist->free_links); MyG(num_inactive_persistent)--; @@ -183,12 +171,12 @@ void mysqli_common_connect(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_real_conne /* reset variables */ #ifndef MYSQLI_NO_CHANGE_USER_ON_PCONNECT - if (!mysql_change_user(mysql->mysql, username, passwd, dbname)) { + if (!mysqli_change_user_silent(mysql->mysql, username, passwd, dbname)) { #else if (!mysql_ping(mysql->mysql)) { #endif #ifdef MYSQLI_USE_MYSQLND - mysqlnd_restart_psession(mysql->mysql, MyG(mysqlnd_thd_zval_cache)); + mysqlnd_restart_psession(mysql->mysql); #endif MyG(num_active_persistent)++; goto end; @@ -245,7 +233,7 @@ void mysqli_common_connect(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_real_conne if (mysql_real_connect(mysql->mysql, hostname, username, passwd, dbname, port, socket, CLIENT_MULTI_RESULTS) == NULL) #else if (mysqlnd_connect(mysql->mysql, hostname, username, passwd, passwd_len, dbname, dbname_len, - port, socket, flags, MyG(mysqlnd_thd_zval_cache) TSRMLS_CC) == NULL) + port, socket, flags TSRMLS_CC) == NULL) #endif { /* Save error messages - for mysqli_connect_error() & mysqli_connect_errno() */ @@ -302,6 +290,7 @@ err: if (mysql->hash_key) { efree(mysql->hash_key); mysql->hash_key = NULL; + mysql->persistent = FALSE; } if (!is_real_connect) { efree(mysql); @@ -428,7 +417,7 @@ PHP_FUNCTION(mysqli_get_cache_stats) if (zend_parse_parameters_none() == FAILURE) { return; } - mysqlnd_palloc_stats(mysqli_mysqlnd_zval_cache, return_value); + array_init(return_value); } /* }}} */ @@ -498,7 +487,7 @@ PHP_FUNCTION(mysqli_multi_query) strcpy(s_sqlstate, mysql_sqlstate(mysql->mysql)); s_errno = mysql_errno(mysql->mysql); #else - mysqlnd_error_info error_info = mysql->mysql->error_info; + MYSQLND_ERROR_INFO error_info = mysql->mysql->error_info; #endif MYSQLI_REPORT_MYSQL_ERROR(mysql->mysql); MYSQLI_DISABLE_MQ; @@ -536,11 +525,7 @@ PHP_FUNCTION(mysqli_query) php_error_docref(NULL TSRMLS_CC, E_WARNING, "Empty query"); RETURN_FALSE; } - if ((resultmode & ~MYSQLI_ASYNC) != MYSQLI_USE_RESULT && (resultmode & ~MYSQLI_ASYNC) != MYSQLI_STORE_RESULT -#if defined(MYSQLI_USE_MYSQLND) && defined(MYSQLND_THREADED) - && (resultmode & ~MYSQLI_ASYNC) != MYSQLI_BG_STORE_RESULT -#endif - ) { + if ((resultmode & ~MYSQLI_ASYNC) != MYSQLI_USE_RESULT && (resultmode & ~MYSQLI_ASYNC) != MYSQLI_STORE_RESULT) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid value for resultmode"); RETURN_FALSE; } @@ -581,11 +566,6 @@ PHP_FUNCTION(mysqli_query) case MYSQLI_USE_RESULT: result = mysql_use_result(mysql->mysql); break; -#if defined(MYSQLI_USE_MYSQLND) && defined(MYSQLND_THREADED) - case MYSQLI_BG_STORE_RESULT: - result = mysqli_bg_store_result(mysql->mysql); - break; -#endif } if (!result) { php_mysqli_throw_sql_exception((char *)mysql_sqlstate(mysql->mysql), mysql_errno(mysql->mysql) TSRMLS_CC, @@ -819,11 +799,6 @@ PHP_FUNCTION(mysqli_reap_async_query) case MYSQLI_USE_RESULT: result = mysql_use_result(mysql->mysql); break; -#if defined(MYSQLI_USE_MYSQLND) && defined(MYSQLND_THREADED) - case MYSQLI_BG_STORE_RESULT: - result = mysqli_bg_store_result(mysql->mysql); - break; -#endif } if (!result) { diff --git a/ext/mysqli/mysqli_prop.c b/ext/mysqli/mysqli_prop.c index 40899f575..fdb304562 100644 --- a/ext/mysqli/mysqli_prop.c +++ b/ext/mysqli/mysqli_prop.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -15,7 +15,7 @@ | Author: Georg Richter | +----------------------------------------------------------------------+ - $Id: mysqli_prop.c 281235 2009-05-27 15:05:28Z andrey $ + $Id: mysqli_prop.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H diff --git a/ext/mysqli/mysqli_report.c b/ext/mysqli/mysqli_report.c index 1c5f916a6..f48688ffc 100644 --- a/ext/mysqli/mysqli_report.c +++ b/ext/mysqli/mysqli_report.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -15,7 +15,7 @@ | Author: Georg Richter | +----------------------------------------------------------------------+ - $Id: mysqli_report.c 272370 2008-12-31 11:15:49Z sebastian $ + $Id: mysqli_report.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H diff --git a/ext/mysqli/mysqli_report.h b/ext/mysqli/mysqli_report.h index 679108f97..8c448026d 100644 --- a/ext/mysqli/mysqli_report.h +++ b/ext/mysqli/mysqli_report.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -15,7 +15,7 @@ | Author: Georg Richter | +----------------------------------------------------------------------+ - $Id: mysqli_report.h 272370 2008-12-31 11:15:49Z sebastian $ + $Id: mysqli_report.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef __HAVE_MYSQLI_PROFILER_H__ diff --git a/ext/mysqli/mysqli_warning.c b/ext/mysqli/mysqli_warning.c index b17694a2f..80c26eb0d 100644 --- a/ext/mysqli/mysqli_warning.c +++ b/ext/mysqli/mysqli_warning.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | diff --git a/ext/mysqli/php_mysqli.h b/ext/mysqli/php_mysqli.h index 773b7f25a..2c279d0ac 100644 --- a/ext/mysqli/php_mysqli.h +++ b/ext/mysqli/php_mysqli.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ | Ulf Wendel | +----------------------------------------------------------------------+ - $Id: php_mysqli.h 272370 2008-12-31 11:15:49Z sebastian $ + $Id: php_mysqli.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_MYSQLI_H diff --git a/ext/mysqli/php_mysqli_structs.h b/ext/mysqli/php_mysqli_structs.h index 789850bb1..beecf01cc 100644 --- a/ext/mysqli/php_mysqli_structs.h +++ b/ext/mysqli/php_mysqli_structs.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -15,7 +15,7 @@ | Author: Georg Richter | +----------------------------------------------------------------------+ - $Id: php_mysqli_structs.h 289630 2009-10-14 13:51:25Z johannes $ + $Id: php_mysqli_structs.h 294543 2010-02-04 20:28:55Z johannes $ */ #ifndef PHP_MYSQLI_STRUCTS_H @@ -196,11 +196,6 @@ extern zend_property_info mysqli_stmt_property_info_entries[]; extern zend_property_info mysqli_driver_property_info_entries[]; extern zend_property_info mysqli_warning_property_info_entries[]; -#ifdef MYSQLI_USE_MYSQLND -extern MYSQLND_ZVAL_PCACHE *mysqli_mysqlnd_zval_cache; -extern MYSQLND_QCACHE *mysqli_mysqlnd_qcache; -#endif - extern void php_mysqli_fetch_into_hash(INTERNAL_FUNCTION_PARAMETERS, int override_flag, int into_object); extern void php_clear_stmt_bind(MY_STMT *stmt TSRMLS_DC); extern void php_clear_mysql(MY_MYSQL *); @@ -220,6 +215,9 @@ extern zend_class_entry *mysqli_exception_class_entry; extern int php_le_pmysqli(void); extern void php_mysqli_dtor_p_elements(void *data); +extern void php_mysqli_close(MY_MYSQL * mysql, int close_type TSRMLS_DC); + + #ifdef HAVE_SPL extern PHPAPI zend_class_entry *spl_ce_RuntimeException; #endif @@ -305,9 +303,6 @@ PHP_MYSQLI_EXPORT(zend_object_value) mysqli_objects_new(zend_class_entry * TSRML #define MYSQLI_STORE_RESULT 0 #define MYSQLI_USE_RESULT 1 #ifdef MYSQLI_USE_MYSQLND -#ifdef MYSQLND_THREADED -#define MYSQLI_BG_STORE_RESULT 4 -#endif #define MYSQLI_ASYNC 8 #else /* libmysql */ @@ -343,6 +338,8 @@ if ((MyG(report_mode) & MYSQLI_REPORT_ERROR) && mysql_stmt_errno(stmt)) { \ void mysqli_common_connect(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_real_connect, zend_bool in_ctor); +void php_mysqli_init(INTERNAL_FUNCTION_PARAMETERS); + ZEND_BEGIN_MODULE_GLOBALS(mysqli) long default_link; @@ -367,9 +364,6 @@ ZEND_BEGIN_MODULE_GLOBALS(mysqli) HashTable *report_ht; unsigned long multi_query; unsigned long embedded; -#ifdef MYSQLI_USE_MYSQLND - MYSQLND_THD_ZVAL_PCACHE *mysqlnd_thd_zval_cache; -#endif ZEND_END_MODULE_GLOBALS(mysqli) diff --git a/ext/mysqli/tests/001.phpt b/ext/mysqli/tests/001.phpt index 4e19d8109..ed09b2eec 100644 --- a/ext/mysqli/tests/001.phpt +++ b/ext/mysqli/tests/001.phpt @@ -8,7 +8,7 @@ require_once('skipifconnectfailure.inc'); ?> --FILE-- --FILE-- --CLEAN-- --FILE-- --CLEAN-- --CLEAN-- --FILE-- --CLEAN-- --FILE-- --CLEAN-- --FILE-- --CLEAN-- --FILE-- --CLEAN-- --FILE-- --CLEAN-- --FILE-- --CLEAN-- --FILE-- --CLEAN-- --FILE-- --CLEAN-- --FILE-- --CLEAN-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --CLEAN-- --FILE-- --CLEAN-- --FILE-- --CLEAN-- --FILE-- --CLEAN-- --FILE-- --CLEAN-- --FILE-- --CLEAN-- --FILE-- --CLEAN-- --FILE-- --CLEAN-- --FILE-- --FILE-- --FILE-- --CLEAN-- --FILE-- --FILE-- --FILE-- --CLEAN-- --FILE-- --FILE-- --FILE-- --FILE-- --CLEAN-- --CLEAN-- --FILE-- --CLEAN-- --FILE-- --FILE-- --CLEAN-- --CLEAN-- --FILE-- --CLEAN-- --FILE-- --CLEAN-- --FILE-- --FILE-- --FILE-- --CLEAN-- --FILE-- --CLEAN-- --FILE-- --CLEAN-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --CLEAN-- --FILE-- --CLEAN-- --FILE-- --CLEAN-- --FILE-- --CLEAN-- --FILE-- --CLEAN-- --FILE-- --FILE-- --FILE-- ') == 1) { ?> --FILE-- --FILE-- --CLEAN-- --CLEAN-- --FILE-- multi_query('SELECT 1;SELECT 2'); diff --git a/ext/mysqli/tests/070.phpt b/ext/mysqli/tests/070.phpt index eee512513..b71d9b2e4 100644 --- a/ext/mysqli/tests/070.phpt +++ b/ext/mysqli/tests/070.phpt @@ -7,7 +7,7 @@ require_once('skipifconnectfailure.inc'); ?> --FILE-- ping()); diff --git a/ext/mysqli/tests/071.phpt b/ext/mysqli/tests/071.phpt index 8888fb170..38bc46b84 100644 --- a/ext/mysqli/tests/071.phpt +++ b/ext/mysqli/tests/071.phpt @@ -8,13 +8,31 @@ require_once('skipifconnectfailure.inc'); ?> --FILE-- server_version; var_dump($mysql->ping()); - var_dump($mysql->kill($mysql->thread_id)); + $ret = $mysql->kill($mysql->thread_id); + if ($IS_MYSQLND) { + if ($ret !== true){ + printf("[001] Expecting boolean/true got %s/%s\n", gettype($ret), var_export($ret, true)); + } + } else { + /* libmysql return value seems to depend on server version */ + if (($version >= 50123 || $version <= 40200) && $version != 50200) { + /* TODO: find exact version */ + if ($ret !== true){ + printf("[001] Expecting boolean/true got %s/%s @\n", gettype($ret), var_export($ret, true), $version); + } + } else { + if ($ret !== false){ + printf("[001] Expecting boolean/false got %s/%s @\n", gettype($ret), var_export($ret, true), $version); + } + } + } var_dump($mysql->ping()); @@ -24,7 +42,24 @@ require_once('skipifconnectfailure.inc'); var_dump(mysqli_ping($mysql)); - var_dump(mysqli_kill($mysql, mysqli_thread_id($mysql))); + $ret = $mysql->kill($mysql->thread_id); + if ($IS_MYSQLND) { + if ($ret !== true){ + printf("[002] Expecting boolean/true got %s/%s\n", gettype($ret), var_export($ret, true)); + } + } else { + /* libmysql return value seems to depend on server version */ + if (($version >= 50123 || $version <= 40200) && $version != 50200) { + /* TODO: find exact version */ + if ($ret !== true){ + printf("[002] Expecting boolean/true got %s/%s @\n", gettype($ret), var_export($ret, true), $version); + } + } else { + if ($ret !== false){ + printf("[002] Expecting boolean/false got %s/%s @\n", gettype($ret), var_export($ret, true), $version); + } + } + } var_dump(mysqli_ping($mysql)); @@ -33,9 +68,7 @@ require_once('skipifconnectfailure.inc'); ?> --EXPECT-- bool(true) -bool(true) bool(false) bool(true) -bool(true) bool(false) done! \ No newline at end of file diff --git a/ext/mysqli/tests/072.phpt b/ext/mysqli/tests/072.phpt index 637014b29..036253a0b 100644 --- a/ext/mysqli/tests/072.phpt +++ b/ext/mysqli/tests/072.phpt @@ -7,7 +7,7 @@ require_once('skipifconnectfailure.inc'); ?> --FILE-- --FILE-- embedded); var_dump($driver->client_version); diff --git a/ext/mysqli/tests/074.phpt b/ext/mysqli/tests/074.phpt index 883655bc5..7d9d01b3b 100644 --- a/ext/mysqli/tests/074.phpt +++ b/ext/mysqli/tests/074.phpt @@ -8,7 +8,7 @@ require_once('skipifconnectfailure.inc'); --FILE-- --FILE-- --FILE-- --FILE-- multi_query('SELECT 1;SELECT 2'); diff --git a/ext/mysqli/tests/bug32405.phpt b/ext/mysqli/tests/bug32405.phpt index 24bcdb4d0..0b3cad50f 100644 --- a/ext/mysqli/tests/bug32405.phpt +++ b/ext/mysqli/tests/bug32405.phpt @@ -7,7 +7,7 @@ require_once('skipifconnectfailure.inc'); ?> --FILE-- --CLEAN-- --FILE-- --CLEAN-- int(0) [%u|b%"connect_error"]=> - %unicode|string%(0) "" + NULL [%u|b%"errno"]=> int(0) [%u|b%"error"]=> @@ -91,7 +91,7 @@ object(mysqli)#%d (%d) { [%u|b%"connect_errno"]=> int(0) [%u|b%"connect_error"]=> - %unicode|string%(0) "" + NULL [%u|b%"errno"]=> int(0) [%u|b%"error"]=> diff --git a/ext/mysqli/tests/bug35103.phpt b/ext/mysqli/tests/bug35103.phpt index 9c137b554..fc3cad04c 100644 --- a/ext/mysqli/tests/bug35103.phpt +++ b/ext/mysqli/tests/bug35103.phpt @@ -12,7 +12,7 @@ $drop = <<query("DROP TABLE IF EXISTS test_bint"); @@ -53,7 +53,7 @@ EOSQL; ?> --CLEAN-- --FILE-- --CLEAN-- --CLEAN-- query('select 1'); diff --git a/ext/mysqli/tests/bug36745.phpt b/ext/mysqli/tests/bug36745.phpt index 511eaf38f..5e203e14e 100644 --- a/ext/mysqli/tests/bug36745.phpt +++ b/ext/mysqli/tests/bug36745.phpt @@ -7,7 +7,7 @@ require_once('skipifconnectfailure.inc'); ?> --FILE-- --CLEAN-- --FILE-- --CLEAN-- ') == 1)) { ?> --FILE-- --FILE-- stmt_init(); diff --git a/ext/mysqli/tests/bug39457.phpt b/ext/mysqli/tests/bug39457.phpt index b834ff1b7..ec9239bb1 100644 --- a/ext/mysqli/tests/bug39457.phpt +++ b/ext/mysqli/tests/bug39457.phpt @@ -1,13 +1,13 @@ --TEST-- Bug #39457 (Multiple invoked OO connections never close) --SKIPIF-- - --FILE-- connect($host, $user, $passwd, $db, $port, $socket); diff --git a/ext/mysqli/tests/bug42548.phpt b/ext/mysqli/tests/bug42548.phpt index c9950be3a..ef0c831e4 100644 --- a/ext/mysqli/tests/bug42548.phpt +++ b/ext/mysqli/tests/bug42548.phpt @@ -52,7 +52,7 @@ print "done!"; ?> --CLEAN-- --FILE-- query('DROP PROCEDURE IF EXISTS p')) @@ -74,7 +73,7 @@ if (mysqli_get_server_version($link) <= 50000) { ?> --CLEAN-- --FILE-- init(); $mysqli->init(); - echo "done"; + echo "done"; ?> --EXPECTF-- done diff --git a/ext/mysqli/tests/bug48909.phpt b/ext/mysqli/tests/bug48909.phpt index 55c85a686..81df54419 100644 --- a/ext/mysqli/tests/bug48909.phpt +++ b/ext/mysqli/tests/bug48909.phpt @@ -7,7 +7,7 @@ require_once('skipifconnectfailure.inc'); ?> --FILE-- +--FILE-- +options(MYSQLI_OPT_CONNECT_TIMEOUT, 3); + $db1->real_connect($host, $user, $passwd); + if(mysqli_connect_error()) { + echo "error 1\n"; + } else { + echo "ok 1\n"; + } + + $db2 = mysqli_init(); + + $db2->options(MYSQLI_OPT_CONNECT_TIMEOUT, 3); + $db2->real_connect($host, $user, $passwd); + if(mysqli_connect_error()) { + echo "error 2\n"; + } else { + echo "ok 2\n"; + } + echo "done\n"; +?> +--EXPECTF-- +ok 1 +ok 2 +done \ No newline at end of file diff --git a/ext/mysqli/tests/connect.inc b/ext/mysqli/tests/connect.inc index ad2428647..48ba893cc 100644 --- a/ext/mysqli/tests/connect.inc +++ b/ext/mysqli/tests/connect.inc @@ -74,53 +74,58 @@ } } - /** - * Whenever possible, please use this wrapper to make testing ot MYSQLI_CLIENT_COMPRESS (and potentially SSL) possible - * - * @param enable_env_flags Enable setting of connection flags through env(MYSQL_TEST_CONNECT_FLAGS)? - */ - function my_mysqli_connect($host, $user, $passwd, $db, $port, $socket, $enable_env_flags = true) { - global $connect_flags; + if (!function_exists('my_mysqli_connect')) { - $flags = ($enable_env_flags) ? $connect_flags : false; + /** + * Whenever possible, please use this wrapper to make testing ot MYSQLI_CLIENT_COMPRESS (and potentially SSL) possible + * + * @param enable_env_flags Enable setting of connection flags through env(MYSQL_TEST_CONNECT_FLAGS)? + */ + function my_mysqli_connect($host, $user, $passwd, $db, $port, $socket, $enable_env_flags = true) { + global $connect_flags; - if ($flags !== false) { - $link = mysqli_init(); - if (!mysqli_real_connect($link, $host, $user, $passwd, $db, $port, $socket, $flags)) - $link = false; - } else { - $link = mysqli_connect($host, $user, $passwd, $db, $port, $socket); - } + $flags = ($enable_env_flags) ? $connect_flags : false; - return $link; - } + if ($flags !== false) { + $link = mysqli_init(); + if (!mysqli_real_connect($link, $host, $user, $passwd, $db, $port, $socket, $flags)) + $link = false; + } else { + $link = mysqli_connect($host, $user, $passwd, $db, $port, $socket); + } - /** - * Whenever possible, please use this wrapper to make testing ot MYSQLI_CLIENT_COMPRESS (and potentially SSL) possible - * - * @param enable_env_flags Enable setting of connection flags through env(MYSQL_TEST_CONNECT_FLAGS) - */ - function my_mysqli_real_connect($link, $host, $user, $passwd, $db, $port, $socket, $flags = 0, $enable_env_flags = true) { - global $connect_flags; + return $link; + } - if ($enable_env_flags) - $flags & $connect_flags; + /** + * Whenever possible, please use this wrapper to make testing ot MYSQLI_CLIENT_COMPRESS (and potentially SSL) possible + * + * @param enable_env_flags Enable setting of connection flags through env(MYSQL_TEST_CONNECT_FLAGS) + */ + function my_mysqli_real_connect($link, $host, $user, $passwd, $db, $port, $socket, $flags = 0, $enable_env_flags = true) { + global $connect_flags; - return mysqli_real_connect($link, $host, $user, $passwd, $db, $port, $socket, $flags); - } + if ($enable_env_flags) + $flags & $connect_flags; - class my_mysqli extends mysqli { - public function __construct($host, $user, $passwd, $db, $port, $socket, $enable_env_flags = true) { - global $connect_flags; + return mysqli_real_connect($link, $host, $user, $passwd, $db, $port, $socket, $flags); + } - $flags = ($enable_env_flags) ? $connect_flags : false; + class my_mysqli extends mysqli { + public function __construct($host, $user, $passwd, $db, $port, $socket, $enable_env_flags = true) { + global $connect_flags; - if ($flags !== false) { - parent::init(); - $this->real_connect($host, $user, $passwd, $db, $port, $socket, $flags); - } else { - parent::__construct($host, $user, $passwd, $db, $port, $socket); + $flags = ($enable_env_flags) ? $connect_flags : false; + + if ($flags !== false) { + parent::init(); + $this->real_connect($host, $user, $passwd, $db, $port, $socket, $flags); + } else { + parent::__construct($host, $user, $passwd, $db, $port, $socket); + } } } + } else { + printf("skip Eeeek/BUG/FIXME - connect.inc included twice! skipif bug?\n"); } ?> \ No newline at end of file diff --git a/ext/mysqli/tests/mysqli_affected_rows.phpt b/ext/mysqli/tests/mysqli_affected_rows.phpt index 6cb5451c0..958b83cb3 100644 --- a/ext/mysqli/tests/mysqli_affected_rows.phpt +++ b/ext/mysqli/tests/mysqli_affected_rows.phpt @@ -8,7 +8,7 @@ mysqli_affected_rows() ?> --FILE-- affected_rows ?> --FILE-- affected_rows)) diff --git a/ext/mysqli/tests/mysqli_autocommit.phpt b/ext/mysqli/tests/mysqli_autocommit.phpt index cdd555976..f1f63e7f3 100644 --- a/ext/mysqli/tests/mysqli_autocommit.phpt +++ b/ext/mysqli/tests/mysqli_autocommit.phpt @@ -26,7 +26,7 @@ mysqli_autocommit() ?> --FILE-- autocommit() ?> --FILE-- --FILE-- diff --git a/ext/mysqli/tests/mysqli_change_user_rollback.phpt b/ext/mysqli/tests/mysqli_change_user_rollback.phpt index a57f80b67..97c2bd851 100644 --- a/ext/mysqli/tests/mysqli_change_user_rollback.phpt +++ b/ext/mysqli/tests/mysqli_change_user_rollback.phpt @@ -12,8 +12,9 @@ $row = mysqli_fetch_row($result); mysqli_free_result($result); mysqli_close($link); -if ($row[1] == 'NO') { - printf ("skip ROLLBACK requires transactional engine InnoDB"); +if ($row[1] == "DISABLED" || $row[1] == "NO") { + printf ("skip innodb support is not installed or enabled."); + exit; } ?> --FILE-- diff --git a/ext/mysqli/tests/mysqli_character_set.phpt b/ext/mysqli/tests/mysqli_character_set.phpt index 11c92ce63..1fced9a3c 100644 --- a/ext/mysqli/tests/mysqli_character_set.phpt +++ b/ext/mysqli/tests/mysqli_character_set.phpt @@ -16,7 +16,7 @@ if (version_compare(PHP_VERSION, '5.9.9', '>') == 1) { ?> --FILE-- unknown, mysqli_unknown = '13' setting mysqli->unknown, mysqli_unknown = 'friday' Access hidden properties for MYSLQI_STATUS_INITIALIZED (TODO documentation): -mysqli->connect_error = ''/%unicode|string% (''/%unicode|string%) +mysqli->connect_error = ''/NULL (''/NULL) mysqli->connect_errno = '0'/integer ('0'/integer) done! \ No newline at end of file diff --git a/ext/mysqli/tests/mysqli_class_mysqli_properties_no_conn.phpt b/ext/mysqli/tests/mysqli_class_mysqli_properties_no_conn.phpt new file mode 100644 index 000000000..d0940a756 --- /dev/null +++ b/ext/mysqli/tests/mysqli_class_mysqli_properties_no_conn.phpt @@ -0,0 +1,282 @@ +--TEST-- +Interface of the class mysqli +--SKIPIF-- + +--FILE-- + $var) { + printf("%s = '%s'\n", $var, var_export(@$mysqli->$var, true)); + } + + printf("\nObject variables:\n"); + $variables = array_keys(get_object_vars($mysqli)); + foreach ($variables as $k => $var) { + printf("%s = '%s'\n", $var, var_export(@$mysqli->$var, true)); + } + + printf("\nMagic, magic properties:\n"); + + assert(@mysqli_affected_rows($mysqli) === @$mysqli->affected_rows); + printf("mysqli->affected_rows = '%s'/%s ('%s'/%s)\n", + @$mysqli->affected_rows, gettype(@$mysqli->affected_rows), + @mysqli_affected_rows($mysqli), gettype(@mysqli_affected_rows($mysqli))); + + assert(@mysqli_get_client_info() === @$mysqli->client_info); + printf("mysqli->client_info = '%s'/%s ('%s'/%s)\n", + @$mysqli->client_info, gettype(@$mysqli->client_info), + @mysqli_get_client_info(), gettype(@mysqli_get_client_info())); + + assert(@mysqli_get_client_version() === @$mysqli->client_version); + printf("mysqli->client_version = '%s'/%s ('%s'/%s)\n", + @$mysqli->client_version, gettype(@$mysqli->client_version), + @mysqli_get_client_version(), gettype(@mysqli_get_client_version())); + + assert(@mysqli_errno($mysqli) === @$mysqli->errno); + printf("mysqli->errno = '%s'/%s ('%s'/%s)\n", + @$mysqli->errno, gettype(@$mysqli->errno), + + @mysqli_errno($mysqli), gettype(@mysqli_errno($mysqli))); + + assert(@mysqli_error($mysqli) === @$mysqli->error); + printf("mysqli->error = '%s'/%s ('%s'/%s)\n", + @$mysqli->error, gettype(@$mysqli->error), + @mysqli_error($mysqli), gettype(@mysqli_error($mysqli))); + + assert(@mysqli_field_count($mysqli) === @$mysqli->field_count); + printf("mysqli->field_count = '%s'/%s ('%s'/%s)\n", + @$mysqli->field_count, gettype(@$mysqli->field_count), + @mysqli_field_count($mysqli), gettype(@mysqli_field_count($mysqli))); + + assert(@mysqli_insert_id($mysqli) === @$mysqli->insert_id); + printf("mysqli->insert_id = '%s'/%s ('%s'/%s)\n", + @$mysqli->insert_id, gettype(@$mysqli->insert_id), + @mysqli_insert_id($mysqli), gettype(@mysqli_insert_id($mysqli))); + + assert(@mysqli_sqlstate($mysqli) === @$mysqli->sqlstate); + printf("mysqli->sqlstate = '%s'/%s ('%s'/%s)\n", + @$mysqli->sqlstate, gettype(@$mysqli->sqlstate), + @mysqli_sqlstate($mysqli), gettype(@mysqli_sqlstate($mysqli))); + + assert(@mysqli_get_host_info($mysqli) === @$mysqli->host_info); + printf("mysqli->host_info = '%s'/%s ('%s'/%s)\n", + @$mysqli->host_info, gettype(@$mysqli->host_info), + @mysqli_get_host_info($mysqli), gettype(@mysqli_get_host_info($mysqli))); + + /* note that the data types are different */ + assert(@mysqli_info($mysqli) == @$mysqli->info); + printf("mysqli->info = '%s'/%s ('%s'/%s)\n", + @$mysqli->info, gettype(@$mysqli->info), + @mysqli_info($mysqli), gettype(@mysqli_info($mysqli))); + + assert(@mysqli_thread_id($mysqli) > @$mysqli->thread_id); + assert(gettype(@$mysqli->thread_id) == gettype(@mysqli_thread_id($mysqli))); + printf("mysqli->thread_id = '%s'/%s ('%s'/%s)\n", + @$mysqli->thread_id, gettype(@$mysqli->thread_id), + @mysqli_thread_id($mysqli), gettype(@mysqli_thread_id($mysqli))); + + assert(@mysqli_get_proto_info($mysqli) === @$mysqli->protocol_version); + printf("mysqli->protocol_version = '%s'/%s ('%s'/%s)\n", + @$mysqli->protocol_version, gettype(@$mysqli->protocol_version), + @mysqli_get_proto_info($mysqli), gettype(@mysqli_get_proto_info($mysqli))); + + assert(@mysqli_get_server_info($mysqli) === @$mysqli->server_info); + printf("mysqli->server_info = '%s'/%s ('%s'/%s)\n", + @$mysqli->server_info, gettype(@$mysqli->server_info), + @mysqli_get_server_info($mysqli), gettype(@mysqli_get_server_info($mysqli))); + + assert(@mysqli_get_server_version($mysqli) === @$mysqli->server_version); + printf("mysqli->server_version = '%s'/%s ('%s'/%s)\n", + @$mysqli->server_version, gettype(@$mysqli->server_version), + @mysqli_get_server_version($mysqli), gettype(@mysqli_get_server_version($mysqli))); + + assert(@mysqli_warning_count($mysqli) === @$mysqli->warning_count); + printf("mysqli->warning_count = '%s'/%s ('%s'/%s)\n", + @$mysqli->warning_count, gettype(@$mysqli->warning_count), + @mysqli_warning_count($mysqli), gettype(@mysqli_warning_count($mysqli))); + + printf("\nAccess to undefined properties:\n"); + printf("mysqli->unknown = '%s'\n", @$mysqli->unknown); + + @$mysqli->unknown = 13; + printf("setting mysqli->unknown, @mysqli_unknown = '%s'\n", @$mysqli->unknown); + + $unknown = 'friday'; + @$mysqli->unknown = $unknown; + printf("setting mysqli->unknown, @mysqli_unknown = '%s'\n", @$mysqli->unknown); + + printf("\nAccess hidden properties for MYSLQI_STATUS_INITIALIZED (TODO documentation):\n"); + assert(@mysqli_connect_error() === @$mysqli->connect_error); + printf("mysqli->connect_error = '%s'/%s ('%s'/%s)\n", + @$mysqli->connect_error, gettype(@$mysqli->connect_error), + @mysqli_connect_error(), gettype(@mysqli_connect_error())); + + assert(@mysqli_connect_errno() === @$mysqli->connect_errno); + printf("mysqli->connect_errno = '%s'/%s ('%s'/%s)\n", + @$mysqli->connect_errno, gettype(@$mysqli->connect_errno), + @mysqli_connect_errno(), gettype(@mysqli_connect_errno())); + } + + printf("Without RS\n"); + $mysqli = @new mysqli($host, $user, $passwd . "invalid", $db, $port, $socket); + dump_properties($mysqli); + + printf("With RS\n"); + $mysqli = @new mysqli($host, $user, $passwd . "invalid", $db, $port, $socket); + $res = @$mysqli->query("SELECT * FROM test"); + dump_properties($mysqli); + + print "done!"; +?> +--CLEAN-- + +--EXPECTF-- +Without RS + +Class variables: +affected_rows = 'NULL' +client_info = 'NULL' +client_version = '%s' +connect_errno = '%s' +connect_error = ''%s' +errno = 'NULL' +error = 'NULL' +field_count = 'NULL' +host_info = 'NULL' +info = 'NULL' +insert_id = 'NULL' +protocol_version = 'NULL' +server_info = 'NULL' +server_version = 'NULL' +sqlstate = 'NULL' +thread_id = 'NULL' +warning_count = 'NULL' + +Object variables: +affected_rows = 'NULL' +client_info = 'NULL' +client_version = '%s' +connect_errno = '%s' +connect_error = '%s' +errno = 'NULL' +error = 'NULL' +field_count = 'NULL' +host_info = 'NULL' +info = 'NULL' +insert_id = 'NULL' +server_info = 'NULL' +server_version = 'NULL' +sqlstate = 'NULL' +protocol_version = 'NULL' +thread_id = 'NULL' +warning_count = 'NULL' + +Magic, magic properties: +mysqli->affected_rows = ''/NULL (''/NULL) + +Warning: assert(): Assertion failed in %s on line %d +mysqli->client_info = ''/NULL ('%s'/%s) +mysqli->client_version = '%s'/integer ('%s'/integer) +mysqli->errno = ''/NULL (''/NULL) +mysqli->error = ''/NULL (''/NULL) +mysqli->field_count = ''/NULL (''/NULL) +mysqli->insert_id = ''/NULL (''/NULL) +mysqli->sqlstate = ''/NULL (''/NULL) +mysqli->host_info = ''/NULL (''/NULL) +mysqli->info = ''/NULL (''/NULL) + +Warning: assert(): Assertion failed in %s on line %d +mysqli->thread_id = ''/NULL (''/NULL) +mysqli->protocol_version = ''/NULL (''/NULL) +mysqli->server_info = ''/NULL (''/NULL) +mysqli->server_version = ''/NULL (''/NULL) +mysqli->warning_count = ''/NULL (''/NULL) + +Access to undefined properties: +mysqli->unknown = '' +setting mysqli->unknown, @mysqli_unknown = '13' +setting mysqli->unknown, @mysqli_unknown = 'friday' + +Access hidden properties for MYSLQI_STATUS_INITIALIZED (TODO documentation): +mysqli->connect_error = '%s'/%s) +mysqli->connect_errno = '%s'/integer ('%s'/integer) +With RS + +Class variables: +affected_rows = 'NULL' +client_info = 'NULL' +client_version = '%s' +connect_errno = '%s' +connect_error = '%s' +errno = 'NULL' +error = 'NULL' +field_count = 'NULL' +host_info = 'NULL' +info = 'NULL' +insert_id = 'NULL' +protocol_version = 'NULL' +server_info = 'NULL' +server_version = 'NULL' +sqlstate = 'NULL' +thread_id = 'NULL' +warning_count = 'NULL' + +Object variables: +affected_rows = 'NULL' +client_info = 'NULL' +client_version = '%s' +connect_errno = '%s' +connect_error = '%s' +errno = 'NULL' +error = 'NULL' +field_count = 'NULL' +host_info = 'NULL' +info = 'NULL' +insert_id = 'NULL' +server_info = 'NULL' +server_version = 'NULL' +sqlstate = 'NULL' +protocol_version = 'NULL' +thread_id = 'NULL' +warning_count = 'NULL' + +Magic, magic properties: +mysqli->affected_rows = ''/NULL (''/NULL) + +Warning: assert(): Assertion failed in %s on line %d +mysqli->client_info = ''/NULL ('%s'/%s) +mysqli->client_version = '%s'/integer ('%s'/integer) +mysqli->errno = ''/NULL (''/NULL) +mysqli->error = ''/NULL (''/NULL) +mysqli->field_count = ''/NULL (''/NULL) +mysqli->insert_id = ''/NULL (''/NULL) +mysqli->sqlstate = ''/NULL (''/NULL) +mysqli->host_info = ''/NULL (''/NULL) +mysqli->info = ''/NULL (''/NULL) + +Warning: assert(): Assertion failed in %s on line %d +mysqli->thread_id = ''/NULL (''/NULL) +mysqli->protocol_version = ''/NULL (''/NULL) +mysqli->server_info = ''/NULL (''/NULL) +mysqli->server_version = ''/NULL (''/NULL) +mysqli->warning_count = ''/NULL (''/NULL) + +Access to undefined properties: +mysqli->unknown = '' +setting mysqli->unknown, @mysqli_unknown = '13' +setting mysqli->unknown, @mysqli_unknown = 'friday' + +Access hidden properties for MYSLQI_STATUS_INITIALIZED (TODO documentation): +mysqli->connect_error = '%s'/%s) +mysqli->connect_errno = '%s'/integer ('%s'/integer) +done! \ No newline at end of file diff --git a/ext/mysqli/tests/mysqli_close.phpt b/ext/mysqli/tests/mysqli_close.phpt index 713c6e157..c6ac92dd6 100644 --- a/ext/mysqli/tests/mysqli_close.phpt +++ b/ext/mysqli/tests/mysqli_close.phpt @@ -8,7 +8,7 @@ require_once('skipifconnectfailure.inc'); ?> --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- real_connect($host, $user, $passwd, $db, $port); + if ($socket != "") { + ini_set('mysqli.default_socket', $socket); + try { + $mysqli = mysqli_init(); + $mysqli->real_connect($host, $user, $passwd, $db, $port); - if (!$res = $mysqli->query("SELECT 'mysqli.default_socket' AS testing")) - printf("[001] [%d] %s\n", $mysqli->errno, $mysqli->error); - var_dump($res->fetch_assoc()); - $res->free_result(); + if (!$res = $mysqli->query("SELECT 'mysqli.default_socket' AS testing")) + printf("[001] [%d] %s\n", $mysqli->errno, $mysqli->error); + $tmp = $res->fetch_assoc(); + $res->free_result(); - $mysqli->close(); + if (!isset($tmp['testing']) || $tmp['testing'] != $socket) { + printf("[002] mysqli.default_socket not properly set?\n"); + var_dump($tmp); + } - } catch (mysqli_sql_exception $e) { - printf("%s\n", $e->getMessage()); - printf("[002] Usage of mysqli.default_socket failed\n"); + $mysqli->close(); + + } catch (mysqli_sql_exception $e) { + printf("%s\n", $e->getMessage()); + printf("[002] Usage of mysqli.default_socket failed\n"); + } } ini_set('mysqli.default_port', $port); @@ -143,10 +154,6 @@ new mysqli() print "done!"; ?> --EXPECTF-- -array(1) { - [%u|b%"testing"]=> - %unicode|string%(21) "mysqli.default_socket" -} array(1) { [%u|b%"testing"]=> %unicode|string%(19) "mysqli.default_port" diff --git a/ext/mysqli/tests/mysqli_connect_oo_warnings.phpt b/ext/mysqli/tests/mysqli_connect_oo_warnings.phpt index 1c2defc8b..5ede44591 100644 --- a/ext/mysqli/tests/mysqli_connect_oo_warnings.phpt +++ b/ext/mysqli/tests/mysqli_connect_oo_warnings.phpt @@ -12,7 +12,7 @@ new mysqli() ?> --FILE-- --FILE-- 51122 && $version < 60000) || ($version > 60003) || $IS_MYSQLND) { $expected_constants['MYSQLI_ON_UPDATE_NOW_FLAG'] = true; } - if ($version > 60005 || $IS_MYSQLND) { + + /* First introduced in MySQL 6.0, backported to MySQL 5.5 */ + if ($version >= 50500 || $IS_MYSQLND) { $expected_constants['MYSQLI_SERVER_QUERY_WAS_SLOW'] = true; } diff --git a/ext/mysqli/tests/mysqli_data_seek.phpt b/ext/mysqli/tests/mysqli_data_seek.phpt index cb54c8003..9e2d65047 100644 --- a/ext/mysqli/tests/mysqli_data_seek.phpt +++ b/ext/mysqli/tests/mysqli_data_seek.phpt @@ -8,7 +8,7 @@ require_once('skipifconnectfailure.inc'); ?> --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- error --SKIPIF-- - --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- 50122) && ($version < 60000)) || + if ((($version > 50122) && ($version < 60000) && ($version != 50200)) || ($version >= 60004)) { // new flag ON_UPDATE_NOW_FLAG (8192) $expected_flags .= ' ON_UPDATE_NOW'; @@ -165,7 +165,7 @@ mysqli_close($link); case 'BIT': $version = mysqli_get_server_version($link); - if ($version <= 50105) { + if (($version <= 50114 && $version > 50100) || ($version == 50200)) { // TODO - check exact version! $expected_flags = trim(str_replace('UNSIGNED', '', $expected_flags)); } @@ -176,8 +176,8 @@ mysqli_close($link); list($missing_flags, $unexpected_flags, $flags_found) = checkFlags($field->flags, $expected_flags, $flags); if ($unexpected_flags) { - printf("[006] Found unexpected flags '%s' for %s, found '%s'\n", - $unexpected_flags, $column_def, $flags_found); + printf("[006] Found unexpected flags '%s' for %s, found '%s' with MySQL %s'\n", + $unexpected_flags, $column_def, $flags_found, mysqli_get_server_version($link)); } if ($missing_flags) { printf("[007] The flags '%s' have not been reported for %s, found '%s'\n", diff --git a/ext/mysqli/tests/mysqli_fetch_field_oo.phpt b/ext/mysqli/tests/mysqli_fetch_field_oo.phpt index 2c169ed3f..f7dcd9b9a 100644 --- a/ext/mysqli/tests/mysqli_fetch_field_oo.phpt +++ b/ext/mysqli/tests/mysqli_fetch_field_oo.phpt @@ -8,7 +8,7 @@ require_once('skipifconnectfailure.inc'); ?> --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --CLEAN-- --FILE-- ---FILE-- - ---CLEAN-- - ---EXPECTF-- -array(7) { - [%u|b%"put_hits"]=> - int(0) - [%u|b%"put_misses"]=> - int(0) - [%u|b%"get_hits"]=> - int(0) - [%u|b%"get_misses"]=> - int(0) - [%u|b%"size"]=> - int(%d) - [%u|b%"free_items"]=> - int(%d) - [%u|b%"references"]=> - int(%d) -} -done! \ No newline at end of file diff --git a/ext/mysqli/tests/mysqli_get_cache_stats_free_buffered.phpt b/ext/mysqli/tests/mysqli_get_cache_stats_free_buffered.phpt deleted file mode 100644 index 0bb90fa71..000000000 --- a/ext/mysqli/tests/mysqli_get_cache_stats_free_buffered.phpt +++ /dev/null @@ -1,99 +0,0 @@ ---TEST-- -mysqli_get_cache_stats() - freeing for buffered result sets ---XFAIL-- -zval caching has been temporarily disabled for the 5.3.0 release ---INI-- -mysqlnd.collect_statistics="1" -mysqlnd.collect_memory_statistics="1" ---SKIPIF-- - ---FILE-- -= $info['free_items']) { - printf("[004] mysqli_free_result() should not yet have free slots again, because \$rows still exists\n"); - var_dump($info); - var_dump($new_info); - } - - /* nothing should change because GC will happen some time after free_result */ - unset($rows); - - if (!is_array($new_info = mysqli_get_cache_stats()) || empty($new_info)) - printf("[005] Expecting array/any_non_empty, got %s/%s\n", gettype($new_info), $new_info); - - if (defined("WE_HAVE_GARBAGE_COLLECTOR_TO_FREE_AFTER_ON_UNSET_AFTER_FREE_RESULT")) { - /* - For now we can't reclaim the slots after the free_result is called. - unset() should happen before free_result(). - */ - if ($new_info['free_items'] < $info['free_items']) { - printf("[006] \$rows has been unset, free item count should be back to the original value\n"); - var_dump($info); - var_dump($new_info); - } - } else { - /* We have to reset $info */ - $info = mysqli_get_cache_stats(); - } - - if (!$res = mysqli_query($link, "SELECT id, label FROM test ORDER BY id")) - printf("[007] [%d] %s\n", mysqli_errno($link), mysqli_error($link)); - - $rows = array(); - while ($rows[] = mysqli_fetch_assoc($res)) - ; - unset($rows); - mysqli_free_result($res); - - if (!is_array($new_info = mysqli_get_cache_stats()) || empty($new_info)) - printf("[008] Expecting array/any_non_empty, got %s/%s\n", gettype($new_info), $new_info); - - if ($new_info['free_items'] < $info['free_items']) { - printf("[009] \$rows has been unset, mysqli_free_result() has been called, free item count should be back to the original value\n"); - var_dump($info); - var_dump($new_info); - } - - mysqli_close($link); - - if (!is_array($new_info = mysqli_get_cache_stats()) || empty($new_info)) - printf("[010] Expecting array/any_non_empty, got %s/%s\n", gettype($new_info), $new_info); - - if ($new_info['free_items'] < $info['free_items']) { - printf("[011] connection has been closed, free item count should be back to the original value\n"); - var_dump($info); - var_dump($new_info); - } - - print "done!"; -?> ---CLEAN-- - ---EXPECTF-- -done! \ No newline at end of file diff --git a/ext/mysqli/tests/mysqli_get_charset.phpt b/ext/mysqli/tests/mysqli_get_charset.phpt index 314853dc0..8f81b3342 100644 --- a/ext/mysqli/tests/mysqli_get_charset.phpt +++ b/ext/mysqli/tests/mysqli_get_charset.phpt @@ -10,7 +10,7 @@ if (!function_exists('mysqli_get_charset')) ?> --FILE-- --FILE-- --CLEAN-- --EXPECTF-- -array(121) { +array(152) { [%u|b%"bytes_sent"]=> %unicode|string%(1) "0" [%u|b%"bytes_received"]=> @@ -974,6 +974,10 @@ array(121) { %unicode|string%(1) "0" [%u|b%"rows_fetched_from_client_ps_cursor"]=> %unicode|string%(1) "0" + [%u|b%"rows_affected_normal"]=> + %unicode|string%(1) "0" + [%u|b%"rows_affected_ps"]=> + %unicode|string%(1) "0" [%u|b%"rows_skipped_normal"]=> %unicode|string%(1) "0" [%u|b%"rows_skipped_ps"]=> @@ -1130,6 +1134,64 @@ array(121) { %unicode|string%(1) "0" [%u|b%"init_command_failed_count"]=> %unicode|string%(1) "0" + [%u|b%"com_quit"]=> + %unicode|string%(1) "0" + [%u|b%"com_init_db"]=> + %unicode|string%(1) "0" + [%u|b%"com_query"]=> + %unicode|string%(1) "0" + [%u|b%"com_field_list"]=> + %unicode|string%(1) "0" + [%u|b%"com_create_db"]=> + %unicode|string%(1) "0" + [%u|b%"com_drop_db"]=> + %unicode|string%(1) "0" + [%u|b%"com_refresh"]=> + %unicode|string%(1) "0" + [%u|b%"com_shutdown"]=> + %unicode|string%(1) "0" + [%u|b%"com_statistics"]=> + %unicode|string%(1) "0" + [%u|b%"com_process_info"]=> + %unicode|string%(1) "0" + [%u|b%"com_connect"]=> + %unicode|string%(1) "0" + [%u|b%"com_process_kill"]=> + %unicode|string%(1) "0" + [%u|b%"com_debug"]=> + %unicode|string%(1) "0" + [%u|b%"com_ping"]=> + %unicode|string%(1) "0" + [%u|b%"com_time"]=> + %unicode|string%(1) "0" + [%u|b%"com_delayed_insert"]=> + %unicode|string%(1) "0" + [%u|b%"com_change_user"]=> + %unicode|string%(1) "0" + [%u|b%"com_binlog_dump"]=> + %unicode|string%(1) "0" + [%u|b%"com_table_dump"]=> + %unicode|string%(1) "0" + [%u|b%"com_connect_out"]=> + %unicode|string%(1) "0" + [%u|b%"com_register_slave"]=> + %unicode|string%(1) "0" + [%u|b%"com_stmt_prepare"]=> + %unicode|string%(1) "0" + [%u|b%"com_stmt_execute"]=> + %unicode|string%(1) "0" + [%u|b%"com_stmt_send_long_data"]=> + %unicode|string%(1) "0" + [%u|b%"com_stmt_close"]=> + %unicode|string%(1) "0" + [%u|b%"com_stmt_reset"]=> + %unicode|string%(1) "0" + [%u|b%"com_stmt_set_option"]=> + %unicode|string%(1) "0" + [%u|b%"com_stmt_fetch"]=> + %unicode|string%(1) "0" + [%u|b%"com_deamon"]=> + %unicode|string%(1) "0" } Testing buffered normal... Testing buffered normal... - SELECT id, label FROM test diff --git a/ext/mysqli/tests/mysqli_get_connection_stats.phpt b/ext/mysqli/tests/mysqli_get_connection_stats.phpt index 698a4684f..64eba1667 100644 --- a/ext/mysqli/tests/mysqli_get_connection_stats.phpt +++ b/ext/mysqli/tests/mysqli_get_connection_stats.phpt @@ -21,8 +21,7 @@ if (!function_exists('mysqli_get_connection_stats')) { if (!is_null($tmp = @mysqli_get_connection_stats($link))) printf("[002] Expecting NULL, got %s/%s\n", gettype($tmp), $tmp); - include "connect.inc"; - include "table.inc"; + require("table.inc"); if (!is_array($info = mysqli_get_connection_stats($link)) || empty($info)) printf("[003] Expecting array/any_non_empty, got %s/%s\n", gettype($info), $info); @@ -63,7 +62,7 @@ if (!function_exists('mysqli_get_connection_stats')) { } mysqli_close($link); - include "table.inc"; + require("table.inc"); if (!is_array($info = mysqli_get_connection_stats($link)) || empty($info)) printf("[008] Expecting array/any_non_empty, got %s/%s\n", gettype($info), $info); diff --git a/ext/mysqli/tests/mysqli_get_host_info.phpt b/ext/mysqli/tests/mysqli_get_host_info.phpt index 63fdad28b..2c3c0f806 100644 --- a/ext/mysqli/tests/mysqli_get_host_info.phpt +++ b/ext/mysqli/tests/mysqli_get_host_info.phpt @@ -8,7 +8,7 @@ require_once('skipifconnectfailure.inc'); ?> --FILE-- --CLEAN-- diff --git a/ext/mysqli/tests/mysqli_get_proto_info.phpt b/ext/mysqli/tests/mysqli_get_proto_info.phpt index b5dd98518..7fbefeb85 100644 --- a/ext/mysqli/tests/mysqli_get_proto_info.phpt +++ b/ext/mysqli/tests/mysqli_get_proto_info.phpt @@ -1,14 +1,14 @@ --TEST-- mysqli_get_proto_info() --SKIPIF-- - --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --CLEAN-- +--INI-- +memory_limit=256M +--FILE-- + +--CLEAN-- + +--EXPECTF-- +done! \ No newline at end of file diff --git a/ext/mysqli/tests/mysqli_kill.phpt b/ext/mysqli/tests/mysqli_kill.phpt index 64daad88e..5706adf46 100644 --- a/ext/mysqli/tests/mysqli_kill.phpt +++ b/ext/mysqli/tests/mysqli_kill.phpt @@ -8,7 +8,7 @@ require_once('skipifconnectfailure.inc'); ?> --FILE-- int(0) [%u|b%"connect_error"]=> - %unicode|string%(0) "" + NULL [%u|b%"errno"]=> int(2006) [%u|b%"error"]=> diff --git a/ext/mysqli/tests/mysqli_more_results.phpt b/ext/mysqli/tests/mysqli_more_results.phpt index 49de0d7fa..271c63e1d 100644 --- a/ext/mysqli/tests/mysqli_more_results.phpt +++ b/ext/mysqli/tests/mysqli_more_results.phpt @@ -8,7 +8,7 @@ require_once('skipifconnectfailure.inc'); ?> --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- +--INI-- +mysqli.allow_persistent=1 +mysqli.max_persistent=-1 +mysqli.max_links=-1 +--FILE-- +thread_id) + printf("[002] Cannot determine thread id, test will fail, [%d] %s\n", mysqli_errno($link), mysqli_error($link)); + + if (true !== ($tmp = my_mysqli_real_connect($link, $host, $user, $passwd, $db, $port, $socket))) + printf("[003] Expecting boolean/true got %s/%s\n", gettype($tmp), $tmp); + + if (!is_int($new_thread_id = mysqli_thread_id($link)) || ($new_thread_id < 0)) + printf("[004] Expecting int/any got %s/%s\n", gettype($tmp), $tmp); + + if ($thread_id == $new_thread_id) + printf("[005] Expecting new connection and new thread id. Old thread id %d, new thread id %d\n", $thread_id, $new_thread_id); + + if (!($res = mysqli_query($link, "SELECT 'ok' AS it_works")) || + !($row = mysqli_fetch_assoc($res))) + printf("[006] [%d] %s\n", mysqli_errno($link), mysqli_error($link)); + + var_dump($row); + mysqli_free_result($res); + + mysqli_close($link); + + if (!$link = new my_mysqli($phost, $user, $passwd, $db, $port, $socket)) + printf("[007] Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n", + $phost, $user, $db, $port, $socket); + + if (!$thread_id = $link->thread_id) + printf("[008] Cannot determine thread id, test will fail, [%d] %s\n", mysqli_errno($link), mysqli_error($link)); + + if (true !== ($tmp = $link->real_connect($host, $user, $passwd, $db, $port, $socket))) + printf("[009] Expecting boolean/true got %s/%s\n", gettype($tmp), $tmp); + + if (!is_int($new_thread_id = $link->thread_id) || ($new_thread_id < 0)) + printf("[010] Expecting int/any got %s/%s\n", gettype($tmp), $tmp); + + if ($thread_id == $new_thread_id) + printf("[011] Expecting new connection and new thread id. Old thread id %d, new thread id %d\n", $thread_id, $new_thread_id); + + if (!($res = $link->query("SELECT 'works also with oo' AS syntax")) || + !($row = $res->fetch_assoc())) + printf("[012] [%d] %s\n", mysqli_errno($link), mysqli_error($link)); + + var_dump($row); + mysqli_free_result($res); + + mysqli_close($link); + + if (NULL !== ($tmp = $link->connect($phost, $user, $passwd, $db, $port, $socket))) + printf("[013] Expecting NULL got %s/%s\n", gettype($tmp), $tmp); + + if (!$link = mysqli_connect($phost, $user, $passwd, $db, $port, $socket)) + printf("[014] Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n", + $phost, $user, $db, $port, $socket); + + if (NULL !== ($tmp = $link->connect($host, $user, $passwd, $db, $port, $socket))) + printf("[015] Expecting NULL got %s/%s\n", gettype($tmp), $tmp); + + printf("Flipping phost/host order\n"); + + if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) + printf("[016] Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n", + $host, $user, $db, $port, $socket); + + if (!$thread_id = mysqli_thread_id($link)) + printf("[017] Cannot determine thread id, test will fail, [%d] %s\n", mysqli_errno($link), mysqli_error($link)); + + if (true !== ($tmp = my_mysqli_real_connect($link, $phost, $user, $passwd, $db, $port, $socket))) + printf("[018] Expecting boolean/true got %s/%s\n", gettype($tmp), $tmp); + + if (!is_int($new_thread_id = mysqli_thread_id($link)) || ($new_thread_id < 0)) + printf("[019] Expecting int/any got %s/%s\n", gettype($tmp), $tmp); + + if ($thread_id == $new_thread_id) + printf("[020] Expecting new connection and new thread id. Old thread id %d, new thread id %d\n", $thread_id, $new_thread_id); + + if (!($res = mysqli_query($link, "SELECT 'ok' AS it_works")) || + !($row = mysqli_fetch_assoc($res))) + printf("[021] [%d] %s\n", mysqli_errno($link), mysqli_error($link)); + + var_dump($row); + mysqli_free_result($res); + + mysqli_close($link); + + if (!$link = new my_mysqli($host, $user, $passwd, $db, $port, $socket)) + printf("[022] Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n", + $host, $user, $db, $port, $socket); + + if (!$thread_id = $link->thread_id) + printf("[023] Cannot determine thread id, test will fail, [%d] %s\n", mysqli_errno($link), mysqli_error($link)); + + if (true !== ($tmp = $link->real_connect($phost, $user, $passwd, $db, $port, $socket))) + printf("[024] Expecting boolean/true got %s/%s\n", gettype($tmp), $tmp); + + if (!is_int($new_thread_id = $link->thread_id) || ($new_thread_id < 0)) + printf("[025] Expecting int/any got %s/%s\n", gettype($tmp), $tmp); + + if ($thread_id == $new_thread_id) + printf("[026] Expecting new connection and new thread id. Old thread id %d, new thread id %d\n", $thread_id, $new_thread_id); + + if (!($res = $link->query("SELECT 'works also with oo' AS syntax")) || + !($row = $res->fetch_assoc())) + printf("[027] [%d] %s\n", mysqli_errno($link), mysqli_error($link)); + + var_dump($row); + mysqli_free_result($res); + + mysqli_close($link); + + if (NULL !== ($tmp = $link->connect($host, $user, $passwd, $db, $port, $socket))) + printf("[028] Expecting NULL got %s/%s\n", gettype($tmp), $tmp); + + if (!$link = mysqli_connect($host, $user, $passwd, $db, $port, $socket)) + printf("[029] Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n", + $host, $user, $db, $port, $socket); + + if (NULL !== ($tmp = $link->connect($phost, $user, $passwd, $db, $port, $socket))) + printf("[030] Expecting NULL got %s/%s\n", gettype($tmp), $tmp); + + print "done!"; +?> +--EXPECTF-- +array(1) { + [%u|b%"it_works"]=> + %unicode|string%(2) "ok" +} +array(1) { + [%u|b%"syntax"]=> + %unicode|string%(18) "works also with oo" +} +Flipping phost/host order +array(1) { + [%u|b%"it_works"]=> + %unicode|string%(2) "ok" +} +array(1) { + [%u|b%"syntax"]=> + %unicode|string%(18) "works also with oo" +} +done! \ No newline at end of file diff --git a/ext/mysqli/tests/mysqli_pconn_disabled.phpt b/ext/mysqli/tests/mysqli_pconn_disabled.phpt index ee0efc4e5..1fe6271c7 100644 --- a/ext/mysqli/tests/mysqli_pconn_disabled.phpt +++ b/ext/mysqli/tests/mysqli_pconn_disabled.phpt @@ -17,7 +17,7 @@ mysqli.max_persistent=2 mysqli.max_links=2 --FILE-- --CLEAN-- +--INI-- +mysqli.allow_persistent=1 +mysqli.max_persistent=-1 +mysqli.max_links=-1 +--FILE-- +real_connect($host, $user, $passwd, $db, $port, $socket))) + printf("[009] Expecting boolean/true got %s/%s\n", gettype($tmp), $tmp); + + /* it is undefined which pooled connection we get - thread ids may differ */ + + if (!($res = $link->query("SELECT 'works also with oo' AS syntax")) || + !($row = $res->fetch_assoc())) + printf("[012] [%d] %s\n", mysqli_errno($link), mysqli_error($link)); + + var_dump($row); + mysqli_free_result($res); + + mysqli_close($link); + + if (NULL !== ($tmp = $link->connect($host, $user, $passwd, $db, $port, $socket))) + printf("[013] Expecting NULL got %s/%s\n", gettype($tmp), $tmp); + + if (!$link = mysqli_connect($host, $user, $passwd, $db, $port, $socket)) + printf("[014] Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n", + $host, $user, $db, $port, $socket); + + if (NULL !== ($tmp = $link->connect($host, $user, $passwd, $db, $port, $socket))) + printf("[015] Expecting NULL got %s/%s\n", gettype($tmp), $tmp); + + print "done!"; +?> +--EXPECTF-- +array(1) { + [%u|b%"it_works"]=> + %unicode|string%(2) "ok" +} +array(1) { + [%u|b%"syntax"]=> + %unicode|string%(18) "works also with oo" +} +done! \ No newline at end of file diff --git a/ext/mysqli/tests/mysqli_pconnect.phpt b/ext/mysqli/tests/mysqli_pconnect.phpt index 57b44ebaf..fbb1092e6 100644 --- a/ext/mysqli/tests/mysqli_pconnect.phpt +++ b/ext/mysqli/tests/mysqli_pconnect.phpt @@ -11,7 +11,7 @@ if (!stristr(mysqli_get_client_info(), 'mysqlnd')) ?> --FILE-- --FILE-- --CLEAN-- --FILE-- --CLEAN-- --FILE-- --FILE-- --CLEAN-- --CLEAN-- --FILE-- --FILE-- --FILE-- --CLEAN-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- prepare("SELECT * FROM test"); + mt_srand(microtime(true)); + + /* mysqlnd detects invalid attributes, libmysql does not AFAIK */ + $invalid_ret = ($IS_MYSQLND) ? false : true; + for ($i = -100; $i < 1000; $i++) { if (in_array($i, $valid_attr)) continue; $invalid_attr = $i; - if (false !== ($tmp = @mysqli_stmt_attr_set($stmt, $invalid_attr, 0))) { - printf("[006a] Expecting boolean/false for attribute %d, got %s/%s\n", $invalid_attr, gettype($tmp), $tmp); + if ($invalid_ret !== ($tmp = @mysqli_stmt_attr_set($stmt, $invalid_attr, 0))) { + printf("[006a] Expecting boolean/%s for attribute %d, got %s/%s\n", $invalid_ret, $invalid_attr, gettype($tmp), $tmp); } } - for ($i = 0; $i < 10; $i++) { + for ($i = 0; $i < 2; $i++) { do { $invalid_attr = mt_rand(-1 * (min(4294967296, PHP_INT_MAX) + 1), min(4294967296, PHP_INT_MAX)); } while (in_array($invalid_attr, $valid_attr)); - if (false !== ($tmp = @mysqli_stmt_attr_set($stmt, $invalid_attr, 0))) { - /* Although it may be desired to get false neither the MySQL Client Library nor mysqlnd are supposed to detect invalid codes */ - printf("[006b] Expecting boolean/true for attribute %d, got %s/%s\n", $invalid_attr, gettype($tmp), $tmp); + if ($invalid_ret !== ($tmp = @mysqli_stmt_attr_set($stmt, $invalid_attr, 0))) { + printf("[006b] Expecting boolean/%s for attribute %d, got %s/%s\n", $invalid_ret, $invalid_attr, gettype($tmp), $tmp); } } $stmt->close(); diff --git a/ext/mysqli/tests/mysqli_stmt_bind_param.phpt b/ext/mysqli/tests/mysqli_stmt_bind_param.phpt index 9aaac9804..33ef3175a 100644 --- a/ext/mysqli/tests/mysqli_stmt_bind_param.phpt +++ b/ext/mysqli/tests/mysqli_stmt_bind_param.phpt @@ -17,7 +17,7 @@ require_once('skipifconnectfailure.inc'); in this file and we test mysqli_stmt_bind_result() in the other test -- therefore the "duplicate" makes some sense to me. */ - include "connect.inc"; + require_once("connect.inc"); $tmp = NULL; $link = NULL; diff --git a/ext/mysqli/tests/mysqli_stmt_bind_param_check_param_no_change.phpt b/ext/mysqli/tests/mysqli_stmt_bind_param_check_param_no_change.phpt index a7d36743c..e1e3a92e5 100644 --- a/ext/mysqli/tests/mysqli_stmt_bind_param_check_param_no_change.phpt +++ b/ext/mysqli/tests/mysqli_stmt_bind_param_check_param_no_change.phpt @@ -8,7 +8,6 @@ require_once('skipifconnectfailure.inc'); ?> --FILE-- --FILE-- --FILE-- --FILE-- ') == 1) ? "unicode":"string"; diff --git a/ext/mysqli/tests/mysqli_stmt_bind_result_bit.phpt b/ext/mysqli/tests/mysqli_stmt_bind_result_bit.phpt index 1eef76747..acf0d0be2 100644 --- a/ext/mysqli/tests/mysqli_stmt_bind_result_bit.phpt +++ b/ext/mysqli/tests/mysqli_stmt_bind_result_bit.phpt @@ -8,7 +8,7 @@ require_once('skipifconnectfailure.inc'); ?> --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --CLEAN-- --FILE-- --FILE-- --FILE-- --CLEAN-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- current_result = NULL; } - if (conn->net.stream) { - DBG_INF_FMT("Freeing stream. abstract=%p", conn->net.stream->abstract); - if (pers) { - php_stream_free(conn->net.stream, PHP_STREAM_FREE_CLOSE_PERSISTENT | PHP_STREAM_FREE_RSRC_DTOR); - } else { - php_stream_free(conn->net.stream, PHP_STREAM_FREE_CLOSE); - - } - conn->net.stream = NULL; - } + conn->net->m.free_contents(conn->net TSRMLS_CC); DBG_INF("Freeing memory of members"); + if (conn->host) { DBG_INF("Freeing host"); mnd_pefree(conn->host, pers); @@ -174,6 +164,11 @@ MYSQLND_METHOD(mysqlnd_conn, free_contents)(MYSQLND *conn TSRMLS_DC) mnd_pefree(conn->passwd, pers); conn->passwd = NULL; } + if (conn->connect_or_select_db) { + DBG_INF("Freeing connect_or_select_db"); + mnd_pefree(conn->connect_or_select_db, pers); + conn->connect_or_select_db = NULL; + } if (conn->unix_socket) { DBG_INF("Freeing unix_socket"); mnd_pefree(conn->unix_socket, pers); @@ -203,26 +198,6 @@ MYSQLND_METHOD(mysqlnd_conn, free_contents)(MYSQLND *conn TSRMLS_DC) mnd_pefree(conn->last_message, pers); conn->last_message = NULL; } - if (conn->zval_cache) { - DBG_INF("Freeing zval cache reference"); - mysqlnd_palloc_free_thd_cache_reference(&conn->zval_cache); - conn->zval_cache = NULL; - } - if (conn->result_set_memory_pool) { - mysqlnd_mempool_destroy(conn->result_set_memory_pool TSRMLS_CC); - conn->result_set_memory_pool = NULL; - } - if (conn->qcache) { - DBG_INF("Freeing qcache reference"); - mysqlnd_qcache_free_cache_reference(&conn->qcache); - conn->qcache = NULL; - } - if (conn->net.cmd_buffer.buffer) { - DBG_INF("Freeing cmd buffer"); - mnd_pefree(conn->net.cmd_buffer.buffer, pers); - conn->net.cmd_buffer.buffer = NULL; - } - conn->charset = NULL; conn->greet_charset = NULL; @@ -241,21 +216,21 @@ MYSQLND_METHOD_PRIVATE(mysqlnd_conn, dtor)(MYSQLND *conn TSRMLS_DC) conn->m->free_contents(conn TSRMLS_CC); conn->m->free_options(conn TSRMLS_CC); -#ifdef MYSQLND_THREADED - if (conn->thread_is_running) { - pthread_mutex_lock(&conn->LOCK_work); - conn->thread_killed = TRUE; - pthread_cond_signal(&conn->COND_work); - pthread_cond_wait(&conn->COND_thread_ended, &conn->LOCK_work); - pthread_mutex_unlock(&conn->LOCK_work); + if (conn->net) { + DBG_INF("Freeing net"); + mysqlnd_net_free(conn->net TSRMLS_CC); + conn->net = NULL; } - tsrm_mutex_free(conn->LOCK_state); + if (conn->protocol) { + DBG_INF("Freeing protocol"); + mysqlnd_protocol_free(conn->protocol TSRMLS_CC); + conn->protocol = NULL; + } - pthread_cond_destroy(&conn->COND_work); - pthread_cond_destroy(&conn->COND_work_done); - pthread_mutex_destroy(&conn->LOCK_work); -#endif + if (conn->stats) { + mysqlnd_stats_end(conn->stats); + } mnd_pefree(conn, conn->persistent); @@ -264,23 +239,21 @@ MYSQLND_METHOD_PRIVATE(mysqlnd_conn, dtor)(MYSQLND *conn TSRMLS_DC) /* }}} */ -/* {{{ mysqlnd_simple_command_handle_response */ -enum_func_status -mysqlnd_simple_command_handle_response(MYSQLND *conn, enum php_mysql_packet_type ok_packet, - zend_bool silent, enum php_mysqlnd_server_command command, - zend_bool ignore_upsert_status - TSRMLS_DC) +/* {{{ mysqlnd_conn::simple_command_handle_response */ +static enum_func_status +MYSQLND_METHOD(mysqlnd_conn, simple_command_handle_response)(MYSQLND *conn, enum mysqlnd_packet_type ok_packet, + zend_bool silent, enum php_mysqlnd_server_command command, + zend_bool ignore_upsert_status TSRMLS_DC) { enum_func_status ret; - DBG_ENTER("mysqlnd_simple_command_handle_response"); + DBG_ENTER("mysqlnd_conn::simple_command_handle_response"); DBG_INF_FMT("silent=%d packet=%d command=%s", silent, ok_packet, mysqlnd_command_to_text[command]); switch (ok_packet) { case PROT_OK_PACKET:{ - php_mysql_packet_ok ok_response; - PACKET_INIT_ALLOCA(ok_response, PROT_OK_PACKET); - if (FAIL == (ret = PACKET_READ_ALLOCA(ok_response, conn))) { + MYSQLND_PACKET_OK * ok_response = conn->protocol->m.get_ok_packet(conn->protocol, FALSE TSRMLS_CC); + if (FAIL == (ret = PACKET_READ(ok_response, conn))) { if (!silent) { DBG_ERR_FMT("Error while reading %s's OK packet", mysqlnd_command_to_text[command]); php_error_docref(NULL TSRMLS_CC, E_WARNING, "Error while reading %s's OK packet. PID=%d", @@ -288,10 +261,9 @@ mysqlnd_simple_command_handle_response(MYSQLND *conn, enum php_mysql_packet_type } } else { DBG_INF_FMT("OK from server"); - if (0xFF == ok_response.field_count) { + if (0xFF == ok_response->field_count) { /* The server signalled error. Set the error */ - SET_CLIENT_ERROR(conn->error_info, ok_response.error_no, - ok_response.sqlstate, ok_response.error); + SET_CLIENT_ERROR(conn->error_info, ok_response->error_no, ok_response->sqlstate, ok_response->error); ret = FAIL; /* Cover a protocol design error: error packet does not @@ -306,24 +278,23 @@ mysqlnd_simple_command_handle_response(MYSQLND *conn, enum php_mysql_packet_type SET_ERROR_AFF_ROWS(conn); } else { SET_NEW_MESSAGE(conn->last_message, conn->last_message_len, - ok_response.message, ok_response.message_len, + ok_response->message, ok_response->message_len, conn->persistent); if (!ignore_upsert_status) { - conn->upsert_status.warning_count = ok_response.warning_count; - conn->upsert_status.server_status = ok_response.server_status; - conn->upsert_status.affected_rows = ok_response.affected_rows; - conn->upsert_status.last_insert_id = ok_response.last_insert_id; + conn->upsert_status.warning_count = ok_response->warning_count; + conn->upsert_status.server_status = ok_response->server_status; + conn->upsert_status.affected_rows = ok_response->affected_rows; + conn->upsert_status.last_insert_id = ok_response->last_insert_id; } } } - PACKET_FREE_ALLOCA(ok_response); + PACKET_FREE(ok_response); break; } case PROT_EOF_PACKET:{ - php_mysql_packet_eof ok_response; - PACKET_INIT_ALLOCA(ok_response, PROT_EOF_PACKET); - if (FAIL == (ret = PACKET_READ_ALLOCA(ok_response, conn))) { + MYSQLND_PACKET_EOF * ok_response = conn->protocol->m.get_eof_packet(conn->protocol, FALSE TSRMLS_CC); + if (FAIL == (ret = PACKET_READ(ok_response, conn))) { SET_CLIENT_ERROR(conn->error_info, CR_MALFORMED_PACKET, UNKNOWN_SQLSTATE, "Malformed packet"); if (!silent) { @@ -331,24 +302,23 @@ mysqlnd_simple_command_handle_response(MYSQLND *conn, enum php_mysql_packet_type php_error_docref(NULL TSRMLS_CC, E_WARNING, "Error while reading %s's EOF packet. PID=%d", mysqlnd_command_to_text[command], getpid()); } - } else if (0xFF == ok_response.field_count) { + } else if (0xFF == ok_response->field_count) { /* The server signalled error. Set the error */ - SET_CLIENT_ERROR(conn->error_info, ok_response.error_no, - ok_response.sqlstate, ok_response.error); + SET_CLIENT_ERROR(conn->error_info, ok_response->error_no, ok_response->sqlstate, ok_response->error); SET_ERROR_AFF_ROWS(conn); - } else if (0xFE != ok_response.field_count) { + } else if (0xFE != ok_response->field_count) { SET_CLIENT_ERROR(conn->error_info, CR_MALFORMED_PACKET, UNKNOWN_SQLSTATE, "Malformed packet"); if (!silent) { - DBG_ERR_FMT("EOF packet expected, field count wasn't 0xFE but 0x%2X", ok_response.field_count); + DBG_ERR_FMT("EOF packet expected, field count wasn't 0xFE but 0x%2X", ok_response->field_count); php_error_docref(NULL TSRMLS_CC, E_WARNING, "EOF packet expected, field count wasn't 0xFE but 0x%2X", - ok_response.field_count); + ok_response->field_count); } } else { DBG_INF_FMT("OK from server"); } - PACKET_FREE_ALLOCA(ok_response); + PACKET_FREE(ok_response); break; } default: @@ -365,17 +335,16 @@ mysqlnd_simple_command_handle_response(MYSQLND *conn, enum php_mysql_packet_type /* }}} */ -/* {{{ mysqlnd_simple_command */ -enum_func_status -mysqlnd_simple_command(MYSQLND *conn, enum php_mysqlnd_server_command command, - const char * const arg, size_t arg_len, - enum php_mysql_packet_type ok_packet, zend_bool silent, - zend_bool ignore_upsert_status TSRMLS_DC) +/* {{{ mysqlnd_conn::simple_command */ +static enum_func_status +MYSQLND_METHOD(mysqlnd_conn, simple_command)(MYSQLND *conn, enum php_mysqlnd_server_command command, + const char * const arg, size_t arg_len, enum mysqlnd_packet_type ok_packet, zend_bool silent, + zend_bool ignore_upsert_status TSRMLS_DC) { enum_func_status ret = PASS; - php_mysql_packet_command cmd_packet; + MYSQLND_PACKET_COMMAND * cmd_packet; - DBG_ENTER("mysqlnd_simple_command"); + DBG_ENTER("mysqlnd_conn::simple_command"); DBG_INF_FMT("command=%s ok_packet=%d silent=%d", mysqlnd_command_to_text[command], ok_packet, silent); switch (CONN_GET_STATE(conn)) { @@ -399,14 +368,16 @@ mysqlnd_simple_command(MYSQLND *conn, enum php_mysqlnd_server_command command, SET_ERROR_AFF_ROWS(conn); SET_EMPTY_ERROR(conn->error_info); - PACKET_INIT_ALLOCA(cmd_packet, PROT_CMD_PACKET); - cmd_packet.command = command; + cmd_packet = conn->protocol->m.get_command_packet(conn->protocol, FALSE TSRMLS_CC); + cmd_packet->command = command; if (arg && arg_len) { - cmd_packet.argument = arg; - cmd_packet.arg_len = arg_len; + cmd_packet->argument = arg; + cmd_packet->arg_len = arg_len; } - if (! PACKET_WRITE_ALLOCA(cmd_packet, conn)) { + MYSQLND_INC_CONN_STATISTIC(conn->stats, STAT_COM_QUIT + command - 1 /* because of COM_SLEEP */ ); + + if (! PACKET_WRITE(cmd_packet, conn)) { if (!silent) { DBG_ERR_FMT("Error while sending %s packet", mysqlnd_command_to_text[command]); php_error(E_WARNING, "Error while sending %s packet. PID=%d", mysqlnd_command_to_text[command], getpid()); @@ -414,15 +385,10 @@ mysqlnd_simple_command(MYSQLND *conn, enum php_mysqlnd_server_command command, DBG_ERR("Server is gone"); ret = FAIL; } else if (ok_packet != PROT_LAST) { - ret = mysqlnd_simple_command_handle_response(conn, ok_packet, silent, command, ignore_upsert_status TSRMLS_CC); + ret = conn->m->simple_command_handle_response(conn, ok_packet, silent, command, ignore_upsert_status TSRMLS_CC); } - /* - There is no need to call FREE_ALLOCA on cmd_packet as the - only allocated string is cmd_packet.argument and it was passed - to us. We should not free it. - */ - + PACKET_FREE(cmd_packet); DBG_INF(ret == PASS ? "PASS":"FAIL"); DBG_RETURN(ret); } @@ -431,36 +397,24 @@ mysqlnd_simple_command(MYSQLND *conn, enum php_mysqlnd_server_command command, /* {{{ mysqlnd_conn::set_server_option */ static enum_func_status -MYSQLND_METHOD(mysqlnd_conn, set_server_option)(MYSQLND * const conn, - enum_mysqlnd_server_option option TSRMLS_DC) +MYSQLND_METHOD(mysqlnd_conn, set_server_option)(MYSQLND * const conn, enum_mysqlnd_server_option option TSRMLS_DC) { enum_func_status ret; char buffer[2]; DBG_ENTER("mysqlnd_conn::set_server_option"); int2store(buffer, (unsigned int) option); - ret = mysqlnd_simple_command(conn, COM_SET_OPTION, buffer, sizeof(buffer), - PROT_EOF_PACKET, FALSE, TRUE TSRMLS_CC); + ret = conn->m->simple_command(conn, COM_SET_OPTION, buffer, sizeof(buffer), PROT_EOF_PACKET, FALSE, TRUE TSRMLS_CC); DBG_RETURN(ret); } /* }}} */ /* {{{ _mysqlnd_restart_psession */ -PHPAPI void _mysqlnd_restart_psession(MYSQLND *conn, MYSQLND_THD_ZVAL_PCACHE *cache TSRMLS_DC) +PHPAPI void _mysqlnd_restart_psession(MYSQLND *conn TSRMLS_DC) { DBG_ENTER("_mysqlnd_restart_psession"); - MYSQLND_INC_CONN_STATISTIC(&conn->stats, STAT_CONNECT_REUSED); - /* Free here what should not be seen by the next script */ - if (conn->last_message) { - mnd_pefree(conn->last_message, conn->persistent); - conn->last_message = NULL; - } - /* - The thd zval cache is always freed on request shutdown, so this has happened already. - Don't touch the old value! Get new reference - */ - conn->zval_cache = mysqlnd_palloc_get_thd_cache_reference(cache); + conn->m->restart_psession(conn TSRMLS_CC); DBG_VOID_RETURN; } /* }}} */ @@ -470,40 +424,62 @@ PHPAPI void _mysqlnd_restart_psession(MYSQLND *conn, MYSQLND_THD_ZVAL_PCACHE *ca PHPAPI void _mysqlnd_end_psession(MYSQLND *conn TSRMLS_DC) { DBG_ENTER("_mysqlnd_end_psession"); - /* The thd zval cache is always freed on request shutdown, so this has happened already */ - mysqlnd_palloc_free_thd_cache_reference(&conn->zval_cache); + conn->m->end_psession(conn TSRMLS_CC); DBG_VOID_RETURN; } /* }}} */ +/* {{{ mysqlnd_conn::restart_psession */ +static enum_func_status +MYSQLND_METHOD(mysqlnd_conn, restart_psession)(MYSQLND * conn TSRMLS_DC) +{ + DBG_ENTER("mysqlnd_conn::restart_psession"); + MYSQLND_INC_CONN_STATISTIC(conn->stats, STAT_CONNECT_REUSED); + /* Free here what should not be seen by the next script */ + if (conn->last_message) { + mnd_pefree(conn->last_message, conn->persistent); + conn->last_message = NULL; + } + DBG_RETURN(PASS); +} +/* }}} */ + -/* {{{ mysqlnd_connect */ -PHPAPI MYSQLND *mysqlnd_connect(MYSQLND *conn, +/* {{{ mysqlnd_conn::end_psession */ +static enum_func_status +MYSQLND_METHOD(mysqlnd_conn, end_psession)(MYSQLND * conn TSRMLS_DC) +{ + DBG_ENTER("mysqlnd_conn::end_psession"); + DBG_RETURN(PASS); +} +/* }}} */ + + +/* {{{ mysqlnd_conn::connect */ +static enum_func_status +MYSQLND_METHOD(mysqlnd_conn, connect)(MYSQLND *conn, const char *host, const char *user, const char *passwd, unsigned int passwd_len, const char *db, unsigned int db_len, unsigned int port, const char *socket, - unsigned int mysql_flags, - MYSQLND_THD_ZVAL_PCACHE *zval_cache + unsigned int mysql_flags TSRMLS_DC) { char *transport = NULL, *errstr = NULL; - char *hashed_details = NULL; - int transport_len, hashed_details_len, errcode = 0, host_len; - unsigned int streams_options = ENFORCE_SAFE_MODE; - unsigned int streams_flags = STREAM_XPORT_CLIENT | STREAM_XPORT_CONNECT; + int transport_len, errcode = 0, host_len; zend_bool self_alloced = FALSE; - struct timeval tv; zend_bool unix_socket = FALSE; const MYSQLND_CHARSET * charset; zend_bool reconnect = FALSE; + zend_bool saved_compression = FALSE; - php_mysql_packet_greet greet_packet; - php_mysql_packet_auth *auth_packet; - php_mysql_packet_ok ok_packet; + MYSQLND_PACKET_GREET * greet_packet = NULL; + MYSQLND_PACKET_AUTH * auth_packet = NULL; + MYSQLND_PACKET_OK * ok_packet = NULL; + + DBG_ENTER("mysqlnd_conn::connect"); - DBG_ENTER("mysqlnd_connect"); DBG_INF_FMT("host=%s user=%s db=%s port=%d flags=%d persistent=%d state=%d", host?host:"", user?user:"", db?db:"", port, mysql_flags, conn? conn->persistent:0, conn? CONN_GET_STATE(conn):-1); @@ -513,17 +489,26 @@ PHPAPI MYSQLND *mysqlnd_connect(MYSQLND *conn, DBG_INF("Connecting on a connected handle."); if (CONN_GET_STATE(conn) < CONN_QUIT_SENT) { - MYSQLND_INC_CONN_STATISTIC(&conn->stats, STAT_CLOSE_IMPLICIT); + MYSQLND_INC_CONN_STATISTIC(conn->stats, STAT_CLOSE_IMPLICIT); reconnect = TRUE; mysqlnd_send_close(conn TSRMLS_CC); } conn->m->free_contents(conn TSRMLS_CC); - MYSQLND_DEC_CONN_STATISTIC(&conn->stats, STAT_OPENED_CONNECTIONS); + MYSQLND_DEC_CONN_STATISTIC(conn->stats, STAT_OPENED_CONNECTIONS); if (conn->persistent) { - MYSQLND_DEC_CONN_STATISTIC(&conn->stats, STAT_OPENED_PERSISTENT_CONNECTIONS); + MYSQLND_DEC_CONN_STATISTIC(conn->stats, STAT_OPENED_PERSISTENT_CONNECTIONS); } /* Now reconnect using the same handle */ + if (conn->net->compressed) { + /* + we need to save the state. As we will re-connect, net->compressed should be off, or + we will look for a compression header as part of the greet message, but there will + be none. + */ + saved_compression = TRUE; + conn->net->compressed = FALSE; + } } if (!host || !host[0]) { @@ -551,123 +536,54 @@ PHPAPI MYSQLND *mysqlnd_connect(MYSQLND *conn, } transport_len = spprintf(&transport, 0, "unix://%s", socket); unix_socket = TRUE; - } else + } else #endif { transport_len = spprintf(&transport, 0, "tcp://%s:%d", host, port); } - DBG_INF_FMT("transport=%p", transport); + DBG_INF_FMT("transport=%s", transport); - PACKET_INIT_ALLOCA(greet_packet, PROT_GREET_PACKET); - PACKET_INIT(auth_packet, PROT_AUTH_PACKET, php_mysql_packet_auth *, FALSE); - PACKET_INIT_ALLOCA(ok_packet, PROT_OK_PACKET); - - if (!conn) { - conn = mysqlnd_init(FALSE); - self_alloced = TRUE; - } + greet_packet = conn->protocol->m.get_greet_packet(conn->protocol, FALSE TSRMLS_CC); + auth_packet = conn->protocol->m.get_auth_packet(conn->protocol, FALSE TSRMLS_CC); + ok_packet = conn->protocol->m.get_ok_packet(conn->protocol, FALSE TSRMLS_CC); - if (conn->persistent) { - hashed_details_len = spprintf(&hashed_details, 0, "%p", conn); - DBG_INF_FMT("hashed_details=%s", hashed_details); - } - - CONN_SET_STATE(conn, CONN_ALLOCED); - conn->net.packet_no = 0; - - if (conn->options.timeout_connect) { - tv.tv_sec = conn->options.timeout_connect; - tv.tv_usec = 0; - } if (conn->persistent) { conn->scheme = pestrndup(transport, transport_len, 1); mnd_efree(transport); } else { conn->scheme = transport; } + conn->scheme_len = transport_len; DBG_INF(conn->scheme); - conn->net.stream = php_stream_xport_create(conn->scheme, transport_len, streams_options, streams_flags, - hashed_details, - (conn->options.timeout_connect) ? &tv : NULL, - NULL /*ctx*/, &errstr, &errcode); - DBG_INF_FMT("stream=%p", conn->net.stream); - - if (errstr || !conn->net.stream) { - if (hashed_details) { - mnd_efree(hashed_details); - } - errcode = CR_CONNECTION_ERROR; - goto err; - } - - if (hashed_details) { - /* - If persistent, the streams register it in EG(persistent_list). - This is unwanted. ext/mysql or ext/mysqli are responsible to clean, - whatever they have to. - */ - zend_rsrc_list_entry *le; - - if (zend_hash_find(&EG(persistent_list), hashed_details, hashed_details_len + 1, - (void*) &le) == SUCCESS) { - /* - in_free will let streams code skip destructing - big HACK, - but STREAMS suck big time regarding persistent streams. - Just not compatible for extensions that need persistency. - */ - conn->net.stream->in_free = 1; - zend_hash_del(&EG(persistent_list), hashed_details, hashed_details_len + 1); - conn->net.stream->in_free = 0; - } -#if ZEND_DEBUG - /* Shut-up the streams, they don't know what they are doing */ - conn->net.stream->__exposed = 1; -#endif - mnd_efree(hashed_details); - } - - if (!conn->options.timeout_read) { - /* should always happen because read_timeout cannot be set via API */ - conn->options.timeout_read = (unsigned int) MYSQLND_G(net_read_timeout); - } - if (conn->options.timeout_read) - { - tv.tv_sec = conn->options.timeout_read; - tv.tv_usec = 0; - php_stream_set_option(conn->net.stream, PHP_STREAM_OPTION_READ_TIMEOUT, 0, &tv); + if (FAIL == conn->net->m.connect(conn->net, conn->scheme, transport_len, conn->persistent, &errstr, &errcode TSRMLS_CC)) { + goto err; } - if (!unix_socket) { - /* Set TCP_NODELAY */ - mysqlnd_set_sock_no_delay(conn->net.stream); - } + DBG_INF_FMT("stream=%p", conn->net->stream); - if (FAIL == PACKET_READ_ALLOCA(greet_packet, conn)) { + if (FAIL == PACKET_READ(greet_packet, conn)) { DBG_ERR("Error while reading greeting packet"); php_error_docref(NULL TSRMLS_CC, E_WARNING, "Error while reading greeting packet. PID=%d", getpid()); goto err; - } else if (greet_packet.error_no) { - DBG_ERR_FMT("errorno=%d error=%s", greet_packet.error_no, greet_packet.error); - SET_CLIENT_ERROR(conn->error_info, greet_packet.error_no, - greet_packet.sqlstate, greet_packet.error); - goto err; - } else if (greet_packet.pre41) { - DBG_ERR_FMT("Connecting to 3.22, 3.23 & 4.0 is not supported. Server is %-.32s", - greet_packet.server_version); + } else if (greet_packet->error_no) { + DBG_ERR_FMT("errorno=%d error=%s", greet_packet->error_no, greet_packet->error); + SET_CLIENT_ERROR(conn->error_info, greet_packet->error_no, greet_packet->sqlstate, greet_packet->error); + goto err; + } else if (greet_packet->pre41) { + DBG_ERR_FMT("Connecting to 3.22, 3.23 & 4.0 is not supported. Server is %-.32s", greet_packet->server_version); php_error_docref(NULL TSRMLS_CC, E_WARNING, "Connecting to 3.22, 3.23 & 4.0 " - " is not supported. Server is %-.32s", greet_packet.server_version); + " is not supported. Server is %-.32s", greet_packet->server_version); SET_CLIENT_ERROR(conn->error_info, CR_NOT_IMPLEMENTED, UNKNOWN_SQLSTATE, "Connecting to 3.22, 3.23 & 4.0 servers is not supported"); goto err; } - conn->thread_id = greet_packet.thread_id; - conn->protocol_version = greet_packet.protocol_version; - conn->server_version = greet_packet.server_version; - greet_packet.server_version = NULL; /* The string will be freed otherwise */ + conn->thread_id = greet_packet->thread_id; + conn->protocol_version = greet_packet->protocol_version; + conn->server_version = pestrdup(greet_packet->server_version, conn->persistent); - conn->greet_charset = mysqlnd_find_charset_nr(greet_packet.charset_no); + conn->greet_charset = mysqlnd_find_charset_nr(greet_packet->charset_no); /* we allow load data local infile by default */ mysql_flags |= CLIENT_LOCAL_FILES | CLIENT_PS_MULTI_RESULTS; #ifndef MYSQLND_COMPRESSION_ENABLED @@ -687,7 +603,7 @@ PHPAPI MYSQLND *mysqlnd_connect(MYSQLND *conn, #if PHP_MAJOR_VERSION >= 6 auth_packet->charset_no = 200;/* utf8 - swedish collation, check mysqlnd_charset.c */ #else - auth_packet->charset_no = greet_packet.charset_no; + auth_packet->charset_no = greet_packet->charset_no; #endif } auth_packet->db = db; @@ -696,42 +612,56 @@ PHPAPI MYSQLND *mysqlnd_connect(MYSQLND *conn, auth_packet->client_flags= mysql_flags; conn->scramble = auth_packet->server_scramble_buf = mnd_pemalloc(SCRAMBLE_LENGTH, conn->persistent); - memcpy(auth_packet->server_scramble_buf, greet_packet.scramble_buf, SCRAMBLE_LENGTH); + memcpy(auth_packet->server_scramble_buf, greet_packet->scramble_buf, SCRAMBLE_LENGTH); if (!PACKET_WRITE(auth_packet, conn)) { CONN_SET_STATE(conn, CONN_QUIT_SENT); SET_CLIENT_ERROR(conn->error_info, CR_SERVER_GONE_ERROR, UNKNOWN_SQLSTATE, mysqlnd_server_gone); - goto err; + goto err; } - if (FAIL == PACKET_READ_ALLOCA(ok_packet, conn) || ok_packet.field_count >= 0xFE) { - if (ok_packet.field_count == 0xFE) { + if (FAIL == PACKET_READ(ok_packet, conn) || ok_packet->field_count >= 0xFE) { + if (ok_packet->field_count == 0xFE) { /* old authentication with new server !*/ DBG_ERR(mysqlnd_old_passwd); SET_CLIENT_ERROR(conn->error_info, CR_UNKNOWN_ERROR, UNKNOWN_SQLSTATE, mysqlnd_old_passwd); - } else if (ok_packet.field_count == 0xFF) { - if (ok_packet.sqlstate[0]) { + } else if (ok_packet->field_count == 0xFF) { + if (ok_packet->sqlstate[0]) { if (!self_alloced) { - strlcpy(conn->error_info.sqlstate, ok_packet.sqlstate, sizeof(conn->error_info.sqlstate)); + strlcpy(conn->error_info.sqlstate, ok_packet->sqlstate, sizeof(conn->error_info.sqlstate)); } - DBG_ERR_FMT("ERROR:%d [SQLSTATE:%s] %s", - ok_packet.error_no, ok_packet.sqlstate, ok_packet.error); + DBG_ERR_FMT("ERROR:%d [SQLSTATE:%s] %s", ok_packet->error_no, ok_packet->sqlstate, ok_packet->error); } if (!self_alloced) { - conn->error_info.error_no = ok_packet.error_no; - strlcpy(conn->error_info.error, ok_packet.error, sizeof(conn->error_info.error)); + conn->error_info.error_no = ok_packet->error_no; + strlcpy(conn->error_info.error, ok_packet->error, sizeof(conn->error_info.error)); } } } else { CONN_SET_STATE(conn, CONN_READY); + if (!self_alloced && saved_compression) { + conn->net->compressed = TRUE; + } + /* + If a connect on a existing handle is performed and mysql_flags is + passed which doesn't CLIENT_COMPRESS, then we need to overwrite the value + which we set based on saved_compression. + */ + conn->net->compressed = mysql_flags & CLIENT_COMPRESS? TRUE:FALSE; conn->user = pestrdup(user, conn->persistent); + conn->user_len = strlen(conn->user); conn->passwd = pestrndup(passwd, passwd_len, conn->persistent); + conn->passwd_len = passwd_len; conn->port = port; - if (host && !socket) { + conn->connect_or_select_db = pestrndup(db, db_len, conn->persistent); + conn->connect_or_select_db_len = db_len; + + if (!unix_socket) { char *p; conn->host = pestrdup(host, conn->persistent); - spprintf(&p, 0, "MySQL host info: %s via TCP/IP", conn->host); + conn->host_len = strlen(conn->host); + spprintf(&p, 0, "%s via TCP/IP", conn->host); if (conn->persistent) { conn->host_info = pestrdup(p, 1); mnd_efree(p); @@ -740,46 +670,38 @@ PHPAPI MYSQLND *mysqlnd_connect(MYSQLND *conn, } } else { conn->unix_socket = pestrdup(socket, conn->persistent); - conn->host_info = pestrdup("MySQL host info: Localhost via UNIX socket", conn->persistent); + conn->unix_socket_len = strlen(conn->unix_socket); + conn->host_info = pestrdup("Localhost via UNIX socket", conn->persistent); } conn->client_flag = auth_packet->client_flags; conn->max_packet_size = auth_packet->max_packet_size; /* todo: check if charset is available */ conn->charset = mysqlnd_find_charset_nr(auth_packet->charset_no); - conn->server_capabilities = greet_packet.server_capabilities; + conn->server_capabilities = greet_packet->server_capabilities; conn->upsert_status.warning_count = 0; - conn->upsert_status.server_status = greet_packet.server_status; + conn->upsert_status.server_status = greet_packet->server_status; conn->upsert_status.affected_rows = 0; SET_NEW_MESSAGE(conn->last_message, conn->last_message_len, - ok_packet.message, ok_packet.message_len, + ok_packet->message, ok_packet->message_len, conn->persistent); SET_EMPTY_ERROR(conn->error_info); - conn->zval_cache = mysqlnd_palloc_get_thd_cache_reference(zval_cache); - mysqlnd_local_infile_default(conn); { - unsigned int buf_size; - buf_size = MYSQLND_G(net_read_buffer_size); /* this is long, cast to unsigned int*/ - conn->m->set_client_option(conn, MYSQLND_OPT_NET_READ_BUFFER_SIZE, - (char *)&buf_size TSRMLS_CC); - - buf_size = MYSQLND_G(net_cmd_buffer_size); /* this is long, cast to unsigned int*/ - conn->m->set_client_option(conn, MYSQLND_OPT_NET_CMD_BUFFER_SIZE, - (char *)&buf_size TSRMLS_CC); + unsigned int buf_size = MYSQLND_G(net_cmd_buffer_size); /* this is long, cast to unsigned int*/ + conn->m->set_client_option(conn, MYSQLND_OPT_NET_CMD_BUFFER_SIZE, (char *)&buf_size TSRMLS_CC); } - MYSQLND_INC_CONN_STATISTIC_W_VALUE2(&conn->stats, STAT_CONNECT_SUCCESS, 1, STAT_OPENED_CONNECTIONS, 1); + MYSQLND_INC_CONN_STATISTIC_W_VALUE2(conn->stats, STAT_CONNECT_SUCCESS, 1, STAT_OPENED_CONNECTIONS, 1); if (reconnect) { - MYSQLND_INC_GLOBAL_STATISTIC(STAT_RECONNECT); + MYSQLND_INC_GLOBAL_STATISTIC(STAT_RECONNECT); } if (conn->persistent) { - MYSQLND_INC_CONN_STATISTIC_W_VALUE2(&conn->stats, STAT_PCONNECT_SUCCESS, 1, STAT_OPENED_PERSISTENT_CONNECTIONS, 1); + MYSQLND_INC_CONN_STATISTIC_W_VALUE2(conn->stats, STAT_PCONNECT_SUCCESS, 1, STAT_OPENED_PERSISTENT_CONNECTIONS, 1); } DBG_INF_FMT("connection_id=%llu", conn->thread_id); - conn->result_set_memory_pool = mysqlnd_mempool_create(16000 TSRMLS_CC); #if PHP_MAJOR_VERSION >= 6 { unsigned int as_unicode = 1; @@ -788,29 +710,14 @@ PHPAPI MYSQLND *mysqlnd_connect(MYSQLND *conn, DBG_INF("unicode set"); } #endif -#ifdef MYSQLND_THREADED - { - pthread_t th; - pthread_attr_t connection_attrib; - conn->tsrm_ls = tsrm_ls; - - pthread_attr_init(&connection_attrib); - pthread_attr_setdetachstate(&connection_attrib, PTHREAD_CREATE_DETACHED); - - conn->thread_is_running = TRUE; - if (pthread_create(&th, &connection_attrib, mysqlnd_fetch_thread, (void*)conn)) { - conn->thread_is_running = FALSE; - } - } -#endif if (conn->options.init_commands) { int current_command = 0; for (; current_command < conn->options.num_commands; ++current_command) { const char * const command = conn->options.init_commands[current_command]; - MYSQLND_INC_CONN_STATISTIC(&conn->stats, STAT_INIT_COMMAND_EXECUTED_COUNT); + MYSQLND_INC_CONN_STATISTIC(conn->stats, STAT_INIT_COMMAND_EXECUTED_COUNT); if (PASS != conn->m->query(conn, command, strlen(command) TSRMLS_CC)) { - MYSQLND_INC_CONN_STATISTIC(&conn->stats, STAT_INIT_COMMAND_FAILED_COUNT); + MYSQLND_INC_CONN_STATISTIC(conn->stats, STAT_INIT_COMMAND_FAILED_COUNT); goto err; } if (conn->last_query_type == QUERY_SELECT) { @@ -820,16 +727,16 @@ PHPAPI MYSQLND *mysqlnd_connect(MYSQLND *conn, } } - PACKET_FREE_ALLOCA(greet_packet); + PACKET_FREE(greet_packet); PACKET_FREE(auth_packet); - PACKET_FREE_ALLOCA(ok_packet); + PACKET_FREE(ok_packet); - DBG_RETURN(conn); + DBG_RETURN(PASS); } err: - PACKET_FREE_ALLOCA(greet_packet); + PACKET_FREE(greet_packet); PACKET_FREE(auth_packet); - PACKET_FREE_ALLOCA(ok_packet); + PACKET_FREE(ok_packet); if (errstr) { DBG_ERR_FMT("[%d] %.64s (trying to connect via %s)", errcode, errstr, conn->scheme); @@ -844,24 +751,56 @@ err: conn->scheme = NULL; } - if (self_alloced) { - /* - We have alloced, thus there are no references to this - object - we are free to kill it! - */ - conn->m->dtor(conn TSRMLS_CC); - } else { - /* This will also close conn->net.stream if it has been opened */ - conn->m->free_contents(conn TSRMLS_CC); - MYSQLND_INC_CONN_STATISTIC(&conn->stats, STAT_CONNECT_FAILURE); + MYSQLND_INC_CONN_STATISTIC(conn->stats, STAT_CONNECT_FAILURE); + + DBG_RETURN(FAIL); +} +/* }}} */ + + +/* {{{ mysqlnd_connect */ +PHPAPI MYSQLND * mysqlnd_connect(MYSQLND * conn, + const char *host, const char *user, + const char *passwd, unsigned int passwd_len, + const char *db, unsigned int db_len, + unsigned int port, + const char *socket, + unsigned int mysql_flags + TSRMLS_DC) +{ + enum_func_status ret; + zend_bool self_alloced = FALSE; + + DBG_ENTER("mysqlnd_connect"); + DBG_INF_FMT("host=%s user=%s db=%s port=%d flags=%d", host?host:"", user?user:"", db?db:"", port, mysql_flags); + + if (!conn) { + conn = mysqlnd_init(FALSE); + self_alloced = TRUE; + } + + ret = conn->m->connect(conn, host, user, passwd, passwd_len, db, db_len, port, socket, mysql_flags TSRMLS_CC); + + if (ret == FAIL) { + if (self_alloced) { + /* + We have alloced, thus there are no references to this + object - we are free to kill it! + */ + conn->m->dtor(conn TSRMLS_CC); + } else { + /* This will also close conn->net->stream if it has been opened */ + conn->m->free_contents(conn TSRMLS_CC); + } + DBG_RETURN(NULL); } - DBG_RETURN(NULL); + DBG_RETURN(conn); } /* }}} */ /* {{{ mysqlnd_conn::query */ -/* +/* If conn->error_info.error_no is not zero, then we had an error. Still the result from the query is PASS */ @@ -872,7 +811,7 @@ MYSQLND_METHOD(mysqlnd_conn, query)(MYSQLND *conn, const char *query, unsigned i DBG_ENTER("mysqlnd_conn::query"); DBG_INF_FMT("conn=%llu query=%s", conn->thread_id, query); - if (PASS != mysqlnd_simple_command(conn, COM_QUERY, query, query_len, + if (PASS != conn->m->simple_command(conn, COM_QUERY, query, query_len, PROT_LAST /* we will handle the OK packet*/, FALSE, FALSE TSRMLS_CC)) { DBG_RETURN(FAIL); @@ -882,7 +821,11 @@ MYSQLND_METHOD(mysqlnd_conn, query)(MYSQLND *conn, const char *query, unsigned i Here read the result set. We don't do it in simple_command because it need information from the ok packet. We will fetch it ourselves. */ - ret = mysqlnd_query_read_result_set_header(conn, NULL TSRMLS_CC); + ret = conn->m->query_read_result_set_header(conn, NULL TSRMLS_CC); + if (ret == PASS && conn->last_query_type == QUERY_UPSERT && conn->upsert_status.affected_rows) { + MYSQLND_INC_CONN_STATISTIC_W_VALUE(conn->stats, STAT_ROWS_AFFECTED_NORMAL, conn->upsert_status.affected_rows); + } + DBG_RETURN(ret); } /* }}} */ @@ -896,7 +839,7 @@ MYSQLND_METHOD(mysqlnd_conn, send_query)(MYSQLND *conn, const char *query, unsig DBG_ENTER("mysqlnd_conn::send_query"); DBG_INF_FMT("conn=%llu query=%s", conn->thread_id, query); - ret = mysqlnd_simple_command(conn, COM_QUERY, query, query_len, + ret = conn->m->simple_command(conn, COM_QUERY, query, query_len, PROT_LAST /* we will handle the OK packet*/, FALSE, FALSE TSRMLS_CC); CONN_SET_STATE(conn, CONN_QUERY_SENT); @@ -904,7 +847,8 @@ MYSQLND_METHOD(mysqlnd_conn, send_query)(MYSQLND *conn, const char *query, unsig } /* }}} */ -/* {{{ mysqlnd_conn::send_query */ + +/* {{{ mysqlnd_conn::reap_query */ static enum_func_status MYSQLND_METHOD(mysqlnd_conn, reap_query)(MYSQLND * conn TSRMLS_DC) { @@ -914,9 +858,10 @@ MYSQLND_METHOD(mysqlnd_conn, reap_query)(MYSQLND * conn TSRMLS_DC) if (state <= CONN_READY || state == CONN_QUIT_SENT) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Connection not opened, clear or has been closed"); - DBG_RETURN(FAIL); + DBG_ERR_FMT("Connection not opened, clear or has been closed. State=%d", state); + DBG_RETURN(FAIL); } - DBG_RETURN(mysqlnd_query_read_result_set_header(conn, NULL TSRMLS_CC)); + DBG_RETURN(conn->m->query_read_result_set_header(conn, NULL TSRMLS_CC)); } /* }}} */ @@ -949,7 +894,7 @@ MYSQLND ** mysqlnd_stream_array_check_for_readiness(MYSQLND ** conn_array TSRMLS } p++; } - *ret_p = NULL; + *ret_p = NULL; } return ret; } @@ -968,9 +913,9 @@ static int mysqlnd_stream_array_to_fd_set(MYSQLND **conn_array, fd_set *fds, php * when casting. It is only used here so that the buffered data warning * is not displayed. * */ - if (SUCCESS == php_stream_cast((*p)->net.stream, PHP_STREAM_AS_FD_FOR_SELECT | PHP_STREAM_CAST_INTERNAL, + if (SUCCESS == php_stream_cast((*p)->net->stream, PHP_STREAM_AS_FD_FOR_SELECT | PHP_STREAM_CAST_INTERNAL, (void*)&this_fd, 1) && this_fd >= 0) { - + PHP_SAFE_FD_SET(this_fd, fds); if (this_fd > *max_fd) { @@ -993,7 +938,7 @@ static int mysqlnd_stream_array_from_fd_set(MYSQLND **conn_array, fd_set *fds TS MYSQLND **fwd = conn_array, **bckwd = conn_array; while (*fwd) { - if (SUCCESS == php_stream_cast((*fwd)->net.stream, PHP_STREAM_AS_FD_FOR_SELECT | PHP_STREAM_CAST_INTERNAL, + if (SUCCESS == php_stream_cast((*fwd)->net->stream, PHP_STREAM_AS_FD_FOR_SELECT | PHP_STREAM_CAST_INTERNAL, (void*)&this_fd, 1) && this_fd >= 0) { if (PHP_SAFE_FD_ISSET(this_fd, fds)) { if (disproportion) { @@ -1009,7 +954,7 @@ static int mysqlnd_stream_array_from_fd_set(MYSQLND **conn_array, fd_set *fds TS fwd++; } *bckwd = NULL;/* NULL-terminate the list */ - + return ret; } @@ -1062,6 +1007,7 @@ _mysqlnd_poll(MYSQLND **r_array, MYSQLND **e_array, MYSQLND ***dont_poll, long s if (!sets) { php_error_docref(NULL TSRMLS_CC, E_WARNING, *dont_poll ? "All arrays passed are clear":"No stream arrays were passed"); + DBG_ERR_FMT(*dont_poll ? "All arrays passed are clear":"No stream arrays were passed"); DBG_RETURN(FAIL); } @@ -1070,14 +1016,14 @@ _mysqlnd_poll(MYSQLND **r_array, MYSQLND **e_array, MYSQLND ***dont_poll, long s /* Solaris + BSD do not like microsecond values which are >= 1 sec */ if (usec > 999999) { tv.tv_sec = sec + (usec / 1000000); - tv.tv_usec = usec % 1000000; + tv.tv_usec = usec % 1000000; } else { tv.tv_sec = sec; tv.tv_usec = usec; } tv_p = &tv; - + retval = php_select(max_fd + 1, &rfds, &wfds, &efds, tv_p); if (retval == -1) { @@ -1127,11 +1073,11 @@ MYSQLND_METHOD(mysqlnd_conn, list_fields)(MYSQLND *conn, const char *table, cons if (achtung_wild && (wild_len = strlen(achtung_wild))) { memcpy(p, achtung_wild, MIN(wild_len, MYSQLND_MAX_ALLOWED_DB_LEN * 4)); - p += wild_len; + p += wild_len; *p++ = '\0'; } - if (PASS != mysqlnd_simple_command(conn, COM_FIELD_LIST, buff, p - buff, + if (PASS != conn->m->simple_command(conn, COM_FIELD_LIST, buff, p - buff, PROT_LAST /* we will handle the OK packet*/, FALSE, TRUE TSRMLS_CC)) { DBG_RETURN(NULL); @@ -1140,7 +1086,7 @@ MYSQLND_METHOD(mysqlnd_conn, list_fields)(MYSQLND *conn, const char *table, cons Prepare for the worst case. MyISAM goes to 2500 BIT columns, double it for safety. */ - result = mysqlnd_result_init(5000, mysqlnd_palloc_get_thd_cache_reference(conn->zval_cache) TSRMLS_CC); + result = mysqlnd_result_init(5000 TSRMLS_CC); if (FAIL == result->m.read_result_metadata(result, conn TSRMLS_CC)) { @@ -1161,8 +1107,7 @@ MYSQLND_METHOD(mysqlnd_conn, list_fields)(MYSQLND *conn, const char *table, cons /* {{{ mysqlnd_conn::list_method */ MYSQLND_RES * -MYSQLND_METHOD(mysqlnd_conn, list_method)(MYSQLND *conn, const char *query, - const char *achtung_wild, char *par1 TSRMLS_DC) +MYSQLND_METHOD(mysqlnd_conn, list_method)(MYSQLND *conn, const char *query, const char *achtung_wild, char *par1 TSRMLS_DC) { char *show_query = NULL; size_t show_query_len; @@ -1175,14 +1120,14 @@ MYSQLND_METHOD(mysqlnd_conn, list_method)(MYSQLND *conn, const char *query, if (achtung_wild) { show_query_len = spprintf(&show_query, 0, query, par1, achtung_wild); } else { - show_query_len = spprintf(&show_query, 0, query, par1); + show_query_len = spprintf(&show_query, 0, query, par1); } } else { if (achtung_wild) { show_query_len = spprintf(&show_query, 0, query, achtung_wild); } else { - show_query_len = strlen(show_query = (char *)query); - } + show_query_len = strlen(show_query = (char *)query); + } } if (PASS == conn->m->query(conn, show_query, show_query_len TSRMLS_CC)) { @@ -1198,7 +1143,7 @@ MYSQLND_METHOD(mysqlnd_conn, list_method)(MYSQLND *conn, const char *query, /* {{{ mysqlnd_conn::errno */ static unsigned int -MYSQLND_METHOD(mysqlnd_conn, errno)(const MYSQLND * const conn) +MYSQLND_METHOD(mysqlnd_conn, errno)(const MYSQLND * const conn TSRMLS_DC) { return conn->error_info.error_no; } @@ -1207,7 +1152,7 @@ MYSQLND_METHOD(mysqlnd_conn, errno)(const MYSQLND * const conn) /* {{{ mysqlnd_conn::error */ static const char * -MYSQLND_METHOD(mysqlnd_conn, error)(const MYSQLND * const conn) +MYSQLND_METHOD(mysqlnd_conn, error)(const MYSQLND * const conn TSRMLS_DC) { return conn->error_info.error; } @@ -1216,7 +1161,7 @@ MYSQLND_METHOD(mysqlnd_conn, error)(const MYSQLND * const conn) /* {{{ mysqlnd_conn::sqlstate */ static const char * -MYSQLND_METHOD(mysqlnd_conn, sqlstate)(const MYSQLND * const conn) +MYSQLND_METHOD(mysqlnd_conn, sqlstate)(const MYSQLND * const conn TSRMLS_DC) { return conn->error_info.sqlstate[0] ? conn->error_info.sqlstate:MYSQLND_SQLSTATE_NULL; } @@ -1235,8 +1180,7 @@ PHPAPI ulong mysqlnd_old_escape_string(char *newstr, const char *escapestr, size /* {{{ mysqlnd_conn::escape_string */ static ulong -MYSQLND_METHOD(mysqlnd_conn, escape_string)(const MYSQLND * const conn, char *newstr, - const char *escapestr, size_t escapestr_len TSRMLS_DC) +MYSQLND_METHOD(mysqlnd_conn, escape_string)(const MYSQLND * const conn, char *newstr, const char *escapestr, size_t escapestr_len TSRMLS_DC) { DBG_ENTER("mysqlnd_conn::escape_string"); DBG_INF_FMT("conn=%llu", conn->thread_id); @@ -1254,29 +1198,33 @@ MYSQLND_METHOD(mysqlnd_conn, dump_debug_info)(MYSQLND * const conn TSRMLS_DC) { DBG_ENTER("mysqlnd_conn::dump_debug_info"); DBG_INF_FMT("conn=%llu", conn->thread_id); - DBG_RETURN(mysqlnd_simple_command(conn, COM_DEBUG, NULL, 0, PROT_EOF_PACKET, FALSE, TRUE TSRMLS_CC)); + DBG_RETURN(conn->m->simple_command(conn, COM_DEBUG, NULL, 0, PROT_EOF_PACKET, FALSE, TRUE TSRMLS_CC)); } /* }}} */ /* {{{ mysqlnd_conn::select_db */ static enum_func_status -MYSQLND_METHOD(mysqlnd_conn, select_db)(MYSQLND * const conn, - const char * const db, - unsigned int db_len TSRMLS_DC) +MYSQLND_METHOD(mysqlnd_conn, select_db)(MYSQLND * const conn, const char * const db, unsigned int db_len TSRMLS_DC) { enum_func_status ret; DBG_ENTER("mysqlnd_conn::select_db"); DBG_INF_FMT("conn=%llu db=%s", conn->thread_id, db); - ret = mysqlnd_simple_command(conn, COM_INIT_DB, db, db_len, PROT_OK_PACKET, FALSE, TRUE TSRMLS_CC); + ret = conn->m->simple_command(conn, COM_INIT_DB, db, db_len, PROT_OK_PACKET, FALSE, TRUE TSRMLS_CC); /* The server sends 0 but libmysql doesn't read it and has established a protocol of giving back -1. Thus we have to follow it :( */ SET_ERROR_AFF_ROWS(conn); - + if (ret == PASS) { + if (conn->connect_or_select_db) { + pefree(conn->connect_or_select_db, conn->persistent); + } + conn->connect_or_select_db = pestrndup(db, db_len, conn->persistent); + conn->connect_or_select_db_len = db_len; + } DBG_RETURN(ret); } /* }}} */ @@ -1291,7 +1239,7 @@ MYSQLND_METHOD(mysqlnd_conn, ping)(MYSQLND * const conn TSRMLS_DC) DBG_ENTER("mysqlnd_conn::ping"); DBG_INF_FMT("conn=%llu", conn->thread_id); - ret = mysqlnd_simple_command(conn, COM_PING, NULL, 0, PROT_OK_PACKET, TRUE, TRUE TSRMLS_CC); + ret = conn->m->simple_command(conn, COM_PING, NULL, 0, PROT_OK_PACKET, TRUE, TRUE TSRMLS_CC); /* The server sends 0 but libmysql doesn't read it and has established a protocol of giving back -1. Thus we have to follow it :( @@ -1309,24 +1257,24 @@ static enum_func_status MYSQLND_METHOD(mysqlnd_conn, stat)(MYSQLND *conn, char **message, unsigned int * message_len TSRMLS_DC) { enum_func_status ret; - php_mysql_packet_stats stats_header; + MYSQLND_PACKET_STATS * stats_header; DBG_ENTER("mysqlnd_conn::stat"); DBG_INF_FMT("conn=%llu", conn->thread_id); - ret = mysqlnd_simple_command(conn, COM_STATISTICS, NULL, 0, PROT_LAST, FALSE, TRUE TSRMLS_CC); + ret = conn->m->simple_command(conn, COM_STATISTICS, NULL, 0, PROT_LAST, FALSE, TRUE TSRMLS_CC); if (FAIL == ret) { DBG_RETURN(FAIL); } - PACKET_INIT_ALLOCA(stats_header, PROT_STATS_PACKET); - if (FAIL == (ret = PACKET_READ_ALLOCA(stats_header, conn))) { + stats_header = conn->protocol->m.get_stats_packet(conn->protocol, FALSE TSRMLS_CC); + if (FAIL == (ret = PACKET_READ(stats_header, conn))) { DBG_RETURN(FAIL); } - *message = stats_header.message; - *message_len = stats_header.message_len; + *message = stats_header->message; + *message_len = stats_header->message_len; /* Ownership transfer */ - stats_header.message = NULL; - PACKET_FREE_ALLOCA(stats_header); + stats_header->message = NULL; + PACKET_FREE(stats_header); DBG_INF(*message); DBG_RETURN(PASS); @@ -1348,13 +1296,13 @@ MYSQLND_METHOD(mysqlnd_conn, kill)(MYSQLND *conn, unsigned int pid TSRMLS_DC) /* If we kill ourselves don't expect OK packet, PROT_LAST will skip it */ if (pid != conn->thread_id) { - ret = mysqlnd_simple_command(conn, COM_PROCESS_KILL, buff, 4, PROT_OK_PACKET, FALSE, TRUE TSRMLS_CC); + ret = conn->m->simple_command(conn, COM_PROCESS_KILL, buff, 4, PROT_OK_PACKET, FALSE, TRUE TSRMLS_CC); /* The server sends 0 but libmysql doesn't read it and has established a protocol of giving back -1. Thus we have to follow it :( */ SET_ERROR_AFF_ROWS(conn); - } else if (PASS == (ret = mysqlnd_simple_command(conn, COM_PROCESS_KILL, buff, + } else if (PASS == (ret = conn->m->simple_command(conn, COM_PROCESS_KILL, buff, 4, PROT_LAST, FALSE, TRUE TSRMLS_CC))) { CONN_SET_STATE(conn, CONN_QUIT_SENT); } @@ -1408,7 +1356,7 @@ MYSQLND_METHOD(mysqlnd_conn, refresh)(MYSQLND * const conn, uint8_t options TSRM int1store(bits, options); - DBG_RETURN(mysqlnd_simple_command(conn, COM_REFRESH, (char *)bits, 1, PROT_OK_PACKET, FALSE, TRUE TSRMLS_CC)); + DBG_RETURN(conn->m->simple_command(conn, COM_REFRESH, (char *)bits, 1, PROT_OK_PACKET, FALSE, TRUE TSRMLS_CC)); } /* }}} */ @@ -1423,7 +1371,7 @@ MYSQLND_METHOD(mysqlnd_conn, shutdown)(MYSQLND * const conn, uint8_t level TSRML int1store(bits, level); - DBG_RETURN(mysqlnd_simple_command(conn, COM_SHUTDOWN, (char *)bits, 1, PROT_OK_PACKET, FALSE, TRUE TSRMLS_CC)); + DBG_RETURN(conn->m->simple_command(conn, COM_SHUTDOWN, (char *)bits, 1, PROT_OK_PACKET, FALSE, TRUE TSRMLS_CC)); } /* }}} */ @@ -1435,14 +1383,14 @@ mysqlnd_send_close(MYSQLND * conn TSRMLS_DC) enum_func_status ret = PASS; DBG_ENTER("mysqlnd_send_close"); - DBG_INF_FMT("conn=%llu conn->net.stream->abstract=%p", - conn->thread_id, conn->net.stream? conn->net.stream->abstract:NULL); + DBG_INF_FMT("conn=%llu conn->net->stream->abstract=%p", + conn->thread_id, conn->net->stream? conn->net->stream->abstract:NULL); switch (CONN_GET_STATE(conn)) { case CONN_READY: DBG_INF("Connection clean, sending COM_QUIT"); - if (conn->net.stream) { - ret = mysqlnd_simple_command(conn, COM_QUIT, NULL, 0, PROT_LAST, TRUE, TRUE TSRMLS_CC); + if (conn->net->stream) { + ret = conn->m->simple_command(conn, COM_QUIT, NULL, 0, PROT_LAST, TRUE, TRUE TSRMLS_CC); } /* Do nothing */ break; @@ -1499,10 +1447,10 @@ MYSQLND_METHOD(mysqlnd_conn, close)(MYSQLND * conn, enum_connection_close_type c DBG_INF_FMT("conn=%llu", conn->thread_id); if (conn->state >= CONN_READY) { - MYSQLND_INC_CONN_STATISTIC(&conn->stats, stat); - MYSQLND_DEC_CONN_STATISTIC(&conn->stats, STAT_OPENED_CONNECTIONS); + MYSQLND_INC_CONN_STATISTIC(conn->stats, stat); + MYSQLND_DEC_CONN_STATISTIC(conn->stats, STAT_OPENED_CONNECTIONS); if (conn->persistent) { - MYSQLND_DEC_CONN_STATISTIC(&conn->stats, STAT_OPENED_PERSISTENT_CONNECTIONS); + MYSQLND_DEC_CONN_STATISTIC(conn->stats, STAT_OPENED_PERSISTENT_CONNECTIONS); } } @@ -1553,25 +1501,12 @@ MYSQLND_METHOD_PRIVATE(mysqlnd_conn, free_reference)(MYSQLND * const conn TSRMLS /* {{{ mysqlnd_conn::get_state */ -#ifdef MYSQLND_THREADED -static enum mysqlnd_connection_state -MYSQLND_METHOD_PRIVATE(mysqlnd_conn, get_state)(MYSQLND * const conn TSRMLS_DC) -{ - enum mysqlnd_connection_state state; - DBG_ENTER("mysqlnd_conn::get_state"); - tsrm_mutex_lock(conn->LOCK_state); - state = conn->state; - tsrm_mutex_unlock(conn->LOCK_state); - DBG_RETURN(state); -} -#else static enum mysqlnd_connection_state MYSQLND_METHOD_PRIVATE(mysqlnd_conn, get_state)(MYSQLND * const conn TSRMLS_DC) { DBG_ENTER("mysqlnd_conn::get_state"); DBG_RETURN(conn->state); } -#endif /* }}} */ @@ -1580,14 +1515,8 @@ static void MYSQLND_METHOD_PRIVATE(mysqlnd_conn, set_state)(MYSQLND * const conn, enum mysqlnd_connection_state new_state TSRMLS_DC) { DBG_ENTER("mysqlnd_conn::set_state"); -#ifdef MYSQLND_THREADED - tsrm_mutex_lock(conn->LOCK_state); -#endif DBG_INF_FMT("New state=%d", new_state); conn->state = new_state; -#ifdef MYSQLND_THREADED - tsrm_mutex_unlock(conn->LOCK_state); -#endif DBG_VOID_RETURN; } /* }}} */ @@ -1595,7 +1524,7 @@ MYSQLND_METHOD_PRIVATE(mysqlnd_conn, set_state)(MYSQLND * const conn, enum mysql /* {{{ mysqlnd_conn::field_count */ static unsigned int -MYSQLND_METHOD(mysqlnd_conn, field_count)(const MYSQLND * const conn) +MYSQLND_METHOD(mysqlnd_conn, field_count)(const MYSQLND * const conn TSRMLS_DC) { return conn->field_count; } @@ -1604,7 +1533,7 @@ MYSQLND_METHOD(mysqlnd_conn, field_count)(const MYSQLND * const conn) /* {{{ mysqlnd_conn::insert_id */ static uint64_t -MYSQLND_METHOD(mysqlnd_conn, insert_id)(const MYSQLND * const conn) +MYSQLND_METHOD(mysqlnd_conn, insert_id)(const MYSQLND * const conn TSRMLS_DC) { return conn->upsert_status.last_insert_id; } @@ -1613,7 +1542,7 @@ MYSQLND_METHOD(mysqlnd_conn, insert_id)(const MYSQLND * const conn) /* {{{ mysqlnd_conn::affected_rows */ static uint64_t -MYSQLND_METHOD(mysqlnd_conn, affected_rows)(const MYSQLND * const conn) +MYSQLND_METHOD(mysqlnd_conn, affected_rows)(const MYSQLND * const conn TSRMLS_DC) { return conn->upsert_status.affected_rows; } @@ -1622,7 +1551,7 @@ MYSQLND_METHOD(mysqlnd_conn, affected_rows)(const MYSQLND * const conn) /* {{{ mysqlnd_conn::warning_count */ static unsigned int -MYSQLND_METHOD(mysqlnd_conn, warning_count)(const MYSQLND * const conn) +MYSQLND_METHOD(mysqlnd_conn, warning_count)(const MYSQLND * const conn TSRMLS_DC) { return conn->upsert_status.warning_count; } @@ -1631,7 +1560,7 @@ MYSQLND_METHOD(mysqlnd_conn, warning_count)(const MYSQLND * const conn) /* {{{ mysqlnd_conn::info */ static const char * -MYSQLND_METHOD(mysqlnd_conn, info)(const MYSQLND * const conn) +MYSQLND_METHOD(mysqlnd_conn, info)(const MYSQLND * const conn TSRMLS_DC) { return conn->last_message; } @@ -1656,7 +1585,7 @@ PHPAPI unsigned int mysqlnd_get_client_version() /* {{{ mysqlnd_conn::get_server_info */ static const char * -MYSQLND_METHOD(mysqlnd_conn, get_server_info)(const MYSQLND * const conn) +MYSQLND_METHOD(mysqlnd_conn, get_server_info)(const MYSQLND * const conn TSRMLS_DC) { return conn->server_version; } @@ -1665,7 +1594,7 @@ MYSQLND_METHOD(mysqlnd_conn, get_server_info)(const MYSQLND * const conn) /* {{{ mysqlnd_conn::get_host_info */ static const char * -MYSQLND_METHOD(mysqlnd_conn, get_host_info)(const MYSQLND * const conn) +MYSQLND_METHOD(mysqlnd_conn, get_host_info)(const MYSQLND * const conn TSRMLS_DC) { return conn->host_info; } @@ -1674,7 +1603,7 @@ MYSQLND_METHOD(mysqlnd_conn, get_host_info)(const MYSQLND * const conn) /* {{{ mysqlnd_conn::get_proto_info */ static unsigned int -MYSQLND_METHOD(mysqlnd_conn, get_proto_info)(const MYSQLND *const conn) +MYSQLND_METHOD(mysqlnd_conn, get_proto_info)(const MYSQLND *const conn TSRMLS_DC) { return conn->protocol_version; } @@ -1683,7 +1612,7 @@ MYSQLND_METHOD(mysqlnd_conn, get_proto_info)(const MYSQLND *const conn) /* {{{ mysqlnd_conn::charset_name */ static const char * -MYSQLND_METHOD(mysqlnd_conn, charset_name)(const MYSQLND * const conn) +MYSQLND_METHOD(mysqlnd_conn, charset_name)(const MYSQLND * const conn TSRMLS_DC) { return conn->charset->name; } @@ -1692,7 +1621,7 @@ MYSQLND_METHOD(mysqlnd_conn, charset_name)(const MYSQLND * const conn) /* {{{ mysqlnd_conn::thread_id */ static uint64_t -MYSQLND_METHOD(mysqlnd_conn, thread_id)(const MYSQLND * const conn) +MYSQLND_METHOD(mysqlnd_conn, thread_id)(const MYSQLND * const conn TSRMLS_DC) { return conn->thread_id; } @@ -1701,7 +1630,7 @@ MYSQLND_METHOD(mysqlnd_conn, thread_id)(const MYSQLND * const conn) /* {{{ mysqlnd_conn::get_server_version */ static unsigned long -MYSQLND_METHOD(mysqlnd_conn, get_server_version)(const MYSQLND * const conn) +MYSQLND_METHOD(mysqlnd_conn, get_server_version)(const MYSQLND * const conn TSRMLS_DC) { long major, minor, patch; char *p; @@ -1715,7 +1644,7 @@ MYSQLND_METHOD(mysqlnd_conn, get_server_version)(const MYSQLND * const conn) minor = strtol(p, &p, 10); p += 1; /* consume the dot */ patch = strtol(p, &p, 10); - + return (unsigned long)(major * 10000L + (unsigned long)(minor * 100L + patch)); } /* }}} */ @@ -1751,7 +1680,7 @@ MYSQLND_METHOD(mysqlnd_conn, next_result)(MYSQLND * const conn TSRMLS_DC) We are sure that there is a result set, since conn->state is set accordingly in mysqlnd_store_result() or mysqlnd_fetch_row_unbuffered() */ - if (FAIL == (ret = mysqlnd_query_read_result_set_header(conn, NULL TSRMLS_CC))) { + if (FAIL == (ret = conn->m->query_read_result_set_header(conn, NULL TSRMLS_CC))) { /* There can be an error in the middle of a multi-statement, which will cancel the multi-statement. So there are no more results and we should just return FALSE, error_no has been set @@ -1826,7 +1755,8 @@ static enum_func_status MYSQLND_METHOD(mysqlnd_conn, change_user)(MYSQLND * const conn, const char *user, const char *passwd, - const char *db TSRMLS_DC) + const char *db, + zend_bool silent TSRMLS_DC) { /* User could be max 16 * 3 (utf8), pass is 20 usually, db is up to 64*3 @@ -1835,13 +1765,13 @@ MYSQLND_METHOD(mysqlnd_conn, change_user)(MYSQLND * const conn, */ size_t user_len; enum_func_status ret; - php_mysql_packet_chg_user_resp chg_user_resp; + MYSQLND_PACKET_CHG_USER_RESPONSE * chg_user_resp; char buffer[MYSQLND_MAX_ALLOWED_USER_LEN + 1 + SCRAMBLE_LENGTH + MYSQLND_MAX_ALLOWED_DB_LEN + 1]; char *p = buffer; DBG_ENTER("mysqlnd_conn::change_user"); - DBG_INF_FMT("conn=%llu user=%s passwd=%s db=%s", - conn->thread_id, user?user:"", passwd?"***":"null", db?db:""); + DBG_INF_FMT("conn=%llu user=%s passwd=%s db=%s silent=%d", + conn->thread_id, user?user:"", passwd?"***":"null", db?db:"", (silent == TRUE)?1:0 ); if (!user) { user = ""; @@ -1876,16 +1806,16 @@ MYSQLND_METHOD(mysqlnd_conn, change_user)(MYSQLND * const conn, } *p++ = '\0'; - if (PASS != mysqlnd_simple_command(conn, COM_CHANGE_USER, buffer, p - buffer, + if (PASS != conn->m->simple_command(conn, COM_CHANGE_USER, buffer, p - buffer, PROT_LAST /* we will handle the OK packet*/, - FALSE, TRUE TSRMLS_CC)) { + silent, TRUE TSRMLS_CC)) { DBG_RETURN(FAIL); } - PACKET_INIT_ALLOCA(chg_user_resp, PROT_CHG_USER_PACKET); - ret = PACKET_READ_ALLOCA(chg_user_resp, conn); - conn->error_info = chg_user_resp.error_info; - PACKET_FREE_ALLOCA(chg_user_resp); + chg_user_resp = conn->protocol->m.get_change_user_response_packet(conn->protocol, FALSE TSRMLS_CC); + ret = PACKET_READ(chg_user_resp, conn); + conn->error_info = chg_user_resp->error_info; + PACKET_FREE(chg_user_resp); if (conn->error_info.error_no) { ret = FAIL; @@ -1897,10 +1827,9 @@ MYSQLND_METHOD(mysqlnd_conn, change_user)(MYSQLND * const conn, if (mysqlnd_get_server_version(conn) > 50113L && mysqlnd_get_server_version(conn) < 50118L) { - php_mysql_packet_ok redundant_error_packet; - PACKET_INIT_ALLOCA(redundant_error_packet, PROT_OK_PACKET); - PACKET_READ_ALLOCA(redundant_error_packet, conn); - PACKET_FREE_ALLOCA(redundant_error_packet); + MYSQLND_PACKET_OK * redundant_error_packet = conn->protocol->m.get_ok_packet(conn->protocol, FALSE TSRMLS_CC); + PACKET_READ(redundant_error_packet, conn); + PACKET_FREE(redundant_error_packet); DBG_INF_FMT("Server is %d, buggy, sends two ERR messages", mysqlnd_get_server_version(conn)); } } @@ -1939,44 +1868,31 @@ MYSQLND_METHOD(mysqlnd_conn, set_client_option)(MYSQLND * const conn, DBG_ENTER("mysqlnd_conn::set_client_option"); DBG_INF_FMT("conn=%llu option=%d", conn->thread_id, option); switch (option) { +#ifdef WHEN_SUPPORTED_BY_MYSQLI + case MYSQL_OPT_COMPRESS: +#endif +#ifdef WHEN_SUPPORTED_BY_MYSQLI + case MYSQL_OPT_READ_TIMEOUT: + case MYSQL_OPT_WRITE_TIMEOUT: +#endif + case MYSQL_OPT_CONNECT_TIMEOUT: + case MYSQLND_OPT_NET_CMD_BUFFER_SIZE: + case MYSQLND_OPT_NET_READ_BUFFER_SIZE: + conn->net->m.set_client_option(conn->net, option, value TSRMLS_CC); + break; #if PHP_MAJOR_VERSION >= 6 case MYSQLND_OPT_NUMERIC_AND_DATETIME_AS_UNICODE: conn->options.numeric_and_datetime_as_unicode = *(unsigned int*) value; break; #endif - case MYSQLND_OPT_NET_CMD_BUFFER_SIZE: - if (*(unsigned int*) value < MYSQLND_NET_CMD_BUFFER_MIN_SIZE) { - DBG_RETURN(FAIL); - } - conn->net.cmd_buffer.length = *(unsigned int*) value; - if (!conn->net.cmd_buffer.buffer) { - conn->net.cmd_buffer.buffer = mnd_pemalloc(conn->net.cmd_buffer.length, conn->persistent); - } else { - conn->net.cmd_buffer.buffer = mnd_perealloc(conn->net.cmd_buffer.buffer, - conn->net.cmd_buffer.length, - conn->persistent); - } - break; - case MYSQLND_OPT_NET_READ_BUFFER_SIZE: - conn->options.net_read_buffer_size = *(unsigned int*) value; - break; #ifdef MYSQLND_STRING_TO_INT_CONVERSION case MYSQLND_OPT_INT_AND_FLOAT_NATIVE: + DBG_INF("MYSQLND_OPT_INT_AND_FLOAT_NATIVE"); conn->options.int_and_float_native = *(unsigned int*) value; break; -#endif - case MYSQL_OPT_CONNECT_TIMEOUT: - conn->options.timeout_connect = *(unsigned int*) value; - break; -#ifdef WHEN_SUPPORTED_BY_MYSQLI - case MYSQL_OPT_READ_TIMEOUT: - conn->options.timeout_read = *(unsigned int*) value; - break; - case MYSQL_OPT_WRITE_TIMEOUT: - conn->options.timeout_write = *(unsigned int*) value; - break; #endif case MYSQL_OPT_LOCAL_INFILE: + DBG_INF("MYSQL_OPT_LOCAL_INFILE"); if (!value || (*(unsigned int*) value) ? 1 : 0) { conn->options.flags |= CLIENT_LOCAL_FILES; } else { @@ -1984,15 +1900,14 @@ MYSQLND_METHOD(mysqlnd_conn, set_client_option)(MYSQLND * const conn, } break; case MYSQL_INIT_COMMAND: + DBG_INF("MYSQL_INIT_COMMAND"); + DBG_INF_FMT("command=%s", value); /* when num_commands is 0, then realloc will be effectively a malloc call, internally */ conn->options.init_commands = mnd_perealloc(conn->options.init_commands, sizeof(char *) * (conn->options.num_commands + 1), conn->persistent); conn->options.init_commands[conn->options.num_commands] = pestrdup(value, conn->persistent); ++conn->options.num_commands; break; -#ifdef WHEN_SUPPORTED_BY_MYSQLI - case MYSQL_OPT_COMPRESS: -#endif case MYSQL_READ_DEFAULT_FILE: case MYSQL_READ_DEFAULT_GROUP: #ifdef WHEN_SUPPORTED_BY_MYSQLI @@ -2003,7 +1918,9 @@ MYSQLND_METHOD(mysqlnd_conn, set_client_option)(MYSQLND * const conn, /* currently not supported. Todo!! */ break; case MYSQL_SET_CHARSET_NAME: + DBG_INF("MYSQL_SET_CHARSET_NAME"); conn->options.charset_name = pestrdup(value, conn->persistent); + DBG_INF_FMT("charset=%s", conn->options.charset_name); break; #ifdef WHEN_SUPPORTED_BY_MYSQLI case MYSQL_SET_CHARSET_DIR: @@ -2055,7 +1972,7 @@ MYSQLND_METHOD(mysqlnd_conn, use_result)(MYSQLND * const conn TSRMLS_DC) DBG_RETURN(NULL); } - MYSQLND_INC_CONN_STATISTIC(&conn->stats, STAT_UNBUFFERED_SETS); + MYSQLND_INC_CONN_STATISTIC(conn->stats, STAT_UNBUFFERED_SETS); result = conn->current_result; conn->current_result = NULL; @@ -2088,7 +2005,7 @@ MYSQLND_METHOD(mysqlnd_conn, store_result)(MYSQLND * const conn TSRMLS_DC) DBG_RETURN(NULL); } - MYSQLND_INC_CONN_STATISTIC(&conn->stats, STAT_BUFFERED_SETS); + MYSQLND_INC_CONN_STATISTIC(conn->stats, STAT_BUFFERED_SETS); result = conn->current_result; conn->current_result = NULL; @@ -2099,44 +2016,6 @@ MYSQLND_METHOD(mysqlnd_conn, store_result)(MYSQLND * const conn TSRMLS_DC) /* }}} */ -/* {{{ mysqlnd_conn::background_store_result */ -MYSQLND_RES * -MYSQLND_METHOD(mysqlnd_conn, background_store_result)(MYSQLND * const conn TSRMLS_DC) -{ - MYSQLND_RES *result; - - DBG_ENTER("mysqlnd_conn::store_result"); - DBG_INF_FMT("conn=%llu", conn->thread_id); - - if (!conn->current_result) { - DBG_RETURN(NULL); - } - - /* Nothing to store for UPSERT/LOAD DATA*/ - if (conn->last_query_type != QUERY_SELECT || CONN_GET_STATE(conn) != CONN_FETCHING_DATA) { - SET_CLIENT_ERROR(conn->error_info, CR_COMMANDS_OUT_OF_SYNC, UNKNOWN_SQLSTATE, - mysqlnd_out_of_sync); - DBG_ERR("Command out of sync"); - DBG_RETURN(NULL); - } - - MYSQLND_INC_CONN_STATISTIC(&conn->stats, STAT_BUFFERED_SETS); - - result = conn->current_result; - - result = result->m.background_store_result(result, conn, FALSE TSRMLS_CC); - - /* - Should be here, because current_result is used by the fetching thread to get data info - The thread is contacted in mysqlnd_res::background_store_result(). - */ - conn->current_result = NULL; - - DBG_RETURN(result); -} -/* }}} */ - - /* {{{ mysqlnd_conn::get_connection_stats */ static void MYSQLND_METHOD(mysqlnd_conn, get_connection_stats)(const MYSQLND * const conn, @@ -2145,15 +2024,20 @@ MYSQLND_METHOD(mysqlnd_conn, get_connection_stats)(const MYSQLND * const conn, { DBG_ENTER("mysqlnd_conn::get_connection_stats"); DBG_INF_FMT("conn=%llu", conn->thread_id); - mysqlnd_fill_stats_hash(&(conn->stats), return_value TSRMLS_CC ZEND_FILE_LINE_CC); + mysqlnd_fill_stats_hash(conn->stats, mysqlnd_stats_values_names, return_value TSRMLS_CC ZEND_FILE_LINE_CC); DBG_VOID_RETURN; } /* }}} */ MYSQLND_STMT * _mysqlnd_stmt_init(MYSQLND * const conn TSRMLS_DC); +static void MYSQLND_METHOD(mysqlnd_conn, init)(MYSQLND * conn TSRMLS_DC); +static MYSQLND_CLASS_METHODS_START(mysqlnd_conn) + MYSQLND_METHOD(mysqlnd_conn, init), + MYSQLND_METHOD(mysqlnd_conn, connect), + MYSQLND_METHOD(mysqlnd_conn, escape_string), MYSQLND_METHOD(mysqlnd_conn, set_charset), MYSQLND_METHOD(mysqlnd_conn, query), @@ -2161,7 +2045,6 @@ MYSQLND_CLASS_METHODS_START(mysqlnd_conn) MYSQLND_METHOD(mysqlnd_conn, reap_query), MYSQLND_METHOD(mysqlnd_conn, use_result), MYSQLND_METHOD(mysqlnd_conn, store_result), - MYSQLND_METHOD(mysqlnd_conn, background_store_result), MYSQLND_METHOD(mysqlnd_conn, next_result), MYSQLND_METHOD(mysqlnd_conn, more_results), @@ -2206,49 +2089,66 @@ MYSQLND_CLASS_METHODS_START(mysqlnd_conn) MYSQLND_METHOD_PRIVATE(mysqlnd_conn, dtor), + mysqlnd_query_read_result_set_header, + MYSQLND_METHOD_PRIVATE(mysqlnd_conn, get_reference), MYSQLND_METHOD_PRIVATE(mysqlnd_conn, free_reference), MYSQLND_METHOD_PRIVATE(mysqlnd_conn, get_state), MYSQLND_METHOD_PRIVATE(mysqlnd_conn, set_state), + + MYSQLND_METHOD(mysqlnd_conn, simple_command), + MYSQLND_METHOD(mysqlnd_conn, simple_command_handle_response), + MYSQLND_METHOD(mysqlnd_conn, restart_psession), + MYSQLND_METHOD(mysqlnd_conn, end_psession) MYSQLND_CLASS_METHODS_END; +/* {{{ mysqlnd_conn::init */ +static void +MYSQLND_METHOD(mysqlnd_conn, init)(MYSQLND * conn TSRMLS_DC) +{ + DBG_ENTER("mysqlnd_conn::init"); + conn->net = mysqlnd_net_init(conn->persistent TSRMLS_CC); + conn->protocol = mysqlnd_protocol_init(conn->persistent TSRMLS_CC); + mysqlnd_stats_init(&conn->stats, STAT_LAST); + + SET_ERROR_AFF_ROWS(conn); + + DBG_VOID_RETURN; +} +/* }}} */ + + /* {{{ mysqlnd_init */ -PHPAPI MYSQLND *_mysqlnd_init(zend_bool persistent TSRMLS_DC) +PHPAPI MYSQLND * _mysqlnd_init(zend_bool persistent TSRMLS_DC) { - MYSQLND *ret = mnd_pecalloc(1, sizeof(MYSQLND), persistent); + size_t alloc_size = sizeof(MYSQLND) + mysqlnd_plugin_count() * sizeof(void *); + MYSQLND *ret = mnd_pecalloc(1, alloc_size, persistent); DBG_ENTER("mysqlnd_init"); DBG_INF_FMT("persistent=%d", persistent); - SET_ERROR_AFF_ROWS(ret); ret->persistent = persistent; - ret->m = mysqlnd_conn_methods; + CONN_SET_STATE(ret, CONN_ALLOCED); ret->m->get_reference(ret TSRMLS_CC); -#ifdef MYSQLND_THREADED - ret->LOCK_state = tsrm_mutex_alloc(); - - pthread_mutex_init(&ret->LOCK_work, NULL); - pthread_cond_init(&ret->COND_work, NULL); - pthread_cond_init(&ret->COND_work_done, NULL); - pthread_cond_init(&ret->COND_thread_ended, NULL); -#endif + ret->m->init(ret TSRMLS_CC); DBG_RETURN(ret); } /* }}} */ + /* {{{ mysqlnd_library_init */ -void mysqlnd_library_init(TSRMLS_D) +PHPAPI void mysqlnd_library_init(TSRMLS_D) { if (mysqlnd_library_initted == FALSE) { mysqlnd_library_initted = TRUE; mysqlnd_conn_methods = &MYSQLND_CLASS_METHOD_TABLE_NAME(mysqlnd_conn); _mysqlnd_init_ps_subsystem(); /* Should be calloc, as mnd_calloc will reference LOCK_access*/ - mysqlnd_stats_init(&mysqlnd_global_stats); + mysqlnd_stats_init(&mysqlnd_global_stats, STAT_LAST); } } /* }}} */ @@ -2267,6 +2167,37 @@ PHPAPI void mysqlnd_conn_set_methods(struct st_mysqlnd_conn_methods *methods) } /* }}} */ + +static unsigned int mysqlnd_plugins_counter = 0; + +/* {{{ mysqlnd_plugin_register */ +PHPAPI unsigned int mysqlnd_plugin_register() +{ + return mysqlnd_plugins_counter++; +} +/* }}} */ + + +/* {{{ mysqlnd_plugin_count */ +PHPAPI unsigned int mysqlnd_plugin_count() +{ + return mysqlnd_plugins_counter; +} +/* }}} */ + + +/* {{{ _mysqlnd_plugin_get_plugin_connection_data */ +PHPAPI void ** _mysqlnd_plugin_get_plugin_connection_data(const MYSQLND * conn, unsigned int plugin_id TSRMLS_DC) +{ + DBG_ENTER("_mysqlnd_plugin_get_plugin_connection_data"); + DBG_INF_FMT("plugin_id=%u", plugin_id); + if (!conn || plugin_id >= mysqlnd_plugin_count()) { + return NULL; + } + DBG_RETURN((void *)((char *)conn + sizeof(MYSQLND) + plugin_id * sizeof(void *))); +} +/* }}} */ + /* * Local variables: * tab-width: 4 diff --git a/ext/mysqlnd/mysqlnd.h b/ext/mysqlnd/mysqlnd.h index 3b3f637e0..1b51c4f14 100644 --- a/ext/mysqlnd/mysqlnd.h +++ b/ext/mysqlnd/mysqlnd.h @@ -17,13 +17,13 @@ | Ulf Wendel | +----------------------------------------------------------------------+ */ -/* $Id: mysqlnd.h 289630 2009-10-14 13:51:25Z johannes $ */ +/* $Id: mysqlnd.h 294543 2010-02-04 20:28:55Z johannes $ */ #ifndef MYSQLND_H #define MYSQLND_H -#define MYSQLND_VERSION "mysqlnd 5.0.5-dev - 081106 - $Revision: 289630 $" -#define MYSQLND_VERSION_ID 50005 +#define MYSQLND_VERSION "mysqlnd 5.0.7-dev - 091210 - $Revision: 294543 $" +#define MYSQLND_VERSION_ID 50007 /* This forces inlining of some accessor functions */ #define MYSQLND_USE_OPTIMISATIONS 0 @@ -40,7 +40,7 @@ on production systems, if of course measured performance degradation is not minimal. */ -#if PHP_DEBUG +#if A0 && PHP_DEBUG #define MYSQLND_DO_WIRE_CHECK_BEFORE_COMMAND 1 #endif @@ -59,11 +59,24 @@ #include "mysqlnd_structs.h" +/* Library related */ +PHPAPI void mysqlnd_library_init(TSRMLS_D); +PHPAPI void mysqlnd_library_end(TSRMLS_D); +PHPAPI unsigned int mysqlnd_plugin_register(); +PHPAPI unsigned int mysqlnd_plugin_count(); +PHPAPI void ** _mysqlnd_plugin_get_plugin_connection_data(const MYSQLND * conn, unsigned int plugin_id TSRMLS_DC); +#define mysqlnd_plugin_get_plugin_connection_data(c, p_id) _mysqlnd_plugin_get_plugin_connection_data((c), (p_id) TSRMLS_CC) + +PHPAPI void ** _mysqlnd_plugin_get_plugin_result_data(const MYSQLND_RES * result, unsigned int plugin_id TSRMLS_DC); +#define mysqlnd_plugin_get_plugin_result_data(r, p_id) _mysqlnd_plugin_get_plugin_result_data((r), (p_id) TSRMLS_CC) + +PHPAPI void ** _mysqlnd_plugin_get_plugin_stmt_data(const MYSQLND_STMT * stmt, unsigned int plugin_id TSRMLS_DC); +#define mysqlnd_plugin_get_plugin_stmt_data(s, p_id) _mysqlnd_plugin_get_plugin_stmt_data((s), (p_id) TSRMLS_CC) + +PHPAPI void ** _mysqlnd_plugin_get_plugin_protocol_data(const MYSQLND_PROTOCOL * protocol, unsigned int plugin_id TSRMLS_DC); +#define mysqlnd_plugin_get_plugin_protocol_data(p, p_id) _mysqlnd_plugin_get_plugin_protocol_data((p), (p_id) TSRMLS_CC) -/* Library related */ -void mysqlnd_library_init(TSRMLS_D); -void mysqlnd_library_end(TSRMLS_D); PHPAPI struct st_mysqlnd_conn_methods * mysqlnd_conn_get_methods(); PHPAPI void mysqlnd_conn_set_methods(struct st_mysqlnd_conn_methods *methods); @@ -72,8 +85,8 @@ PHPAPI struct st_mysqlnd_stmt_methods * mysqlnd_stmt_get_methods(); PHPAPI void mysqlnd_stmt_set_methods(struct st_mysqlnd_stmt_methods *methods); -#define mysqlnd_restart_psession(conn, cache) _mysqlnd_restart_psession((conn), (cache) TSRMLS_CC) -PHPAPI void _mysqlnd_restart_psession(MYSQLND *conn, MYSQLND_THD_ZVAL_PCACHE *cache TSRMLS_DC); +#define mysqlnd_restart_psession(conn) _mysqlnd_restart_psession((conn) TSRMLS_CC) +PHPAPI void _mysqlnd_restart_psession(MYSQLND * conn TSRMLS_DC); #define mysqlnd_end_psession(conn) _mysqlnd_end_psession((conn) TSRMLS_CC) PHPAPI void _mysqlnd_end_psession(MYSQLND *conn TSRMLS_DC); PHPAPI void mysqlnd_minfo_print_hash(zval *values); @@ -92,11 +105,10 @@ PHPAPI MYSQLND * mysqlnd_connect(MYSQLND *conn, const char *db, unsigned int db_len, unsigned int port, const char *socket, - unsigned int mysql_flags, - MYSQLND_THD_ZVAL_PCACHE *zval_cache + unsigned int mysql_flags TSRMLS_DC); -#define mysqlnd_change_user(conn, user, passwd, db) (conn)->m->change_user((conn), (user), (passwd), (db) TSRMLS_CC) +#define mysqlnd_change_user(conn, user, passwd, db, silent) (conn)->m->change_user((conn), (user), (passwd), (db), (silent) TSRMLS_CC) #define mysqlnd_debug(x) _mysqlnd_debug((x) TSRMLS_CC) PHPAPI void _mysqlnd_debug(const char *mode TSRMLS_DC); @@ -120,7 +132,6 @@ PHPAPI enum_func_status _mysqlnd_poll(MYSQLND **r_array, MYSQLND **e_array, MYSQ #define mysqlnd_use_result(conn) (conn)->m->use_result((conn) TSRMLS_CC) #define mysqlnd_store_result(conn) (conn)->m->store_result((conn) TSRMLS_CC) -#define mysqlnd_bg_store_result(conn) (conn)->m->background_store_result((conn) TSRMLS_CC) #define mysqlnd_next_result(conn) (conn)->m->next_result((conn) TSRMLS_CC) #define mysqlnd_more_results(conn) (conn)->m->more_results((conn) TSRMLS_CC) #define mysqlnd_free_result(r,e_or_i) ((MYSQLND_RES*)r)->m.free_result(((MYSQLND_RES*)(r)), (e_or_i) TSRMLS_CC) @@ -151,7 +162,7 @@ PHPAPI enum_func_status _mysqlnd_poll(MYSQLND **r_array, MYSQLND **e_array, MYSQ #define mysqlnd_num_rows(result) ((result)->stored_data? (result)->stored_data->row_count:0) #define mysqlnd_num_fields(result) (result)->field_count -#define mysqlnd_fetch_lengths(result) ((result)->m.fetch_lengths? (result)->m.fetch_lengths((result)):NULL) +#define mysqlnd_fetch_lengths(result) ((result)->m.fetch_lengths? (result)->m.fetch_lengths((result) TSRMLS_CC) : NULL) #define mysqlnd_field_seek(result, ofs) (result)->m.seek_field((result), (ofs)) #define mysqlnd_field_tell(result) ((result)->meta? (result)->meta->current_field:0) @@ -181,31 +192,32 @@ PHPAPI enum_func_status _mysqlnd_poll(MYSQLND **r_array, MYSQLND **e_array, MYSQ /*****************************************************************************************************/ /* Errors */ -#define mysqlnd_errno(conn) (conn)->m->get_error_no((conn)) -#define mysqlnd_error(conn) (conn)->m->get_error_str((conn)) -#define mysqlnd_sqlstate(conn) (conn)->m->get_sqlstate((conn)) +#define mysqlnd_errno(conn) (conn)->m->get_error_no((conn) TSRMLS_CC) +#define mysqlnd_error(conn) (conn)->m->get_error_str((conn) TSRMLS_CC) +#define mysqlnd_sqlstate(conn) (conn)->m->get_sqlstate((conn) TSRMLS_CC) /* Charset */ -#define mysqlnd_character_set_name(conn) (conn)->m->charset_name((conn)) +#define mysqlnd_character_set_name(conn) (conn)->m->charset_name((conn) TSRMLS_CC) /* Simple metadata */ -#define mysqlnd_field_count(conn) (conn)->m->get_field_count((conn)) -#define mysqlnd_insert_id(conn) (conn)->m->get_last_insert_id((conn)) -#define mysqlnd_affected_rows(conn) (conn)->m->get_affected_rows((conn)) -#define mysqlnd_warning_count(conn) (conn)->m->get_warning_count((conn)) -#define mysqlnd_info(conn) (conn)->m->get_last_message((conn)) -#define mysqlnd_get_server_info(conn) (conn)->m->get_server_information((conn)) -#define mysqlnd_get_host_info(conn) (conn)->m->get_host_information((conn)) -#define mysqlnd_get_proto_info(conn) (conn)->m->get_protocol_information((conn)) -#define mysqlnd_thread_id(conn) (conn)->m->get_thread_id((conn)) - -#define mysqlnd_num_rows(result) (result)->m.num_rows((result)) -#define mysqlnd_num_fields(result) (result)->m.num_fields((result)) - -PHPAPI unsigned long * mysqlnd_fetch_lengths(MYSQLND_RES * const result); - -#define mysqlnd_field_seek(result, ofs) (result)->m.seek_field((result), (ofs)) -#define mysqlnd_field_tell(result) (result)->m.field_tell((result)) +#define mysqlnd_field_count(conn) (conn)->m->get_field_count((conn) TSRMLS_CC) +#define mysqlnd_insert_id(conn) (conn)->m->get_last_insert_id((conn) TSRMLS_CC) +#define mysqlnd_affected_rows(conn) (conn)->m->get_affected_rows((conn) TSRMLS_CC) +#define mysqlnd_warning_count(conn) (conn)->m->get_warning_count((conn) TSRMLS_CC) +#define mysqlnd_info(conn) (conn)->m->get_last_message((conn) TSRMLS_CC) +#define mysqlnd_get_server_info(conn) (conn)->m->get_server_information((conn) TSRMLS_CC) +#define mysqlnd_get_host_info(conn) (conn)->m->get_host_information((conn) TSRMLS_CC) +#define mysqlnd_get_proto_info(conn) (conn)->m->get_protocol_information((conn) TSRMLS_CC) +#define mysqlnd_thread_id(conn) (conn)->m->get_thread_id((conn) TSRMLS_CC) + +#define mysqlnd_num_rows(result) (result)->m.num_rows((result) TSRMLS_CC) +#define mysqlnd_num_fields(result) (result)->m.num_fields((result) TSRMLS_CC) + +#define mysqlnd_fetch_lengths(result) _mysqlnd_fetch_lengths((result) TSRMLS_CC) +PHPAPI unsigned long * _mysqlnd_fetch_lengths(MYSQLND_RES * const result TSRMLS_DC); + +#define mysqlnd_field_seek(result, ofs) (result)->m.seek_field((result), (ofs) TSRMLS_CC) +#define mysqlnd_field_tell(result) (result)->m.field_tell((result) TSRMLS_CC) #define mysqlnd_fetch_field(result) (result)->m.fetch_field((result) TSRMLS_CC) #define mysqlnd_fetch_field_direct(result,fnr) (result)->m.fetch_field_direct((result), (fnr) TSRMLS_CC) #define mysqlnd_fetch_fields(result) (result)->m.fetch_fields((result) TSRMLS_CC) @@ -215,15 +227,15 @@ PHPAPI const char * mysqlnd_get_client_info(); PHPAPI unsigned int mysqlnd_get_client_version(); /* PS */ -#define mysqlnd_stmt_insert_id(stmt) (stmt)->m->get_last_insert_id((stmt)) -#define mysqlnd_stmt_affected_rows(stmt) (stmt)->m->get_affected_rows((stmt)) -#define mysqlnd_stmt_num_rows(stmt) (stmt)->m->get_num_rows((stmt)) -#define mysqlnd_stmt_param_count(stmt) (stmt)->m->get_param_count((stmt)) -#define mysqlnd_stmt_field_count(stmt) (stmt)->m->get_field_count((stmt)) -#define mysqlnd_stmt_warning_count(stmt) (stmt)->m->get_warning_count((stmt)) -#define mysqlnd_stmt_errno(stmt) (stmt)->m->get_error_no((stmt)) -#define mysqlnd_stmt_error(stmt) (stmt)->m->get_error_str((stmt)) -#define mysqlnd_stmt_sqlstate(stmt) (stmt)->m->get_sqlstate((stmt)) +#define mysqlnd_stmt_insert_id(stmt) (stmt)->m->get_last_insert_id((stmt) TSRMLS_CC) +#define mysqlnd_stmt_affected_rows(stmt) (stmt)->m->get_affected_rows((stmt) TSRMLS_CC) +#define mysqlnd_stmt_num_rows(stmt) (stmt)->m->get_num_rows((stmt) TSRMLS_CC) +#define mysqlnd_stmt_param_count(stmt) (stmt)->m->get_param_count((stmt) TSRMLS_CC) +#define mysqlnd_stmt_field_count(stmt) (stmt)->m->get_field_count((stmt) TSRMLS_CC) +#define mysqlnd_stmt_warning_count(stmt) (stmt)->m->get_warning_count((stmt) TSRMLS_CC) +#define mysqlnd_stmt_errno(stmt) (stmt)->m->get_error_no((stmt) TSRMLS_CC) +#define mysqlnd_stmt_error(stmt) (stmt)->m->get_error_str((stmt) TSRMLS_CC) +#define mysqlnd_stmt_sqlstate(stmt) (stmt)->m->get_sqlstate((stmt) TSRMLS_CC) #endif /* MYSQLND_USE_OPTIMISATIONS */ /*****************************************************************************************************/ @@ -252,7 +264,7 @@ PHPAPI void mysqlnd_set_local_infile_handler(MYSQLND * const conn, const char * #define mysqlnd_kill(conn, pid) (conn)->m->kill_connection((conn), (pid) TSRMLS_CC) #define mysqlnd_refresh(conn, options) (conn)->m->refresh_server((conn), (options) TSRMLS_CC) #define mysqlnd_shutdown(conn, level) (conn)->m->shutdown_server((conn), (level) TSRMLS_CC) -#define mysqlnd_get_server_version(conn) (conn)->m->get_server_version((conn)) +#define mysqlnd_get_server_version(conn) (conn)->m->get_server_version((conn) TSRMLS_CC) #define mysqlnd_set_character_set(conn, cs) (conn)->m->set_charset((conn), (cs) TSRMLS_CC) #define mysqlnd_stat(conn, msg, msg_len) (conn)->m->get_server_statistics((conn), (msg), (msg_len) TSRMLS_CC) #define mysqlnd_options(conn, opt, value) (conn)->m->set_client_option((conn), (opt), (value) TSRMLS_CC) @@ -270,7 +282,6 @@ PHPAPI ulong mysqlnd_old_escape_string(char *newstr, const char *escapestr, size /* PS */ #define mysqlnd_stmt_init(conn) (conn)->m->stmt_init((conn) TSRMLS_CC) #define mysqlnd_stmt_store_result(stmt) (!mysqlnd_stmt_field_count((stmt)) ? PASS:((stmt)->m->store_result((stmt) TSRMLS_CC)? PASS:FAIL)) -#define mysqlnd_stmt_bg_store_result(stmt) (!mysqlnd_stmt_field_count((stmt)) ? PASS:((stmt)->m->background_store_result((stmt) TSRMLS_CC)? PASS:FAIL)) #define mysqlnd_stmt_get_result(stmt) (stmt)->m->get_result((stmt) TSRMLS_CC) #define mysqlnd_stmt_more_results(stmt) (stmt)->m->more_results((stmt) TSRMLS_CC) #define mysqlnd_stmt_next_result(stmt) (stmt)->m->next_result((stmt) TSRMLS_CC) @@ -302,63 +313,6 @@ PHPAPI ulong mysqlnd_old_escape_string(char *newstr, const char *escapestr, size /* Performance statistics */ PHPAPI void _mysqlnd_get_client_stats(zval *return_value TSRMLS_DC ZEND_FILE_LINE_DC); -/* Persistent caching zval allocator */ -#define mysqlnd_palloc_init_cache(size) _mysqlnd_palloc_init_cache((size) TSRMLS_CC) -#define mysqlnd_palloc_free_cache(cache) _mysqlnd_palloc_free_cache((cache) TSRMLS_CC) -PHPAPI MYSQLND_ZVAL_PCACHE* _mysqlnd_palloc_init_cache(unsigned int cache_size TSRMLS_DC); -PHPAPI void _mysqlnd_palloc_free_cache(MYSQLND_ZVAL_PCACHE *cache TSRMLS_DC); -PHPAPI void mysqlnd_palloc_stats(const MYSQLND_ZVAL_PCACHE * const cache, - zval *return_value); - -#define mysqlnd_palloc_rinit(cache) _mysqlnd_palloc_rinit((cache) TSRMLS_CC) -#define mysqlnd_palloc_rshutdown(cache) _mysqlnd_palloc_rshutdown((cache) TSRMLS_CC) -PHPAPI MYSQLND_THD_ZVAL_PCACHE * _mysqlnd_palloc_rinit(MYSQLND_ZVAL_PCACHE * cache TSRMLS_DC); -PHPAPI void _mysqlnd_palloc_rshutdown(MYSQLND_THD_ZVAL_PCACHE * cache TSRMLS_DC); - - -#define mysqlnd_palloc_init_thd_cache(cache) _mysqlnd_palloc_init_thd_cache((cache) TSRMLS_CC) -#define mysqlnd_palloc_free_thd_cache_reference(cache) _mysqlnd_palloc_free_thd_cache_reference((cache) TSRMLS_CC) -#define mysqlnd_palloc_get_thd_cache_reference(cache) _mysqlnd_palloc_get_thd_cache_reference((cache) TSRMLS_CC) - -PHPAPI MYSQLND_THD_ZVAL_PCACHE* _mysqlnd_palloc_init_thd_cache(MYSQLND_ZVAL_PCACHE * const cache TSRMLS_DC); -MYSQLND_THD_ZVAL_PCACHE* _mysqlnd_palloc_get_thd_cache_reference(MYSQLND_THD_ZVAL_PCACHE * const cache TSRMLS_DC); -PHPAPI void _mysqlnd_palloc_free_thd_cache_reference(MYSQLND_THD_ZVAL_PCACHE **cache TSRMLS_DC); - - -/* There two should not be used from outside */ -void * mysqlnd_palloc_get_zval(MYSQLND_THD_ZVAL_PCACHE * const cache, zend_bool *allocated TSRMLS_DC); -void mysqlnd_palloc_zval_ptr_dtor(zval **zv, MYSQLND_THD_ZVAL_PCACHE * const cache, - enum_mysqlnd_res_type type, zend_bool *copy_ctor_called TSRMLS_DC); - - - -/* ---------------------- QUERY CACHE ---------------*/ -struct st_mysqlnd_qcache { - HashTable *ht; - unsigned int references; -#ifdef ZTS - MUTEX_T LOCK_access; -#endif -}; - - -typedef struct st_mysqlnd_qcache_element { - MYSQLND_RES_BUFFERED *data; - MYSQLND_RES_METADATA *meta; - const char * query; - size_t query_len; -} MYSQLND_QCACHE_ELEMENT; - - -PHPAPI MYSQLND_QCACHE * mysqlnd_qcache_init_cache(); -PHPAPI MYSQLND_QCACHE * mysqlnd_qcache_get_cache_reference(MYSQLND_QCACHE * const cache); -PHPAPI void mysqlnd_qcache_free_cache_reference(MYSQLND_QCACHE **cache); -PHPAPI void mysqlnd_qcache_stats(const MYSQLND_QCACHE * const cache, zval *return_value); -MYSQLND_RES * mysqlnd_qcache_get(MYSQLND_QCACHE * const cache, const char * query, - size_t query_len); -void mysqlnd_qcache_put(MYSQLND_QCACHE * const cache, char * query, size_t query_len, - MYSQLND_RES_BUFFERED * const result, MYSQLND_RES_METADATA * const meta); - /* double check the class name to avoid naming conflicts when using these: */ #define MYSQLND_METHOD(class, method) php_##class##_##method##_pub #define MYSQLND_METHOD_PRIVATE(class, method) php_##class##_##method##_priv @@ -371,9 +325,6 @@ ZEND_BEGIN_MODULE_GLOBALS(mysqlnd) long net_cmd_buffer_size; long net_read_buffer_size; long log_mask; -#ifdef MYSQLND_THREADED - THREAD_T thread_id; -#endif long net_read_timeout; ZEND_END_MODULE_GLOBALS(mysqlnd) @@ -386,6 +337,8 @@ ZEND_EXTERN_MODULE_GLOBALS(mysqlnd); #endif +PHPAPI void mysqlnd_minfo_print_hash(zval *values); + #endif /* MYSQLND_H */ diff --git a/ext/mysqlnd/mysqlnd_block_alloc.c b/ext/mysqlnd/mysqlnd_block_alloc.c index cf7be9fd0..8c7f7d951 100644 --- a/ext/mysqlnd/mysqlnd_block_alloc.c +++ b/ext/mysqlnd/mysqlnd_block_alloc.c @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: mysqlnd_block_alloc.c 282779 2009-06-25 19:03:52Z johannes $ */ +/* $Id: mysqlnd_block_alloc.c 293779 2010-01-20 17:09:28Z johannes $ */ #include "php.h" #include "mysqlnd.h" @@ -160,7 +160,7 @@ MYSQLND_MEMORY_POOL_CHUNK * mysqlnd_mempool_get_chunk(MYSQLND_MEMORY_POOL * pool /* {{{ mysqlnd_mempool_create */ -MYSQLND_MEMORY_POOL * +PHPAPI MYSQLND_MEMORY_POOL * mysqlnd_mempool_create(size_t arena_size TSRMLS_DC) { /* We calloc, because we free(). We don't mnd_calloc() for a reason. */ @@ -179,7 +179,7 @@ mysqlnd_mempool_create(size_t arena_size TSRMLS_DC) /* {{{ mysqlnd_mempool_destroy */ -void +PHPAPI void mysqlnd_mempool_destroy(MYSQLND_MEMORY_POOL * pool TSRMLS_DC) { DBG_ENTER("mysqlnd_mempool_destroy"); diff --git a/ext/mysqlnd/mysqlnd_block_alloc.h b/ext/mysqlnd/mysqlnd_block_alloc.h index 56576214e..0607d4209 100644 --- a/ext/mysqlnd/mysqlnd_block_alloc.h +++ b/ext/mysqlnd/mysqlnd_block_alloc.h @@ -18,13 +18,13 @@ +----------------------------------------------------------------------+ */ -/* $Id: mysqlnd_block_alloc.h 282779 2009-06-25 19:03:52Z johannes $ */ +/* $Id: mysqlnd_block_alloc.h 293779 2010-01-20 17:09:28Z johannes $ */ #ifndef MYSQLND_BLOCK_ALLOC_H #define MYSQLND_BLOCK_ALLOC_H -MYSQLND_MEMORY_POOL * mysqlnd_mempool_create(size_t arena_size TSRMLS_DC); -void mysqlnd_mempool_destroy(MYSQLND_MEMORY_POOL * pool TSRMLS_DC); +PHPAPI MYSQLND_MEMORY_POOL * mysqlnd_mempool_create(size_t arena_size TSRMLS_DC); +PHPAPI void mysqlnd_mempool_destroy(MYSQLND_MEMORY_POOL * pool TSRMLS_DC); #endif /* MYSQLND_BLOCK_ALLOC_H */ diff --git a/ext/mysqlnd/mysqlnd_charset.c b/ext/mysqlnd/mysqlnd_charset.c index 3fc434cc5..7ec9bfbc2 100644 --- a/ext/mysqlnd/mysqlnd_charset.c +++ b/ext/mysqlnd/mysqlnd_charset.c @@ -171,7 +171,7 @@ static unsigned int check_mb_eucjpms(const char *start, const char *end) if (valid_eucjpms_ss2(start[0]) && (end - start) > 1 && valid_eucjpms_kata(start[1])) { return 2; } - if (valid_eucjpms_ss3(start[0]) && (end - start) > 2 && valid_eucjpms(start[1]) && + if (valid_eucjpms_ss3(start[0]) && (end - start) > 2 && valid_eucjpms(start[1]) && valid_eucjpms(start[2])) { return 2; } @@ -199,7 +199,7 @@ static unsigned int mysqlnd_mbcharlen_eucjpms(unsigned int jpms) static unsigned int check_mb_gb2312(const char *start, const char *end) { - return (valid_gb2312_head((unsigned int)start[0]) && end - start > 1 && + return (valid_gb2312_head((unsigned int)start[0]) && end - start > 1 && valid_gb2312_tail((unsigned int)start[1])) ? 2 : 0; } @@ -311,12 +311,12 @@ const MYSQLND_CHARSET mysqlnd_charsets[] = { 19, "euckr", "euckr_korean_ci", 1, 2, "", mysqlnd_mbcharlen_euckr, check_mb_euckr}, { 22, "koi8u", "koi8u_general_ci", 1, 1, "", NULL, NULL}, { 24, "gb2312", "gb2312_chinese_ci", 1, 2, "", mysqlnd_mbcharlen_gb2312, check_mb_gb2312}, - { 25, "greek", "greek_general_ci", 1, 1, "", NULL, NULL}, + { 25, "greek", "greek_general_ci", 1, 1, "", NULL, NULL}, { 26, "cp1250", "cp1250_general_ci", 1, 1, "", NULL, NULL}, { 28, "gbk", "gbk_chinese_ci", 1, 2, "", mysqlnd_mbcharlen_gbk, check_mb_gbk}, { 30, "latin5", "latin5_turkish_ci", 1, 1, "", NULL, NULL}, { 32, "armscii8", "armscii8_general_ci", 1, 1, "", NULL, NULL}, - { 33, "utf8", "utf8_general_ci", 1, 2, "UTF-8 Unicode", mysqlnd_mbcharlen_utf8, check_mb_utf8_valid}, + { 33, "utf8", "utf8_general_ci", 1, 3, "UTF-8 Unicode", mysqlnd_mbcharlen_utf8, check_mb_utf8_valid}, { 35, "ucs2", "ucs2_general_ci", 2, 2, "UCS-2 Unicode", mysqlnd_mbcharlen_ucs2, check_mb_ucs2}, { 36, "cp866", "cp866_general_ci", 1, 1, "", NULL, NULL}, { 37, "keybcs2", "keybcs2_general_ci", 1, 1, "", NULL, NULL}, @@ -372,7 +372,7 @@ const MYSQLND_CHARSET mysqlnd_charsets[] = { 81, "cp852", "cp852_bin", 1, 1, "", NULL, NULL}, { 82, "swe7", "swe7_bin", 1, 1, "", NULL, NULL}, { 93, "geostd8", "geostd8_bin", 1, 1, "", NULL, NULL}, - { 83, "utf8", "utf8_bin", 1, 2, "UTF-8 Unicode", mysqlnd_mbcharlen_utf8, check_mb_utf8_valid}, + { 83, "utf8", "utf8_bin", 1, 3, "UTF-8 Unicode", mysqlnd_mbcharlen_utf8, check_mb_utf8_valid}, { 84, "big5", "big5_bin", 1, 2, "", mysqlnd_mbcharlen_big5, check_mb_big5}, { 85, "euckr", "euckr_bin", 1, 2, "", mysqlnd_mbcharlen_euckr, check_mb_euckr}, { 86, "gb2312", "gb2312_bin", 1, 2, "", mysqlnd_mbcharlen_gb2312, check_mb_gb2312}, @@ -424,7 +424,47 @@ const MYSQLND_CHARSET mysqlnd_charsets[] = { 208, "utf8", "utf8_persian_ci", 1, 3, "", mysqlnd_mbcharlen_utf8, check_mb_utf8_valid}, { 209, "utf8", "utf8_esperanto_ci", 1, 3, "", mysqlnd_mbcharlen_utf8, check_mb_utf8_valid}, { 210, "utf8", "utf8_hungarian_ci", 1, 3, "", mysqlnd_mbcharlen_utf8, check_mb_utf8_valid}, - { 254, "utf8", "utf8_general_cs", 1, 3, "", mysqlnd_mbcharlen_utf8, check_mb_utf8_valid}, + { 192, "utf8mb3", "utf8mb3_general_ci", 1, 3, "", mysqlnd_mbcharlen_utf8, check_mb_utf8_valid}, + { 193, "utf8mb3", "utf8mb3_icelandic_ci", 1, 3, "", mysqlnd_mbcharlen_utf8, check_mb_utf8_valid}, + { 194, "utf8mb3", "utf8mb3_latvian_ci", 1, 3, "", mysqlnd_mbcharlen_utf8, check_mb_utf8_valid}, + { 195, "utf8mb3", "utf8mb3_romanian_ci", 1, 3, "", mysqlnd_mbcharlen_utf8, check_mb_utf8_valid}, + { 196, "utf8mb3", "utf8mb3_slovenian_ci", 1, 3, "", mysqlnd_mbcharlen_utf8, check_mb_utf8_valid}, + { 197, "utf8mb3", "utf8mb3_polish_ci", 1, 3, "", mysqlnd_mbcharlen_utf8, check_mb_utf8_valid}, + { 198, "utf8mb3", "utf8mb3_estonian_ci", 1, 3, "", mysqlnd_mbcharlen_utf8, check_mb_utf8_valid}, + { 119, "utf8mb3", "utf8mb3_spanish_ci", 1, 3, "", mysqlnd_mbcharlen_utf8, check_mb_utf8_valid}, + { 200, "utf8mb3", "utf8mb3_swedish_ci", 1, 3, "", mysqlnd_mbcharlen_utf8, check_mb_utf8_valid}, + { 201, "utf8mb3", "utf8mb3_turkish_ci", 1, 3, "", mysqlnd_mbcharlen_utf8, check_mb_utf8_valid}, + { 202, "utf8mb3", "utf8mb3_czech_ci", 1, 3, "", mysqlnd_mbcharlen_utf8, check_mb_utf8_valid}, + { 203, "utf8mb3", "utf8mb3_danish_ci", 1, 3, "", mysqlnd_mbcharlen_utf8, check_mb_utf8_valid }, + { 204, "utf8mb3", "utf8mb3_lithunian_ci", 1, 3, "", mysqlnd_mbcharlen_utf8, check_mb_utf8_valid }, + { 205, "utf8mb3", "utf8mb3_slovak_ci", 1, 3, "", mysqlnd_mbcharlen_utf8, check_mb_utf8_valid}, + { 206, "utf8mb3", "utf8mb3_spanish2_ci", 1, 3, "", mysqlnd_mbcharlen_utf8, check_mb_utf8_valid}, + { 207, "utf8mb3", "utf8mb3_roman_ci", 1, 3, "", mysqlnd_mbcharlen_utf8, check_mb_utf8_valid}, + { 208, "utf8mb3", "utf8mb3_persian_ci", 1, 3, "", mysqlnd_mbcharlen_utf8, check_mb_utf8_valid}, + { 209, "utf8mb3", "utf8mb3_esperanto_ci", 1, 3, "", mysqlnd_mbcharlen_utf8, check_mb_utf8_valid}, + { 210, "utf8mb3", "utf8mb3_hungarian_ci", 1, 3, "", mysqlnd_mbcharlen_utf8, check_mb_utf8_valid}, + { 211, "utf8mb3", "utf8mb3_sinhala_ci", 1, 3, "", mysqlnd_mbcharlen_utf8, check_mb_utf8_valid}, + { 224, "utf8", "utf8_unicode_ci", 1, 4, "", mysqlnd_mbcharlen_utf8, check_mb_utf8_valid}, + { 225, "utf8", "utf8_icelandic_ci", 1, 4, "", mysqlnd_mbcharlen_utf8, check_mb_utf8_valid}, + { 226, "utf8", "utf8_latvian_ci", 1, 4, "", mysqlnd_mbcharlen_utf8, check_mb_utf8_valid}, + { 227, "utf8", "utf8_romanian_ci", 1, 4, "", mysqlnd_mbcharlen_utf8, check_mb_utf8_valid}, + { 228, "utf8", "utf8_slovenian_ci", 1, 4, "", mysqlnd_mbcharlen_utf8, check_mb_utf8_valid}, + { 229, "utf8", "utf8_polish_ci", 1, 4, "", mysqlnd_mbcharlen_utf8, check_mb_utf8_valid}, + { 230, "utf8", "utf8_estonian_ci", 1, 4, "", mysqlnd_mbcharlen_utf8, check_mb_utf8_valid}, + { 231, "utf8", "utf8_spanish_ci", 1, 4, "", mysqlnd_mbcharlen_utf8, check_mb_utf8_valid}, + { 232, "utf8", "utf8_swedish_ci", 1, 4, "", mysqlnd_mbcharlen_utf8, check_mb_utf8_valid}, + { 233, "utf8", "utf8_turkish_ci", 1, 4, "", mysqlnd_mbcharlen_utf8, check_mb_utf8_valid}, + { 234, "utf8", "utf8_czech_ci", 1, 4, "", mysqlnd_mbcharlen_utf8, check_mb_utf8_valid}, + { 235, "utf8", "utf8_danish_ci", 1, 4, "", mysqlnd_mbcharlen_utf8, check_mb_utf8_valid}, + { 236, "utf8", "utf8_lithuanian_ci", 1, 4, "", mysqlnd_mbcharlen_utf8, check_mb_utf8_valid}, + { 237, "utf8", "utf8_slovak_ci", 1, 4, "", mysqlnd_mbcharlen_utf8, check_mb_utf8_valid}, + { 238, "utf8", "utf8_spanish2_ci", 1, 4, "", mysqlnd_mbcharlen_utf8, check_mb_utf8_valid}, + { 239, "utf8", "utf8_roman_ci", 1, 4, "", mysqlnd_mbcharlen_utf8, check_mb_utf8_valid}, + { 240, "utf8", "utf8_persian_ci", 1, 4, "", mysqlnd_mbcharlen_utf8, check_mb_utf8_valid}, + { 241, "utf8", "utf8_esperanto_ci", 1, 4, "", mysqlnd_mbcharlen_utf8, check_mb_utf8_valid}, + { 242, "utf8", "utf8_hungarian_ci", 1, 4, "", mysqlnd_mbcharlen_utf8, check_mb_utf8_valid}, + { 243, "utf8", "utf8_sinhala_ci", 1, 4, "", mysqlnd_mbcharlen_utf8, check_mb_utf8_valid}, + { 254, "utf8mb3", "utf8mb3_general_cs", 1, 3, "", mysqlnd_mbcharlen_utf8, check_mb_utf8_valid}, { 0, NULL, NULL, 0, 0, NULL, NULL, NULL} }; /* }}} */ @@ -449,7 +489,7 @@ const MYSQLND_CHARSET mysqlnd_charsets60[] = { 19, "euckr", "euckr_korean_ci", 1, 2, "", mysqlnd_mbcharlen_euckr, check_mb_euckr}, { 22, "koi8u", "koi8u_general_ci", 1, 1, "", NULL, NULL}, { 24, "gb2312", "gb2312_chinese_ci", 1, 2, "", mysqlnd_mbcharlen_gb2312, check_mb_gb2312}, - { 25, "greek", "greek_general_ci", 1, 1, "", NULL, NULL}, + { 25, "greek", "greek_general_ci", 1, 1, "", NULL, NULL}, { 26, "cp1250", "cp1250_general_ci", 1, 1, "", NULL, NULL}, { 28, "gbk", "gbk_chinese_ci", 1, 2, "", mysqlnd_mbcharlen_gbk, check_mb_gbk}, { 30, "latin5", "latin5_turkish_ci", 1, 1, "", NULL, NULL}, @@ -635,7 +675,7 @@ PHPAPI ulong mysqlnd_cset_escape_quotes(const MYSQLND_CHARSET * const cset, char for (;escapestr < end; escapestr++) { unsigned int len = 0; /* check unicode characters */ - + if (cset->char_maxlen > 1 && (len = cset->mb_valid(escapestr, end))) { /* check possible overflow */ @@ -685,7 +725,8 @@ PHPAPI ulong mysqlnd_cset_escape_slashes(const MYSQLND_CHARSET * const cset, cha zend_bool escape_overflow = FALSE; DBG_ENTER("mysqlnd_cset_escape_slashes"); - + DBG_INF_FMT("charset=%s", cset->name); + for (;escapestr < end; escapestr++) { char esc = '\0'; unsigned int len = 0; diff --git a/ext/mysqlnd/mysqlnd_charset.h b/ext/mysqlnd/mysqlnd_charset.h index 432fd03f1..46cf03f1e 100644 --- a/ext/mysqlnd/mysqlnd_charset.h +++ b/ext/mysqlnd/mysqlnd_charset.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 6 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | diff --git a/ext/mysqlnd/mysqlnd_debug.c b/ext/mysqlnd/mysqlnd_debug.c index 3537c1373..2c2764faf 100644 --- a/ext/mysqlnd/mysqlnd_debug.c +++ b/ext/mysqlnd/mysqlnd_debug.c @@ -1,4 +1,4 @@ -/* +;/* +----------------------------------------------------------------------+ | PHP Version 6 | +----------------------------------------------------------------------+ @@ -18,14 +18,13 @@ +----------------------------------------------------------------------+ */ -/* $Id: mysqlnd_debug.c 282779 2009-06-25 19:03:52Z johannes $ */ +/* $Id: mysqlnd_debug.c 294543 2010-02-04 20:28:55Z johannes $ */ #include "php.h" #include "mysqlnd.h" #include "mysqlnd_priv.h" #include "mysqlnd_debug.h" #include "mysqlnd_wireprotocol.h" -#include "mysqlnd_palloc.h" #include "mysqlnd_statistics.h" #include "zend_builtin_functions.h" @@ -48,18 +47,37 @@ static const char * const mysqlnd_debug_default_trace_file = "/tmp/mysqlnd.trace #define MYSQLND_DEBUG_FLUSH 128 #define MYSQLND_DEBUG_TRACE_MEMORY_CALLS 256 -static char * mysqlnd_emalloc_name = "_mysqlnd_emalloc"; -static char * mysqlnd_pemalloc_name = "_mysqlnd_pemalloc"; -static char * mysqlnd_ecalloc_name = "_mysqlnd_ecalloc"; -static char * mysqlnd_pecalloc_name = "_mysqlnd_pecalloc"; -static char * mysqlnd_erealloc_name = "_mysqlnd_erealloc"; -static char * mysqlnd_perealloc_name= "_mysqlnd_perealloc"; -static char * mysqlnd_efree_name = "_mysqlnd_efree"; -static char * mysqlnd_pefree_name = "_mysqlnd_pefree"; -static char * mysqlnd_malloc_name = "_mysqlnd_malloc"; -static char * mysqlnd_calloc_name = "_mysqlnd_calloc"; -static char * mysqlnd_realloc_name = "_mysqlnd_realloc"; -static char * mysqlnd_free_name = "_mysqlnd_free"; +static const char mysqlnd_emalloc_name[] = "_mysqlnd_emalloc"; +static const char mysqlnd_pemalloc_name[] = "_mysqlnd_pemalloc"; +static const char mysqlnd_ecalloc_name[] = "_mysqlnd_ecalloc"; +static const char mysqlnd_pecalloc_name[] = "_mysqlnd_pecalloc"; +static const char mysqlnd_erealloc_name[] = "_mysqlnd_erealloc"; +static const char mysqlnd_perealloc_name[] = "_mysqlnd_perealloc"; +static const char mysqlnd_efree_name[] = "_mysqlnd_efree"; +static const char mysqlnd_pefree_name[] = "_mysqlnd_pefree"; +static const char mysqlnd_malloc_name[] = "_mysqlnd_malloc"; +static const char mysqlnd_calloc_name[] = "_mysqlnd_calloc"; +static const char mysqlnd_realloc_name[] = "_mysqlnd_realloc"; +static const char mysqlnd_free_name[] = "_mysqlnd_free"; + +const char * mysqlnd_debug_std_no_trace_funcs[] = +{ + mysqlnd_emalloc_name, + mysqlnd_ecalloc_name, + mysqlnd_efree_name, + mysqlnd_erealloc_name, + mysqlnd_pemalloc_name, + mysqlnd_pecalloc_name, + mysqlnd_pefree_name, + mysqlnd_perealloc_name, + mysqlnd_malloc_name, + mysqlnd_calloc_name, + mysqlnd_realloc_name, + mysqlnd_free_name, + mysqlnd_read_header_name, + mysqlnd_read_body_name, + NULL /* must be always last */ +}; /* {{{ mysqlnd_debug::open */ static enum_func_status @@ -95,12 +113,6 @@ MYSQLND_METHOD(mysqlnd_debug, log)(MYSQLND_DEBUG * self, line_buffer[6], level_buffer[7]; MYSQLND_ZTS(self); -#ifdef MYSQLND_THREADED - if (MYSQLND_G(thread_id) != tsrm_thread_id()) { - return PASS; /* don't trace background threads */ - } -#endif - if (!self->stream) { if (FAIL == self->m->open(self, FALSE)) { return FAIL; @@ -201,12 +213,6 @@ MYSQLND_METHOD(mysqlnd_debug, log_va)(MYSQLND_DEBUG *self, line_buffer[6], level_buffer[7]; MYSQLND_ZTS(self); -#ifdef MYSQLND_THREADED - if (MYSQLND_G(thread_id) != tsrm_thread_id()) { - return PASS; /* don't trace background threads */ - } -#endif - if (!self->stream) { if (FAIL == self->m->open(self, FALSE)) { return FAIL; @@ -301,34 +307,24 @@ MYSQLND_METHOD(mysqlnd_debug, log_va)(MYSQLND_DEBUG *self, static zend_bool MYSQLND_METHOD(mysqlnd_debug, func_enter)(MYSQLND_DEBUG * self, unsigned int line, const char * const file, - char * func_name, unsigned int func_name_len) + const char * const func_name, unsigned int func_name_len) { -#ifdef MYSQLND_THREADED - MYSQLND_ZTS(self); -#endif if ((self->flags & MYSQLND_DEBUG_DUMP_TRACE) == 0 || self->file_name == NULL) { return FALSE; } -#ifdef MYSQLND_THREADED - if (MYSQLND_G(thread_id) != tsrm_thread_id()) { - return FALSE; /* don't trace background threads */ - } -#endif if (zend_stack_count(&self->call_stack) >= self->nest_level_limit) { return FALSE; } - if ((self->flags & MYSQLND_DEBUG_TRACE_MEMORY_CALLS) == 0 && - (func_name == mysqlnd_emalloc_name || func_name == mysqlnd_pemalloc_name || - func_name == mysqlnd_ecalloc_name || func_name == mysqlnd_pecalloc_name || - func_name == mysqlnd_erealloc_name || func_name == mysqlnd_perealloc_name || - func_name == mysqlnd_efree_name || func_name == mysqlnd_pefree_name || - func_name == mysqlnd_malloc_name || func_name == mysqlnd_calloc_name || - func_name == mysqlnd_realloc_name || func_name == mysqlnd_free_name || - func_name == mysqlnd_palloc_zval_ptr_dtor_name || func_name == mysqlnd_palloc_get_zval_name || - func_name == mysqlnd_read_header_name || func_name == mysqlnd_read_body_name)) { - zend_stack_push(&self->call_stack, "", sizeof("")); - return FALSE; + if ((self->flags & MYSQLND_DEBUG_TRACE_MEMORY_CALLS) == 0 && self->skip_functions) { + const char ** p = self->skip_functions; + while (*p) { + if (*p == func_name) { + zend_stack_push(&self->call_stack, "", sizeof("")); + return FALSE; + } + p++; + } } zend_stack_push(&self->call_stack, func_name, func_name_len + 1); @@ -351,17 +347,9 @@ MYSQLND_METHOD(mysqlnd_debug, func_leave)(MYSQLND_DEBUG * self, unsigned int lin const char * const file) { char *func_name; -#ifdef MYSQLND_THREADED - MYSQLND_ZTS(self); -#endif if ((self->flags & MYSQLND_DEBUG_DUMP_TRACE) == 0 || self->file_name == NULL) { return PASS; } -#ifdef MYSQLND_THREADED - if (MYSQLND_G(thread_id) != tsrm_thread_id()) { - return PASS; /* don't trace background threads */ - } -#endif if (zend_stack_count(&self->call_stack) >= self->nest_level_limit) { return PASS; } @@ -618,7 +606,8 @@ MYSQLND_CLASS_METHODS_END; /* {{{ mysqlnd_debug_init */ -PHPAPI MYSQLND_DEBUG *mysqlnd_debug_init(TSRMLS_D) +PHPAPI MYSQLND_DEBUG * +mysqlnd_debug_init(const char * skip_functions[] TSRMLS_DC) { MYSQLND_DEBUG *ret = ecalloc(1, sizeof(MYSQLND_DEBUG)); #ifdef ZTS @@ -630,6 +619,7 @@ PHPAPI MYSQLND_DEBUG *mysqlnd_debug_init(TSRMLS_D) zend_hash_init(&ret->not_filtered_functions, 0, NULL, NULL, 0); ret->m = & mysqlnd_mysqlnd_debug_methods; + ret->skip_functions = skip_functions; return ret; } @@ -637,12 +627,12 @@ PHPAPI MYSQLND_DEBUG *mysqlnd_debug_init(TSRMLS_D) /* {{{ _mysqlnd_debug */ -PHPAPI void _mysqlnd_debug(const char *mode TSRMLS_DC) +PHPAPI void _mysqlnd_debug(const char * mode TSRMLS_DC) { #ifdef PHP_DEBUG MYSQLND_DEBUG *dbg = MYSQLND_G(dbg); if (!dbg) { - MYSQLND_G(dbg) = dbg = mysqlnd_debug_init(TSRMLS_C); + MYSQLND_G(dbg) = dbg = mysqlnd_debug_init(mysqlnd_debug_std_no_trace_funcs TSRMLS_CC); if (!dbg) { return; } @@ -670,11 +660,6 @@ void * _mysqlnd_emalloc(size_t size MYSQLND_MEM_D) { void *ret; DBG_ENTER(mysqlnd_emalloc_name); -#ifdef MYSQLND_THREADED - if (MYSQLND_G(thread_id) != tsrm_thread_id()) { - DBG_RETURN(_mysqlnd_pemalloc(size, 1 TSRMLS_CC ZEND_FILE_LINE_CC ZEND_FILE_LINE_EMPTY_CC)); - } -#endif DBG_INF_FMT("file=%-15s line=%4d", strrchr(__zend_filename, PHP_DIR_SEPARATOR) + 1, __zend_lineno); DBG_INF_FMT("before: %lu", zend_memory_usage(FALSE TSRMLS_CC)); @@ -723,11 +708,6 @@ void * _mysqlnd_ecalloc(unsigned int nmemb, size_t size MYSQLND_MEM_D) { void *ret; DBG_ENTER(mysqlnd_ecalloc_name); -#ifdef MYSQLND_THREADED - if (MYSQLND_G(thread_id) != tsrm_thread_id()) { - DBG_RETURN(_mysqlnd_pecalloc(nmemb, size, 1 TSRMLS_CC ZEND_FILE_LINE_CC ZEND_FILE_LINE_EMPTY_CC)); - } -#endif DBG_INF_FMT("file=%-15s line=%4d", strrchr(__zend_filename, PHP_DIR_SEPARATOR) + 1, __zend_lineno); DBG_INF_FMT("before: %lu", zend_memory_usage(FALSE TSRMLS_CC)); @@ -776,11 +756,6 @@ void * _mysqlnd_erealloc(void *ptr, size_t new_size MYSQLND_MEM_D) { void *ret; DBG_ENTER(mysqlnd_erealloc_name); -#ifdef MYSQLND_THREADED - if (MYSQLND_G(thread_id) != tsrm_thread_id()) { - DBG_RETURN(_mysqlnd_perealloc(ptr, new_size, 1 TSRMLS_CC ZEND_FILE_LINE_CC ZEND_FILE_LINE_EMPTY_CC)); - } -#endif DBG_INF_FMT("file=%-15s line=%4d", strrchr(__zend_filename, PHP_DIR_SEPARATOR) + 1, __zend_lineno); DBG_INF_FMT("ptr=%p new_size=%lu", ptr, new_size); DBG_INF_FMT("before: %lu", zend_memory_usage(FALSE TSRMLS_CC)); @@ -830,11 +805,6 @@ void * _mysqlnd_perealloc(void *ptr, size_t new_size, zend_bool persistent MYSQL void _mysqlnd_efree(void *ptr MYSQLND_MEM_D) { DBG_ENTER(mysqlnd_efree_name); -#ifdef MYSQLND_THREADED - if (MYSQLND_G(thread_id) != tsrm_thread_id()) { - DBG_RETURN(_mysqlnd_pefree(ptr, 1 TSRMLS_CC ZEND_FILE_LINE_CC ZEND_FILE_LINE_EMPTY_CC)); - } -#endif DBG_INF_FMT("file=%-15s line=%4d", strrchr(__zend_filename, PHP_DIR_SEPARATOR) + 1, __zend_lineno); DBG_INF_FMT("ptr=%p", ptr); DBG_INF_FMT("before: %lu", zend_memory_usage(FALSE TSRMLS_CC)); @@ -1143,11 +1113,18 @@ static int mysqlnd_build_trace_string(zval **frame TSRMLS_DC, int num_args, va_l long line; HashTable *ht = Z_ARRVAL_PP(frame); zval **file, **tmp; + uint * level; + level = va_arg(args, uint *); str = va_arg(args, char**); len = va_arg(args, int*); num = va_arg(args, int*); + if (!*level) { + return ZEND_HASH_APPLY_KEEP; + } + --*level; + s_tmp = emalloc(1 + MAX_LENGTH_OF_LONG + 1 + 1); sprintf(s_tmp, "#%d ", (*num)++); TRACE_APPEND_STRL(s_tmp, strlen(s_tmp)); @@ -1313,11 +1290,18 @@ static int mysqlnd_build_trace_string(zval **frame TSRMLS_DC, int num_args, va_l long line; HashTable *ht = Z_ARRVAL_PP(frame); zval **file, **tmp; + uint * level; + level = va_arg(args, uint *); str = va_arg(args, char**); len = va_arg(args, int*); num = va_arg(args, int*); + if (!*level) { + return ZEND_HASH_APPLY_KEEP; + } + --*level; + s_tmp = emalloc(1 + MAX_LENGTH_OF_LONG + 1 + 1); sprintf(s_tmp, "#%d ", (*num)++); TRACE_APPEND_STRL(s_tmp, strlen(s_tmp)); @@ -1353,24 +1337,30 @@ static int mysqlnd_build_trace_string(zval **frame TSRMLS_DC, int num_args, va_l #endif -char * mysqlnd_get_backtrace(TSRMLS_D) +PHPAPI char * mysqlnd_get_backtrace(uint max_levels, size_t * length TSRMLS_DC) { zval *trace; char *res = estrdup(""), **str = &res, *s_tmp; int res_len = 0, *len = &res_len, num = 0; + if (max_levels == 0) { + max_levels = 99999; + } MAKE_STD_ZVAL(trace); zend_fetch_debug_backtrace(trace, 0, 0 TSRMLS_CC); - zend_hash_apply_with_arguments(Z_ARRVAL_P(trace) TSRMLS_CC, (apply_func_args_t)mysqlnd_build_trace_string, 3, str, len, &num); + zend_hash_apply_with_arguments(Z_ARRVAL_P(trace) TSRMLS_CC, (apply_func_args_t)mysqlnd_build_trace_string, 4, &max_levels, str, len, &num); zval_ptr_dtor(&trace); - s_tmp = emalloc(1 + MAX_LENGTH_OF_LONG + 7 + 1); - sprintf(s_tmp, "#%d {main}", num); - TRACE_APPEND_STRL(s_tmp, strlen(s_tmp)); - efree(s_tmp); + if (max_levels) { + s_tmp = emalloc(1 + MAX_LENGTH_OF_LONG + 7 + 1); + sprintf(s_tmp, "#%d {main}", num); + TRACE_APPEND_STRL(s_tmp, strlen(s_tmp)); + efree(s_tmp); + } res[res_len] = '\0'; + *length = res_len; return res; } diff --git a/ext/mysqlnd/mysqlnd_debug.h b/ext/mysqlnd/mysqlnd_debug.h index 13eeb24cd..be46cf0cb 100644 --- a/ext/mysqlnd/mysqlnd_debug.h +++ b/ext/mysqlnd/mysqlnd_debug.h @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: mysqlnd_debug.h 278018 2009-03-30 13:55:47Z johannes $ */ +/* $Id: mysqlnd_debug.h 294543 2010-02-04 20:28:55Z johannes $ */ #ifndef MYSQLND_DEBUG_H #define MYSQLND_DEBUG_H @@ -36,7 +36,7 @@ struct st_mysqlnd_debug_methods enum_func_status (*log_va)(MYSQLND_DEBUG *self, unsigned int line, const char * const file, unsigned int level, const char * type, const char *format, ...); zend_bool (*func_enter)(MYSQLND_DEBUG *self, unsigned int line, const char * const file, - char * func_name, unsigned int func_name_len); + const char * const func_name, unsigned int func_name_len); enum_func_status (*func_leave)(MYSQLND_DEBUG *self, unsigned int line, const char * const file); enum_func_status (*close)(MYSQLND_DEBUG *self); enum_func_status (*free_handle)(MYSQLND_DEBUG *self); @@ -55,43 +55,67 @@ struct st_mysqlnd_debug zend_stack call_stack; HashTable not_filtered_functions; struct st_mysqlnd_debug_methods *m; + const char ** skip_functions; }; +PHPAPI extern const char * mysqlnd_debug_std_no_trace_funcs[]; -PHPAPI MYSQLND_DEBUG *mysqlnd_debug_init(TSRMLS_D); +PHPAPI MYSQLND_DEBUG * mysqlnd_debug_init(const char * skip_functions[] TSRMLS_DC); #define MYSQLND_MEM_D TSRMLS_DC ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC -void * _mysqlnd_emalloc(size_t size MYSQLND_MEM_D); -void * _mysqlnd_pemalloc(size_t size, zend_bool persistent MYSQLND_MEM_D); -void * _mysqlnd_ecalloc(unsigned int nmemb, size_t size MYSQLND_MEM_D); -void * _mysqlnd_pecalloc(unsigned int nmemb, size_t size, zend_bool persistent MYSQLND_MEM_D); -void * _mysqlnd_erealloc(void *ptr, size_t new_size MYSQLND_MEM_D); -void * _mysqlnd_perealloc(void *ptr, size_t new_size, zend_bool persistent MYSQLND_MEM_D); -void _mysqlnd_efree(void *ptr MYSQLND_MEM_D); -void _mysqlnd_pefree(void *ptr, zend_bool persistent MYSQLND_MEM_D); -void * _mysqlnd_malloc(size_t size MYSQLND_MEM_D); -void * _mysqlnd_calloc(unsigned int nmemb, size_t size MYSQLND_MEM_D); -void * _mysqlnd_realloc(void *ptr, size_t new_size MYSQLND_MEM_D); -void _mysqlnd_free(void *ptr MYSQLND_MEM_D); +PHPAPI void * _mysqlnd_emalloc(size_t size MYSQLND_MEM_D); +PHPAPI void * _mysqlnd_pemalloc(size_t size, zend_bool persistent MYSQLND_MEM_D); +PHPAPI void * _mysqlnd_ecalloc(unsigned int nmemb, size_t size MYSQLND_MEM_D); +PHPAPI void * _mysqlnd_pecalloc(unsigned int nmemb, size_t size, zend_bool persistent MYSQLND_MEM_D); +PHPAPI void * _mysqlnd_erealloc(void *ptr, size_t new_size MYSQLND_MEM_D); +PHPAPI void * _mysqlnd_perealloc(void *ptr, size_t new_size, zend_bool persistent MYSQLND_MEM_D); +PHPAPI void _mysqlnd_efree(void *ptr MYSQLND_MEM_D); +PHPAPI void _mysqlnd_pefree(void *ptr, zend_bool persistent MYSQLND_MEM_D); +PHPAPI void * _mysqlnd_malloc(size_t size MYSQLND_MEM_D); +PHPAPI void * _mysqlnd_calloc(unsigned int nmemb, size_t size MYSQLND_MEM_D); +PHPAPI void * _mysqlnd_realloc(void *ptr, size_t new_size MYSQLND_MEM_D); +PHPAPI void _mysqlnd_free(void *ptr MYSQLND_MEM_D); -char * mysqlnd_get_backtrace(TSRMLS_D); +PHPAPI char * mysqlnd_get_backtrace(uint max_levels, size_t * length TSRMLS_DC); + +#if defined(__GNUC__) +#define DBG_INF_EX(dbg_obj, msg) do { if (dbg_skip_trace == FALSE) (dbg_obj)->m->log((dbg_obj), __LINE__, __FILE__, -1, "info : ", (msg)); } while (0) +#define DBG_ERR_EX(dbg_obj, msg) do { if (dbg_skip_trace == FALSE) (dbg_obj)->m->log((dbg_obj), __LINE__, __FILE__, -1, "error: ", (msg)); } while (0) +#define DBG_INF_FMT_EX(dbg_obj, ...) do { if (dbg_skip_trace == FALSE) (dbg_obj)->m->log_va((dbg_obj), __LINE__, __FILE__, -1, "info : ", __VA_ARGS__); } while (0) +#define DBG_ERR_FMT_EX(dbg_obj, ...) do { if (dbg_skip_trace == FALSE) (dbg_obj)->m->log_va((dbg_obj), __LINE__, __FILE__, -1, "error: ", __VA_ARGS__); } while (0) + +#define DBG_ENTER_EX(dbg_obj, func_name) zend_bool dbg_skip_trace = TRUE; if ((dbg_obj)) dbg_skip_trace = !(dbg_obj)->m->func_enter((dbg_obj), __LINE__, __FILE__, func_name, strlen(func_name)); +#define DBG_RETURN_EX(dbg_obj, value) do { if ((dbg_obj)) (dbg_obj)->m->func_leave((dbg_obj), __LINE__, __FILE__); return (value); } while (0) +#define DBG_VOID_RETURN_EX(dbg_obj) do { if ((dbg_obj)) (dbg_obj)->m->func_leave((dbg_obj), __LINE__, __FILE__); return; } while (0) + +#else +static inline void DBG_INF_EX(MYSQLND_DEBUG * dbg_obj, const char * const msg) {} +static inline void DBG_ERR_EX(MYSQLND_DEBUG * dbg_obj, const char * const msg) {} +static inline void DBG_INF_FMT_EX(MYSQLND_DEBUG * dbg_obj, ...) {} +static inline void DBG_ERR_FMT_EX(MYSQLND_DEBUG * dbg_obj, ...) {} +static inline void DBG_ENTER_EX(MYSQLND_DEBUG * dbg_obj, const char * const func_name) {} +#define DBG_RETURN_EX(dbg_obj, value) return (value) +#define DBG_VOID_RETURN_EX(dbg_obj) return + +#endif #if MYSQLND_DBG_ENABLED == 1 -#define DBG_INF(msg) do { if (dbg_skip_trace == FALSE) MYSQLND_G(dbg)->m->log(MYSQLND_G(dbg), __LINE__, __FILE__, -1, "info : ", (msg)); } while (0) -#define DBG_ERR(msg) do { if (dbg_skip_trace == FALSE) MYSQLND_G(dbg)->m->log(MYSQLND_G(dbg), __LINE__, __FILE__, -1, "error: ", (msg)); } while (0) -#define DBG_INF_FMT(...) do { if (dbg_skip_trace == FALSE) MYSQLND_G(dbg)->m->log_va(MYSQLND_G(dbg), __LINE__, __FILE__, -1, "info : ", __VA_ARGS__); } while (0) -#define DBG_ERR_FMT(...) do { if (dbg_skip_trace == FALSE) MYSQLND_G(dbg)->m->log_va(MYSQLND_G(dbg), __LINE__, __FILE__, -1, "error: ", __VA_ARGS__); } while (0) +#define DBG_INF(msg) DBG_INF_EX(MYSQLND_G(dbg), (msg)) +#define DBG_ERR(msg) DBG_ERR_EX(MYSQLND_G(dbg), (msg)) +#define DBG_INF_FMT(...) DBG_INF_FMT_EX(MYSQLND_G(dbg), __VA_ARGS__) +#define DBG_ERR_FMT(...) DBG_ERR_FMT_EX(MYSQLND_G(dbg), __VA_ARGS__) -#define DBG_ENTER(func_name) zend_bool dbg_skip_trace = TRUE; if (MYSQLND_G(dbg)) dbg_skip_trace = !MYSQLND_G(dbg)->m->func_enter(MYSQLND_G(dbg), __LINE__, __FILE__, func_name, strlen(func_name)); -#define DBG_RETURN(value) do { if (MYSQLND_G(dbg)) MYSQLND_G(dbg)->m->func_leave(MYSQLND_G(dbg), __LINE__, __FILE__); return (value); } while (0) -#define DBG_VOID_RETURN do { if (MYSQLND_G(dbg)) MYSQLND_G(dbg)->m->func_leave(MYSQLND_G(dbg), __LINE__, __FILE__); return; } while (0) +#define DBG_ENTER(func_name) DBG_ENTER_EX(MYSQLND_G(dbg), (func_name)) +#define DBG_RETURN(value) DBG_RETURN_EX(MYSQLND_G(dbg), (value)) +#define DBG_VOID_RETURN DBG_VOID_RETURN_EX(MYSQLND_G(dbg)) #elif MYSQLND_DBG_ENABLED == 0 + static inline void DBG_INF(const char * const msg) {} static inline void DBG_ERR(const char * const msg) {} static inline void DBG_INF_FMT(const char * const format, ...) {} @@ -99,6 +123,7 @@ static inline void DBG_ERR_FMT(const char * const format, ...) {} static inline void DBG_ENTER(const char * const func_name) {} #define DBG_RETURN(value) return (value) #define DBG_VOID_RETURN return + #endif diff --git a/ext/mysqlnd/mysqlnd_enum_n_def.h b/ext/mysqlnd/mysqlnd_enum_n_def.h index 554dab8cc..281319c73 100644 --- a/ext/mysqlnd/mysqlnd_enum_n_def.h +++ b/ext/mysqlnd/mysqlnd_enum_n_def.h @@ -18,10 +18,21 @@ +----------------------------------------------------------------------+ */ -/* $Id: mysqlnd_enum_n_def.h 289630 2009-10-14 13:51:25Z johannes $ */ +/* $Id: mysqlnd_enum_n_def.h 293779 2010-01-20 17:09:28Z johannes $ */ #ifndef MYSQLND_ENUM_N_DEF_H #define MYSQLND_ENUM_N_DEF_H +#ifndef TRUE +#define TRUE 1 +#endif + +#ifndef FALSE +#define FALSE 0 +#endif + + +#define MYSQLND_MIN_COMPRESS_LEN 0 + #define MYSQLND_MAX_PACKET_SIZE (256L*256L*256L-1) #define MYSQLND_ERRMSG_SIZE 512 @@ -354,6 +365,8 @@ typedef enum mysqlnd_collected_stats STAT_ROWS_FETCHED_FROM_CLIENT_PS_BUF, STAT_ROWS_FETCHED_FROM_CLIENT_PS_UNBUF, STAT_ROWS_FETCHED_FROM_CLIENT_PS_CURSOR, + STAT_ROWS_AFFECTED_NORMAL, + STAT_ROWS_AFFECTED_PS, STAT_ROWS_SKIPPED_NORMAL, STAT_ROWS_SKIPPED_PS, STAT_COPY_ON_WRITE_SAVED, @@ -432,10 +445,93 @@ typedef enum mysqlnd_collected_stats STAT_BINARY_TYPE_FETCHED_OTHER, STAT_INIT_COMMAND_EXECUTED_COUNT, STAT_INIT_COMMAND_FAILED_COUNT, + STAT_COM_QUIT, + STAT_COM_INIT_DB, + STAT_COM_QUERY, + STAT_COM_FIELD_LIST, + STAT_COM_CREATE_DB, + STAT_COM_DROP_DB, + STAT_COM_REFRESH, + STAT_COM_SHUTDOWN, + STAT_COM_STATISTICS, + STAT_COM_PROCESS_INFO, + STAT_COM_CONNECT, + STAT_COM_PROCESS_KILL, + STAT_COM_DEBUG, + STAT_COM_PING, + STAT_COM_TIME, + STAT_COM_DELAYED_INSERT, + STAT_COM_CHANGE_USER, + STAT_COM_BINLOG_DUMP, + STAT_COM_TABLE_DUMP, + STAT_COM_CONNECT_OUT, + STAT_COM_REGISTER_SLAVE, + STAT_COM_STMT_PREPARE, + STAT_COM_STMT_EXECUTE, + STAT_COM_STMT_SEND_LONG_DATA, + STAT_COM_STMT_CLOSE, + STAT_COM_STMT_RESET, + STAT_COM_SET_OPTION, + STAT_COM_STMT_FETCH, + STAT_COM_DAEMON, STAT_LAST /* Should be always the last */ } enum_mysqlnd_collected_stats; +/* Enums */ +enum mysqlnd_packet_type +{ + PROT_GREET_PACKET= 0, + PROT_AUTH_PACKET, + PROT_OK_PACKET, + PROT_EOF_PACKET, + PROT_CMD_PACKET, + PROT_RSET_HEADER_PACKET, + PROT_RSET_FLD_PACKET, + PROT_ROW_PACKET, + PROT_STATS_PACKET, + PROT_PREPARE_RESP_PACKET, + PROT_CHG_USER_RESP_PACKET, + PROT_LAST, /* should always be last */ +}; + + +enum php_mysqlnd_server_command +{ + COM_SLEEP = 0, + COM_QUIT, + COM_INIT_DB, + COM_QUERY, + COM_FIELD_LIST, + COM_CREATE_DB, + COM_DROP_DB, + COM_REFRESH, + COM_SHUTDOWN, + COM_STATISTICS, + COM_PROCESS_INFO, + COM_CONNECT, + COM_PROCESS_KILL, + COM_DEBUG, + COM_PING, + COM_TIME = 15, + COM_DELAYED_INSERT, + COM_CHANGE_USER, + COM_BINLOG_DUMP, + COM_TABLE_DUMP, + COM_CONNECT_OUT = 20, + COM_REGISTER_SLAVE, + COM_STMT_PREPARE = 22, + COM_STMT_EXECUTE = 23, + COM_STMT_SEND_LONG_DATA = 24, + COM_STMT_CLOSE = 25, + COM_STMT_RESET = 26, + COM_SET_OPTION = 27, + COM_STMT_FETCH = 28, + COM_DAEMON, + COM_END +}; + + #define MYSQLND_DEFAULT_PREFETCH_ROWS (ulong) 1 #define MYSQLND_REFRESH_GRANT 1 /* Refresh grant tables */ diff --git a/ext/mysqlnd/mysqlnd_libmysql_compat.h b/ext/mysqlnd/mysqlnd_libmysql_compat.h index a9e15c71a..78f48c97b 100644 --- a/ext/mysqlnd/mysqlnd_libmysql_compat.h +++ b/ext/mysqlnd/mysqlnd_libmysql_compat.h @@ -41,7 +41,7 @@ /* functions */ #define mysql_affected_rows(r) mysqlnd_affected_rows((r)) #define mysql_autocommit(r,m) mysqlnd_autocommit((r),(m)) -#define mysql_change_user(r,a,b,c) mysqlnd_change_user((r), (a), (b), (c)) +#define mysql_change_user(r,a,b,c) mysqlnd_change_user((r), (a), (b), (c), FALSE) #define mysql_character_set_name(c) mysqlnd_character_set_name((c)) #define mysql_close(r) mysqlnd_close((r), MYSQLND_CLOSE_EXPLICIT) #define mysql_commit(r) mysqlnd_commit((r)) diff --git a/ext/mysqlnd/mysqlnd_loaddata.c b/ext/mysqlnd/mysqlnd_loaddata.c index f37aff51b..77670ec1f 100644 --- a/ext/mysqlnd/mysqlnd_loaddata.c +++ b/ext/mysqlnd/mysqlnd_loaddata.c @@ -25,12 +25,6 @@ #include "mysqlnd_priv.h" #include "mysqlnd_debug.h" -enum_func_status mysqlnd_simple_command_handle_response(MYSQLND *conn, - enum php_mysql_packet_type ok_packet, - zend_bool silent, enum php_mysqlnd_server_command command, - zend_bool ignore_upsert_status - TSRMLS_DC); - #define ALLOC_CALLBACK_ARGS(a, b, c)\ if (c) {\ @@ -75,7 +69,7 @@ int mysqlnd_local_infile_init(void **ptr, char *filename, void **userdata TSRMLS if (info->fd == NULL) { snprintf((char *)info->error_msg, sizeof(info->error_msg), "Can't find file '%-.64s'.", filename); - info->error_no = MYSQLND_EE_FILENOTFOUND; + info->error_no = MYSQLND_EE_FILENOTFOUND; DBG_RETURN(1); } @@ -188,7 +182,7 @@ mysqlnd_handle_local_infile(MYSQLND *conn, const char *filename, zend_bool *is_w if (!(conn->options.flags & CLIENT_LOCAL_FILES)) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "LOAD DATA LOCAL INFILE forbidden"); /* write empty packet to server */ - ret = mysqlnd_stream_write_w_header(conn, empty_packet, 0 TSRMLS_CC); + ret = conn->net->m.send(conn, empty_packet, 0 TSRMLS_CC); *is_warning = TRUE; goto infile_error; } @@ -196,7 +190,7 @@ mysqlnd_handle_local_infile(MYSQLND *conn, const char *filename, zend_bool *is_w infile = conn->infile; /* allocate buffer for reading data */ buf = (char *)mnd_ecalloc(1, buflen); - + *is_warning = FALSE; /* init handler: allocate read buffer and open file */ @@ -208,14 +202,14 @@ mysqlnd_handle_local_infile(MYSQLND *conn, const char *filename, zend_bool *is_w infile.local_infile_error(info, conn->error_info.error, sizeof(conn->error_info.error) TSRMLS_CC); /* write empty packet to server */ - ret = mysqlnd_stream_write_w_header(conn, empty_packet, 0 TSRMLS_CC); + ret = conn->net->m.send(conn, empty_packet, 0 TSRMLS_CC); goto infile_error; } /* read data */ while ((bufsize = infile.local_infile_read (info, buf + MYSQLND_HEADER_SIZE, buflen - MYSQLND_HEADER_SIZE TSRMLS_CC)) > 0) { - if ((ret = mysqlnd_stream_write_w_header(conn, buf, bufsize TSRMLS_CC)) < 0) { + if ((ret = conn->net->m.send(conn, buf, bufsize TSRMLS_CC)) < 0) { DBG_ERR_FMT("Error during read : %d %s %s", CR_SERVER_LOST, UNKNOWN_SQLSTATE, lost_conn); SET_CLIENT_ERROR(conn->error_info, CR_SERVER_LOST, UNKNOWN_SQLSTATE, lost_conn); goto infile_error; @@ -223,7 +217,7 @@ mysqlnd_handle_local_infile(MYSQLND *conn, const char *filename, zend_bool *is_w } /* send empty packet for eof */ - if ((ret = mysqlnd_stream_write_w_header(conn, empty_packet, 0 TSRMLS_CC)) < 0) { + if ((ret = conn->net->m.send(conn, empty_packet, 0 TSRMLS_CC)) < 0) { SET_CLIENT_ERROR(conn->error_info, CR_SERVER_LOST, UNKNOWN_SQLSTATE, lost_conn); goto infile_error; } @@ -242,7 +236,7 @@ mysqlnd_handle_local_infile(MYSQLND *conn, const char *filename, zend_bool *is_w infile_error: /* get response from server and update upsert values */ - if (FAIL == mysqlnd_simple_command_handle_response(conn, PROT_OK_PACKET, FALSE, COM_QUERY, FALSE TSRMLS_CC)) { + if (FAIL == conn->m->simple_command_handle_response(conn, PROT_OK_PACKET, FALSE, COM_QUERY, FALSE TSRMLS_CC)) { result = FAIL; } diff --git a/ext/mysqlnd/mysqlnd_net.c b/ext/mysqlnd/mysqlnd_net.c new file mode 100644 index 000000000..8f4c46e9d --- /dev/null +++ b/ext/mysqlnd/mysqlnd_net.c @@ -0,0 +1,744 @@ +/* + +----------------------------------------------------------------------+ + | PHP Version 6 | + +----------------------------------------------------------------------+ + | Copyright (c) 2006-2009 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.01 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_01.txt | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Georg Richter | + | Andrey Hristov | + | Ulf Wendel | + +----------------------------------------------------------------------+ +*/ +#include "php.h" +#include "php_globals.h" +#include "mysqlnd.h" +#include "mysqlnd_priv.h" +#include "mysqlnd_wireprotocol.h" +#include "mysqlnd_statistics.h" +#include "mysqlnd_debug.h" +#include "mysqlnd_block_alloc.h" +#include "ext/standard/sha1.h" +#include "php_network.h" +#include "zend_ini.h" +#ifdef MYSQLND_COMPRESSION_ENABLED +#include +#endif + +#ifndef PHP_WIN32 +#include +#else +#include +#endif + + +/* {{{ mysqlnd_set_sock_no_delay */ +static int +mysqlnd_set_sock_no_delay(php_stream * stream) +{ + + int socketd = ((php_netstream_data_t*)stream->abstract)->socket; + int ret = SUCCESS; + int flag = 1; + int result = setsockopt(socketd, IPPROTO_TCP, TCP_NODELAY, (char *) &flag, sizeof(int)); + TSRMLS_FETCH(); + + DBG_ENTER("mysqlnd_set_sock_no_delay"); + + if (result == -1) { + ret = FAILURE; + } + + DBG_RETURN(ret); +} +/* }}} */ + + +/* {{{ mysqlnd_net::network_read */ +static enum_func_status +MYSQLND_METHOD(mysqlnd_net, network_read)(MYSQLND * conn, zend_uchar * buffer, size_t count TSRMLS_DC) +{ + size_t to_read = count, ret; + size_t old_chunk_size = conn->net->stream->chunk_size; + DBG_ENTER("mysqlnd_net::network_read"); + DBG_INF_FMT("count=%u", count); + conn->net->stream->chunk_size = MIN(to_read, conn->net->options.net_read_buffer_size); + while (to_read) { + if (!(ret = php_stream_read(conn->net->stream, (char *) buffer, to_read))) { + DBG_ERR_FMT("Error while reading header from socket"); + DBG_RETURN(FAIL); + } + buffer += ret; + to_read -= ret; + } + MYSQLND_INC_CONN_STATISTIC_W_VALUE(conn->stats, STAT_BYTES_RECEIVED, count); + conn->net->stream->chunk_size = old_chunk_size; + DBG_RETURN(PASS); +} +/* }}} */ + + +/* {{{ mysqlnd_net::network_write */ +static size_t +MYSQLND_METHOD(mysqlnd_net, network_write)(MYSQLND * const conn, const zend_uchar * const buf, size_t count TSRMLS_DC) +{ + size_t ret; + DBG_ENTER("mysqlnd_net::network_write"); + ret = php_stream_write(conn->net->stream, (char *)buf, count); + DBG_RETURN(ret); +} +/* }}} */ + + + +/* {{{ mysqlnd_net::connect */ +static enum_func_status +MYSQLND_METHOD(mysqlnd_net, connect)(MYSQLND_NET * net, const char * const scheme, size_t scheme_len, zend_bool persistent, char **errstr, int * errcode TSRMLS_DC) +{ + unsigned int streams_options = ENFORCE_SAFE_MODE; + unsigned int streams_flags = STREAM_XPORT_CLIENT | STREAM_XPORT_CONNECT; + char * hashed_details = NULL; + int hashed_details_len = 0; + struct timeval tv; + DBG_ENTER("mysqlnd_net::connect"); + + if (persistent) { + hashed_details_len = spprintf(&hashed_details, 0, "%p", net); + DBG_INF_FMT("hashed_details=%s", hashed_details); + } + + net->packet_no = net->compressed_envelope_packet_no = 0; + + if (net->options.timeout_connect) { + tv.tv_sec = net->options.timeout_connect; + tv.tv_usec = 0; + } + + net->stream = php_stream_xport_create(scheme, scheme_len, streams_options, streams_flags, + hashed_details, (net->options.timeout_connect) ? &tv : NULL, + NULL /*ctx*/, errstr, errcode); + + + if (*errstr || !net->stream) { + if (hashed_details) { + efree(hashed_details); + } + *errcode = CR_CONNECTION_ERROR; + DBG_RETURN(FAIL); + } + + if (hashed_details) { + /* + If persistent, the streams register it in EG(persistent_list). + This is unwanted. ext/mysql or ext/mysqli are responsible to clean, + whatever they have to. + */ + zend_rsrc_list_entry *le; + + if (zend_hash_find(&EG(persistent_list), hashed_details, hashed_details_len + 1, + (void*) &le) == SUCCESS) { + /* + in_free will let streams code skip destructing - big HACK, + but STREAMS suck big time regarding persistent streams. + Just not compatible for extensions that need persistency. + */ + net->stream->in_free = 1; + zend_hash_del(&EG(persistent_list), hashed_details, hashed_details_len + 1); + net->stream->in_free = 0; + } +#if ZEND_DEBUG + /* Shut-up the streams, they don't know what they are doing */ + net->stream->__exposed = 1; +#endif + efree(hashed_details); + } + + if (!net->options.timeout_read) { + /* should always happen because read_timeout cannot be set via API */ + net->options.timeout_read = (unsigned int) MYSQLND_G(net_read_timeout); + } + if (net->options.timeout_read) + { + tv.tv_sec = net->options.timeout_read; + tv.tv_usec = 0; + php_stream_set_option(net->stream, PHP_STREAM_OPTION_READ_TIMEOUT, 0, &tv); + } + + if (!memcmp(scheme, "tcp://", sizeof("tcp://") - 1)) { + /* TCP -> Set TCP_NODELAY */ + mysqlnd_set_sock_no_delay(net->stream); + } + + { + unsigned int buf_size = MYSQLND_G(net_read_buffer_size); /* this is long, cast to unsigned int*/ + net->m.set_client_option(net, MYSQLND_OPT_NET_READ_BUFFER_SIZE, (char *)&buf_size TSRMLS_CC); + } + + + DBG_RETURN(PASS); +} +/* }}} */ + + +/* We assume that MYSQLND_HEADER_SIZE is 4 bytes !! */ +#define STORE_HEADER_SIZE(safe_storage, buffer) int4store((safe_storage), (*(uint32_t *)(buffer))) +#define RESTORE_HEADER_SIZE(buffer, safe_storage) STORE_HEADER_SIZE((safe_storage), (buffer)) + +/* {{{ mysqlnd_net::send */ +/* + IMPORTANT : It's expected that buf has place in the beginning for MYSQLND_HEADER_SIZE !!!! + This is done for performance reasons in the caller of this function. + Otherwise we will have to do send two TCP packets, or do new alloc and memcpy. + Neither are quick, thus the clients of this function are obligated to do + what they are asked for. + + `count` is actually the length of the payload data. Thus : + count + MYSQLND_HEADER_SIZE = sizeof(buf) (not the pointer but the actual buffer) +*/ +size_t +MYSQLND_METHOD(mysqlnd_net, send)(MYSQLND * const conn, char * const buf, size_t count TSRMLS_DC) +{ + zend_uchar safe_buf[((MYSQLND_HEADER_SIZE) + (sizeof(zend_uchar)) - 1) / (sizeof(zend_uchar))]; + zend_uchar *safe_storage = safe_buf; + MYSQLND_NET *net = conn->net; + size_t old_chunk_size = net->stream->chunk_size; + size_t ret, packets_sent = 1; + size_t left = count; + zend_uchar *p = (zend_uchar *) buf; + zend_uchar * compress_buf = NULL; + size_t to_be_sent; + + DBG_ENTER("mysqlnd_net::send"); + DBG_INF_FMT("conn=%llu count=%lu compression=%d", conn->thread_id, count, net->compressed); + + net->stream->chunk_size = MYSQLND_MAX_PACKET_SIZE; + + if (net->compressed == TRUE) { + size_t comp_buf_size = MYSQLND_HEADER_SIZE + COMPRESSED_HEADER_SIZE + MYSQLND_HEADER_SIZE + MIN(left, MYSQLND_MAX_PACKET_SIZE); + DBG_INF_FMT("compress_buf_size=%d", comp_buf_size); + compress_buf = emalloc(comp_buf_size); + } + + do { + to_be_sent = MIN(left, MYSQLND_MAX_PACKET_SIZE); +#ifdef MYSQLND_COMPRESSION_ENABLED + if (net->compressed == TRUE) { + /* here we need to compress the data and then write it, first comes the compressed header */ + size_t tmp_complen = to_be_sent; + size_t payload_size; + zend_uchar * uncompressed_payload = p; /* should include the header */ + + STORE_HEADER_SIZE(safe_storage, uncompressed_payload); + int3store(uncompressed_payload, to_be_sent); + int1store(uncompressed_payload + 3, net->packet_no); + if (PASS == net->m.encode((compress_buf + COMPRESSED_HEADER_SIZE + MYSQLND_HEADER_SIZE), tmp_complen, uncompressed_payload, to_be_sent + MYSQLND_HEADER_SIZE TSRMLS_CC)) { + int3store(compress_buf + MYSQLND_HEADER_SIZE, to_be_sent + MYSQLND_HEADER_SIZE); + payload_size = tmp_complen; + } else { + int3store(compress_buf + MYSQLND_HEADER_SIZE, 0); + memcpy(compress_buf + MYSQLND_HEADER_SIZE + COMPRESSED_HEADER_SIZE, uncompressed_payload, to_be_sent + MYSQLND_HEADER_SIZE); + payload_size = to_be_sent + MYSQLND_HEADER_SIZE; + } + RESTORE_HEADER_SIZE(uncompressed_payload, safe_storage); + + int3store(compress_buf, payload_size); + int1store(compress_buf + 3, net->packet_no); + DBG_INF_FMT("writing %d bytes to the network", payload_size + MYSQLND_HEADER_SIZE + COMPRESSED_HEADER_SIZE); + ret = conn->net->m.network_write(conn, compress_buf, payload_size + MYSQLND_HEADER_SIZE + COMPRESSED_HEADER_SIZE TSRMLS_CC); + net->compressed_envelope_packet_no++; + #if WHEN_WE_NEED_TO_CHECK_WHETHER_COMPRESSION_WORKS_CORRECTLY + if (res == Z_OK) { + size_t decompressed_size = left + MYSQLND_HEADER_SIZE; + zend_uchar * decompressed_data = malloc(decompressed_size); + int error = net->m.decode(decompressed_data, decompressed_size, compress_buf + MYSQLND_HEADER_SIZE + COMPRESSED_HEADER_SIZE, payload_size); + if (error == Z_OK) { + int i; + DBG_INF("success decompressing"); + for (i = 0 ; i < decompressed_size; i++) { + if (i && (i % 30 == 0)) { + printf("\n\t\t"); + } + printf("%.2X ", (int)*((char*)&(decompressed_data[i]))); + DBG_INF_FMT("%.2X ", (int)*((char*)&(decompressed_data[i]))); + } + } else { + DBG_INF("error decompressing"); + } + free(decompressed_data); + } + #endif /* WHEN_WE_NEED_TO_CHECK_WHETHER_COMPRESSION_WORKS_CORRECTLY */ + } else +#endif /* MYSQLND_COMPRESSION_ENABLED */ + { + DBG_INF("no compression"); + STORE_HEADER_SIZE(safe_storage, p); + int3store(p, to_be_sent); + int1store(p + 3, net->packet_no); + ret = conn->net->m.network_write(conn, p, to_be_sent + MYSQLND_HEADER_SIZE TSRMLS_CC); + RESTORE_HEADER_SIZE(p, safe_storage); + net->compressed_envelope_packet_no++; + } + net->packet_no++; + + p += to_be_sent; + left -= to_be_sent; + packets_sent++; + /* + if left is 0 then there is nothing more to send, but if the last packet was exactly + with the size MYSQLND_MAX_PACKET_SIZE we need to send additional packet, which has + empty payload. Thus if left == 0 we check for to_be_sent being the max size. If it is + indeed it then loop once more, then to_be_sent will become 0, left will stay 0. Empty + packet will be sent and this loop will end. + */ + } while (ret && (left > 0 || to_be_sent == MYSQLND_MAX_PACKET_SIZE)); + + DBG_INF_FMT("packet_size=%d packet_no=%d", left, net->packet_no); + /* Even for zero size payload we have to send a packet */ + if (!ret) { + DBG_ERR_FMT("Can't %u send bytes", count); + conn->state = CONN_QUIT_SENT; + SET_CLIENT_ERROR(conn->error_info, CR_SERVER_GONE_ERROR, UNKNOWN_SQLSTATE, mysqlnd_server_gone); + } + + MYSQLND_INC_CONN_STATISTIC_W_VALUE3(conn->stats, + STAT_BYTES_SENT, count + packets_sent * MYSQLND_HEADER_SIZE, + STAT_PROTOCOL_OVERHEAD_OUT, packets_sent * MYSQLND_HEADER_SIZE, + STAT_PACKETS_SENT, packets_sent); + + net->stream->chunk_size = old_chunk_size; + if (compress_buf) { + efree(compress_buf); + } + DBG_RETURN(ret); +} +/* }}} */ + + +#ifdef MYSQLND_COMPRESSION_ENABLED +/* {{{ php_mysqlnd_read_buffer_is_empty */ +static zend_bool +php_mysqlnd_read_buffer_is_empty(MYSQLND_READ_BUFFER * buffer) +{ + return buffer->len? FALSE:TRUE; +} +/* }}} */ + + +/* {{{ php_mysqlnd_read_buffer_read */ +static void +php_mysqlnd_read_buffer_read(MYSQLND_READ_BUFFER * buffer, size_t count, zend_uchar * dest) +{ + if (buffer->len >= count) { + memcpy(dest, buffer->data + buffer->offset, count); + buffer->offset += count; + buffer->len -= count; + } +} +/* }}} */ + + +/* {{{ php_mysqlnd_read_buffer_bytes_left */ +static size_t +php_mysqlnd_read_buffer_bytes_left(MYSQLND_READ_BUFFER * buffer) +{ + return buffer->len; +} +/* }}} */ + + +/* {{{ php_mysqlnd_read_buffer_free */ +static void +php_mysqlnd_read_buffer_free(MYSQLND_READ_BUFFER ** buffer TSRMLS_DC) +{ + DBG_ENTER("php_mysqlnd_read_buffer_free"); + if (*buffer) { + mnd_efree((*buffer)->data); + mnd_efree(*buffer); + *buffer = NULL; + } + DBG_VOID_RETURN; +} +/* }}} */ + + +/* {{{ php_mysqlnd_create_read_buffer */ +static MYSQLND_READ_BUFFER * +mysqlnd_create_read_buffer(size_t count TSRMLS_DC) +{ + MYSQLND_READ_BUFFER * ret = mnd_emalloc(sizeof(MYSQLND_READ_BUFFER)); + DBG_ENTER("mysqlnd_create_read_buffer"); + ret->is_empty = php_mysqlnd_read_buffer_is_empty; + ret->read = php_mysqlnd_read_buffer_read; + ret->bytes_left = php_mysqlnd_read_buffer_bytes_left; + ret->free_buffer = php_mysqlnd_read_buffer_free; + ret->data = mnd_emalloc(count); + ret->size = ret->len = count; + ret->offset = 0; + DBG_RETURN(ret); +} +/* }}} */ + + +/* {{{ mysqlnd_read_compressed_packet_from_stream_and_fill_read_buffer */ +static enum_func_status +mysqlnd_read_compressed_packet_from_stream_and_fill_read_buffer(MYSQLND * conn, size_t net_payload_size TSRMLS_DC) +{ + MYSQLND_NET * net = conn->net; + size_t decompressed_size; + enum_func_status ret = PASS; + zend_uchar * compressed_data = NULL; + zend_uchar comp_header[COMPRESSED_HEADER_SIZE]; + DBG_ENTER("mysqlnd_read_compressed_packet_from_stream_and_fill_read_buffer"); + + /* Read the compressed header */ + if (FAIL == conn->net->m.network_read(conn, comp_header, COMPRESSED_HEADER_SIZE TSRMLS_CC)) { + DBG_RETURN(FAIL); + } + decompressed_size = uint3korr(comp_header); + + /* When decompressed_size is 0, then the data is not compressed, and we have wasted 3 bytes */ + /* we need to decompress the data */ + + if (decompressed_size) { + compressed_data = emalloc(net_payload_size); + if (FAIL == conn->net->m.network_read(conn, compressed_data, net_payload_size TSRMLS_CC)) { + ret = FAIL; + goto end; + } + net->uncompressed_data = mysqlnd_create_read_buffer(decompressed_size TSRMLS_CC); + ret = net->m.decode(net->uncompressed_data->data, decompressed_size, compressed_data, net_payload_size TSRMLS_CC); + if (ret == FAIL) { + goto end; + } + } else { + DBG_INF_FMT("The server decided not to compress the data. Our job is easy. Copying %u bytes", net_payload_size); + net->uncompressed_data = mysqlnd_create_read_buffer(net_payload_size TSRMLS_CC); + if (FAIL == conn->net->m.network_read(conn, net->uncompressed_data->data, net_payload_size TSRMLS_CC)) { + ret = FAIL; + goto end; + } + } +end: + if (compressed_data) { + efree(compressed_data); + } + DBG_RETURN(ret); +} +/* }}} */ +#endif /* MYSQLND_COMPRESSION_ENABLED */ + + +/* {{{ mysqlnd_net::decode */ +static enum_func_status +MYSQLND_METHOD(mysqlnd_net, decode)(zend_uchar * uncompressed_data, size_t uncompressed_data_len, + const zend_uchar * const compressed_data, size_t compressed_data_len TSRMLS_DC) +{ + int error; + uLongf tmp_complen = uncompressed_data_len; + DBG_ENTER("mysqlnd_net::decode"); + error = uncompress(uncompressed_data, &tmp_complen, compressed_data, compressed_data_len); + + DBG_INF_FMT("compressed data: decomp_len=%d compressed_size=%d", tmp_complen, compressed_data_len); + if (error != Z_OK) { + DBG_INF_FMT("decompression NOT successful. error=%d Z_OK=%d Z_BUF_ERROR=%d Z_MEM_ERROR=%d", error, Z_OK, Z_BUF_ERROR, Z_MEM_ERROR); + } + DBG_RETURN(error == Z_OK? PASS:FAIL); +} +/* }}} */ + + +/* {{{ mysqlnd_net::encode */ +static enum_func_status +MYSQLND_METHOD(mysqlnd_net, encode)(zend_uchar * compress_buffer, size_t compress_buffer_len, + const zend_uchar * const uncompressed_data, size_t uncompressed_data_len TSRMLS_DC) +{ + int error; + uLongf tmp_complen = compress_buffer_len; + DBG_ENTER("mysqlnd_net::encode"); + error = compress(compress_buffer, &tmp_complen, uncompressed_data, uncompressed_data_len); + + if (error != Z_OK) { + DBG_INF_FMT("compression NOT successful. error=%d Z_OK=%d Z_BUF_ERROR=%d Z_MEM_ERROR=%d", error, Z_OK, Z_BUF_ERROR, Z_MEM_ERROR); + } else { + DBG_INF_FMT("compression successful. compressed size=%d", tmp_complen); + } + DBG_RETURN(error == Z_OK? PASS:FAIL); +} +/* }}} */ + + +/* {{{ mysqlnd_net::receive */ +static size_t +MYSQLND_METHOD(mysqlnd_net, receive)(MYSQLND * conn, zend_uchar * buffer, size_t count TSRMLS_DC) +{ + size_t to_read = count; + zend_uchar * p = buffer; + MYSQLND_NET * net = conn->net; + + DBG_ENTER("mysqlnd_net::receive"); +#ifdef MYSQLND_COMPRESSION_ENABLED + if (net->compressed) { + if (net->uncompressed_data) { + size_t to_read_from_buffer = MIN(net->uncompressed_data->bytes_left(net->uncompressed_data), to_read); + DBG_INF_FMT("reading %u from uncompressed_data buffer", to_read_from_buffer); + if (to_read_from_buffer) { + net->uncompressed_data->read(net->uncompressed_data, to_read_from_buffer, (zend_uchar *) p); + p += to_read_from_buffer; + to_read -= to_read_from_buffer; + } + DBG_INF_FMT("left %u to read", to_read); + if (TRUE == net->uncompressed_data->is_empty(net->uncompressed_data)) { + /* Everything was consumed. This should never happen here, but for security */ + net->uncompressed_data->free_buffer(&net->uncompressed_data TSRMLS_CC); + } + } + if (to_read) { + zend_uchar net_header[MYSQLND_HEADER_SIZE]; + size_t net_payload_size; + zend_uchar packet_no; + + if (FAIL == net->m.network_read(conn, net_header, MYSQLND_HEADER_SIZE TSRMLS_CC)) { + DBG_RETURN(FAIL); + } + net_payload_size = uint3korr(net_header); + packet_no = uint1korr(net_header + 3); + if (net->compressed_envelope_packet_no != packet_no) { + DBG_ERR_FMT("Transport level: packets out of order. Expected %d received %d. Packet size=%d", + net->compressed_envelope_packet_no, packet_no, net_payload_size); + + php_error(E_WARNING, "Packets out of order. Expected %d received %d. Packet size="MYSQLND_SZ_T_SPEC, + net->compressed_envelope_packet_no, packet_no, net_payload_size); + DBG_RETURN(FAIL); + } + net->compressed_envelope_packet_no++; +#ifdef MYSQLND_DUMP_HEADER_N_BODY + DBG_INF_FMT("HEADER: hwd_packet_no=%d size=%3d", packet_no, net_payload_size); +#endif + /* Now let's read from the wire, decompress it and fill the read buffer */ + mysqlnd_read_compressed_packet_from_stream_and_fill_read_buffer(conn, net_payload_size TSRMLS_CC); + + /* + Now a bit of recursion - read from the read buffer, + if the data which we have just read from the wire + is not enough, then the recursive call will try to + satisfy it until it is satisfied. + */ + DBG_RETURN(net->m.receive(conn, p, to_read TSRMLS_CC)); + } + DBG_RETURN(PASS); + } +#endif /* MYSQLND_COMPRESSION_ENABLED */ + DBG_RETURN(net->m.network_read(conn, p, to_read TSRMLS_CC)); +} +/* }}} */ + + +/* {{{ mysqlnd_net::set_client_option */ +static enum_func_status +MYSQLND_METHOD(mysqlnd_net, set_client_option)(MYSQLND_NET * const net, enum mysqlnd_option option, const char * const value TSRMLS_DC) +{ + DBG_ENTER("mysqlnd_net::set_client_option"); + DBG_INF_FMT("option=%d", option); + switch (option) { + case MYSQLND_OPT_NET_CMD_BUFFER_SIZE: + DBG_INF("MYSQLND_OPT_NET_CMD_BUFFER_SIZE"); + if (*(unsigned int*) value < MYSQLND_NET_CMD_BUFFER_MIN_SIZE) { + DBG_RETURN(FAIL); + } + net->cmd_buffer.length = *(unsigned int*) value; + DBG_INF_FMT("new_length=%u", net->cmd_buffer.length); + if (!net->cmd_buffer.buffer) { + net->cmd_buffer.buffer = mnd_pemalloc(net->cmd_buffer.length, net->persistent); + } else { + net->cmd_buffer.buffer = mnd_perealloc(net->cmd_buffer.buffer, net->cmd_buffer.length, net->persistent); + } + break; + case MYSQLND_OPT_NET_READ_BUFFER_SIZE: + DBG_INF("MYSQLND_OPT_NET_READ_BUFFER_SIZE"); + net->options.net_read_buffer_size = *(unsigned int*) value; + DBG_INF_FMT("new_length=%u", net->options.net_read_buffer_size); + break; + case MYSQL_OPT_CONNECT_TIMEOUT: + DBG_INF("MYSQL_OPT_CONNECT_TIMEOUT"); + net->options.timeout_connect = *(unsigned int*) value; + break; +#ifdef WHEN_SUPPORTED_BY_MYSQLI + case MYSQL_OPT_READ_TIMEOUT: + DBG_INF("MYSQL_OPT_READ_TIMEOUT"); + net->options.timeout_read = *(unsigned int*) value; + break; + case MYSQL_OPT_WRITE_TIMEOUT: + DBG_INF("MYSQL_OPT_WRITE_TIMEOUT"); + net->options.timeout_write = *(unsigned int*) value; + break; +#endif +#ifdef WHEN_SUPPORTED_BY_MYSQLI + case MYSQL_OPT_COMPRESS: +#endif + /* currently not supported. Todo!! */ + break; + default: + DBG_RETURN(FAIL); + } + DBG_RETURN(PASS); +} +/* }}} */ + +/* {{{ mysqlnd_net::consume_uneaten_data */ +size_t +MYSQLND_METHOD(mysqlnd_net, consume_uneaten_data)(MYSQLND_NET * const net, enum php_mysqlnd_server_command cmd TSRMLS_DC) +{ +#ifdef MYSQLND_DO_WIRE_CHECK_BEFORE_COMMAND + /* + Switch to non-blocking mode and try to consume something from + the line, if possible, then continue. This saves us from looking for + the actuall place where out-of-order packets have been sent. + If someone is completely sure that everything is fine, he can switch it + off. + */ + char tmp_buf[256]; + size_t skipped_bytes = 0; + int opt = PHP_STREAM_OPTION_BLOCKING; + int was_blocked = net->stream->ops->set_option(net->stream, opt, 0, NULL TSRMLS_CC); + + DBG_ENTER("mysqlnd_net::consume_uneaten_data"); + + if (PHP_STREAM_OPTION_RETURN_ERR != was_blocked) { + /* Do a read of 1 byte */ + int bytes_consumed; + + do { + skipped_bytes += (bytes_consumed = php_stream_read(net->stream, tmp_buf, sizeof(tmp_buf))); + } while (bytes_consumed == sizeof(tmp_buf)); + + if (was_blocked) { + net->stream->ops->set_option(net->stream, opt, 1, NULL TSRMLS_CC); + } + + if (bytes_consumed) { + DBG_ERR_FMT("Skipped %u bytes. Last command %s hasn't consumed all the output from the server", + bytes_consumed, mysqlnd_command_to_text[net->last_command]); + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Skipped %u bytes. Last command %s hasn't " + "consumed all the output from the server", + bytes_consumed, mysqlnd_command_to_text[net->last_command]); + } + } + net->last_command = cmd; + + DBG_RETURN(skipped_bytes); +#else + return 0; +#endif +} +/* }}} */ + + + +/* {{{ mysqlnd_net::set_client_option */ +static void +MYSQLND_METHOD(mysqlnd_net, free_contents)(MYSQLND_NET * net TSRMLS_DC) +{ + DBG_ENTER("mysqlnd_net::free_contents"); + +#ifdef MYSQLND_COMPRESSION_ENABLED + if (net->uncompressed_data) { + net->uncompressed_data->free_buffer(&net->uncompressed_data TSRMLS_CC); + } +#endif + DBG_VOID_RETURN; +} +/* }}} */ + + +/* {{{ mysqlnd_net_init */ +PHPAPI MYSQLND_NET * +mysqlnd_net_init(zend_bool persistent TSRMLS_DC) +{ + size_t alloc_size = sizeof(MYSQLND_NET) + mysqlnd_plugin_count() * sizeof(void *); + MYSQLND_NET * net = mnd_pecalloc(1, alloc_size, persistent); + + DBG_ENTER("mysqlnd_net_init"); + DBG_INF_FMT("persistent=%d", persistent); + net->persistent = persistent; + + net->m.connect = MYSQLND_METHOD(mysqlnd_net, connect); + net->m.send = MYSQLND_METHOD(mysqlnd_net, send); + net->m.receive = MYSQLND_METHOD(mysqlnd_net, receive); + net->m.set_client_option = MYSQLND_METHOD(mysqlnd_net, set_client_option); + net->m.network_read = MYSQLND_METHOD(mysqlnd_net, network_read); + net->m.network_write = MYSQLND_METHOD(mysqlnd_net, network_write); + net->m.decode = MYSQLND_METHOD(mysqlnd_net, decode); + net->m.encode = MYSQLND_METHOD(mysqlnd_net, encode); + net->m.consume_uneaten_data = MYSQLND_METHOD(mysqlnd_net, consume_uneaten_data); + net->m.free_contents = MYSQLND_METHOD(mysqlnd_net, free_contents); + + { + unsigned int buf_size = MYSQLND_G(net_read_buffer_size); /* this is long, cast to unsigned int*/ + net->m.set_client_option(net, MYSQLND_OPT_NET_CMD_BUFFER_SIZE, (char *) &buf_size TSRMLS_CC); + } + DBG_RETURN(net); +} +/* }}} */ + + +/* {{{ mysqlnd_net_free */ +PHPAPI void +mysqlnd_net_free(MYSQLND_NET * const net TSRMLS_DC) +{ + zend_bool pers = net->persistent; + + DBG_ENTER("mysqlnd_net_free"); + + if (net) { + net->m.free_contents(net TSRMLS_CC); + if (net->cmd_buffer.buffer) { + DBG_INF("Freeing cmd buffer"); + mnd_pefree(net->cmd_buffer.buffer, pers); + net->cmd_buffer.buffer = NULL; + } + + if (net->stream) { + DBG_INF_FMT("Freeing stream. abstract=%p", net->stream->abstract); + if (pers) { + php_stream_free(net->stream, PHP_STREAM_FREE_CLOSE_PERSISTENT | PHP_STREAM_FREE_RSRC_DTOR); + } else { + php_stream_free(net->stream, PHP_STREAM_FREE_CLOSE); + } + net->stream = NULL; + } + mnd_pefree(net, pers); + } + DBG_VOID_RETURN; +} +/* }}} */ + + +/* {{{ _mysqlnd_plugin_get_plugin_net_data */ +PHPAPI void ** _mysqlnd_plugin_get_plugin_net_data(const MYSQLND_NET * net, unsigned int plugin_id TSRMLS_DC) +{ + DBG_ENTER("_mysqlnd_plugin_get_plugin_net_data"); + DBG_INF_FMT("plugin_id=%u", plugin_id); + if (!net || plugin_id >= mysqlnd_plugin_count()) { + return NULL; + } + DBG_RETURN((void *)((char *)net + sizeof(MYSQLND_NET) + plugin_id * sizeof(void *))); +} +/* }}} */ + + + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + * vim600: noet sw=4 ts=4 fdm=marker + * vim<600: noet sw=4 ts=4 + */ diff --git a/ext/mysqlnd/mysqlnd_net.h b/ext/mysqlnd/mysqlnd_net.h new file mode 100644 index 000000000..8f75a8eb2 --- /dev/null +++ b/ext/mysqlnd/mysqlnd_net.h @@ -0,0 +1,38 @@ +/* + +----------------------------------------------------------------------+ + | PHP Version 6 | + +----------------------------------------------------------------------+ + | Copyright (c) 2006-2009 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.01 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_01.txt | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Georg Richter | + | Andrey Hristov | + | Ulf Wendel | + +----------------------------------------------------------------------+ +*/ + +/* $Id: mysqlnd_wireprotocol.h 291983 2009-12-11 11:58:57Z andrey $ */ + +#ifndef MYSQLND_NET_H +#define MYSQLND_NET_H + +PHPAPI MYSQLND_NET * mysqlnd_net_init(zend_bool persistent TSRMLS_DC); +PHPAPI void mysqlnd_net_free(MYSQLND_NET * const net TSRMLS_DC); + +#endif /* MYSQLND_NET_H */ + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + * vim600: noet sw=4 ts=4 fdm=marker + * vim<600: noet sw=4 ts=4 + */ diff --git a/ext/mysqlnd/mysqlnd_palloc.c b/ext/mysqlnd/mysqlnd_palloc.c deleted file mode 100644 index 6146e6f00..000000000 --- a/ext/mysqlnd/mysqlnd_palloc.c +++ /dev/null @@ -1,605 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | PHP Version 6 | - +----------------------------------------------------------------------+ - | Copyright (c) 2006-2009 The PHP Group | - +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Authors: Georg Richter | - | Andrey Hristov | - | Ulf Wendel | - +----------------------------------------------------------------------+ -*/ - -/* $Id: mysqlnd_palloc.c 289630 2009-10-14 13:51:25Z johannes $ */ -#include "php.h" -#include "mysqlnd.h" -#include "mysqlnd_priv.h" -#include "mysqlnd_palloc.h" -#include "mysqlnd_debug.h" - -/* Used in mysqlnd_debug.c */ -char * mysqlnd_palloc_zval_ptr_dtor_name = "mysqlnd_palloc_zval_ptr_dtor"; -char * mysqlnd_palloc_get_zval_name = "mysqlnd_palloc_get_zval"; - - -#ifdef ZTS -#define LOCK_PCACHE(cache) tsrm_mutex_lock((cache)->LOCK_access) -#define UNLOCK_PCACHE(cache) tsrm_mutex_unlock((cache)->LOCK_access) -#else -#define LOCK_PCACHE(cache) -#define UNLOCK_PCACHE(cache) -#endif - - -/* {{{ _mysqlnd_palloc_init_cache */ -PHPAPI MYSQLND_ZVAL_PCACHE* _mysqlnd_palloc_init_cache(unsigned int cache_size TSRMLS_DC) -{ - MYSQLND_ZVAL_PCACHE *ret = mnd_calloc(1, sizeof(MYSQLND_ZVAL_PCACHE)); - unsigned int i; - - DBG_ENTER("_mysqlnd_palloc_init_cache"); - DBG_INF_FMT("cache=%p size=%u", ret, cache_size); - -#ifdef ZTS - ret->LOCK_access = tsrm_mutex_alloc(); -#endif - - ret->max_items = cache_size; - ret->free_items = cache_size; - ret->references = 1; - - /* 1. First initialize the free list part of the structure */ - /* One more for empty position of last_added - always 0x0, bounds checking */ - ret->free_list.ptr_line = mnd_calloc(ret->max_items + 1, sizeof(mysqlnd_zval *)); - ret->free_list.last_added = ret->free_list.ptr_line + ret->max_items; - ret->free_list.canary1 = (void*)0xBEEF; - ret->free_list.canary2 = (void*)0xAFFE; - - /* 3. Allocate and initialize our zvals and initialize the free list */ - ret->block = mnd_calloc(ret->max_items, sizeof(mysqlnd_zval)); - ret->last_in_block = &(ret->block[ret->max_items]); - for (i = 0; i < ret->max_items; i++) { - /* 1. Initialize */ - INIT_PZVAL(&(ret->block[i].zv)); - ZVAL_NULL(&(ret->block[i].zv)); - /* Assure it will never be freed before MSHUTDOWN */ - Z_ADDREF_P(&(ret->block[i].zv)); - /* 2. Add to the free list */ - *(--ret->free_list.last_added) = &(ret->block[i]); - } - - DBG_RETURN(ret); -} -/* }}} */ - - -/* {{{ mysqlnd_palloc_get_cache_reference */ -MYSQLND_ZVAL_PCACHE* mysqlnd_palloc_get_cache_reference(MYSQLND_ZVAL_PCACHE * const cache) -{ - if (cache) { - LOCK_PCACHE(cache); - cache->references++; - UNLOCK_PCACHE(cache); - } - return cache; -} -/* }}} */ - - -/* {{{ mysqlnd_palloc_free_cache */ -/* - As this call will happen on MSHUTDOWN(), then we don't need to copy the zvals with - copy_ctor but scrap what they point to with zval_dtor() and then just free our - pre-allocated block. Precondition is that we ZVAL_NULL() the zvals when we put them - to the free list after usage. We ZVAL_NULL() them when we allocate them in the - constructor of the cache. -*/ -void _mysqlnd_palloc_free_cache(MYSQLND_ZVAL_PCACHE *cache TSRMLS_DC) -{ - DBG_ENTER("_mysqlnd_palloc_free_cache"); - DBG_INF_FMT("cache=%p", cache); - -#ifdef ZTS - tsrm_mutex_free(cache->LOCK_access); -#endif - - /* Data in pointed by 'block' was cleaned in RSHUTDOWN */ - mnd_free(cache->block); - mnd_free(cache->free_list.ptr_line); - mnd_free(cache); - - DBG_VOID_RETURN; -} -/* }}} */ - - -/* {{{ _mysqlnd_palloc_init_thd_cache */ -PHPAPI MYSQLND_THD_ZVAL_PCACHE* _mysqlnd_palloc_init_thd_cache(MYSQLND_ZVAL_PCACHE * const cache TSRMLS_DC) -{ - MYSQLND_THD_ZVAL_PCACHE *ret = mnd_calloc(1, sizeof(MYSQLND_THD_ZVAL_PCACHE)); - DBG_ENTER("_mysqlnd_palloc_init_thd_cache"); - DBG_INF_FMT("ret = %p", ret); - -#if PHP_DEBUG - LOCK_PCACHE(cache); - if (cache->references == 1 && cache->max_items != cache->free_items) { - UNLOCK_PCACHE(cache); - php_error_docref(NULL TSRMLS_CC, E_WARNING, "No references to mysqlnd's zval cache but max_items != free_items"); - } else { - UNLOCK_PCACHE(cache); - } -#endif - ret->parent = mysqlnd_palloc_get_cache_reference(cache); - -#ifdef ZTS - ret->thread_id = tsrm_thread_id(); -#endif - - ret->references = 1; - - /* 1. Initialize the GC list */ - ret->gc_list.ptr_line = mnd_calloc(cache->max_items, sizeof(mysqlnd_zval *)); - /* Backward and forward looping is possible */ - ret->gc_list.last_added = ret->gc_list.ptr_line; - ret->gc_list.canary1 = (void*)0xCAFE; - ret->gc_list.canary2 = (void*)0x190280; - - DBG_INF_FMT("ptr_line=%p last_added=%p", ret->gc_list.ptr_line, ret->gc_list.last_added); - DBG_RETURN(ret); -} -/* }}} */ - - -/* {{{ _mysqlnd_palloc_get_thd_cache_reference */ -MYSQLND_THD_ZVAL_PCACHE* _mysqlnd_palloc_get_thd_cache_reference(MYSQLND_THD_ZVAL_PCACHE * const cache TSRMLS_DC) -{ - DBG_ENTER("_mysqlnd_palloc_get_thd_cache_reference"); - if (cache) { - ++cache->references; - DBG_INF_FMT("cache=%p new_refc=%d gc_list.canary1=%p gc_list.canary2=%p", - cache, cache->references, cache->gc_list.canary1, cache->gc_list.canary2); - mysqlnd_palloc_get_cache_reference(cache->parent); - } - DBG_RETURN(cache); -} -/* }}} */ - - -/* {{{ mysqlnd_palloc_free_cache */ -/* - As this call will happen on MSHUTDOWN(), then we don't need to copy the zvals with - copy_ctor but scrap what they point to with zval_dtor() and then just free our - pre-allocated block. Precondition is that we ZVAL_NULL() the zvals when we put them - to the free list after usage. We ZVAL_NULL() them when we allocate them in the - constructor of the cache. -*/ -static -void mysqlnd_palloc_free_thd_cache(MYSQLND_THD_ZVAL_PCACHE *thd_cache TSRMLS_DC) -{ - MYSQLND_ZVAL_PCACHE *global_cache; - mysqlnd_zval **p; - - DBG_ENTER("mysqlnd_palloc_free_thd_cache"); - DBG_INF_FMT("thd_cache=%p", thd_cache); - - if ((global_cache = thd_cache->parent)) { - /* - Keep in mind that for pthreads pthread_equal() should be used to be - fully standard compliant. However, the PHP code all-around, incl. the - the Zend MM uses direct comparison. - */ - p = thd_cache->gc_list.ptr_line; - while (p < thd_cache->gc_list.last_added) { - zval_dtor(&(*p)->zv); - p++; - } - - p = thd_cache->gc_list.ptr_line; - - LOCK_PCACHE(global_cache); - while (p < thd_cache->gc_list.last_added) { - (*p)->point_type = MYSQLND_POINTS_FREE; - *(--global_cache->free_list.last_added) = *p; - ++global_cache->free_items; -#ifdef ZTS - memset(&((*p)->thread_id), 0, sizeof(THREAD_T)); -#endif - p++; - } - UNLOCK_PCACHE(global_cache); - - } - mnd_free(thd_cache->gc_list.ptr_line); - mnd_free(thd_cache); - - DBG_VOID_RETURN; -} -/* }}} */ - - -/* {{{ _mysqlnd_palloc_free_thd_cache_reference */ -PHPAPI void _mysqlnd_palloc_free_thd_cache_reference(MYSQLND_THD_ZVAL_PCACHE **cache TSRMLS_DC) -{ - DBG_ENTER("_mysqlnd_palloc_free_thd_cache_reference"); - if (*cache) { - --(*cache)->parent->references; - DBG_INF_FMT("cache=%p references_left=%d canary1=%p canary2=%p", - *cache, (*cache)->references, (*cache)->gc_list.canary1, (*cache)->gc_list.canary2); - - DBG_INF_FMT("gc_list.ptr_line=%p gc_list.last_added=%p", (*cache)->gc_list.ptr_line, (*cache)->gc_list.last_added); - - if (--(*cache)->references == 0) { - mysqlnd_palloc_free_thd_cache(*cache TSRMLS_CC); - } - *cache = NULL; - } - DBG_VOID_RETURN; -} -/* }}} */ - - -/* - The cache line is a big contiguous array of zval pointers. - Because the CPU cache will cache starting from an address, and not - before it, then we have to organize our structure according to this. - Thus, if 'last_added' is valid pointer (not NULL) then last_added is - increased. When zval is cached, if there is room, last_added is decreased - and then the zval pointer will be assigned to it. This means that some - positions may become hot points and stay in the cache. - Imagine we have 5 pointers in a line - 1. last_added = list_item->ptr_line + cache->max_items; - 2. get_zval -> *last_added = NULL. Use MAKE_STD_ZVAL - 3. get_zval -> *last_added = NULL. Use MAKE_STD_ZVAL - 4. get_zval -> *last_added = NULL. Use MAKE_STD_ZVAL - 0x0 - 0x0 - 0x0 - 0x0 - 0x0 - --- - empty_position, always 0x0 <-- last_added - - 5. free_zval -> if (free_items++ != max_items) {// we can add more - *(--last_added) = zval_ptr; - } - (memory addresses increase downwards) - 0x0 - 0x0 - 0x0 - 0x0 - 0xA <-- last_added - --- - 0x0 - - 6. free_zval -> if (free_items++ != max_items) {// we can add more - *(--last_added) = zval_ptr; - } - 0x0 - 0x0 - 0x0 - 0xB <-- last_added - 0xA - --- - 0x0 - - 7. free_zval -> if (free_items++ != max_items) {// we can add more - *(--last_added) = zval_ptr; - } - 0x0 - 0x0 - 0xC <-- last_added - 0xB - 0xA - --- - 0x0 - - 8. get_zval -> *last_added != NULL. -> p = *last_added; *last_added++ = NULL; - 0x0 - 0x0 - 0x0 - 0xB <-- last_added - 0xA - --- - 0x0 - - 9. get_zval -> *last_added != NULL. -> p = *last_added; *last_added++ = NULL; - 0x0 - 0x0 - 0x0 - 0x0 - 0xA <-- last_added - --- - 0x0 - - 10. get_zval -> *last_added != NULL. -> p = *last_added; *last_added++ = NULL; - 0x0 - 0x0 - 0x0 - 0x0 - 0x0 - --- - 0x0 <-- last_added - -*/ - - -/* {{{ mysqlnd_palloc_get_zval */ -void *mysqlnd_palloc_get_zval(MYSQLND_THD_ZVAL_PCACHE * const thd_cache, zend_bool *allocated TSRMLS_DC) -{ - void *ret = NULL; - - DBG_ENTER("mysqlnd_palloc_get_zval"); - if (thd_cache) { - DBG_INF_FMT("cache=%p *last_added=%p free_items=%d", - thd_cache, thd_cache->parent->free_list.last_added, - thd_cache->parent->free_items); - DBG_INF_FMT("gc_list.ptr_line=%p gc_list.last_added=%p gc_list.canary1=%p gc_list.canary2=%p", - thd_cache->gc_list.ptr_line, thd_cache->gc_list.last_added, - thd_cache->gc_list.canary1, thd_cache->gc_list.canary2); - } - - if (thd_cache) { - MYSQLND_ZVAL_PCACHE *cache = thd_cache->parent; - LOCK_PCACHE(cache); - - DBG_INF_FMT("free_items=%d free_list.ptr_line=%p free_list.last_added=%p *free_list.last_added=%p free_list.canary1=%p free_list.canary2=%p", - cache->free_items, cache->free_list.ptr_line, cache->free_list.last_added, - *cache->free_list.last_added, - cache->free_list.canary1, cache->free_list.canary2); - - /* We have max_items + 1 allocated block for free_list, thus we know if we */ - if ((ret = *cache->free_list.last_added)) { - *cache->free_list.last_added++ = NULL; - *allocated = FALSE; -#ifdef ZTS - ((mysqlnd_zval *) ret)->thread_id = thd_cache->thread_id; -#endif - --cache->free_items; - ++cache->get_hits; - } else { - ++cache->get_misses; - } - UNLOCK_PCACHE(cache); - } - if (!ret) { - /* - We allocate a bit more. The user of this function will use it, but at - end it will use only the zval part. Because the zval part is first then - when freeing the zval part the whole allocated block will be cleaned, not - only the zval part (by the Engine when destructing the zval). - */ - ALLOC_ZVAL(ret); - INIT_PZVAL((zval *) ret); - *allocated = TRUE; - } else { - /* This will set the refcount to 1, increase it, to keep the variable */ - INIT_PZVAL(&((mysqlnd_zval *) ret)->zv); - Z_ADDREF_P(&(((mysqlnd_zval *)ret)->zv)); - } - - DBG_INF_FMT("allocated=%d ret=%p", *allocated, ret); - DBG_RETURN(ret); -} -/* }}} */ - - -/* {{{ mysqlnd_palloc_zval_ptr_dtor */ -void mysqlnd_palloc_zval_ptr_dtor(zval **zv, MYSQLND_THD_ZVAL_PCACHE * const thd_cache, - enum_mysqlnd_res_type type, zend_bool *copy_ctor_called TSRMLS_DC) -{ - MYSQLND_ZVAL_PCACHE *cache; - DBG_ENTER("mysqlnd_palloc_zval_ptr_dtor"); - if (thd_cache) { - DBG_INF_FMT("cache=%p parent_block=%p last_in_block=%p *zv=%p refc=%d type=%d ", - thd_cache, - thd_cache->parent->block, - thd_cache->parent->last_in_block, - *zv, Z_REFCOUNT_PP(zv), type); - DBG_INF_FMT("gc_list.ptr_line=%p gc_list.last_added=%p gc_list.canary1=%p gc_list.canary2=%p", - thd_cache->gc_list.ptr_line, thd_cache->gc_list.last_added, thd_cache->gc_list.canary1, thd_cache->gc_list.canary2); - } - *copy_ctor_called = FALSE; - /* Check whether cache is used and the zval is from the cache */ - if (!thd_cache || !(cache = thd_cache->parent) || ((char *)*zv < (char *)thd_cache->parent->block || - (char *)*zv > (char *)thd_cache->parent->last_in_block)) { - /* - This zval is not from the cache block. - Thus the refcount is -1 than of a zval from the cache, - because the zvals from the cache are owned by it. - */ - if (type == MYSQLND_RES_PS_BUF || type == MYSQLND_RES_PS_UNBUF) { - ; /* do nothing, zval_ptr_dtor will do the job*/ - } else if (Z_REFCOUNT_PP(zv) > 1) { - /* - Not a prepared statement, then we have to - call copy_ctor and then zval_ptr_dtor() - - In Unicode mode the destruction of the zvals should not call - zval_copy_ctor() because then we will leak. - I suppose we can use UG(unicode) in mysqlnd.c when freeing a result set - to check if we need to call copy_ctor(). - - If the type is IS_UNICODE, which can happen with PHP6, then we don't - need to copy_ctor, as the data doesn't point to our internal buffers. - If it's string (in PHP5 always) and in PHP6 if data is binary, then - it still points to internal buffers and has to be copied. - */ - if (Z_TYPE_PP(zv) == IS_STRING) { - zval_copy_ctor(*zv); - } - *copy_ctor_called = TRUE; - } else { - if (Z_TYPE_PP(zv) == IS_STRING) { - ZVAL_NULL(*zv); - } - } - zval_ptr_dtor(zv); - DBG_VOID_RETURN; - } - - /* The zval is from our cache */ - /* refcount is always > 1, because we call Z_ADDREF_P(). Thus test refcount > 2 */ - if (Z_REFCOUNT_PP(zv) > 2) { - /* - Because the zval is first element in mysqlnd_zval structure, then we can - do upcasting from zval to mysqlnd_zval here. Because we know that this - zval is part of our pre-allocated block. - - Now check whether this zval points to ZE allocated memory or to our - buffers. If it points to the internal buffers, call copy_ctor() - which will do estrndup for strings. And nothing for null, int, double. - - This branch will be skipped for PS, because there is no need to copy - what is pointed by them, as they don't point to the internal buffers. - */ - if (((mysqlnd_zval *)*zv)->point_type == MYSQLND_POINTS_INT_BUFFER) { - zval_copy_ctor(*zv); - *copy_ctor_called = TRUE; - ((mysqlnd_zval *)*zv)->point_type = MYSQLND_POINTS_EXT_BUFFER; - } - /* - This will decrease the counter of the user-level (mysqlnd). When the engine - layer (the script) has finished working this this zval, when the variable is - no more used, out of scope whatever, then it will try zval_ptr_dtor() but - and the refcount will reach 1 and the engine won't try to destruct the - memory allocated by us. - */ - zval_ptr_dtor(zv); - - /* - Unfortunately, we can't return this variable to the free_list - because it's still used. And this cleaning up will happen at request - shutdown :(. - */ - LOCK_PCACHE(cache); - DBG_INF_FMT("gc_list.ptr_line=%p gc_list.last_added=%p *gc_list.last_added=%p free_list.canary1=%p free_list.canary2=%p", - thd_cache->gc_list.ptr_line, - thd_cache->gc_list.last_added, - *thd_cache->gc_list.last_added, - cache->free_list.canary1, cache->free_list.canary2); - if ((thd_cache->gc_list.last_added - thd_cache->gc_list.ptr_line) > (int) cache->max_items) { - DBG_ERR("Buffer overflow follows"); - DBG_ERR_FMT("parent->max_items=%d parent->free_items=%d diff=%d", - cache->max_items, cache->free_items, - thd_cache->gc_list.last_added - thd_cache->gc_list.ptr_line); - - php_error_docref(NULL TSRMLS_CC, E_WARNING, "We will get buffer overflow"); - } - ++cache->put_misses; - *(thd_cache->gc_list.last_added++) = (mysqlnd_zval *)*zv; - UNLOCK_PCACHE(cache); - } else { - DBG_INF("No user reference"); - /* No user reference */ - if (((mysqlnd_zval *)*zv)->point_type == MYSQLND_POINTS_EXT_BUFFER) { - DBG_INF("Points to external buffer. Calling zval_dtor"); - /* - PS are here - Unicode mode goes also here if the column is not binary but a text - */ - zval_dtor(*zv); - } - LOCK_PCACHE(cache); - ++cache->put_hits; - ++cache->free_items; - ((mysqlnd_zval *)*zv)->point_type = MYSQLND_POINTS_FREE; - Z_DELREF_PP(zv); /* Make it 1 */ - ZVAL_NULL(*zv); -#ifdef ZTS - memset(&((mysqlnd_zval *)*zv)->thread_id, 0, sizeof(THREAD_T)); -#endif - *(--cache->free_list.last_added) = (mysqlnd_zval *)*zv; - - UNLOCK_PCACHE(cache); - } - DBG_VOID_RETURN; -} -/* }}} */ - - -/* {{{ _mysqlnd_palloc_rinit */ -PHPAPI MYSQLND_THD_ZVAL_PCACHE * _mysqlnd_palloc_rinit(MYSQLND_ZVAL_PCACHE * cache TSRMLS_DC) -{ - return mysqlnd_palloc_init_thd_cache(cache); -} -/* }}} */ - - -/* {{{ _mysqlnd_palloc_rshutdown */ -PHPAPI void _mysqlnd_palloc_rshutdown(MYSQLND_THD_ZVAL_PCACHE * thd_cache TSRMLS_DC) -{ - DBG_ENTER("_mysqlnd_palloc_rshutdown"); - DBG_INF_FMT("cache=%p", thd_cache); - mysqlnd_palloc_free_thd_cache_reference(&thd_cache); - DBG_VOID_RETURN; -} -/* }}} */ - - -/* {{{ mysqlnd_palloc_rshutdown */ -PHPAPI void mysqlnd_palloc_stats(const MYSQLND_ZVAL_PCACHE * const cache, zval *return_value) -{ - if (cache) { -#if PHP_MAJOR_VERSION >= 6 - UChar *ustr; - int ulen; - - TSRMLS_FETCH(); -#endif - - LOCK_PCACHE(cache); - array_init(return_value); -#if PHP_MAJOR_VERSION >= 6 - zend_string_to_unicode(UG(utf8_conv), &ustr, &ulen, "put_hits", sizeof("put_hits") TSRMLS_CC); - add_u_assoc_long_ex(return_value, IS_UNICODE, ZSTR(ustr), ulen + 1, cache->put_hits); - efree(ustr); - zend_string_to_unicode(UG(utf8_conv), &ustr, &ulen, "put_misses", sizeof("put_misses") TSRMLS_CC); - add_u_assoc_long_ex(return_value, IS_UNICODE, ZSTR(ustr), ulen + 1, cache->put_hits); - efree(ustr); - zend_string_to_unicode(UG(utf8_conv), &ustr, &ulen, "get_hits", sizeof("get_hits") TSRMLS_CC); - add_u_assoc_long_ex(return_value, IS_UNICODE, ZSTR(ustr), ulen + 1, cache->put_hits); - efree(ustr); - zend_string_to_unicode(UG(utf8_conv), &ustr, &ulen, "get_misses", sizeof("get_misses") TSRMLS_CC); - add_u_assoc_long_ex(return_value, IS_UNICODE, ZSTR(ustr), ulen + 1, cache->put_hits); - efree(ustr); - zend_string_to_unicode(UG(utf8_conv), &ustr, &ulen, "size", sizeof("size") TSRMLS_CC); - add_u_assoc_long_ex(return_value, IS_UNICODE, ZSTR(ustr), ulen + 1, cache->put_hits); - efree(ustr); - zend_string_to_unicode(UG(utf8_conv), &ustr, &ulen, "free_items", sizeof("free_items") TSRMLS_CC); - add_u_assoc_long_ex(return_value, IS_UNICODE, ZSTR(ustr), ulen + 1, cache->put_hits); - efree(ustr); - zend_string_to_unicode(UG(utf8_conv), &ustr, &ulen, "references", sizeof("references") TSRMLS_CC); - add_u_assoc_long_ex(return_value, IS_UNICODE, ZSTR(ustr), ulen + 1, cache->put_hits); - efree(ustr); -#else - add_assoc_long_ex(return_value, "put_hits", sizeof("put_hits"), cache->put_hits); - add_assoc_long_ex(return_value, "put_misses", sizeof("put_misses"), cache->put_misses); - add_assoc_long_ex(return_value, "get_hits", sizeof("get_hits"), cache->get_hits); - add_assoc_long_ex(return_value, "get_misses", sizeof("get_misses"), cache->get_misses); - add_assoc_long_ex(return_value, "size", sizeof("size"), cache->max_items); - add_assoc_long_ex(return_value, "free_items", sizeof("free_items"), cache->free_items); - add_assoc_long_ex(return_value, "references", sizeof("references"), cache->references); -#endif - UNLOCK_PCACHE(cache); - } else { - ZVAL_NULL(return_value); - } -} -/* }}} */ - -/* - * Local variables: - * tab-width: 4 - * c-basic-offset: 4 - * End: - * vim600: noet sw=4 ts=4 fdm=marker - * vim<600: noet sw=4 ts=4 - */ diff --git a/ext/mysqlnd/mysqlnd_palloc.h b/ext/mysqlnd/mysqlnd_palloc.h deleted file mode 100644 index b67c01d41..000000000 --- a/ext/mysqlnd/mysqlnd_palloc.h +++ /dev/null @@ -1,116 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | PHP Version 6 | - +----------------------------------------------------------------------+ - | Copyright (c) 2006-2009 The PHP Group | - +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Authors: Georg Richter | - | Andrey Hristov | - | Ulf Wendel | - +----------------------------------------------------------------------+ -*/ - -/* $Id: mysqlnd_palloc.h 272370 2008-12-31 11:15:49Z sebastian $ */ -#ifndef MYSQLND_PALLOC_H -#define MYSQLND_PALLOC_H - -/* Used in mysqlnd_debug.c */ -extern char * mysqlnd_palloc_zval_ptr_dtor_name; -extern char * mysqlnd_palloc_get_zval_name; - - -/* Session caching allocator */ -struct st_mysqlnd_zval_list { - zval **ptr_line; - zval **last_added; -}; - -typedef struct st_mysqlnd_zval_cache MYSQLND_ZVAL_CACHE; - -struct st_mysqlnd_zval_cache { - struct st_mysqlnd_zval_list *free_list; - unsigned int free_items; - unsigned int max_items; - unsigned int references; - unsigned long get_hits; - unsigned long get_misses; - unsigned long put_hits; - unsigned long put_full_misses; - unsigned long put_refcount_misses; -}; - - -enum mysqlnd_zval_ptr_type -{ - MYSQLND_POINTS_INT_BUFFER, - MYSQLND_POINTS_EXT_BUFFER, - MYSQLND_POINTS_FREE -}; - -/* Persistent caching allocator */ -typedef struct st_mysqlnd_zval { - /* Should be first */ - zval zv; - enum mysqlnd_zval_ptr_type point_type; -#ifdef ZTS - THREAD_T thread_id; -#endif -} mysqlnd_zval; - - -typedef struct st_mysqlnd_ndzval_list { - mysqlnd_zval **ptr_line; /* we allocate this, all are pointers to the block */ - void *canary1; - void *canary2; - mysqlnd_zval **last_added; /* this points to the ptr_line, and moves left-right. It's our stack */ -} mysqlnd_ndzval_list; - - -struct st_mysqlnd_zval_pcache { - mysqlnd_zval *block; - mysqlnd_zval *last_in_block; - mysqlnd_ndzval_list free_list; /* Fetch from here */ - -#ifdef ZTS - MUTEX_T LOCK_access; -#endif - unsigned int references; - - /* These are just for statistics and not used for operational purposes */ - unsigned int free_items; - unsigned int max_items; - - unsigned long get_hits; - unsigned long get_misses; - unsigned long put_hits; - unsigned long put_misses; -}; - -struct st_mysqlnd_thread_zval_pcache { - struct st_mysqlnd_zval_pcache *parent; - - unsigned int references; -#ifdef ZTS - THREAD_T thread_id; -#endif - mysqlnd_ndzval_list gc_list; /* GC these from time to time */ -}; - -#endif /* MYSQLND_PALLOC_H */ - -/* - * Local variables: - * tab-width: 4 - * c-basic-offset: 4 - * End: - * vim600: noet sw=4 ts=4 fdm=marker - * vim<600: noet sw=4 ts=4 - */ diff --git a/ext/mysqlnd/mysqlnd_portability.h b/ext/mysqlnd/mysqlnd_portability.h index 43cb50586..ed0a5c8b1 100644 --- a/ext/mysqlnd/mysqlnd_portability.h +++ b/ext/mysqlnd/mysqlnd_portability.h @@ -235,47 +235,44 @@ typedef unsigned long long uint64_t; #define uint1korr(A) (*(((uint8_t*)(A)))) /* Bit values are sent in reverted order of bytes, compared to normal !!! */ -#define bit_uint2korr(A) ((uint16_t) (((uint16_t) (((zend_uchar*) (A))[1])) +\ - ((uint16_t) (((zend_uchar*) (A))[0]) << 8))) -#define bit_uint3korr(A) ((uint32_t) (((uint32_t) (((zend_uchar*) (A))[2])) +\ - (((uint32_t) (((zend_uchar*) (A))[1])) << 8) +\ - (((uint32_t) (((zend_uchar*) (A))[0])) << 16))) - -#define bit_uint4korr(A) ((uint32_t) (((uint32_t) (((zend_uchar*) (A))[3])) +\ - (((uint32_t) (((zend_uchar*) (A))[2])) << 8) +\ - (((uint32_t) (((zend_uchar*) (A))[1])) << 16) +\ - (((uint32_t) (((zend_uchar*) (A))[0])) << 24))) - -#define bit_uint5korr(A) ((uint64_t)(((uint32_t) ((zend_uchar) (A)[4])) +\ - (((uint32_t) ((zend_uchar) (A)[3])) << 8) +\ - (((uint32_t) ((zend_uchar) (A)[2])) << 16) +\ - (((uint32_t) ((zend_uchar) (A)[1])) << 24)) +\ - (((uint64_t) ((zend_uchar) (A)[0])) << 32)) - -#define bit_uint6korr(A) ((uint64_t)(((uint32_t) (((zend_uchar*) (A))[5])) +\ - (((uint32_t) (((zend_uchar*) (A))[4])) << 8) +\ - (((uint32_t) (((zend_uchar*) (A))[3])) << 16) +\ - (((uint32_t) (((zend_uchar*) (A))[2])) << 24)) +\ - (((uint64_t) (((uint32_t) (((zend_uchar*) (A))[1])) +\ - (((uint32_t) (((zend_uchar*) (A))[0]) << 8)))) << 32)) - -#define bit_uint7korr(A) ((uint64_t)(((uint32_t) (((zend_uchar*) (A))[6])) +\ - (((uint32_t) (((zend_uchar*) (A))[5])) << 8) +\ - (((uint32_t) (((zend_uchar*) (A))[4])) << 16) +\ - (((uint32_t) (((zend_uchar*) (A))[3])) << 24)) +\ - (((uint64_t) (((uint32_t) (((zend_uchar*) (A))[2])) +\ - (((uint32_t) (((zend_uchar*) (A))[1])) << 8) +\ - (((uint32_t) (((zend_uchar*) (A))[0])) << 16))) << 32)) - - -#define bit_uint8korr(A) ((uint64_t)(((uint32_t) (((zend_uchar*) (A))[7])) +\ - (((uint32_t) (((zend_uchar*) (A))[6])) << 8) +\ - (((uint32_t) (((zend_uchar*) (A))[5])) << 16) +\ - (((uint32_t) (((zend_uchar*) (A))[4])) << 24)) +\ - (((uint64_t) (((uint32_t) (((zend_uchar*) (A))[3])) +\ - (((uint32_t) (((zend_uchar*) (A))[2])) << 8) +\ - (((uint32_t) (((zend_uchar*) (A))[1])) << 16) +\ - (((uint32_t) (((zend_uchar*) (A))[0])) << 24))) << 32)) +#define bit_uint2korr(A) ((uint16_t) (((uint16_t) (((unsigned char*) (A))[1])) +\ + ((uint16_t) (((unsigned char*) (A))[0]) << 8))) +#define bit_uint3korr(A) ((uint32_t) (((uint32_t) (((unsigned char*) (A))[2])) +\ + (((uint32_t) (((unsigned char*) (A))[1])) << 8) +\ + (((uint32_t) (((unsigned char*) (A))[0])) << 16))) +#define bit_uint4korr(A) ((uint32_t) (((uint32_t) (((unsigned char*) (A))[3])) +\ + (((uint32_t) (((unsigned char*) (A))[2])) << 8) +\ + (((uint32_t) (((unsigned char*) (A))[1])) << 16) +\ + (((uint32_t) (((unsigned char*) (A))[0])) << 24))) +#define bit_uint5korr(A) ((uint64_t)(((uint32_t) (((unsigned char*) (A))[4])) +\ + (((uint32_t) (((unsigned char*) (A))[3])) << 8) +\ + (((uint32_t) (((unsigned char*) (A))[2])) << 16) +\ + (((uint32_t) (((unsigned char*) (A))[1])) << 24)) +\ + (((uint64_t) (((unsigned char*) (A))[0])) << 32)) +#define bit_uint6korr(A) ((uint64_t)(((uint32_t) (((unsigned char*) (A))[5])) +\ + (((uint32_t) (((unsigned char*) (A))[4])) << 8) +\ + (((uint32_t) (((unsigned char*) (A))[3])) << 16) +\ + (((uint32_t) (((unsigned char*) (A))[2])) << 24)) +\ + (((uint64_t) (((uint32_t) (((unsigned char*) (A))[1])) +\ + (((uint32_t) (((unsigned char*) (A))[0]) << 8)))) <<\ + 32)) +#define bit_uint7korr(A) ((uint64_t)(((uint32_t) (((unsigned char*) (A))[6])) +\ + (((uint32_t) (((unsigned char*) (A))[5])) << 8) +\ + (((uint32_t) (((unsigned char*) (A))[4])) << 16) +\ + (((uint32_t) (((unsigned char*) (A))[3])) << 24)) +\ + (((uint64_t) (((uint32_t) (((unsigned char*) (A))[2])) +\ + (((uint32_t) (((unsigned char*) (A))[1])) << 8) +\ + (((uint32_t) (((unsigned char*) (A))[0])) << 16))) <<\ + 32)) +#define bit_uint8korr(A) ((uint64_t)(((uint32_t) (((unsigned char*) (A))[7])) +\ + (((uint32_t) (((unsigned char*) (A))[6])) << 8) +\ + (((uint32_t) (((unsigned char*) (A))[5])) << 16) +\ + (((uint32_t) (((unsigned char*) (A))[4])) << 24)) +\ + (((uint64_t) (((uint32_t) (((unsigned char*) (A))[3])) +\ + (((uint32_t) (((unsigned char*) (A))[2])) << 8) +\ + (((uint32_t) (((unsigned char*) (A))[1])) << 16) +\ + (((uint32_t) (((unsigned char*) (A))[0])) << 24))) <<\ + 32)) /* @@ -372,16 +369,6 @@ typedef union { (((uint32_t) ((zend_uchar) (A)[2])) << 16) +\ (((uint32_t) ((zend_uchar) (A)[3])) << 24)) - -#define bit_uint8korr(A) ((uint64_t)(((uint32_t) (((zend_uchar*) (A))[7])) +\ - (((uint32_t) (((zend_uchar*) (A))[6])) << 8) +\ - (((uint32_t) (((zend_uchar*) (A))[5])) << 16) +\ - (((uint32_t) (((zend_uchar*) (A))[4])) << 24)) +\ - (((uint64_t) (((uint32_t) (((zend_uchar*) (A))[3])) +\ - (((uint32_t) (((zend_uchar*) (A))[2])) << 8) +\ - (((uint32_t) (((zend_uchar*) (A))[1])) << 16) +\ - (((uint32_t) (((zend_uchar*) (A))[0])) << 24))) << 32)) - #define uint8korr(A) ((uint64_t)(((uint32_t) ((zend_uchar) (A)[0])) +\ (((uint32_t) ((zend_uchar) (A)[1])) << 8) +\ (((uint32_t) ((zend_uchar) (A)[2])) << 16) +\ diff --git a/ext/mysqlnd/mysqlnd_priv.h b/ext/mysqlnd/mysqlnd_priv.h index b15e91579..c9f40cda6 100644 --- a/ext/mysqlnd/mysqlnd_priv.h +++ b/ext/mysqlnd/mysqlnd_priv.h @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: mysqlnd_priv.h 289630 2009-10-14 13:51:25Z johannes $ */ +/* $Id: mysqlnd_priv.h 293779 2010-01-20 17:09:28Z johannes $ */ #ifndef MYSQLND_PRIV_H #define MYSQLND_PRIV_H @@ -37,21 +37,12 @@ #include "TSRM.h" #endif -#ifndef TRUE -#define TRUE 1 -#endif - -#ifndef FALSE -#define FALSE 0 -#endif - #ifndef pestrndup #define pestrndup(s, length, persistent) ((persistent)?zend_strndup((s),(length)):estrndup((s),(length))) #endif #define MYSQLND_CLASS_METHOD_TABLE_NAME(class) mysqlnd_##class##_methods -#define MYSQLND_CLASS_METHODS_START(class) static \ - struct st_##class##_methods MYSQLND_CLASS_METHOD_TABLE_NAME(class) = { +#define MYSQLND_CLASS_METHODS_START(class) struct st_##class##_methods MYSQLND_CLASS_METHOD_TABLE_NAME(class) = { #define MYSQLND_CLASS_METHODS_END } #if PHP_MAJOR_VERSION < 6 @@ -163,9 +154,9 @@ struct st_mysqlnd_perm_bind { extern struct st_mysqlnd_perm_bind mysqlnd_ps_fetch_functions[MYSQL_TYPE_LAST + 1]; -extern const char * const mysqlnd_old_passwd; -extern const char * const mysqlnd_out_of_sync; -extern const char * const mysqlnd_server_gone; +PHPAPI extern const char * const mysqlnd_old_passwd; +PHPAPI extern const char * const mysqlnd_out_of_sync; +PHPAPI extern const char * const mysqlnd_server_gone; enum_func_status mysqlnd_handle_local_infile(MYSQLND *conn, const char *filename, zend_bool *is_warning TSRMLS_DC); @@ -178,9 +169,6 @@ void ps_fetch_from_1_to_8_bytes(zval *zv, const MYSQLND_FIELD * const field, unsigned int pack_len, zend_uchar **row, zend_bool as_unicode, unsigned int byte_count TSRMLS_DC); - - -int mysqlnd_set_sock_no_delay(php_stream *stream); #endif /* MYSQLND_PRIV_H */ diff --git a/ext/mysqlnd/mysqlnd_ps.c b/ext/mysqlnd/mysqlnd_ps.c index 68f0a828d..06ec510f5 100644 --- a/ext/mysqlnd/mysqlnd_ps.c +++ b/ext/mysqlnd/mysqlnd_ps.c @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: mysqlnd_ps.c 289630 2009-10-14 13:51:25Z johannes $ */ +/* $Id: mysqlnd_ps.c 294543 2010-02-04 20:28:55Z johannes $ */ #include "php.h" #include "mysqlnd.h" #include "mysqlnd_wireprotocol.h" @@ -27,6 +27,7 @@ #include "mysqlnd_result_meta.h" #include "mysqlnd_statistics.h" #include "mysqlnd_debug.h" +#include "mysqlnd_block_alloc.h" #define MYSQLND_SILENT @@ -37,13 +38,6 @@ const char * const mysqlnd_stmt_not_prepared = "Statement not prepared"; static struct st_mysqlnd_stmt_methods *mysqlnd_stmt_methods; -/* Exported by mysqlnd.c */ -enum_func_status mysqlnd_simple_command(MYSQLND *conn, enum php_mysqlnd_server_command command, - const char * const arg, size_t arg_len, - enum php_mysql_packet_type ok_packet, - zend_bool silent, zend_bool ignore_upsert_status - TSRMLS_DC); - /* Exported by mysqlnd_ps_codec.c */ zend_uchar* mysqlnd_stmt_execute_generate_request(MYSQLND_STMT *stmt, size_t *request_len, zend_bool *free_buffer TSRMLS_DC); @@ -100,95 +94,16 @@ MYSQLND_METHOD(mysqlnd_stmt, store_result)(MYSQLND_STMT * const stmt TSRMLS_DC) SET_EMPTY_ERROR(stmt->error_info); SET_EMPTY_ERROR(stmt->conn->error_info); - MYSQLND_INC_CONN_STATISTIC(&conn->stats, STAT_PS_BUFFERED_SETS); + MYSQLND_INC_CONN_STATISTIC(conn->stats, STAT_PS_BUFFERED_SETS); result = stmt->result; result->type = MYSQLND_RES_PS_BUF; result->m.fetch_row = mysqlnd_fetch_stmt_row_buffered; result->m.fetch_lengths = NULL;/* makes no sense */ - if (!result->zval_cache) { - result->zval_cache = mysqlnd_palloc_get_thd_cache_reference(conn->zval_cache); - } - /* Create room for 'next_extend' rows */ + result->result_set_memory_pool = mysqlnd_mempool_create(16000 TSRMLS_CC); - ret = mysqlnd_store_result_fetch_data(conn, result, result->meta, - TRUE, to_cache TSRMLS_CC); - - if (PASS == ret) { - /* libmysql API docs say it should be so for SELECT statements */ - stmt->upsert_status.affected_rows = stmt->result->stored_data->row_count; - - stmt->state = MYSQLND_STMT_USE_OR_STORE_CALLED; - } else { - conn->error_info = result->stored_data->error_info; - stmt->result->m.free_result_contents(stmt->result TSRMLS_CC); - mnd_efree(stmt->result); - stmt->result = NULL; - stmt->state = MYSQLND_STMT_PREPARED; - } - - DBG_RETURN(result); -} -/* }}} */ - - -/* {{{ mysqlnd_stmt::background_store_result */ -static MYSQLND_RES * -MYSQLND_METHOD(mysqlnd_stmt, background_store_result)(MYSQLND_STMT * const stmt TSRMLS_DC) -{ - enum_func_status ret; - MYSQLND *conn = stmt->conn; - MYSQLND_RES *result; - zend_bool to_cache = FALSE; - - DBG_ENTER("mysqlnd_stmt::background_store_result"); - DBG_INF_FMT("stmt=%lu", stmt->stmt_id); - - /* be compliant with libmysql - NULL will turn */ - if (!stmt->field_count) { - DBG_RETURN(NULL); - } - - if (stmt->cursor_exists) { - /* Silently convert buffered to unbuffered, for now */ - MYSQLND_RES * res = stmt->m->use_result(stmt TSRMLS_CC); - DBG_RETURN(res); - } - - /* Nothing to store for UPSERT/LOAD DATA*/ - if (CONN_GET_STATE(conn) != CONN_FETCHING_DATA || - stmt->state != MYSQLND_STMT_WAITING_USE_OR_STORE) - { - SET_CLIENT_ERROR(conn->error_info, CR_COMMANDS_OUT_OF_SYNC, - UNKNOWN_SQLSTATE, mysqlnd_out_of_sync); - DBG_RETURN(NULL); - } - - stmt->default_rset_handler = stmt->m->store_result; - - SET_EMPTY_ERROR(stmt->error_info); - SET_EMPTY_ERROR(stmt->conn->error_info); - MYSQLND_INC_CONN_STATISTIC(&conn->stats, STAT_PS_BUFFERED_SETS); - - result = stmt->result; - result->type = MYSQLND_RES_PS_BUF; - result->m.fetch_row = mysqlnd_fetch_stmt_row_buffered; - result->m.fetch_lengths = NULL;/* makes no sense */ - if (!result->zval_cache) { - result->zval_cache = mysqlnd_palloc_get_thd_cache_reference(conn->zval_cache); - } - - /* Create room for 'next_extend' rows */ - - /* Not set for SHOW statements at PREPARE stage */ - if (result->conn) { - result->conn->m->free_reference(result->conn TSRMLS_CC); - result->conn = NULL; /* store result does not reference the connection */ - } - - ret = mysqlnd_store_result_fetch_data(conn, result, result->meta, - TRUE, to_cache TSRMLS_CC); + ret = result->m.store_result_fetch_data(conn, result, result->meta, TRUE, to_cache TSRMLS_CC); if (PASS == ret) { /* libmysql API docs say it should be so for SELECT statements */ @@ -237,10 +152,9 @@ MYSQLND_METHOD(mysqlnd_stmt, get_result)(MYSQLND_STMT * const stmt TSRMLS_DC) SET_EMPTY_ERROR(stmt->error_info); SET_EMPTY_ERROR(stmt->conn->error_info); - MYSQLND_INC_CONN_STATISTIC(&conn->stats, STAT_BUFFERED_SETS); + MYSQLND_INC_CONN_STATISTIC(conn->stats, STAT_BUFFERED_SETS); - result = mysqlnd_result_init(stmt->result->field_count, - mysqlnd_palloc_get_thd_cache_reference(conn->zval_cache) TSRMLS_CC); + result = mysqlnd_result_init(stmt->result->field_count TSRMLS_CC); result->meta = stmt->result->meta->m->clone_metadata(stmt->result->meta, FALSE TSRMLS_CC); @@ -304,20 +218,20 @@ mysqlnd_stmt_skip_metadata(MYSQLND_STMT *stmt TSRMLS_DC) /* Follows parameter metadata, we have just to skip it, as libmysql does */ unsigned int i = 0; enum_func_status ret = PASS; - php_mysql_packet_res_field field_packet; + MYSQLND_PACKET_RES_FIELD * field_packet; DBG_ENTER("mysqlnd_stmt_skip_metadata"); DBG_INF_FMT("stmt=%lu", stmt->stmt_id); - PACKET_INIT_ALLOCA(field_packet, PROT_RSET_FLD_PACKET); - field_packet.skip_parsing = TRUE; + field_packet = stmt->conn->protocol->m.get_result_field_packet(stmt->conn->protocol, FALSE TSRMLS_CC); + field_packet->skip_parsing = TRUE; for (;i < stmt->param_count; i++) { - if (FAIL == PACKET_READ_ALLOCA(field_packet, stmt->conn)) { + if (FAIL == PACKET_READ(field_packet, stmt->conn)) { ret = FAIL; break; } } - PACKET_FREE_ALLOCA(field_packet); + PACKET_FREE(field_packet); DBG_RETURN(ret); } @@ -328,31 +242,31 @@ mysqlnd_stmt_skip_metadata(MYSQLND_STMT *stmt TSRMLS_DC) static enum_func_status mysqlnd_stmt_read_prepare_response(MYSQLND_STMT *stmt TSRMLS_DC) { - php_mysql_packet_prepare_response prepare_resp; + MYSQLND_PACKET_PREPARE_RESPONSE * prepare_resp; enum_func_status ret = PASS; DBG_ENTER("mysqlnd_stmt_read_prepare_response"); DBG_INF_FMT("stmt=%lu", stmt->stmt_id); - PACKET_INIT_ALLOCA(prepare_resp, PROT_PREPARE_RESP_PACKET); - if (FAIL == PACKET_READ_ALLOCA(prepare_resp, stmt->conn)) { + prepare_resp = stmt->conn->protocol->m.get_prepare_response_packet(stmt->conn->protocol, FALSE TSRMLS_CC); + if (FAIL == PACKET_READ(prepare_resp, stmt->conn)) { ret = FAIL; goto done; } - if (0xFF == prepare_resp.error_code) { - stmt->error_info = stmt->conn->error_info = prepare_resp.error_info; + if (0xFF == prepare_resp->error_code) { + stmt->error_info = stmt->conn->error_info = prepare_resp->error_info; ret = FAIL; goto done; } - stmt->stmt_id = prepare_resp.stmt_id; - stmt->warning_count = stmt->conn->upsert_status.warning_count = prepare_resp.warning_count; - stmt->field_count = stmt->conn->field_count = prepare_resp.field_count; - stmt->param_count = prepare_resp.param_count; - PACKET_FREE_ALLOCA(prepare_resp); - + stmt->stmt_id = prepare_resp->stmt_id; + stmt->warning_count = stmt->conn->upsert_status.warning_count = prepare_resp->warning_count; + stmt->field_count = stmt->conn->field_count = prepare_resp->field_count; + stmt->param_count = prepare_resp->param_count; done: + PACKET_FREE(prepare_resp); + DBG_RETURN(ret); } /* }}} */ @@ -362,14 +276,14 @@ done: static enum_func_status mysqlnd_stmt_prepare_read_eof(MYSQLND_STMT *stmt TSRMLS_DC) { - php_mysql_packet_eof fields_eof; + MYSQLND_PACKET_EOF * fields_eof; enum_func_status ret; DBG_ENTER("mysqlnd_stmt_prepare_read_eof"); DBG_INF_FMT("stmt=%lu", stmt->stmt_id); - PACKET_INIT_ALLOCA(fields_eof, PROT_EOF_PACKET); - if (FAIL == (ret = PACKET_READ_ALLOCA(fields_eof, stmt->conn))) { + fields_eof = stmt->conn->protocol->m.get_eof_packet(stmt->conn->protocol, FALSE TSRMLS_CC); + if (FAIL == (ret = PACKET_READ(fields_eof, stmt->conn))) { if (stmt->result) { stmt->result->m.free_result_contents(stmt->result TSRMLS_CC); mnd_efree(stmt->result); @@ -377,11 +291,11 @@ mysqlnd_stmt_prepare_read_eof(MYSQLND_STMT *stmt TSRMLS_DC) stmt->state = MYSQLND_STMT_INITTED; } } else { - stmt->upsert_status.server_status = fields_eof.server_status; - stmt->upsert_status.warning_count = fields_eof.warning_count; + stmt->upsert_status.server_status = fields_eof->server_status; + stmt->upsert_status.warning_count = fields_eof->warning_count; stmt->state = MYSQLND_STMT_PREPARED; } - PACKET_FREE_ALLOCA(fields_eof); + PACKET_FREE(fields_eof); DBG_RETURN(ret); } @@ -390,8 +304,7 @@ mysqlnd_stmt_prepare_read_eof(MYSQLND_STMT *stmt TSRMLS_DC) /* {{{ mysqlnd_stmt::prepare */ static enum_func_status -MYSQLND_METHOD(mysqlnd_stmt, prepare)(MYSQLND_STMT * const stmt, const char * const query, - unsigned int query_len TSRMLS_DC) +MYSQLND_METHOD(mysqlnd_stmt, prepare)(MYSQLND_STMT * const stmt, const char * const query, unsigned int query_len TSRMLS_DC) { MYSQLND_STMT *stmt_to_prepare = stmt; @@ -422,8 +335,8 @@ MYSQLND_METHOD(mysqlnd_stmt, prepare)(MYSQLND_STMT * const stmt, const char * co stmt_to_prepare = mysqlnd_stmt_init(stmt->conn); } - if (FAIL == mysqlnd_simple_command(stmt_to_prepare->conn, COM_STMT_PREPARE, query, - query_len, PROT_LAST, FALSE, TRUE TSRMLS_CC) || + if (FAIL == stmt_to_prepare->conn->m->simple_command(stmt_to_prepare->conn, COM_STMT_PREPARE, query, + query_len, PROT_LAST, FALSE, TRUE TSRMLS_CC) || FAIL == mysqlnd_stmt_read_prepare_response(stmt_to_prepare TSRMLS_CC)) { goto fail; } @@ -442,9 +355,7 @@ MYSQLND_METHOD(mysqlnd_stmt, prepare)(MYSQLND_STMT * const stmt, const char * co no metadata at prepare. */ if (stmt_to_prepare->field_count) { - MYSQLND_RES *result = mysqlnd_result_init(stmt_to_prepare->field_count, - mysqlnd_palloc_get_thd_cache_reference(stmt->conn->zval_cache) - TSRMLS_CC); + MYSQLND_RES *result = mysqlnd_result_init(stmt_to_prepare->field_count TSRMLS_CC); /* Allocate the result now as it is needed for the reading of metadata */ stmt_to_prepare->result = result; @@ -686,9 +597,9 @@ MYSQLND_METHOD(mysqlnd_stmt, execute)(MYSQLND_STMT * const stmt TSRMLS_DC) /* support for buffer types should be added here ! */ - ret = mysqlnd_simple_command(stmt->conn, COM_STMT_EXECUTE, (char *)request, request_len, - PROT_LAST /* we will handle the response packet*/, - FALSE, FALSE TSRMLS_CC); + ret = stmt->conn->m->simple_command(stmt->conn, COM_STMT_EXECUTE, (char *)request, request_len, + PROT_LAST /* we will handle the response packet*/, + FALSE, FALSE TSRMLS_CC); if (free_request) { mnd_efree(request); @@ -701,15 +612,19 @@ MYSQLND_METHOD(mysqlnd_stmt, execute)(MYSQLND_STMT * const stmt TSRMLS_DC) } stmt->execute_count++; - DBG_RETURN(mysqlnd_stmt_execute_parse_response(stmt TSRMLS_CC)); + ret = mysqlnd_stmt_execute_parse_response(stmt TSRMLS_CC); + + if (ret == PASS && conn->last_query_type == QUERY_UPSERT && stmt->upsert_status.affected_rows) { + MYSQLND_INC_CONN_STATISTIC_W_VALUE(conn->stats, STAT_ROWS_AFFECTED_PS, stmt->upsert_status.affected_rows); + } + DBG_RETURN(ret); } /* }}} */ /* {{{ mysqlnd_fetch_stmt_row_buffered */ enum_func_status -mysqlnd_fetch_stmt_row_buffered(MYSQLND_RES *result, void *param, unsigned int flags, - zend_bool *fetched_anything TSRMLS_DC) +mysqlnd_fetch_stmt_row_buffered(MYSQLND_RES *result, void *param, unsigned int flags, zend_bool *fetched_anything TSRMLS_DC) { MYSQLND_STMT *stmt = (MYSQLND_STMT *) param; MYSQLND_RES_BUFFERED *set = result->stored_data; @@ -735,7 +650,10 @@ mysqlnd_fetch_stmt_row_buffered(MYSQLND_RES *result, void *param, unsigned int f current_row, meta->field_count, meta->fields, - result->conn TSRMLS_CC); + result->stored_data->persistent, + result->conn->options.numeric_and_datetime_as_unicode, + result->conn->options.int_and_float_native, + result->conn->stats TSRMLS_CC); if (stmt->update_max_length) { for (i = 0; i < result->field_count; i++) { /* @@ -801,12 +719,11 @@ mysqlnd_fetch_stmt_row_buffered(MYSQLND_RES *result, void *param, unsigned int f /* {{{ mysqlnd_stmt_fetch_row_unbuffered */ static enum_func_status -mysqlnd_stmt_fetch_row_unbuffered(MYSQLND_RES *result, void *param, unsigned int flags, - zend_bool *fetched_anything TSRMLS_DC) +mysqlnd_stmt_fetch_row_unbuffered(MYSQLND_RES *result, void *param, unsigned int flags, zend_bool *fetched_anything TSRMLS_DC) { enum_func_status ret; MYSQLND_STMT *stmt = (MYSQLND_STMT *) param; - php_mysql_packet_row *row_packet = result->row_packet; + MYSQLND_PACKET_ROW *row_packet = result->row_packet; DBG_ENTER("mysqlnd_stmt_fetch_row_unbuffered"); @@ -827,7 +744,7 @@ mysqlnd_stmt_fetch_row_unbuffered(MYSQLND_RES *result, void *param, unsigned int /* If we skip rows (stmt == NULL || stmt->result_bind == NULL) we have to - mysqlnd_unbuffered_free_last_data() before it. The function returns always true. + result->m.unbuffered_free_last_data() before it. The function returns always true. */ if (PASS == (ret = PACKET_READ(row_packet, result->conn)) && !row_packet->eof) { unsigned int i, field_count = result->field_count; @@ -835,7 +752,7 @@ mysqlnd_stmt_fetch_row_unbuffered(MYSQLND_RES *result, void *param, unsigned int *fetched_anything = TRUE; if (!row_packet->skip_extraction) { - mysqlnd_unbuffered_free_last_data(result TSRMLS_CC); + result->m.unbuffered_free_last_data(result TSRMLS_CC); DBG_INF("extracting data"); result->unbuf->last_row_data = row_packet->fields; @@ -847,14 +764,17 @@ mysqlnd_stmt_fetch_row_unbuffered(MYSQLND_RES *result, void *param, unsigned int result->unbuf->last_row_data, row_packet->field_count, row_packet->fields_metadata, - result->conn TSRMLS_CC); + FALSE, + result->conn->options.numeric_and_datetime_as_unicode, + result->conn->options.int_and_float_native, + result->conn->stats TSRMLS_CC); for (i = 0; i < field_count; i++) { if (stmt->result_bind[i].bound == TRUE) { zval *data = result->unbuf->last_row_data[i]; /* stmt->result_bind[i].zv has been already destructed - in mysqlnd_unbuffered_free_last_data() + in result->m.unbuffered_free_last_data() */ #ifndef WE_DONT_COPY_IN_BUFFERED_AND_UNBUFFERED_BECAUSEOF_IS_REF zval_dtor(stmt->result_bind[i].zv); @@ -871,16 +791,16 @@ mysqlnd_stmt_fetch_row_unbuffered(MYSQLND_RES *result, void *param, unsigned int result->meta->fields[i].max_length = Z_STRLEN_P(data); } stmt->result_bind[i].zv->value = data->value; - // copied data, thus also the ownership. Thus null data + /* copied data, thus also the ownership. Thus null data */ ZVAL_NULL(data); } } } - MYSQLND_INC_CONN_STATISTIC(&stmt->conn->stats, STAT_ROWS_FETCHED_FROM_CLIENT_PS_UNBUF); + MYSQLND_INC_CONN_STATISTIC(stmt->conn->stats, STAT_ROWS_FETCHED_FROM_CLIENT_PS_UNBUF); } else { DBG_INF("skipping extraction"); /* - Data has been allocated and usually mysqlnd_unbuffered_free_last_data() + Data has been allocated and usually result->m.unbuffered_free_last_data() frees it but we can't call this function as it will cause problems with the bound variables. Thus we need to do part of what it does or Zend will report leaks. @@ -943,7 +863,7 @@ MYSQLND_METHOD(mysqlnd_stmt, use_result)(MYSQLND_STMT *stmt TSRMLS_DC) SET_EMPTY_ERROR(stmt->error_info); - MYSQLND_INC_CONN_STATISTIC(&stmt->conn->stats, STAT_PS_UNBUFFERED_SETS); + MYSQLND_INC_CONN_STATISTIC(stmt->conn->stats, STAT_PS_UNBUFFERED_SETS); result = stmt->result; DBG_INF_FMT("%scursor exists", stmt->cursor_exists? "":"no "); @@ -962,13 +882,12 @@ MYSQLND_METHOD(mysqlnd_stmt, use_result)(MYSQLND_STMT *stmt TSRMLS_DC) /* {{{ mysqlnd_fetch_row_cursor */ enum_func_status -mysqlnd_fetch_stmt_row_cursor(MYSQLND_RES *result, void *param, unsigned int flags, - zend_bool *fetched_anything TSRMLS_DC) +mysqlnd_fetch_stmt_row_cursor(MYSQLND_RES *result, void *param, unsigned int flags, zend_bool *fetched_anything TSRMLS_DC) { enum_func_status ret; MYSQLND_STMT *stmt = (MYSQLND_STMT *) param; zend_uchar buf[STMT_ID_LENGTH /* statement id */ + 4 /* number of rows to fetch */]; - php_mysql_packet_row *row_packet = result->row_packet; + MYSQLND_PACKET_ROW *row_packet = result->row_packet; DBG_ENTER("mysqlnd_fetch_stmt_row_cursor"); @@ -993,9 +912,9 @@ mysqlnd_fetch_stmt_row_cursor(MYSQLND_RES *result, void *param, unsigned int fla int4store(buf, stmt->stmt_id); int4store(buf + STMT_ID_LENGTH, 1); /* for now fetch only one row */ - if (FAIL == mysqlnd_simple_command(stmt->conn, COM_STMT_FETCH, (char *)buf, sizeof(buf), - PROT_LAST /* we will handle the response packet*/, - FALSE, TRUE TSRMLS_CC)) { + if (FAIL == stmt->conn->m->simple_command(stmt->conn, COM_STMT_FETCH, (char *)buf, sizeof(buf), + PROT_LAST /* we will handle the response packet*/, + FALSE, TRUE TSRMLS_CC)) { stmt->error_info = stmt->conn->error_info; DBG_RETURN(FAIL); } @@ -1009,7 +928,7 @@ mysqlnd_fetch_stmt_row_cursor(MYSQLND_RES *result, void *param, unsigned int fla DBG_INF_FMT("skip_extraction=%d", row_packet->skip_extraction); if (!row_packet->skip_extraction) { - mysqlnd_unbuffered_free_last_data(result TSRMLS_CC); + result->m.unbuffered_free_last_data(result TSRMLS_CC); DBG_INF("extracting data"); result->unbuf->last_row_data = row_packet->fields; @@ -1021,7 +940,10 @@ mysqlnd_fetch_stmt_row_cursor(MYSQLND_RES *result, void *param, unsigned int fla result->unbuf->last_row_data, row_packet->field_count, row_packet->fields_metadata, - result->conn TSRMLS_CC); + FALSE, + result->conn->options.numeric_and_datetime_as_unicode, + result->conn->options.int_and_float_native, + result->conn->stats TSRMLS_CC); /* If no result bind, do nothing. We consumed the data */ for (i = 0; i < field_count; i++) { @@ -1029,7 +951,7 @@ mysqlnd_fetch_stmt_row_cursor(MYSQLND_RES *result, void *param, unsigned int fla zval *data = result->unbuf->last_row_data[i]; /* stmt->result_bind[i].zv has been already destructed - in mysqlnd_unbuffered_free_last_data() + in result->m.unbuffered_free_last_data() */ #ifndef WE_DONT_COPY_IN_BUFFERED_AND_UNBUFFERED_BECAUSEOF_IS_REF zval_dtor(stmt->result_bind[i].zv); @@ -1047,7 +969,7 @@ mysqlnd_fetch_stmt_row_cursor(MYSQLND_RES *result, void *param, unsigned int fla result->meta->fields[i].max_length = Z_STRLEN_P(data); } stmt->result_bind[i].zv->value = data->value; - // copied data, thus also the ownership. Thus null data + /* copied data, thus also the ownership. Thus null data */ ZVAL_NULL(data); } } @@ -1055,7 +977,7 @@ mysqlnd_fetch_stmt_row_cursor(MYSQLND_RES *result, void *param, unsigned int fla } else { DBG_INF("skipping extraction"); /* - Data has been allocated and usually mysqlnd_unbuffered_free_last_data() + Data has been allocated and usually result->m.unbuffered_free_last_data() frees it but we can't call this function as it will cause problems with the bound variables. Thus we need to do part of what it does or Zend will report leaks. @@ -1069,7 +991,7 @@ mysqlnd_fetch_stmt_row_cursor(MYSQLND_RES *result, void *param, unsigned int fla row_packet->row_buffer->free_chunk(row_packet->row_buffer, TRUE TSRMLS_CC); row_packet->row_buffer = NULL; } - MYSQLND_INC_CONN_STATISTIC(&stmt->conn->stats, STAT_ROWS_FETCHED_FROM_CLIENT_PS_CURSOR); + MYSQLND_INC_CONN_STATISTIC(stmt->conn->stats, STAT_ROWS_FETCHED_FROM_CLIENT_PS_CURSOR); } else { *fetched_anything = FALSE; @@ -1101,8 +1023,7 @@ mysqlnd_fetch_stmt_row_cursor(MYSQLND_RES *result, void *param, unsigned int fla /* {{{ mysqlnd_stmt::fetch */ static enum_func_status -MYSQLND_METHOD(mysqlnd_stmt, fetch)(MYSQLND_STMT * const stmt, - zend_bool * const fetched_anything TSRMLS_DC) +MYSQLND_METHOD(mysqlnd_stmt, fetch)(MYSQLND_STMT * const stmt, zend_bool * const fetched_anything TSRMLS_DC) { enum_func_status ret; DBG_ENTER("mysqlnd_stmt::fetch"); @@ -1200,7 +1121,7 @@ MYSQLND_METHOD(mysqlnd_stmt, reset)(MYSQLND_STMT * const stmt TSRMLS_DC) int4store(cmd_buf, stmt->stmt_id); if (CONN_GET_STATE(conn) == CONN_READY && - FAIL == (ret = mysqlnd_simple_command(conn, COM_STMT_RESET, (char *)cmd_buf, + FAIL == (ret = conn->m->simple_command(conn, COM_STMT_RESET, (char *)cmd_buf, sizeof(cmd_buf), PROT_OK_PACKET, FALSE, TRUE TSRMLS_CC))) { stmt->error_info = conn->error_info; @@ -1257,7 +1178,7 @@ MYSQLND_METHOD(mysqlnd_stmt, send_long_data)(MYSQLND_STMT * const stmt, unsigned XXX: Unfortunately we have to allocate additional buffer to be able the additional data, which is like a header inside the payload. This should be optimised, but it will be a pervasive change, so - mysqlnd_simple_command() will accept not a buffer, but actually MYSQLND_STRING* + conn->m->simple_command() will accept not a buffer, but actually MYSQLND_STRING* terminated by NULL, to send. If the strings are not big, we can collapse them on the buffer every connection has, but otherwise we will just send them one by one to the wire. @@ -1273,7 +1194,7 @@ MYSQLND_METHOD(mysqlnd_stmt, send_long_data)(MYSQLND_STMT * const stmt, unsigned memcpy(cmd_buf + STMT_ID_LENGTH + 2, data, length); /* COM_STMT_SEND_LONG_DATA doesn't send an OK packet*/ - ret = mysqlnd_simple_command(conn, cmd, (char *)cmd_buf, packet_len, + ret = conn->m->simple_command(conn, cmd, (char *)cmd_buf, packet_len, PROT_LAST , FALSE, TRUE TSRMLS_CC); mnd_efree(cmd_buf); if (FAIL == ret) { @@ -1299,7 +1220,7 @@ MYSQLND_METHOD(mysqlnd_stmt, send_long_data)(MYSQLND_STMT * const stmt, unsigned #if HAVE_USLEEP && !defined(PHP_WIN32) usleep(120000); #endif - if ((packet_len = php_mysqlnd_consume_uneaten_data(conn, cmd TSRMLS_CC))) { + if ((packet_len = conn->net->m.consume_uneaten_data(conn->net, cmd TSRMLS_CC))) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "There was an error " "while sending long data. Probably max_allowed_packet_size " "is smaller than the data. You have to increase it or send " @@ -1319,8 +1240,7 @@ MYSQLND_METHOD(mysqlnd_stmt, send_long_data)(MYSQLND_STMT * const stmt, unsigned /* {{{ mysqlnd_stmt::bind_parameters */ static enum_func_status -MYSQLND_METHOD(mysqlnd_stmt, bind_parameters)(MYSQLND_STMT * const stmt, - MYSQLND_PARAM_BIND * const param_bind TSRMLS_DC) +MYSQLND_METHOD(mysqlnd_stmt, bind_parameters)(MYSQLND_STMT * const stmt, MYSQLND_PARAM_BIND * const param_bind TSRMLS_DC) { DBG_ENTER("mysqlnd_stmt::bind_param"); DBG_INF_FMT("stmt=%lu param_count=%u", stmt->stmt_id, stmt->param_count); @@ -1586,7 +1506,7 @@ MYSQLND_METHOD(mysqlnd_stmt, set_result_bind_dtor)(MYSQLND_STMT * const stmt, /* {{{ mysqlnd_stmt::insert_id */ static uint64_t -MYSQLND_METHOD(mysqlnd_stmt, insert_id)(const MYSQLND_STMT * const stmt) +MYSQLND_METHOD(mysqlnd_stmt, insert_id)(const MYSQLND_STMT * const stmt TSRMLS_DC) { return stmt->upsert_status.last_insert_id; } @@ -1595,7 +1515,7 @@ MYSQLND_METHOD(mysqlnd_stmt, insert_id)(const MYSQLND_STMT * const stmt) /* {{{ mysqlnd_stmt::affected_rows */ static uint64_t -MYSQLND_METHOD(mysqlnd_stmt, affected_rows)(const MYSQLND_STMT * const stmt) +MYSQLND_METHOD(mysqlnd_stmt, affected_rows)(const MYSQLND_STMT * const stmt TSRMLS_DC) { return stmt->upsert_status.affected_rows; } @@ -1604,7 +1524,7 @@ MYSQLND_METHOD(mysqlnd_stmt, affected_rows)(const MYSQLND_STMT * const stmt) /* {{{ mysqlnd_stmt::num_rows */ static uint64_t -MYSQLND_METHOD(mysqlnd_stmt, num_rows)(const MYSQLND_STMT * const stmt) +MYSQLND_METHOD(mysqlnd_stmt, num_rows)(const MYSQLND_STMT * const stmt TSRMLS_DC) { return stmt->result? mysqlnd_num_rows(stmt->result):0; } @@ -1613,7 +1533,7 @@ MYSQLND_METHOD(mysqlnd_stmt, num_rows)(const MYSQLND_STMT * const stmt) /* {{{ mysqlnd_stmt::warning_count */ static unsigned int -MYSQLND_METHOD(mysqlnd_stmt, warning_count)(const MYSQLND_STMT * const stmt) +MYSQLND_METHOD(mysqlnd_stmt, warning_count)(const MYSQLND_STMT * const stmt TSRMLS_DC) { return stmt->upsert_status.warning_count; } @@ -1622,7 +1542,7 @@ MYSQLND_METHOD(mysqlnd_stmt, warning_count)(const MYSQLND_STMT * const stmt) /* {{{ mysqlnd_stmt::field_count */ static unsigned int -MYSQLND_METHOD(mysqlnd_stmt, field_count)(const MYSQLND_STMT * const stmt) +MYSQLND_METHOD(mysqlnd_stmt, field_count)(const MYSQLND_STMT * const stmt TSRMLS_DC) { return stmt->field_count; } @@ -1631,7 +1551,7 @@ MYSQLND_METHOD(mysqlnd_stmt, field_count)(const MYSQLND_STMT * const stmt) /* {{{ mysqlnd_stmt::param_count */ static unsigned int -MYSQLND_METHOD(mysqlnd_stmt, param_count)(const MYSQLND_STMT * const stmt) +MYSQLND_METHOD(mysqlnd_stmt, param_count)(const MYSQLND_STMT * const stmt TSRMLS_DC) { return stmt->param_count; } @@ -1640,7 +1560,7 @@ MYSQLND_METHOD(mysqlnd_stmt, param_count)(const MYSQLND_STMT * const stmt) /* {{{ mysqlnd_stmt::errno */ static unsigned int -MYSQLND_METHOD(mysqlnd_stmt, errno)(const MYSQLND_STMT * const stmt) +MYSQLND_METHOD(mysqlnd_stmt, errno)(const MYSQLND_STMT * const stmt TSRMLS_DC) { return stmt->error_info.error_no; } @@ -1649,7 +1569,7 @@ MYSQLND_METHOD(mysqlnd_stmt, errno)(const MYSQLND_STMT * const stmt) /* {{{ mysqlnd_stmt::error */ static const char * -MYSQLND_METHOD(mysqlnd_stmt, error)(const MYSQLND_STMT * const stmt) +MYSQLND_METHOD(mysqlnd_stmt, error)(const MYSQLND_STMT * const stmt TSRMLS_DC) { return stmt->error_info.error; } @@ -1658,7 +1578,7 @@ MYSQLND_METHOD(mysqlnd_stmt, error)(const MYSQLND_STMT * const stmt) /* {{{ mysqlnd_stmt::sqlstate */ static const char * -MYSQLND_METHOD(mysqlnd_stmt, sqlstate)(const MYSQLND_STMT * const stmt) +MYSQLND_METHOD(mysqlnd_stmt, sqlstate)(const MYSQLND_STMT * const stmt TSRMLS_DC) { return stmt->error_info.sqlstate[0] ? stmt->error_info.sqlstate:MYSQLND_SQLSTATE_NULL; } @@ -1676,7 +1596,7 @@ MYSQLND_METHOD(mysqlnd_stmt, data_seek)(const MYSQLND_STMT * const stmt, uint64_ /* {{{ mysqlnd_stmt::param_metadata */ static MYSQLND_RES * -MYSQLND_METHOD(mysqlnd_stmt, param_metadata)(MYSQLND_STMT * const stmt) +MYSQLND_METHOD(mysqlnd_stmt, param_metadata)(MYSQLND_STMT * const stmt TSRMLS_DC) { if (!stmt->param_count) { return NULL; @@ -1703,7 +1623,7 @@ MYSQLND_METHOD(mysqlnd_stmt, result_metadata)(MYSQLND_STMT * const stmt TSRMLS_D if (stmt->update_max_length && stmt->result->stored_data) { /* stored result, we have to update the max_length before we clone the meta data :( */ - mysqlnd_res_initialize_result_set_rest(stmt->result TSRMLS_CC); + stmt->result->m.initialize_result_set_rest(stmt->result TSRMLS_CC); } /* TODO: This implementation is kind of a hack, @@ -1714,7 +1634,7 @@ MYSQLND_METHOD(mysqlnd_stmt, result_metadata)(MYSQLND_STMT * const stmt TSRMLS_D In the meantime we don't need a zval cache reference for this fake result set, so we don't get one. */ - result = mysqlnd_result_init(stmt->field_count, NULL TSRMLS_CC); + result = mysqlnd_result_init(stmt->field_count TSRMLS_CC); result->type = MYSQLND_RES_NORMAL; result->m.fetch_row = result->m.fetch_row_normal_unbuffered; result->unbuf = mnd_ecalloc(1, sizeof(MYSQLND_RES_UNBUFFERED)); @@ -2043,7 +1963,7 @@ MYSQLND_METHOD_PRIVATE(mysqlnd_stmt, net_close)(MYSQLND_STMT * const stmt, zend_ int4store(cmd_buf, stmt->stmt_id); if (CONN_GET_STATE(conn) == CONN_READY && - FAIL == mysqlnd_simple_command(conn, COM_STMT_CLOSE, (char *)cmd_buf, sizeof(cmd_buf), + FAIL == conn->m->simple_command(conn, COM_STMT_CLOSE, (char *)cmd_buf, sizeof(cmd_buf), PROT_LAST /* COM_STMT_CLOSE doesn't send an OK packet*/, FALSE, TRUE TSRMLS_CC)) { stmt->error_info = conn->error_info; @@ -2061,7 +1981,7 @@ MYSQLND_METHOD_PRIVATE(mysqlnd_stmt, net_close)(MYSQLND_STMT * const stmt, zend_ break; } if (stat != STAT_LAST) { - MYSQLND_INC_CONN_STATISTIC(&conn->stats, stat); + MYSQLND_INC_CONN_STATISTIC(conn->stats, stat); } if (stmt->execute_cmd_buffer.buffer) { @@ -2106,7 +2026,6 @@ MYSQLND_CLASS_METHODS_START(mysqlnd_stmt) MYSQLND_METHOD(mysqlnd_stmt, execute), MYSQLND_METHOD(mysqlnd_stmt, use_result), MYSQLND_METHOD(mysqlnd_stmt, store_result), - MYSQLND_METHOD(mysqlnd_stmt, background_store_result), MYSQLND_METHOD(mysqlnd_stmt, get_result), MYSQLND_METHOD(mysqlnd_stmt, more_results), MYSQLND_METHOD(mysqlnd_stmt, next_result), @@ -2149,7 +2068,8 @@ MYSQLND_CLASS_METHODS_END; /* {{{ _mysqlnd_stmt_init */ MYSQLND_STMT * _mysqlnd_stmt_init(MYSQLND * const conn TSRMLS_DC) { - MYSQLND_STMT *stmt = mnd_ecalloc(1, sizeof(MYSQLND_STMT)); + size_t alloc_size = sizeof(MYSQLND_STMT) + mysqlnd_plugin_count() * sizeof(void *); + MYSQLND_STMT *stmt = mnd_ecalloc(1, alloc_size); DBG_ENTER("_mysqlnd_stmt_init"); DBG_INF_FMT("stmt=%p", stmt); @@ -2175,6 +2095,19 @@ MYSQLND_STMT * _mysqlnd_stmt_init(MYSQLND * const conn TSRMLS_DC) /* }}} */ +/* {{{ _mysqlnd_plugin_get_plugin_stmt_data */ +PHPAPI void ** _mysqlnd_plugin_get_plugin_stmt_data(const MYSQLND_STMT * stmt, unsigned int plugin_id TSRMLS_DC) +{ + DBG_ENTER("_mysqlnd_plugin_get_plugin_stmt_data"); + DBG_INF_FMT("plugin_id=%u", plugin_id); + if (!stmt || plugin_id >= mysqlnd_plugin_count()) { + return NULL; + } + DBG_RETURN((void *)((char *)stmt + sizeof(MYSQLND_STMT) + plugin_id * sizeof(void *))); +} +/* }}} */ + + /* {{{ mysqlnd_efree_param_bind_dtor */ PHPAPI void mysqlnd_efree_param_bind_dtor(MYSQLND_PARAM_BIND * param_bind TSRMLS_DC) diff --git a/ext/mysqlnd/mysqlnd_ps_codec.c b/ext/mysqlnd/mysqlnd_ps_codec.c index 65be19297..650584c0f 100644 --- a/ext/mysqlnd/mysqlnd_ps_codec.c +++ b/ext/mysqlnd/mysqlnd_ps_codec.c @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: mysqlnd_ps_codec.c 289630 2009-10-14 13:51:25Z johannes $ */ +/* $Id: mysqlnd_ps_codec.c 289030 2009-09-30 23:34:56Z andrey $ */ #include "php.h" #include "mysqlnd.h" #include "mysqlnd_wireprotocol.h" diff --git a/ext/mysqlnd/mysqlnd_qcache.c b/ext/mysqlnd/mysqlnd_qcache.c deleted file mode 100644 index 467ad0918..000000000 --- a/ext/mysqlnd/mysqlnd_qcache.c +++ /dev/null @@ -1,141 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | PHP Version 6 | - +----------------------------------------------------------------------+ - | Copyright (c) 2006-2009 The PHP Group | - +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Authors: Georg Richter | - | Andrey Hristov | - | Ulf Wendel | - +----------------------------------------------------------------------+ -*/ - -/* $Id: mysqlnd_qcache.c 272370 2008-12-31 11:15:49Z sebastian $ */ -#include "php.h" -#include "mysqlnd.h" -#include "mysqlnd_priv.h" -#include "mysqlnd_statistics.h" - -#define MYSQLND_SILENT - -#ifdef ZTS -#define LOCK_QCACHE(cache) tsrm_mutex_lock((cache)->LOCK_access) -#define UNLOCK_QCACHE(cache) tsrm_mutex_unlock((cache)->LOCK_access) -#else -#define LOCK_QCACHE(cache) -#define UNLOCK_QCACHE(cache) -#endif - - -/* {{{ mysqlnd_qcache_init_cache */ -PHPAPI MYSQLND_QCACHE * mysqlnd_qcache_init_cache() -{ - MYSQLND_QCACHE *cache = calloc(1, sizeof(MYSQLND_QCACHE)); -#ifndef MYSQLND_SILENT - php_printf("[mysqlnd_qcache_init_cache %p]\n", cache); -#endif - - cache->references = 1; -#ifdef ZTS - cache->LOCK_access = tsrm_mutex_alloc(); -#endif - cache->ht = malloc(sizeof(HashTable)); - zend_hash_init(cache->ht, 10 /* init_elements */, NULL, NULL, TRUE /*pers*/); - - return cache; -} -/* }}} */ - - -/* {{{ mysqlnd_qcache_get_cache_reference */ -PHPAPI MYSQLND_QCACHE * mysqlnd_qcache_get_cache_reference(MYSQLND_QCACHE * const cache) -{ - if (cache) { -#ifndef MYSQLND_SILENT - php_printf("[mysqlnd_qcache_get_cache_reference %p will become %d]\n", cache, cache->references+1); -#endif - LOCK_QCACHE(cache); - cache->references++; - UNLOCK_QCACHE(cache); - } - return cache; -} -/* }}} */ - - -/* {{{ mysqlnd_qcache_free_cache */ -/* - As this call will happen on MSHUTDOWN(), then we don't need to copy the zvals with - copy_ctor but scrap what they point to with zval_dtor() and then just free our - pre-allocated block. Precondition is that we ZVAL_NULL() the zvals when we put them - to the free list after usage. We ZVAL_NULL() them when we allocate them in the - constructor of the cache. -*/ -static -void mysqlnd_qcache_free_cache(MYSQLND_QCACHE *cache) -{ -#ifndef MYSQLND_SILENT - php_printf("[mysqlnd_qcache_free_cache %p]\n", cache); -#endif - -#ifdef ZTS - tsrm_mutex_free(cache->LOCK_access); -#endif - zend_hash_destroy(cache->ht); - free(cache->ht); - free(cache); -} -/* }}} */ - - -/* {{{ mysqlnd_qcache_free_cache_reference */ -PHPAPI void mysqlnd_qcache_free_cache_reference(MYSQLND_QCACHE **cache) -{ - if (*cache) { - zend_bool to_free; -#ifndef MYSQLND_SILENT - php_printf("[mysqlnd_qcache_free_cache_reference %p] refs=%d\n", *cache, (*cache)->references); -#endif - LOCK_QCACHE(*cache); - to_free = --(*cache)->references == 0; - /* Unlock before destroying */ - UNLOCK_QCACHE(*cache); - if (to_free) { - mysqlnd_qcache_free_cache(*cache); - } - *cache = NULL; - } -} -/* }}} */ - - -/* {{{ mysqlnd_qcache_free_cache_reference */ -PHPAPI void mysqlnd_qcache_stats(const MYSQLND_QCACHE * const cache, zval *return_value) -{ - if (cache) { - LOCK_QCACHE(cache); - array_init(return_value); - add_assoc_long_ex(return_value, "references", sizeof("references"), cache->references); - UNLOCK_QCACHE(cache); - } else { - ZVAL_NULL(return_value); - } -} -/* }}} */ - -/* - * Local variables: - * tab-width: 4 - * c-basic-offset: 4 - * End: - * vim600: noet sw=4 ts=4 fdm=marker - * vim<600: noet sw=4 ts=4 - */ diff --git a/ext/mysqlnd/mysqlnd_result.c b/ext/mysqlnd/mysqlnd_result.c index e724820a1..2e1d01263 100644 --- a/ext/mysqlnd/mysqlnd_result.c +++ b/ext/mysqlnd/mysqlnd_result.c @@ -18,10 +18,11 @@ +----------------------------------------------------------------------+ */ -/* $Id: mysqlnd_result.c 289630 2009-10-14 13:51:25Z johannes $ */ +/* $Id: mysqlnd_result.c 294543 2010-02-04 20:28:55Z johannes $ */ #include "php.h" #include "mysqlnd.h" #include "mysqlnd_wireprotocol.h" +#include "mysqlnd_block_alloc.h" #include "mysqlnd_priv.h" #include "mysqlnd_result.h" #include "mysqlnd_result_meta.h" @@ -32,75 +33,17 @@ #define MYSQLND_SILENT -#ifdef MYSQLND_THREADED -/* {{{ mysqlnd_fetch_thread */ -void * mysqlnd_fetch_thread(void *arg) -{ - MYSQLND *conn = (MYSQLND *) arg; - MYSQLND_RES * result = NULL; - void ***tsrm_ls = conn->tsrm_ls; -#ifndef MYSQLND_SILENT - printf("THREAD] conn=%p tsrm_ls=%p\n", conn, conn->tsrm_ls); -#endif - do { - pthread_mutex_lock(&conn->LOCK_work); - while (conn->thread_killed == FALSE && !conn->current_result) { -#ifndef MYSQLND_SILENT - printf("THREAD] Waiting for work in %s\n", __FUNCTION__); -#endif - pthread_cond_wait(&conn->COND_work, &conn->LOCK_work); - } - if (conn->thread_killed == TRUE) { -#ifndef MYSQLND_SILENT - printf("THREAD] Thread killed in %s\n", __FUNCTION__); -#endif - pthread_cond_signal(&conn->COND_thread_ended); - pthread_mutex_unlock(&conn->LOCK_work); - break; - } -#ifndef MYSQLND_SILENT - printf("THREAD] Got work in %s\n", __FUNCTION__); -#endif - CONN_SET_STATE(conn, CONN_FETCHING_DATA); - result = conn->current_result; - conn->current_result = NULL; - pthread_cond_signal(&conn->COND_work); /* sent notification back */ - pthread_mutex_unlock(&conn->LOCK_work); - -#ifndef MYSQLND_SILENT - printf("THREAD] Starting fetch %s\n", __FUNCTION__); -#endif - mysqlnd_background_store_result_fetch_data(result TSRMLS_CC); - - /* do fetch the data from the wire */ - pthread_mutex_lock(&conn->LOCK_work); - CONN_SET_STATE(conn, CONN_READY); - pthread_cond_signal(&conn->COND_work_done); -#ifndef MYSQLND_SILENT - printf("THREAD] Signaling work done in %s\n", __FUNCTION__); -#endif - pthread_mutex_unlock(&conn->LOCK_work); - } while (1); - -#ifndef MYSQLND_SILENT - printf("THREAD] Exiting worker thread in %s\n", __FUNCTION__); -#endif - return NULL; -} -/* }}} */ -#endif /* MYSQLND_THREADED */ - - -/* {{{ mysqlnd_res_initialize_result_set_rest */ -void mysqlnd_res_initialize_result_set_rest(MYSQLND_RES * const result TSRMLS_DC) +/* {{{ mysqlnd_res::initialize_result_set_rest */ +static void +MYSQLND_METHOD(mysqlnd_res, initialize_result_set_rest)(MYSQLND_RES * const result TSRMLS_DC) { unsigned int i; zval **data_cursor = result->stored_data->data; zval **data_begin = result->stored_data->data; unsigned int field_count = result->meta->field_count; unsigned int row_count = result->stored_data->row_count; - DBG_ENTER("mysqlnd_res_initialize_result_set_rest"); + DBG_ENTER("mysqlnd_res::initialize_result_set_rest"); if (!data_cursor || row_count == result->stored_data->initialized_rows) { DBG_VOID_RETURN; @@ -113,7 +56,10 @@ void mysqlnd_res_initialize_result_set_rest(MYSQLND_RES * const result TSRMLS_DC data_cursor, result->meta->field_count, result->meta->fields, - result->conn TSRMLS_CC); + result->stored_data->persistent, + result->conn->options.numeric_and_datetime_as_unicode, + result->conn->options.int_and_float_native, + result->conn->stats TSRMLS_CC); for (i = 0; i < result->field_count; i++) { /* NULL fields are 0 length, 0 is not more than 0 @@ -135,12 +81,60 @@ void mysqlnd_res_initialize_result_set_rest(MYSQLND_RES * const result TSRMLS_DC /* }}} */ -/* {{{ mysqlnd_unbuffered_free_last_data */ -void mysqlnd_unbuffered_free_last_data(MYSQLND_RES *result TSRMLS_DC) + +/* {{{ mysqlnd_palloc_zval_ptr_dtor */ +void mysqlnd_palloc_zval_ptr_dtor(zval **zv, enum_mysqlnd_res_type type, zend_bool * copy_ctor_called TSRMLS_DC) +{ + DBG_ENTER("mysqlnd_palloc_zval_ptr_dtor"); + *copy_ctor_called = FALSE; + { + /* + This zval is not from the cache block. + Thus the refcount is -1 than of a zval from the cache, + because the zvals from the cache are owned by it. + */ + if (type == MYSQLND_RES_PS_BUF || type == MYSQLND_RES_PS_UNBUF) { + ; /* do nothing, zval_ptr_dtor will do the job*/ + } else if (Z_REFCOUNT_PP(zv) > 1) { + /* + Not a prepared statement, then we have to + call copy_ctor and then zval_ptr_dtor() + + In Unicode mode the destruction of the zvals should not call + zval_copy_ctor() because then we will leak. + I suppose we can use UG(unicode) in mysqlnd.c when freeing a result set + to check if we need to call copy_ctor(). + + If the type is IS_UNICODE, which can happen with PHP6, then we don't + need to copy_ctor, as the data doesn't point to our internal buffers. + If it's string (in PHP5 always) and in PHP6 if data is binary, then + it still points to internal buffers and has to be copied. + */ + if (Z_TYPE_PP(zv) == IS_STRING) { + zval_copy_ctor(*zv); + } + *copy_ctor_called = TRUE; + } else { + if (Z_TYPE_PP(zv) == IS_STRING) { + ZVAL_NULL(*zv); + } + } + zval_ptr_dtor(zv); + DBG_VOID_RETURN; + } + + DBG_VOID_RETURN; +} +/* }}} */ + + +/* {{{ mysqlnd_res::unbuffered_free_last_data */ +static void +MYSQLND_METHOD(mysqlnd_res, unbuffered_free_last_data)(MYSQLND_RES * result TSRMLS_DC) { MYSQLND_RES_UNBUFFERED *unbuf = result->unbuf; - DBG_ENTER("mysqlnd_unbuffered_free_last_data"); + DBG_ENTER("mysqlnd_res::unbuffered_free_last_data"); if (!unbuf) { DBG_VOID_RETURN; @@ -150,13 +144,11 @@ void mysqlnd_unbuffered_free_last_data(MYSQLND_RES *result TSRMLS_DC) if (unbuf->last_row_data) { unsigned int i, ctor_called_count = 0; zend_bool copy_ctor_called; - MYSQLND_STATS *global_stats = result->conn? &result->conn->stats:NULL; + MYSQLND_STATS *global_stats = result->conn? result->conn->stats:NULL; DBG_INF_FMT("%u columns to free", result->field_count); for (i = 0; i < result->field_count; i++) { - mysqlnd_palloc_zval_ptr_dtor(&(unbuf->last_row_data[i]), - result->zval_cache, result->type, - ©_ctor_called TSRMLS_CC); + mysqlnd_palloc_zval_ptr_dtor(&(unbuf->last_row_data[i]), result->type, ©_ctor_called TSRMLS_CC); if (copy_ctor_called) { ctor_called_count++; } @@ -186,15 +178,15 @@ void mysqlnd_unbuffered_free_last_data(MYSQLND_RES *result TSRMLS_DC) /* }}} */ -/* {{{ mysqlnd_free_buffered_data */ -void mysqlnd_free_buffered_data(MYSQLND_RES *result TSRMLS_DC) +/* {{{ mysqlnd_res::free_buffered_data */ +static void +MYSQLND_METHOD(mysqlnd_res, free_buffered_data)(MYSQLND_RES *result TSRMLS_DC) { - MYSQLND_THD_ZVAL_PCACHE *zval_cache = result->zval_cache; MYSQLND_RES_BUFFERED *set = result->stored_data; unsigned int field_count = result->field_count; int row; - DBG_ENTER("mysqlnd_free_buffered_data"); + DBG_ENTER("mysqlnd_res::free_buffered_data"); DBG_INF_FMT("Freeing "MYSQLND_LLU_SPEC" row(s)", set->row_count); DBG_INF_FMT("before: real_usage=%lu usage=%lu", zend_memory_usage(TRUE TSRMLS_CC), zend_memory_usage(FALSE TSRMLS_CC)); @@ -208,8 +200,7 @@ void mysqlnd_free_buffered_data(MYSQLND_RES *result TSRMLS_DC) if (current_row[0] == NULL) { break;/* row that was never initialized */ } - mysqlnd_palloc_zval_ptr_dtor(&(current_row[col]), zval_cache, - result->type, ©_ctor_called TSRMLS_CC); + mysqlnd_palloc_zval_ptr_dtor(&(current_row[col]), result->type, ©_ctor_called TSRMLS_CC); #if MYSQLND_DEBUG_MEMORY DBG_INF_FMT("Copy_ctor_called=%d", copy_ctor_called); #endif @@ -232,87 +223,6 @@ void mysqlnd_free_buffered_data(MYSQLND_RES *result TSRMLS_DC) } set->data_cursor = NULL; set->row_count = 0; - if (set->qcache) { - mysqlnd_qcache_free_cache_reference(&set->qcache); - } - - DBG_INF("Freeing set"); - mnd_pefree(set, set->persistent); - - DBG_INF_FMT("after: real_usage=%lu usage=%lu", zend_memory_usage(TRUE TSRMLS_CC), zend_memory_usage(FALSE TSRMLS_CC)); - DBG_VOID_RETURN; -} -/* }}} */ - - -#ifdef MYSQLND_THREADED -/* {{{ mysqlnd_free_background_buffered_data */ -void mysqlnd_free_background_buffered_data(MYSQLND_RES *result TSRMLS_DC) -{ - MYSQLND_THD_ZVAL_PCACHE *zval_cache = result->zval_cache; - MYSQLND_RES_BG_BUFFERED *set = result->bg_stored_data; - unsigned int field_count = result->field_count; - int row; - - DBG_ENTER("mysqlnd_free_buffered_data"); - DBG_INF_FMT("Freeing "MYSQLND_LLU_SPEC" row(s)", set->row_count); - - do { - tsrm_mutex_lock(set->LOCK); - if (set->bg_fetch_finished) { - tsrm_mutex_unlock(set->LOCK); - break; - } - tsrm_mutex_unlock(set->LOCK); -#if HAVE_USLEEP - usleep(2000); -#else - { - volatile int i; - for (i = 0; i < 1000; i++); - } -#endif - } while (1); - - DBG_INF_FMT("before: real_usage=%lu usage=%lu", zend_memory_usage(TRUE TSRMLS_CC), zend_memory_usage(FALSE TSRMLS_CC)); - for (row = set->row_count - 1; row >= 0; row--) { - MYSQLND_MEMORY_POOL_CHUNK *current_buffer = set->row_buffers[row]; - /* It could be the case that the user fetched no rows - then no set->data */ - if (row < set->data_size && set->data[row]) { - zval **current_row = set->data[row]; - unsigned int col; - - for (col = 0; col < field_count; col++) { - zend_bool copy_ctor_called; - mysqlnd_palloc_zval_ptr_dtor(&(current_row[col]), zval_cache, - result->type, ©_ctor_called TSRMLS_CC); -#if MYSQLND_DEBUG_MEMORY - DBG_INF_FMT("Copy_ctor_called=%d", copy_ctor_called); -#endif - MYSQLND_INC_GLOBAL_STATISTIC(copy_ctor_called? STAT_COPY_ON_WRITE_PERFORMED: - STAT_COPY_ON_WRITE_SAVED); - } -#if MYSQLND_DEBUG_MEMORY - DBG_INF("Freeing current_row & current_buffer"); -#endif - mnd_pefree(current_row, set->persistent); - } - current_buffer->free_chunk(current_buffer, TRUE TSRMLS_CC); - } - DBG_INF("Freeing data & row_buffer"); - mnd_pefree(set->data, set->persistent); - mnd_pefree(set->row_buffers, set->persistent); - set->data = NULL; - set->row_buffers = NULL; - set->data_cursor = NULL; - set->row_count = 0; - if (set->qcache) { - mysqlnd_qcache_free_cache_reference(&set->qcache); - } - - if (set->LOCK) { - tsrm_mutex_free(set->LOCK); - } DBG_INF("Freeing set"); mnd_pefree(set, set->persistent); @@ -321,7 +231,6 @@ void mysqlnd_free_background_buffered_data(MYSQLND_RES *result TSRMLS_DC) DBG_VOID_RETURN; } /* }}} */ -#endif /* MYSQL_THREADING */ /* {{{ mysqlnd_res::free_result_buffers */ @@ -332,19 +241,13 @@ MYSQLND_METHOD(mysqlnd_res, free_result_buffers)(MYSQLND_RES *result TSRMLS_DC) DBG_INF_FMT("%s", result->unbuf? "unbuffered":(result->stored_data? "buffered":"unknown")); if (result->unbuf) { - mysqlnd_unbuffered_free_last_data(result TSRMLS_CC); + result->m.unbuffered_free_last_data(result TSRMLS_CC); mnd_efree(result->unbuf); result->unbuf = NULL; } else if (result->stored_data) { - mysqlnd_free_buffered_data(result TSRMLS_CC); + result->m.free_buffered_data(result TSRMLS_CC); result->stored_data = NULL; } -#ifdef MYSQLND_THREADED - else if (result->bg_stored_data) { - mysqlnd_free_background_buffered_data(result TSRMLS_CC); - result->bg_stored_data = NULL; - } -#endif if (result->lengths) { mnd_efree(result->lengths); @@ -357,6 +260,12 @@ MYSQLND_METHOD(mysqlnd_res, free_result_buffers)(MYSQLND_RES *result TSRMLS_DC) result->row_packet = NULL; } + if (result->result_set_memory_pool) { + DBG_INF("Freeing memory pool"); + mysqlnd_mempool_destroy(result->result_set_memory_pool TSRMLS_CC); + result->result_set_memory_pool = NULL; + } + DBG_VOID_RETURN; } /* }}} */ @@ -375,12 +284,6 @@ void mysqlnd_internal_free_result_contents(MYSQLND_RES *result TSRMLS_DC) result->meta = NULL; } - if (result->zval_cache) { - DBG_INF("Freeing zval cache reference"); - mysqlnd_palloc_free_thd_cache_reference(&result->zval_cache); - result->zval_cache = NULL; - } - DBG_VOID_RETURN; } /* }}} */ @@ -451,21 +354,21 @@ enum_func_status mysqlnd_query_read_result_set_header(MYSQLND *conn, MYSQLND_STMT *stmt TSRMLS_DC) { enum_func_status ret; - php_mysql_packet_rset_header rset_header; + MYSQLND_PACKET_RSET_HEADER * rset_header; DBG_ENTER("mysqlnd_query_read_result_set_header"); DBG_INF_FMT("stmt=%d", stmt? stmt->stmt_id:0); ret = FAIL; - PACKET_INIT_ALLOCA(rset_header, PROT_RSET_HEADER_PACKET); + rset_header = conn->protocol->m.get_rset_header_packet(conn->protocol, FALSE TSRMLS_CC); do { SET_ERROR_AFF_ROWS(conn); - if (FAIL == (ret = PACKET_READ_ALLOCA(rset_header, conn))) { + if (FAIL == (ret = PACKET_READ(rset_header, conn))) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Error reading result set's header"); break; } - if (rset_header.error_info.error_no) { + if (rset_header->error_info.error_no) { /* Cover a protocol design error: error packet does not contain the server status. Therefore, the client has no way @@ -480,7 +383,7 @@ mysqlnd_query_read_result_set_header(MYSQLND *conn, MYSQLND_STMT *stmt TSRMLS_DC This will copy the error code and the messages, as they are buffers in the struct */ - conn->error_info = rset_header.error_info; + conn->error_info = rset_header->error_info; ret = FAIL; /* Return back from CONN_QUERY_SENT */ CONN_SET_STATE(conn, CONN_READY); @@ -488,27 +391,27 @@ mysqlnd_query_read_result_set_header(MYSQLND *conn, MYSQLND_STMT *stmt TSRMLS_DC } conn->error_info.error_no = 0; - switch (rset_header.field_count) { + switch (rset_header->field_count) { case MYSQLND_NULL_LENGTH: { /* LOAD DATA LOCAL INFILE */ zend_bool is_warning; DBG_INF("LOAD DATA"); conn->last_query_type = QUERY_LOAD_LOCAL; CONN_SET_STATE(conn, CONN_SENDING_LOAD_DATA); - ret = mysqlnd_handle_local_infile(conn, rset_header.info_or_local_file, &is_warning TSRMLS_CC); + ret = mysqlnd_handle_local_infile(conn, rset_header->info_or_local_file, &is_warning TSRMLS_CC); CONN_SET_STATE(conn, (ret == PASS || is_warning == TRUE)? CONN_READY:CONN_QUIT_SENT); - MYSQLND_INC_CONN_STATISTIC(&conn->stats, STAT_NON_RSET_QUERY); + MYSQLND_INC_CONN_STATISTIC(conn->stats, STAT_NON_RSET_QUERY); break; } case 0: /* UPSERT */ DBG_INF("UPSERT"); conn->last_query_type = QUERY_UPSERT; - conn->field_count = rset_header.field_count; - conn->upsert_status.warning_count = rset_header.warning_count; - conn->upsert_status.server_status = rset_header.server_status; - conn->upsert_status.affected_rows = rset_header.affected_rows; - conn->upsert_status.last_insert_id = rset_header.last_insert_id; + conn->field_count = rset_header->field_count; + conn->upsert_status.warning_count = rset_header->warning_count; + conn->upsert_status.server_status = rset_header->server_status; + conn->upsert_status.affected_rows = rset_header->affected_rows; + conn->upsert_status.last_insert_id = rset_header->last_insert_id; SET_NEW_MESSAGE(conn->last_message, conn->last_message_len, - rset_header.info_or_local_file, rset_header.info_or_local_file_len, + rset_header->info_or_local_file, rset_header->info_or_local_file_len, conn->persistent); /* Result set can follow UPSERT statement, check server_status */ if (conn->upsert_status.server_status & SERVER_MORE_RESULTS_EXISTS) { @@ -517,17 +420,17 @@ mysqlnd_query_read_result_set_header(MYSQLND *conn, MYSQLND_STMT *stmt TSRMLS_DC CONN_SET_STATE(conn, CONN_READY); } ret = PASS; - MYSQLND_INC_CONN_STATISTIC(&conn->stats, STAT_NON_RSET_QUERY); + MYSQLND_INC_CONN_STATISTIC(conn->stats, STAT_NON_RSET_QUERY); break; default:{ /* Result set */ - php_mysql_packet_eof fields_eof; + MYSQLND_PACKET_EOF * fields_eof; MYSQLND_RES *result; enum_mysqlnd_collected_stats stat = STAT_LAST; DBG_INF("Result set pending"); SET_EMPTY_MESSAGE(conn->last_message, conn->last_message_len, conn->persistent); - MYSQLND_INC_CONN_STATISTIC(&conn->stats, STAT_RSET_QUERY); + MYSQLND_INC_CONN_STATISTIC(conn->stats, STAT_RSET_QUERY); memset(&conn->upsert_status, 0, sizeof(conn->upsert_status)); /* restore after zeroing */ SET_ERROR_AFF_ROWS(conn); @@ -535,13 +438,9 @@ mysqlnd_query_read_result_set_header(MYSQLND *conn, MYSQLND_STMT *stmt TSRMLS_DC conn->last_query_type = QUERY_SELECT; CONN_SET_STATE(conn, CONN_FETCHING_DATA); /* PS has already allocated it */ - conn->field_count = rset_header.field_count; + conn->field_count = rset_header->field_count; if (!stmt) { - result = - conn->current_result= - mysqlnd_result_init(rset_header.field_count, - mysqlnd_palloc_get_thd_cache_reference(conn->zval_cache) - TSRMLS_CC); + result = conn->current_result = mysqlnd_result_init(rset_header->field_count TSRMLS_CC); } else { if (!stmt->result) { DBG_INF("This is 'SHOW'/'EXPLAIN'-like query."); @@ -550,11 +449,7 @@ mysqlnd_query_read_result_set_header(MYSQLND *conn, MYSQLND_STMT *stmt TSRMLS_DC prepared statements can't send result set metadata for these queries on prepare stage. Read it now. */ - result = - stmt->result = - mysqlnd_result_init(rset_header.field_count, - mysqlnd_palloc_get_thd_cache_reference(conn->zval_cache) - TSRMLS_CC); + result = stmt->result = mysqlnd_result_init(rset_header->field_count TSRMLS_CC); } else { /* Update result set metadata if it for some reason changed between @@ -583,8 +478,8 @@ mysqlnd_query_read_result_set_header(MYSQLND *conn, MYSQLND_STMT *stmt TSRMLS_DC } /* Check for SERVER_STATUS_MORE_RESULTS if needed */ - PACKET_INIT_ALLOCA(fields_eof, PROT_EOF_PACKET); - if (FAIL == (ret = PACKET_READ_ALLOCA(fields_eof, conn))) { + fields_eof = conn->protocol->m.get_eof_packet(conn->protocol, FALSE TSRMLS_CC); + if (FAIL == (ret = PACKET_READ(fields_eof, conn))) { DBG_ERR("Error ocurred while reading the EOF packet"); result->m.free_result_contents(result TSRMLS_CC); mnd_efree(result); @@ -597,9 +492,9 @@ mysqlnd_query_read_result_set_header(MYSQLND *conn, MYSQLND_STMT *stmt TSRMLS_DC } } else { unsigned int to_log = MYSQLND_G(log_mask); - to_log &= fields_eof.server_status; - DBG_INF_FMT("warnings=%u server_status=%u", fields_eof.warning_count, fields_eof.server_status); - conn->upsert_status.warning_count = fields_eof.warning_count; + to_log &= fields_eof->server_status; + DBG_INF_FMT("warnings=%u server_status=%u", fields_eof->warning_count, fields_eof->server_status); + conn->upsert_status.warning_count = fields_eof->warning_count; /* If SERVER_MORE_RESULTS_EXISTS is set then this is either MULTI_QUERY or a CALL() The first packet after sending the query/com_execute has the bit set only @@ -607,12 +502,12 @@ mysqlnd_query_read_result_set_header(MYSQLND *conn, MYSQLND_STMT *stmt TSRMLS_DC will include many result sets. What actually matters are the bits set at the end of every result set (the EOF packet). */ - conn->upsert_status.server_status = fields_eof.server_status; - if (fields_eof.server_status & SERVER_QUERY_NO_GOOD_INDEX_USED) { + conn->upsert_status.server_status = fields_eof->server_status; + if (fields_eof->server_status & SERVER_QUERY_NO_GOOD_INDEX_USED) { stat = STAT_BAD_INDEX_USED; - } else if (fields_eof.server_status & SERVER_QUERY_NO_INDEX_USED) { + } else if (fields_eof->server_status & SERVER_QUERY_NO_INDEX_USED) { stat = STAT_NO_INDEX_USED; - } else if (fields_eof.server_status & SERVER_QUERY_WAS_SLOW) { + } else if (fields_eof->server_status & SERVER_QUERY_WAS_SLOW) { stat = STAT_QUERY_WAS_SLOW; } if (to_log) { @@ -621,17 +516,17 @@ mysqlnd_query_read_result_set_header(MYSQLND *conn, MYSQLND_STMT *stmt TSRMLS_DC php_log_err(backtrace TSRMLS_CC); efree(backtrace); #endif - MYSQLND_INC_CONN_STATISTIC(&conn->stats, stat); } + MYSQLND_INC_CONN_STATISTIC(conn->stats, stat); } - PACKET_FREE_ALLOCA(fields_eof); + PACKET_FREE(fields_eof); break; } } } while (0); - PACKET_FREE_ALLOCA(rset_header); + PACKET_FREE(rset_header); DBG_INF(ret == PASS? "PASS":"FAIL"); DBG_RETURN(ret); @@ -647,7 +542,7 @@ mysqlnd_query_read_result_set_header(MYSQLND *conn, MYSQLND_STMT *stmt TSRMLS_DC completeness. */ static -unsigned long * mysqlnd_fetch_lengths_buffered(MYSQLND_RES * const result) +unsigned long * mysqlnd_fetch_lengths_buffered(MYSQLND_RES * const result TSRMLS_DC) { unsigned int i; zval **previous_row; @@ -676,48 +571,9 @@ unsigned long * mysqlnd_fetch_lengths_buffered(MYSQLND_RES * const result) /* }}} */ -#ifdef MYSQLND_THREADED -/* {{{ mysqlnd_fetch_lengths_async_buffered */ -/* - Do lazy initialization for buffered results. As PHP strings have - length inside, this function makes not much sense in the context - of PHP, to be called as separate function. But let's have it for - completeness. -*/ -static -unsigned long * mysqlnd_fetch_lengths_async_buffered(MYSQLND_RES * const result) -{ - int i; - zval **previous_row; - MYSQLND_RES_BG_BUFFERED *set = result->bg_stored_data; - - /* - If: - - unbuffered result - - first row has not been read - - last_row has been read - */ - if (set->data_cursor == NULL || - set->data_cursor == set->data || - ((set->data_cursor - set->data) > set->row_count)) - { - return NULL;/* No rows or no more rows */ - } - - previous_row = *(set->data_cursor - 1); - for (i = 0; i < result->meta->field_count; i++) { - result->lengths[i] = (Z_TYPE_P(previous_row[i]) == IS_NULL)? 0:Z_STRLEN_P(previous_row[i]); - } - - return result->lengths; -} -/* }}} */ -#endif - - /* {{{ mysqlnd_fetch_lengths_unbuffered */ static -unsigned long * mysqlnd_fetch_lengths_unbuffered(MYSQLND_RES * const result) +unsigned long * mysqlnd_fetch_lengths_unbuffered(MYSQLND_RES * const result TSRMLS_DC) { return result->lengths; } @@ -725,9 +581,9 @@ unsigned long * mysqlnd_fetch_lengths_unbuffered(MYSQLND_RES * const result) #if !defined(MYSQLND_USE_OPTIMISATIONS) || MYSQLND_USE_OPTIMISATIONS == 0 /* {{{ mysqlnd_res::fetch_lengths */ -PHPAPI unsigned long * mysqlnd_fetch_lengths(MYSQLND_RES * const result) +PHPAPI unsigned long * _mysqlnd_fetch_lengths(MYSQLND_RES * const result TSRMLS_DC) { - return result->m.fetch_lengths? result->m.fetch_lengths(result):NULL; + return result->m.fetch_lengths? result->m.fetch_lengths(result TSRMLS_CC) : NULL; } /* }}} */ #endif @@ -740,7 +596,7 @@ mysqlnd_fetch_row_unbuffered_c(MYSQLND_RES *result TSRMLS_DC) MYSQLND_ROW_C retrow = NULL; unsigned int i, field_count = result->field_count; - php_mysql_packet_row *row_packet = result->row_packet; + MYSQLND_PACKET_ROW *row_packet = result->row_packet; unsigned long *lengths = result->lengths; DBG_ENTER("mysqlnd_fetch_row_unbuffered_c"); @@ -759,19 +615,19 @@ mysqlnd_fetch_row_unbuffered_c(MYSQLND_RES *result TSRMLS_DC) /* If we skip rows (row == NULL) we have to - mysqlnd_unbuffered_free_last_data() before it. The function returns always true. + result->m.unbuffered_free_last_data() before it. The function returns always true. */ if (PASS == (ret = PACKET_READ(row_packet, result->conn)) && !row_packet->eof) { result->unbuf->row_count++; - mysqlnd_unbuffered_free_last_data(result TSRMLS_CC); + result->m.unbuffered_free_last_data(result TSRMLS_CC); result->unbuf->last_row_data = row_packet->fields; result->unbuf->last_row_buffer = row_packet->row_buffer; row_packet->fields = NULL; row_packet->row_buffer = NULL; - MYSQLND_INC_CONN_STATISTIC(&result->conn->stats, STAT_ROWS_FETCHED_FROM_CLIENT_NORMAL_UNBUF); + MYSQLND_INC_CONN_STATISTIC(result->conn->stats, STAT_ROWS_FETCHED_FROM_CLIENT_NORMAL_UNBUF); if (!row_packet->skip_extraction) { MYSQLND_FIELD *field = result->meta->fields; @@ -781,7 +637,10 @@ mysqlnd_fetch_row_unbuffered_c(MYSQLND_RES *result TSRMLS_DC) result->unbuf->last_row_data, row_packet->field_count, row_packet->fields_metadata, - result->conn TSRMLS_CC); + FALSE, + result->conn->options.numeric_and_datetime_as_unicode, + result->conn->options.int_and_float_native, + result->conn->stats TSRMLS_CC); retrow = mnd_malloc(result->field_count * sizeof(char *)); @@ -829,7 +688,7 @@ mysqlnd_fetch_row_unbuffered_c(MYSQLND_RES *result TSRMLS_DC) } else { CONN_SET_STATE(result->conn, CONN_READY); } - mysqlnd_unbuffered_free_last_data(result TSRMLS_CC); + result->m.unbuffered_free_last_data(result TSRMLS_CC); } DBG_RETURN(retrow); @@ -839,12 +698,11 @@ mysqlnd_fetch_row_unbuffered_c(MYSQLND_RES *result TSRMLS_DC) /* {{{ mysqlnd_fetch_row_unbuffered */ static enum_func_status -mysqlnd_fetch_row_unbuffered(MYSQLND_RES *result, void *param, unsigned int flags, - zend_bool *fetched_anything TSRMLS_DC) +mysqlnd_fetch_row_unbuffered(MYSQLND_RES *result, void *param, unsigned int flags, zend_bool *fetched_anything TSRMLS_DC) { enum_func_status ret; zval *row = (zval *) param; - php_mysql_packet_row *row_packet = result->row_packet; + MYSQLND_PACKET_ROW *row_packet = result->row_packet; DBG_ENTER("mysqlnd_fetch_row_unbuffered"); DBG_INF_FMT("flags=%d", flags); @@ -864,13 +722,13 @@ mysqlnd_fetch_row_unbuffered(MYSQLND_RES *result, void *param, unsigned int flag /* If we skip rows (row == NULL) we have to - mysqlnd_unbuffered_free_last_data() before it. The function returns always true. + result->m.unbuffered_free_last_data() before it. The function returns always true. */ if (PASS == (ret = PACKET_READ(row_packet, result->conn)) && !row_packet->eof) { result->unbuf->row_count++; *fetched_anything = TRUE; - mysqlnd_unbuffered_free_last_data(result TSRMLS_CC); + result->m.unbuffered_free_last_data(result TSRMLS_CC); result->unbuf->last_row_data = row_packet->fields; result->unbuf->last_row_buffer = row_packet->row_buffer; @@ -878,7 +736,7 @@ mysqlnd_fetch_row_unbuffered(MYSQLND_RES *result, void *param, unsigned int flag row_packet->row_buffer = NULL; - MYSQLND_INC_CONN_STATISTIC(&result->conn->stats, STAT_ROWS_FETCHED_FROM_CLIENT_NORMAL_UNBUF); + MYSQLND_INC_CONN_STATISTIC(result->conn->stats, STAT_ROWS_FETCHED_FROM_CLIENT_NORMAL_UNBUF); if (!row_packet->skip_extraction) { HashTable *row_ht = Z_ARRVAL_P(row); @@ -891,7 +749,10 @@ mysqlnd_fetch_row_unbuffered(MYSQLND_RES *result, void *param, unsigned int flag result->unbuf->last_row_data, field_count, row_packet->fields_metadata, - result->conn TSRMLS_CC); + FALSE, + result->conn->options.numeric_and_datetime_as_unicode, + result->conn->options.int_and_float_native, + result->conn->stats TSRMLS_CC); for (i = 0; i < field_count; i++, field++, zend_hash_key++) { zval *data = result->unbuf->last_row_data[i]; @@ -962,7 +823,7 @@ mysqlnd_fetch_row_unbuffered(MYSQLND_RES *result, void *param, unsigned int flag } else { CONN_SET_STATE(result->conn, CONN_READY); } - mysqlnd_unbuffered_free_last_data(result TSRMLS_CC); + result->m.unbuffered_free_last_data(result TSRMLS_CC); *fetched_anything = FALSE; } @@ -996,13 +857,16 @@ MYSQLND_METHOD(mysqlnd_res, use_result)(MYSQLND_RES * const result, zend_bool ps } result->unbuf = mnd_ecalloc(1, sizeof(MYSQLND_RES_UNBUFFERED)); + result->result_set_memory_pool = mysqlnd_mempool_create(16000 TSRMLS_CC); + /* Will be freed in the mysqlnd_internal_free_result_contents() called by the resource destructor. mysqlnd_fetch_row_unbuffered() expects this to be not NULL. */ /* FALSE = non-persistent */ - PACKET_INIT(result->row_packet, PROT_ROW_PACKET, php_mysql_packet_row *, FALSE); + result->row_packet = result->conn->protocol->m.get_row_packet(result->conn->protocol, FALSE TSRMLS_CC); + result->row_packet->result_set_memory_pool = result->result_set_memory_pool; result->row_packet->field_count = result->field_count; result->row_packet->binary_protocol = ps; result->row_packet->fields_metadata = result->meta->fields; @@ -1039,7 +903,10 @@ mysqlnd_fetch_row_buffered_c(MYSQLND_RES *result TSRMLS_DC) current_row, result->meta->field_count, result->meta->fields, - result->conn TSRMLS_CC); + FALSE, + result->conn->options.numeric_and_datetime_as_unicode, + result->conn->options.int_and_float_native, + result->conn->stats TSRMLS_CC); for (i = 0; i < result->field_count; i++) { /* NULL fields are 0 length, 0 is not more than 0 @@ -1080,8 +947,7 @@ mysqlnd_fetch_row_buffered_c(MYSQLND_RES *result TSRMLS_DC) /* {{{ mysqlnd_fetch_row_buffered */ static enum_func_status -mysqlnd_fetch_row_buffered(MYSQLND_RES *result, void *param, unsigned int flags, - zend_bool *fetched_anything TSRMLS_DC) +mysqlnd_fetch_row_buffered(MYSQLND_RES *result, void *param, unsigned int flags, zend_bool *fetched_anything TSRMLS_DC) { unsigned int i; zval *row = (zval *) param; @@ -1105,7 +971,10 @@ mysqlnd_fetch_row_buffered(MYSQLND_RES *result, void *param, unsigned int flags, current_row, result->meta->field_count, result->meta->fields, - result->conn TSRMLS_CC); + result->stored_data->persistent, + result->conn->options.numeric_and_datetime_as_unicode, + result->conn->options.int_and_float_native, + result->conn->stats TSRMLS_CC); for (i = 0; i < result->field_count; i++) { /* NULL fields are 0 length, 0 is not more than 0 @@ -1174,19 +1043,19 @@ mysqlnd_fetch_row_buffered(MYSQLND_RES *result, void *param, unsigned int flags, #define STORE_RESULT_PREALLOCATED_SET_IF_NOT_EMPTY 2 -/* {{{ mysqlnd_store_result_fetch_data */ +/* {{{ mysqlnd_res::store_result_fetch_data */ enum_func_status -mysqlnd_store_result_fetch_data(MYSQLND * const conn, MYSQLND_RES *result, - MYSQLND_RES_METADATA *meta, - zend_bool binary_protocol, - zend_bool to_cache TSRMLS_DC) +MYSQLND_METHOD(mysqlnd_res, store_result_fetch_data)(MYSQLND * const conn, MYSQLND_RES *result, + MYSQLND_RES_METADATA *meta, + zend_bool binary_protocol, + zend_bool to_cache TSRMLS_DC) { enum_func_status ret; - php_mysql_packet_row *row_packet; + MYSQLND_PACKET_ROW *row_packet; unsigned int next_extend = STORE_RESULT_PREALLOCATED_SET_IF_NOT_EMPTY, free_rows = 1; MYSQLND_RES_BUFFERED *set; - DBG_ENTER("mysqlnd_store_result_fetch_data"); + DBG_ENTER("mysqlnd_res::store_result_fetch_data"); DBG_INF_FMT("conn=%llu binary_proto=%d to_cache=%d", conn->thread_id, binary_protocol, to_cache); @@ -1195,14 +1064,14 @@ mysqlnd_store_result_fetch_data(MYSQLND * const conn, MYSQLND_RES *result, set->row_buffers = mnd_pemalloc(free_rows * sizeof(MYSQLND_MEMORY_POOL_CHUNK *), to_cache); } set->persistent = to_cache; - set->qcache = to_cache? mysqlnd_qcache_get_cache_reference(conn->qcache):NULL; set->references = 1; result->m.row_decoder = binary_protocol? php_mysqlnd_rowp_read_binary_protocol: php_mysqlnd_rowp_read_text_protocol; /* non-persistent */ - PACKET_INIT(row_packet, PROT_ROW_PACKET, php_mysql_packet_row *, FALSE); + row_packet = conn->protocol->m.get_row_packet(conn->protocol, FALSE TSRMLS_CC); + row_packet->result_set_memory_pool = result->result_set_memory_pool; row_packet->field_count = meta->field_count; row_packet->binary_protocol = binary_protocol; row_packet->fields_metadata = meta->fields; @@ -1242,7 +1111,7 @@ mysqlnd_store_result_fetch_data(MYSQLND * const conn, MYSQLND_RES *result, memset(set->data, 0, set->row_count * meta->field_count * sizeof(zval *)); } - MYSQLND_INC_CONN_STATISTIC_W_VALUE(&conn->stats, + MYSQLND_INC_CONN_STATISTIC_W_VALUE(conn->stats, binary_protocol? STAT_ROWS_BUFFERED_FROM_CLIENT_PS: STAT_ROWS_BUFFERED_FROM_CLIENT_NORMAL, set->row_count); @@ -1303,10 +1172,10 @@ MYSQLND_METHOD(mysqlnd_res, store_result)(MYSQLND_RES * result, CONN_SET_STATE(conn, CONN_FETCHING_DATA); + result->result_set_memory_pool = mysqlnd_mempool_create(16000 TSRMLS_CC); result->lengths = mnd_ecalloc(result->field_count, sizeof(unsigned long)); - ret = mysqlnd_store_result_fetch_data(conn, result, result->meta, - ps_protocol, to_cache TSRMLS_CC); + ret = result->m.store_result_fetch_data(conn, result, result->meta, ps_protocol, to_cache TSRMLS_CC); if (PASS == ret) { /* libmysql's documentation says it should be so for SELECT statements */ conn->upsert_status.affected_rows = result->stored_data->row_count; @@ -1321,322 +1190,6 @@ MYSQLND_METHOD(mysqlnd_res, store_result)(MYSQLND_RES * result, /* }}} */ -#ifdef MYSQLND_THREADED -/* {{{ mysqlnd_fetch_row_async_buffered */ -static enum_func_status -mysqlnd_fetch_row_async_buffered(MYSQLND_RES *result, void *param, unsigned int flags, - zend_bool *fetched_anything TSRMLS_DC) -{ - zval *row = (zval *) param; - MYSQLND_RES_BG_BUFFERED *set = result->bg_stored_data; - - DBG_ENTER("mysqlnd_fetch_row_async_buffered"); - DBG_INF_FMT("flags=%u row=%p", flags, row); - - do { - tsrm_mutex_lock(set->LOCK); - if (set->bg_fetch_finished == TRUE) { - /* Don't unlock here, will be done later */ - break; - } - if (!set->data_cursor || (set->data_cursor - set->data) < (set->row_count)) { - tsrm_mutex_unlock(set->LOCK); -#if HAVE_USLEEP - usleep(2000); -#else - volatile int i = 0; - for (int i = 0; i < 100; i++); -#endif - } else { - break; - } - } while (1); - - /* At the point we are still under LOCK */ - if (set->data_cursor && (set->data_cursor - set->data) < (set->row_count)) { - uint64_t row_num = set->data_cursor - set->data; - zval **current_row = *set->data_cursor++; - unsigned int i; - - set->initialized_rows++; - /* We don't forget to release the lock */ - tsrm_mutex_unlock(set->LOCK); - - /* If there was no decoding in background, we have to decode here */ - if (set->decode_in_foreground == TRUE) { - MYSQLND_MEMORY_POOL_CHUNK *current_buffer = set->row_buffers[row_num]; - result->m.row_decoder(current_buffer, - current_row, - result->meta->field_count, - result->meta->fields, - result->conn TSRMLS_CC); - - for (i = 0; i < result->field_count; i++) { - /* - NULL fields are 0 length, 0 is not more than 0 - String of zero size, definitely can't be the next max_length. - Thus for NULL and zero-length we are quite efficient. - */ - if (Z_TYPE_P(current_row[i]) >= IS_STRING) { - unsigned long len = Z_STRLEN_P(current_row[i]); - if (result->meta->fields[i].max_length < len) { - result->meta->fields[i].max_length = len; - } - } - } - } - - - for (i = 0; i < result->field_count; i++) { - zval *data = current_row[i]; - - /* - Let us later know what to do with this zval. If ref_count > 1, we will just - decrease it, otherwise free it. zval_ptr_dtor() make this very easy job. - */ - Z_ADDREF_P(data); - - if ((flags & MYSQLND_FETCH_BOTH) == MYSQLND_FETCH_BOTH) { - Z_ADDREF_P(data); - } - if (flags & MYSQLND_FETCH_NUM) { - zend_hash_next_index_insert(Z_ARRVAL_P(row), &data, sizeof(zval *), NULL); - } - if (flags & MYSQLND_FETCH_ASSOC) { - /* zend_hash_quick_update needs length + trailing zero */ - /* QQ: Error handling ? */ - /* - zend_hash_quick_update does not check, as add_assoc_zval_ex do, whether - the index is a numeric and convert it to it. This however means constant - hashing of the column name, which is not needed as it can be precomputed. - */ - if (result->meta->zend_hash_keys[i].is_numeric == FALSE) { -#if PHP_MAJOR_VERSION >= 6 - zend_u_hash_quick_update(Z_ARRVAL_P(row), IS_UNICODE, - result->meta->zend_hash_keys[i].ustr, - result->meta->zend_hash_keys[i].ulen + 1, - result->meta->zend_hash_keys[i].key, - (void *) &data, sizeof(zval *), NULL); -#else - zend_hash_quick_update(Z_ARRVAL_P(row), - result->meta->fields[i].name, - result->meta->fields[i].name_length + 1, - result->meta->zend_hash_keys[i].key, - (void *) &data, sizeof(zval *), NULL); -#endif - } else { - zend_hash_index_update(Z_ARRVAL_P(row), - result->meta->zend_hash_keys[i].key, - (void *) &data, sizeof(zval *), NULL); - } - } - } - *fetched_anything = TRUE; - MYSQLND_INC_GLOBAL_STATISTIC(STAT_ROWS_FETCHED_FROM_CLIENT_NORMAL_BUF); - } else { - set->data_cursor = NULL; - /* We don't forget to release the lock */ - tsrm_mutex_unlock(set->LOCK); - *fetched_anything = FALSE; - DBG_INF("EOF reached"); - } - - DBG_INF_FMT("ret=PASS fetched=%d", *fetched_anything); - DBG_RETURN(PASS); -} -/* }}} */ - - -/* {{{ mysqlnd_background_store_result_fetch_data */ -enum_func_status -mysqlnd_background_store_result_fetch_data(MYSQLND_RES *result TSRMLS_DC) -{ - enum_func_status ret; - php_mysql_packet_row *row_packet; - unsigned int next_extend = STORE_RESULT_PREALLOCATED_SET_IF_NOT_EMPTY, free_rows; - MYSQLND_RES_BG_BUFFERED *set = result->bg_stored_data; - MYSQLND *conn = result->conn; - - DBG_ENTER("mysqlnd_background_store_result_fetch_data"); - - free_rows = next_extend; - - /* persistent */ - PACKET_INIT(row_packet, PROT_ROW_PACKET, php_mysql_packet_row *, TRUE); - row_packet->field_count = result->meta->field_count; - row_packet->binary_protocol = result->m.row_decoder == php_mysqlnd_rowp_read_binary_protocol; - row_packet->fields_metadata = result->meta->fields; - row_packet->bit_fields_count = result->meta->bit_fields_count; - row_packet->bit_fields_total_len= result->meta->bit_fields_total_len; - row_packet->persistent_alloc = TRUE; - - while (FAIL != (ret = PACKET_READ(row_packet, conn)) && !row_packet->eof) { - tsrm_mutex_lock(set->LOCK); - if (!free_rows) { - uint64_t total_rows = free_rows = next_extend = next_extend * 5 / 3; /* extend with 33% */ - uint64_t old_size; - total_rows += set->row_count; - - old_size = set->data_size; - set->data_size = total_rows; - set->data = mnd_perealloc(set->data, set->data_size * sizeof(zval **), set->persistent); -#if 0 - memset(set->data + old_size, 0, (set->data_size - old_size) * sizeof(zval **)); -#endif - set->row_buffers = mnd_perealloc(set->row_buffers, - total_rows * sizeof(MYSQLND_MEMORY_POOL_CHUNK *), - set->persistent); - } - set->row_buffers[set->row_count] = row_packet->row_buffer; - set->data[set->row_count] = row_packet->fields; - - if (set->decode_in_foreground == FALSE) { - unsigned int i; - result->m.row_decoder(set->row_buffers[set->row_count], - set->data[set->row_count], - result->meta->field_count, - result->meta->fields, - result->conn TSRMLS_CC); - - for (i = 0; i < result->field_count; i++) { - /* - NULL fields are 0 length, 0 is not more than 0 - String of zero size, definitely can't be the next max_length. - Thus for NULL and zero-length we are quite efficient. - */ - if (Z_TYPE_P(set->data[set->row_count][i]) >= IS_STRING) { - unsigned long len = Z_STRLEN_P(set->data[set->row_count][i]); - if (result->meta->fields[i].max_length < len) { - result->meta->fields[i].max_length = len; - } - } - } - } - set->row_count++; - - tsrm_mutex_unlock(set->LOCK); - free_rows--; - - /* So row_packet's destructor function won't efree() it */ - row_packet->row_buffer = NULL; - row_packet->fields = NULL; - - /* - No need to FREE_ALLOCA as we can reuse the - 'lengths' and 'fields' arrays. For lengths its absolutely safe. - 'fields' is reused because the ownership of the strings has been - transfered above. - */ - } -#if 0 - MYSQLND_INC_CONN_STATISTIC_W_VALUE(&conn->stats, - binary_protocol? STAT_ROWS_BUFFERED_FROM_CLIENT_PS: - STAT_ROWS_BUFFERED_FROM_CLIENT_NORMAL, - set->row_count); -#endif - tsrm_mutex_lock(set->LOCK); - /* Finally clean */ - if (row_packet->eof) { - set->upsert_status.warning_count = row_packet->warning_count; - set->upsert_status.server_status = row_packet->server_status; - } - /* save some memory */ - if (free_rows) { - set->data_size = set->row_count; - set->data = mnd_perealloc(set->data, - (size_t) set->data_size * sizeof(zval **), set->persistent); - set->row_buffers = mnd_perealloc(set->row_buffers, - set->row_count * sizeof(MYSQLND_MEMORY_POOL_CHUNK *), - set->persistent); - } - if (ret == FAIL) { - set->error_info = row_packet->error_info; - } else { - /* Position at the first row */ - set->data_cursor = set->data; - - /* libmysql's documentation says it should be so for SELECT statements */ - conn->upsert_status.affected_rows = set->row_count; - set->upsert_status.affected_rows = set->row_count; - } - set->bg_fetch_finished = TRUE; - tsrm_mutex_unlock(set->LOCK); - - PACKET_FREE(row_packet); - - if (conn->upsert_status.server_status & SERVER_MORE_RESULTS_EXISTS) { - CONN_SET_STATE(conn, CONN_NEXT_RESULT_PENDING); - } else { - CONN_SET_STATE(conn, CONN_READY); - } - DBG_INF_FMT("ret=%s row_count=%u warnings=%u server_status=%u", ret == PASS? "PASS":"FAIL", - set->row_count, conn->upsert_status.warning_count, conn->upsert_status.server_status); - DBG_RETURN(ret); -} -/* }}} */ -#endif - - -/* {{{ mysqlnd_res::background_store_result */ -static MYSQLND_RES * -MYSQLND_METHOD(mysqlnd_res, background_store_result)(MYSQLND_RES * result, MYSQLND * const conn, zend_bool ps TSRMLS_DC) -{ -#ifndef MYSQLND_THREADED - return (result->m.store_result(result, conn, ps TSRMLS_CC)); -#else - enum_func_status ret; - zend_bool to_cache = TRUE; - - DBG_ENTER("mysqlnd_res::background_store_result"); - DBG_INF_FMT("conn=%d ps_protocol=%d", conn->thread_id, ps); - - /* We need the conn because we are doing lazy zval initialization in buffered_fetch_row */ - result->conn = conn->m->get_reference(conn TSRMLS_CC); - result->type = MYSQLND_RES_NORMAL; - result->m.fetch_row = mysqlnd_fetch_row_async_buffered; - result->m.fetch_lengths = mysqlnd_fetch_lengths_async_buffered; - - result->bg_stored_data = mnd_pecalloc(1, sizeof(MYSQLND_RES_BG_BUFFERED), to_cache); - result->bg_stored_data->data_size = STORE_RESULT_PREALLOCATED_SET_IF_NOT_EMPTY; - result->bg_stored_data->data = mnd_pecalloc(result->bg_stored_data->data_size, sizeof(zval **), to_cache); - result->bg_stored_data->row_buffers = mnd_pemalloc(STORE_RESULT_PREALLOCATED_SET_IF_NOT_EMPTY * sizeof(MYSQLND_MEMORY_POOL_CHUNK *), to_cache); - result->bg_stored_data->persistent = to_cache; - result->bg_stored_data->qcache = to_cache? mysqlnd_qcache_get_cache_reference(conn->qcache):NULL; - result->bg_stored_data->references = 1; - - result->bg_stored_data->LOCK = tsrm_mutex_alloc(); - - result->m.row_decoder = ps? php_mysqlnd_rowp_read_binary_protocol: - php_mysqlnd_rowp_read_text_protocol; - - CONN_SET_STATE(conn, CONN_FETCHING_DATA); - /* - This should be definitely TRUE. Decoding in background means creating zvals - which is not very safe for Zend MM, will complain in debug mode and more problems - also manifest themselves - unstable. - */ - result->bg_stored_data->decode_in_foreground = TRUE; - - result->lengths = mnd_ecalloc(result->field_count, sizeof(unsigned long)); - - pthread_mutex_lock(&conn->LOCK_work); - - pthread_cond_signal(&conn->COND_work); - do { - pthread_cond_wait(&conn->COND_work, &conn->LOCK_work); - } while (conn->current_result); /* this is our invariant */ - pthread_mutex_unlock(&conn->LOCK_work); - -#if 0 - ret = mysqlnd_background_store_result_fetch_data(result TSRMLS_CC); -#endif - - DBG_RETURN(result); -#endif -} -/* }}} */ - - /* {{{ mysqlnd_res::skip_result */ static enum_func_status MYSQLND_METHOD(mysqlnd_res, skip_result)(MYSQLND_RES * const result TSRMLS_DC) @@ -1654,7 +1207,7 @@ MYSQLND_METHOD(mysqlnd_res, skip_result)(MYSQLND_RES * const result TSRMLS_DC) { DBG_INF("skipping result"); /* We have to fetch all data to clean the line */ - MYSQLND_INC_CONN_STATISTIC(&result->conn->stats, + MYSQLND_INC_CONN_STATISTIC(result->conn->stats, result->type == MYSQLND_RES_NORMAL? STAT_FLUSHED_NORMAL_SETS: STAT_FLUSHED_PS_SETS); @@ -1677,7 +1230,7 @@ MYSQLND_METHOD(mysqlnd_res, free_result)(MYSQLND_RES *result, zend_bool implicit DBG_INF_FMT("implicit=%d", implicit); result->m.skip_result(result TSRMLS_CC); - MYSQLND_INC_CONN_STATISTIC(result->conn? &result->conn->stats : NULL, + MYSQLND_INC_CONN_STATISTIC(result->conn? result->conn->stats : NULL, implicit == TRUE? STAT_FREE_RESULT_IMPLICIT: STAT_FREE_RESULT_EXPLICIT); @@ -1712,7 +1265,7 @@ MYSQLND_METHOD(mysqlnd_res, data_seek)(MYSQLND_RES *result, uint64_t row TSRMLS_ /* {{{ mysqlnd_res::num_rows */ static uint64_t -MYSQLND_METHOD(mysqlnd_res, num_rows)(const MYSQLND_RES * const result) +MYSQLND_METHOD(mysqlnd_res, num_rows)(const MYSQLND_RES * const result TSRMLS_DC) { /* Be compatible with libmysql. We count row_count, but will return 0 */ return result->stored_data? result->stored_data->row_count:0; @@ -1722,7 +1275,7 @@ MYSQLND_METHOD(mysqlnd_res, num_rows)(const MYSQLND_RES * const result) /* {{{ mysqlnd_res::num_fields */ static unsigned int -MYSQLND_METHOD(mysqlnd_res, num_fields)(const MYSQLND_RES * const result) +MYSQLND_METHOD(mysqlnd_res, num_fields)(const MYSQLND_RES * const result TSRMLS_DC) { return result->field_count; } @@ -1748,7 +1301,7 @@ MYSQLND_METHOD(mysqlnd_res, fetch_field)(MYSQLND_RES * const result TSRMLS_DC) if (result->stored_data && (result->stored_data->initialized_rows < result->stored_data->row_count)) { DBG_INF_FMT("We have decode the whole result set to be able to satisfy this meta request"); /* we have to initialize the rest to get the updated max length */ - mysqlnd_res_initialize_result_set_rest(result TSRMLS_CC); + result->m.initialize_result_set_rest(result TSRMLS_CC); } DBG_RETURN(result->meta->m->fetch_field(result->meta TSRMLS_CC)); } @@ -1759,8 +1312,7 @@ MYSQLND_METHOD(mysqlnd_res, fetch_field)(MYSQLND_RES * const result TSRMLS_DC) /* {{{ mysqlnd_res::fetch_field_direct */ static const MYSQLND_FIELD * -MYSQLND_METHOD(mysqlnd_res, fetch_field_direct)(MYSQLND_RES * const result, - MYSQLND_FIELD_OFFSET fieldnr TSRMLS_DC) +MYSQLND_METHOD(mysqlnd_res, fetch_field_direct)(MYSQLND_RES * const result, MYSQLND_FIELD_OFFSET fieldnr TSRMLS_DC) { DBG_ENTER("mysqlnd_res::fetch_field_direct"); if (result->meta) { @@ -1777,7 +1329,7 @@ MYSQLND_METHOD(mysqlnd_res, fetch_field_direct)(MYSQLND_RES * const result, if (result->stored_data && (result->stored_data->initialized_rows < result->stored_data->row_count)) { DBG_INF_FMT("We have decode the whole result set to be able to satisfy this meta request"); /* we have to initialized the rest to get the updated max length */ - mysqlnd_res_initialize_result_set_rest(result TSRMLS_CC); + result->m.initialize_result_set_rest(result TSRMLS_CC); } DBG_RETURN(result->meta->m->fetch_field_direct(result->meta, fieldnr TSRMLS_CC)); } @@ -1795,7 +1347,7 @@ MYSQLND_METHOD(mysqlnd_res, fetch_fields)(MYSQLND_RES * const result TSRMLS_DC) if (result->meta) { if (result->stored_data && (result->stored_data->initialized_rows < result->stored_data->row_count)) { /* we have to initialize the rest to get the updated max length */ - mysqlnd_res_initialize_result_set_rest(result TSRMLS_CC); + result->m.initialize_result_set_rest(result TSRMLS_CC); } DBG_RETURN(result->meta->m->fetch_fields(result->meta TSRMLS_CC)); } @@ -1807,8 +1359,7 @@ MYSQLND_METHOD(mysqlnd_res, fetch_fields)(MYSQLND_RES * const result TSRMLS_DC) /* {{{ mysqlnd_res::field_seek */ static MYSQLND_FIELD_OFFSET -MYSQLND_METHOD(mysqlnd_res, field_seek)(MYSQLND_RES * const result, - MYSQLND_FIELD_OFFSET field_offset) +MYSQLND_METHOD(mysqlnd_res, field_seek)(MYSQLND_RES * const result, MYSQLND_FIELD_OFFSET field_offset TSRMLS_DC) { MYSQLND_FIELD_OFFSET return_value = 0; if (result->meta) { @@ -1822,9 +1373,9 @@ MYSQLND_METHOD(mysqlnd_res, field_seek)(MYSQLND_RES * const result, /* {{{ mysqlnd_res::field_tell */ static MYSQLND_FIELD_OFFSET -MYSQLND_METHOD(mysqlnd_res, field_tell)(const MYSQLND_RES * const result) +MYSQLND_METHOD(mysqlnd_res, field_tell)(const MYSQLND_RES * const result TSRMLS_DC) { - return result->meta? result->meta->m->field_tell(result->meta):0; + return result->meta? result->meta->m->field_tell(result->meta TSRMLS_CC) : 0; } /* }}} */ @@ -1896,8 +1447,7 @@ MYSQLND_METHOD(mysqlnd_res, fetch_row_c)(MYSQLND_RES *result TSRMLS_DC) /* {{{ mysqlnd_res::fetch_all */ static void -MYSQLND_METHOD(mysqlnd_res, fetch_all)(MYSQLND_RES *result, unsigned int flags, - zval *return_value TSRMLS_DC ZEND_FILE_LINE_DC) +MYSQLND_METHOD(mysqlnd_res, fetch_all)(MYSQLND_RES *result, unsigned int flags, zval *return_value TSRMLS_DC ZEND_FILE_LINE_DC) { zval *row; ulong i = 0; @@ -1932,8 +1482,7 @@ MYSQLND_METHOD(mysqlnd_res, fetch_all)(MYSQLND_RES *result, unsigned int flags, /* {{{ mysqlnd_res::fetch_field_data */ static void -MYSQLND_METHOD(mysqlnd_res, fetch_field_data)(MYSQLND_RES *result, unsigned int offset, - zval *return_value TSRMLS_DC) +MYSQLND_METHOD(mysqlnd_res, fetch_field_data)(MYSQLND_RES *result, unsigned int offset, zval *return_value TSRMLS_DC) { zval row; zval **entry; @@ -1976,19 +1525,19 @@ MYSQLND_METHOD(mysqlnd_res, fetch_field_data)(MYSQLND_RES *result, unsigned int /* {{{ mysqlnd_result_init */ -MYSQLND_RES *mysqlnd_result_init(unsigned int field_count, MYSQLND_THD_ZVAL_PCACHE *cache TSRMLS_DC) +PHPAPI MYSQLND_RES * +mysqlnd_result_init(unsigned int field_count TSRMLS_DC) { - MYSQLND_RES *ret = mnd_ecalloc(1, sizeof(MYSQLND_RES)); + size_t alloc_size = sizeof(MYSQLND_RES) + mysqlnd_plugin_count() * sizeof(void *); + MYSQLND_RES *ret = mnd_ecalloc(1, alloc_size); DBG_ENTER("mysqlnd_result_init"); - DBG_INF_FMT("field_count=%u cache=%p", field_count, cache); + DBG_INF_FMT("field_count=%u", field_count); ret->field_count = field_count; - ret->zval_cache = cache; ret->m.use_result = MYSQLND_METHOD(mysqlnd_res, use_result); ret->m.store_result = MYSQLND_METHOD(mysqlnd_res, store_result); - ret->m.background_store_result = MYSQLND_METHOD(mysqlnd_res, background_store_result); ret->m.free_result = MYSQLND_METHOD(mysqlnd_res, free_result); ret->m.seek_data = MYSQLND_METHOD(mysqlnd_res, data_seek); ret->m.num_rows = MYSQLND_METHOD(mysqlnd_res, num_rows); @@ -2007,8 +1556,13 @@ MYSQLND_RES *mysqlnd_result_init(unsigned int field_count, MYSQLND_THD_ZVAL_PCAC ret->m.free_result_buffers = MYSQLND_METHOD(mysqlnd_res, free_result_buffers); ret->m.free_result_internal = mysqlnd_internal_free_result; ret->m.free_result_contents = mysqlnd_internal_free_result_contents; + ret->m.free_buffered_data = MYSQLND_METHOD(mysqlnd_res, free_buffered_data); + ret->m.unbuffered_free_last_data = MYSQLND_METHOD(mysqlnd_res, unbuffered_free_last_data); ret->m.read_result_metadata = MYSQLND_METHOD(mysqlnd_res, read_result_metadata); + ret->m.store_result_fetch_data = MYSQLND_METHOD(mysqlnd_res, store_result_fetch_data); + ret->m.initialize_result_set_rest = MYSQLND_METHOD(mysqlnd_res, initialize_result_set_rest); + ret->m.fetch_row_normal_buffered = mysqlnd_fetch_row_buffered; ret->m.fetch_row_normal_unbuffered = mysqlnd_fetch_row_unbuffered; ret->m.row_decoder = NULL; @@ -2017,6 +1571,19 @@ MYSQLND_RES *mysqlnd_result_init(unsigned int field_count, MYSQLND_THD_ZVAL_PCAC } /* }}} */ + +/* {{{ _mysqlnd_plugin_get_plugin_result_data */ +PHPAPI void ** _mysqlnd_plugin_get_plugin_result_data(const MYSQLND_RES * result, unsigned int plugin_id TSRMLS_DC) +{ + DBG_ENTER("_mysqlnd_plugin_get_plugin_result_data"); + DBG_INF_FMT("plugin_id=%u", plugin_id); + if (!result || plugin_id >= mysqlnd_plugin_count()) { + return NULL; + } + DBG_RETURN((void *)((char *)result + sizeof(MYSQLND_RES) + plugin_id * sizeof(void *))); +} +/* }}} */ + /* * Local variables: * tab-width: 4 diff --git a/ext/mysqlnd/mysqlnd_result.h b/ext/mysqlnd/mysqlnd_result.h index 1f7a249d2..0ed188df9 100644 --- a/ext/mysqlnd/mysqlnd_result.h +++ b/ext/mysqlnd/mysqlnd_result.h @@ -18,31 +18,15 @@ +----------------------------------------------------------------------+ */ -/* $Id: mysqlnd_result.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: mysqlnd_result.h 293779 2010-01-20 17:09:28Z johannes $ */ #ifndef MYSQLND_RESULT_H #define MYSQLND_RESULT_H -MYSQLND_RES *mysqlnd_result_init(unsigned int field_count, MYSQLND_THD_ZVAL_PCACHE *cache TSRMLS_DC); - -void mysqlnd_unbuffered_free_last_data(MYSQLND_RES *result TSRMLS_DC); - -enum_func_status -mysqlnd_store_result_fetch_data(MYSQLND * const conn, MYSQLND_RES *result, - MYSQLND_RES_METADATA *meta, - zend_bool binary_protocol, - zend_bool to_cache TSRMLS_DC); +PHPAPI MYSQLND_RES * mysqlnd_result_init(unsigned int field_count TSRMLS_DC); enum_func_status mysqlnd_query_read_result_set_header(MYSQLND *conn, MYSQLND_STMT *stmt TSRMLS_DC); -void mysqlnd_res_initialize_result_set_rest(MYSQLND_RES * const result TSRMLS_DC); - - -#ifdef MYSQLND_THREADED -void * mysqlnd_fetch_thread(void *arg); -#endif - -enum_func_status mysqlnd_background_store_result_fetch_data(MYSQLND_RES *result TSRMLS_DC); #endif /* MYSQLND_RESULT_H */ /* diff --git a/ext/mysqlnd/mysqlnd_result_meta.c b/ext/mysqlnd/mysqlnd_result_meta.c index 8a8787f88..108b83938 100644 --- a/ext/mysqlnd/mysqlnd_result_meta.c +++ b/ext/mysqlnd/mysqlnd_result_meta.c @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: mysqlnd_result_meta.c 289630 2009-10-14 13:51:25Z johannes $ */ +/* $Id: mysqlnd_result_meta.c 294543 2010-02-04 20:28:55Z johannes $ */ #include "php.h" #include "mysqlnd.h" #include "mysqlnd_priv.h" @@ -138,11 +138,10 @@ zend_bool mysqlnd_unicode_is_key_numeric(UChar *key, size_t length, long *idx) /* {{{ mysqlnd_res_meta::read_metadata */ static enum_func_status -MYSQLND_METHOD(mysqlnd_res_meta, read_metadata)(MYSQLND_RES_METADATA * const meta, - MYSQLND *conn TSRMLS_DC) +MYSQLND_METHOD(mysqlnd_res_meta, read_metadata)(MYSQLND_RES_METADATA * const meta, MYSQLND *conn TSRMLS_DC) { unsigned int i = 0; - php_mysql_packet_res_field field_packet; + MYSQLND_PACKET_RES_FIELD * field_packet; #if PHP_MAJOR_VERSION >= 6 UChar *ustr; int ulen; @@ -150,7 +149,7 @@ MYSQLND_METHOD(mysqlnd_res_meta, read_metadata)(MYSQLND_RES_METADATA * const met DBG_ENTER("mysqlnd_res_meta::read_metadata"); - PACKET_INIT_ALLOCA(field_packet, PROT_RSET_FLD_PACKET); + field_packet = conn->protocol->m.get_result_field_packet(conn->protocol, FALSE TSRMLS_CC); for (;i < meta->field_count; i++) { long idx; @@ -160,19 +159,19 @@ MYSQLND_METHOD(mysqlnd_res_meta, read_metadata)(MYSQLND_RES_METADATA * const met meta->fields[i].root = NULL; } - field_packet.metadata = &(meta->fields[i]); - if (FAIL == PACKET_READ_ALLOCA(field_packet, conn)) { - PACKET_FREE_ALLOCA(field_packet); + field_packet->metadata = &(meta->fields[i]); + if (FAIL == PACKET_READ(field_packet, conn)) { + PACKET_FREE(field_packet); DBG_RETURN(FAIL); } - if (field_packet.error_info.error_no) { - conn->error_info = field_packet.error_info; + if (field_packet->error_info.error_no) { + conn->error_info = field_packet->error_info; /* Return back from CONN_QUERY_SENT */ - PACKET_FREE_ALLOCA(field_packet); + PACKET_FREE(field_packet); DBG_RETURN(FAIL); } - if (field_packet.stupid_list_fields_eof == TRUE) { + if (field_packet->stupid_list_fields_eof == TRUE) { meta->field_count = i; break; } @@ -184,7 +183,7 @@ MYSQLND_METHOD(mysqlnd_res_meta, read_metadata)(MYSQLND_RES_METADATA * const met "Unknown type %d sent by the server. " "Please send a report to the developers", meta->fields[i].type); - PACKET_FREE_ALLOCA(field_packet); + PACKET_FREE(field_packet); DBG_RETURN(FAIL); } if (meta->fields[i].type == MYSQL_TYPE_BIT) { @@ -240,19 +239,19 @@ MYSQLND_METHOD(mysqlnd_res_meta, read_metadata)(MYSQLND_RES_METADATA * const met #else /* For BC we have to check whether the key is numeric and use it like this */ if ((meta->zend_hash_keys[i].is_numeric = - mysqlnd_is_key_numeric(field_packet.metadata->name, - field_packet.metadata->name_length + 1, + mysqlnd_is_key_numeric(field_packet->metadata->name, + field_packet->metadata->name_length + 1, &idx))) { meta->zend_hash_keys[i].key = idx; } else { meta->zend_hash_keys[i].key = - zend_get_hash_value(field_packet.metadata->name, - field_packet.metadata->name_length + 1); + zend_get_hash_value(field_packet->metadata->name, + field_packet->metadata->name_length + 1); } #endif } - PACKET_FREE_ALLOCA(field_packet); + PACKET_FREE(field_packet); DBG_RETURN(PASS); } @@ -303,8 +302,7 @@ MYSQLND_METHOD(mysqlnd_res_meta, free)(MYSQLND_RES_METADATA *meta, zend_bool per /* {{{ mysqlnd_res::clone_metadata */ static MYSQLND_RES_METADATA * -MYSQLND_METHOD(mysqlnd_res_meta, clone_metadata)(const MYSQLND_RES_METADATA * const meta, - zend_bool persistent TSRMLS_DC) +MYSQLND_METHOD(mysqlnd_res_meta, clone_metadata)(const MYSQLND_RES_METADATA * const meta, zend_bool persistent TSRMLS_DC) { unsigned int i; /* +1 is to have empty marker at the end */ @@ -393,8 +391,7 @@ MYSQLND_METHOD(mysqlnd_res_meta, fetch_field)(MYSQLND_RES_METADATA * const meta /* {{{ mysqlnd_res_meta::fetch_field_direct */ static const MYSQLND_FIELD * -MYSQLND_METHOD(mysqlnd_res_meta, fetch_field_direct)(const MYSQLND_RES_METADATA * const meta, - MYSQLND_FIELD_OFFSET fieldnr TSRMLS_DC) +MYSQLND_METHOD(mysqlnd_res_meta, fetch_field_direct)(const MYSQLND_RES_METADATA * const meta, MYSQLND_FIELD_OFFSET fieldnr TSRMLS_DC) { DBG_ENTER("mysqlnd_res_meta::fetch_field_direct"); DBG_INF_FMT("fieldnr=%d", fieldnr); @@ -418,7 +415,7 @@ MYSQLND_METHOD(mysqlnd_res_meta, fetch_fields)(MYSQLND_RES_METADATA * const meta /* {{{ mysqlnd_res_meta::field_tell */ static MYSQLND_FIELD_OFFSET -MYSQLND_METHOD(mysqlnd_res_meta, field_tell)(const MYSQLND_RES_METADATA * const meta) +MYSQLND_METHOD(mysqlnd_res_meta, field_tell)(const MYSQLND_RES_METADATA * const meta TSRMLS_DC) { return meta->current_field; } @@ -437,7 +434,7 @@ MYSQLND_CLASS_METHODS_END; /* {{{ mysqlnd_result_meta_init */ -MYSQLND_RES_METADATA * +PHPAPI MYSQLND_RES_METADATA * mysqlnd_result_meta_init(unsigned int field_count TSRMLS_DC) { MYSQLND_RES_METADATA *ret; diff --git a/ext/mysqlnd/mysqlnd_result_meta.h b/ext/mysqlnd/mysqlnd_result_meta.h index d4da9671e..6a3d9164f 100644 --- a/ext/mysqlnd/mysqlnd_result_meta.h +++ b/ext/mysqlnd/mysqlnd_result_meta.h @@ -18,13 +18,13 @@ +----------------------------------------------------------------------+ */ -/* $Id: mysqlnd_result_meta.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: mysqlnd_result_meta.h 293779 2010-01-20 17:09:28Z johannes $ */ #ifndef MYSQLND_RESULT_META_H #define MYSQLND_RESULT_META_H -MYSQLND_RES_METADATA *mysqlnd_result_meta_init(unsigned int field_count TSRMLS_DC); +PHPAPI MYSQLND_RES_METADATA * mysqlnd_result_meta_init(unsigned int field_count TSRMLS_DC); diff --git a/ext/mysqlnd/mysqlnd_statistics.c b/ext/mysqlnd/mysqlnd_statistics.c index 612614165..1fa8d1472 100644 --- a/ext/mysqlnd/mysqlnd_statistics.c +++ b/ext/mysqlnd/mysqlnd_statistics.c @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: mysqlnd_statistics.c 287807 2009-08-27 13:16:39Z andrey $ */ +/* $Id: mysqlnd_statistics.c 293779 2010-01-20 17:09:28Z johannes $ */ #include "php.h" #include "mysqlnd.h" #include "mysqlnd_priv.h" @@ -76,6 +76,8 @@ const MYSQLND_STRING mysqlnd_stats_values_names[STAT_LAST] = { STR_W_LEN("rows_fetched_from_client_ps_buffered") }, { STR_W_LEN("rows_fetched_from_client_ps_unbuffered") }, { STR_W_LEN("rows_fetched_from_client_ps_cursor") }, + { STR_W_LEN("rows_affected_normal") }, + { STR_W_LEN("rows_affected_ps") }, { STR_W_LEN("rows_skipped_normal") }, { STR_W_LEN("rows_skipped_ps") }, { STR_W_LEN("copy_on_write_saved") }, @@ -153,19 +155,48 @@ const MYSQLND_STRING mysqlnd_stats_values_names[STAT_LAST] = { STR_W_LEN("proto_binary_fetched_geometry") }, { STR_W_LEN("proto_binary_fetched_other") }, { STR_W_LEN("init_command_executed_count") }, - { STR_W_LEN("init_command_failed_count") } + { STR_W_LEN("init_command_failed_count") }, + { STR_W_LEN("com_quit") }, + { STR_W_LEN("com_init_db") }, + { STR_W_LEN("com_query") }, + { STR_W_LEN("com_field_list") }, + { STR_W_LEN("com_create_db") }, + { STR_W_LEN("com_drop_db") }, + { STR_W_LEN("com_refresh") }, + { STR_W_LEN("com_shutdown") }, + { STR_W_LEN("com_statistics") }, + { STR_W_LEN("com_process_info") }, + { STR_W_LEN("com_connect") }, + { STR_W_LEN("com_process_kill") }, + { STR_W_LEN("com_debug") }, + { STR_W_LEN("com_ping") }, + { STR_W_LEN("com_time") }, + { STR_W_LEN("com_delayed_insert") }, + { STR_W_LEN("com_change_user") }, + { STR_W_LEN("com_binlog_dump") }, + { STR_W_LEN("com_table_dump") }, + { STR_W_LEN("com_connect_out") }, + { STR_W_LEN("com_register_slave") }, + { STR_W_LEN("com_stmt_prepare") }, + { STR_W_LEN("com_stmt_execute") }, + { STR_W_LEN("com_stmt_send_long_data") }, + { STR_W_LEN("com_stmt_close") }, + { STR_W_LEN("com_stmt_reset") }, + { STR_W_LEN("com_stmt_set_option") }, + { STR_W_LEN("com_stmt_fetch") }, + { STR_W_LEN("com_deamon") } }; /* }}} */ /* {{{ mysqlnd_fill_stats_hash */ -void -mysqlnd_fill_stats_hash(const MYSQLND_STATS * const stats, zval *return_value TSRMLS_DC ZEND_FILE_LINE_DC) +PHPAPI void +mysqlnd_fill_stats_hash(const MYSQLND_STATS * const stats, const MYSQLND_STRING * names, zval *return_value TSRMLS_DC ZEND_FILE_LINE_DC) { unsigned int i; - mysqlnd_array_init(return_value, STAT_LAST); - for (i = 0; i < STAT_LAST; i++) { + mysqlnd_array_init(return_value, stats->count); + for (i = 0; i < stats->count; i++) { #if PHP_MAJOR_VERSION >= 6 UChar *ustr, *tstr; int ulen, tlen; @@ -174,15 +205,13 @@ mysqlnd_fill_stats_hash(const MYSQLND_STATS * const stats, zval *return_value TS sprintf((char *)&tmp, MYSQLND_LLU_SPEC, stats->values[i]); #if PHP_MAJOR_VERSION >= 6 - zend_string_to_unicode(UG(utf8_conv), &ustr, &ulen, mysqlnd_stats_values_names[i].s, - mysqlnd_stats_values_names[i].l + 1 TSRMLS_CC); + zend_string_to_unicode(UG(utf8_conv), &ustr, &ulen, names[i].s, names[i].l + 1 TSRMLS_CC); zend_string_to_unicode(UG(utf8_conv), &tstr, &tlen, tmp, strlen(tmp) + 1 TSRMLS_CC); add_u_assoc_unicode_ex(return_value, IS_UNICODE, ZSTR(ustr), ulen, tstr, 1); efree(ustr); efree(tstr); #else - add_assoc_string_ex(return_value, mysqlnd_stats_values_names[i].s, - mysqlnd_stats_values_names[i].l + 1, tmp, 1); + add_assoc_string_ex(return_value, names[i].s, names[i].l + 1, tmp, 1); #endif } } @@ -198,17 +227,21 @@ PHPAPI void _mysqlnd_get_client_stats(zval *return_value TSRMLS_DC ZEND_FILE_LIN memset(&stats, 0, sizeof(stats)); stats_ptr = &stats; } - mysqlnd_fill_stats_hash(stats_ptr, return_value TSRMLS_CC ZEND_FILE_LINE_CC); + mysqlnd_fill_stats_hash(stats_ptr, mysqlnd_stats_values_names, return_value TSRMLS_CC ZEND_FILE_LINE_CC); DBG_VOID_RETURN; } /* }}} */ /* {{{ mysqlnd_stats_init */ -void -mysqlnd_stats_init(MYSQLND_STATS ** stats) +PHPAPI void +mysqlnd_stats_init(MYSQLND_STATS ** stats, size_t statistic_count) { *stats = calloc(1, sizeof(MYSQLND_STATS)); + (*stats)->values = calloc(statistic_count, sizeof(uint64_t)); + (*stats)->triggers = calloc(statistic_count, sizeof(mysqlnd_stat_trigger)); + (*stats)->in_trigger = FALSE; + (*stats)->count = statistic_count; #ifdef ZTS (*stats)->LOCK_access = tsrm_mutex_alloc(); #endif @@ -218,18 +251,53 @@ mysqlnd_stats_init(MYSQLND_STATS ** stats) /* {{{ mysqlnd_stats_end */ -void +PHPAPI void mysqlnd_stats_end(MYSQLND_STATS * stats) { #ifdef ZTS tsrm_mutex_free(stats->LOCK_access); #endif + free(stats->triggers); + free(stats->values); /* mnd_free will reference LOCK_access and crash...*/ free(stats); } /* }}} */ +/* {{{ mysqlnd_stats_set_trigger */ +PHPAPI mysqlnd_stat_trigger +mysqlnd_stats_set_trigger(MYSQLND_STATS * const stats, enum_mysqlnd_collected_stats stat, mysqlnd_stat_trigger trigger TSRMLS_DC) +{ + mysqlnd_stat_trigger ret = NULL; + DBG_ENTER("mysqlnd_stats_set_trigger"); + if (stats) { + MYSQLND_STATS_LOCK(stats); + ret = stats->triggers[stat]; + stats->triggers[stat] = trigger; + MYSQLND_STATS_UNLOCK(stats); + } + DBG_RETURN(ret); +} +/* }}} */ + + +/* {{{ mysqlnd_stats_set_handler */ +PHPAPI mysqlnd_stat_trigger +mysqlnd_stats_reset_triggers(MYSQLND_STATS * const stats TSRMLS_DC) +{ + mysqlnd_stat_trigger ret = NULL; + DBG_ENTER("mysqlnd_stats_reset_trigger"); + if (stats) { + MYSQLND_STATS_LOCK(stats); + memset(stats->triggers, 0, stats->count * sizeof(mysqlnd_stat_trigger)); + MYSQLND_STATS_UNLOCK(stats); + } + DBG_RETURN(ret); +} +/* }}} */ + + /* * Local variables: * tab-width: 4 diff --git a/ext/mysqlnd/mysqlnd_statistics.h b/ext/mysqlnd/mysqlnd_statistics.h index 184d0e389..a3281b44f 100644 --- a/ext/mysqlnd/mysqlnd_statistics.h +++ b/ext/mysqlnd/mysqlnd_statistics.h @@ -18,13 +18,13 @@ +----------------------------------------------------------------------+ */ -/* $Id: mysqlnd_statistics.h 282029 2009-06-12 13:24:57Z andrey $ */ +/* $Id: mysqlnd_statistics.h 294543 2010-02-04 20:28:55Z johannes $ */ #ifndef MYSQLND_STATISTICS_H #define MYSQLND_STATISTICS_H -extern MYSQLND_STATS *mysqlnd_global_stats; +PHPAPI extern MYSQLND_STATS * mysqlnd_global_stats; typedef struct st_mysqlnd_string { @@ -35,243 +35,121 @@ typedef struct st_mysqlnd_string extern const MYSQLND_STRING mysqlnd_stats_values_names[]; #ifdef ZTS +#define MYSQLND_STATS_LOCK(stats) tsrm_mutex_lock((stats)->LOCK_access) +#define MYSQLND_STATS_UNLOCK(stats) tsrm_mutex_unlock((stats)->LOCK_access) +#else +#define MYSQLND_STATS_LOCK(stats) +#define MYSQLND_STATS_UNLOCK(stats) +#endif -#define MYSQLND_INC_GLOBAL_STATISTIC(statistic) \ - { \ - if (MYSQLND_G(collect_statistics) && (statistic) != STAT_LAST) { \ - DBG_INF_FMT("Global stat increase [%s]", mysqlnd_stats_values_names[(statistic)].s); \ - \ - tsrm_mutex_lock(mysqlnd_global_stats->LOCK_access); \ - mysqlnd_global_stats->values[(statistic)]++; \ - tsrm_mutex_unlock(mysqlnd_global_stats->LOCK_access); \ - }\ - } - -#define MYSQLND_DEC_CONN_STATISTIC(conn_stats, statistic) \ - { \ - if (MYSQLND_G(collect_statistics) && (statistic) != STAT_LAST) { \ - DBG_INF_FMT("Global&conn stat decrease [%s]", mysqlnd_stats_values_names[(statistic)].s); \ - \ - tsrm_mutex_lock(mysqlnd_global_stats->LOCK_access); \ - mysqlnd_global_stats->values[(statistic)]--; \ - tsrm_mutex_unlock(mysqlnd_global_stats->LOCK_access); \ - if ((conn_stats)) { \ - ((MYSQLND_STATS *) conn_stats)->values[(statistic)]--; \ - } \ - }\ - } - -#define MYSQLND_INC_GLOBAL_STATISTIC_W_VALUE2(statistic1, value1, statistic2, value2) \ +#define MYSQLND_UPDATE_VALUE_AND_CALL_TRIGGER(stats, statistic, value) \ + { \ + MYSQLND_STATS_LOCK(stats); \ + (stats)->values[(statistic)] += (value); \ + if ((stats)->triggers[(statistic)] && (stats)->in_trigger == FALSE) { \ + (stats)->in_trigger = TRUE; \ + MYSQLND_STATS_UNLOCK(stats); \ + \ + (stats)->triggers[(statistic)]((stats), (statistic), (value) TSRMLS_CC); \ + \ + MYSQLND_STATS_LOCK(stats); \ + (stats)->in_trigger = FALSE; \ + } \ + MYSQLND_STATS_UNLOCK(_p_s); \ + } \ + +#define MYSQLND_DEC_STATISTIC(enabler, stats, statistic) \ { \ - if (MYSQLND_G(collect_statistics)) { \ - uint64_t v1 = (uint64_t) (value1); \ - uint64_t v2 = (uint64_t) (value2); \ - enum_mysqlnd_collected_stats _s1 = (statistic1);\ - enum_mysqlnd_collected_stats _s2 = (statistic2);\ - \ - if (_s1 != STAT_LAST) DBG_INF_FMT("Global stat increase1 [%s]", mysqlnd_stats_values_names[_s1].s); \ - if (_s2 != STAT_LAST) DBG_INF_FMT("Global stat increase2 [%s]", mysqlnd_stats_values_names[_s2].s); \ - \ - tsrm_mutex_lock(mysqlnd_global_stats->LOCK_access); \ - if (_s1 != STAT_LAST) mysqlnd_global_stats->values[_s1]+= v1; \ - if (_s2 != STAT_LAST) mysqlnd_global_stats->values[_s2]+= v2; \ - tsrm_mutex_unlock(mysqlnd_global_stats->LOCK_access); \ + enum_mysqlnd_collected_stats _s = (statistic);\ + MYSQLND_STATS * _p_s = (MYSQLND_STATS *) (stats); \ + if ((enabler) && _p_s && _s != _p_s->count) { \ + MYSQLND_UPDATE_VALUE_AND_CALL_TRIGGER(_p_s, _s, -1); \ }\ } -#define MYSQLND_INC_CONN_STATISTIC(conn_stats, statistic) \ +#define MYSQLND_INC_STATISTIC(enabler, stats, statistic) \ { \ - if (MYSQLND_G(collect_statistics) && (statistic) != STAT_LAST) { \ - DBG_INF_FMT("Global&Conn stat increase [%s]", mysqlnd_stats_values_names[(statistic)].s); \ - \ - tsrm_mutex_lock(mysqlnd_global_stats->LOCK_access); \ - mysqlnd_global_stats->values[(statistic)]++; \ - tsrm_mutex_unlock(mysqlnd_global_stats->LOCK_access); \ - if ((conn_stats)) { \ - ((MYSQLND_STATS *) conn_stats)->values[(statistic)]++; \ - } \ + enum_mysqlnd_collected_stats _s = (statistic);\ + MYSQLND_STATS * _p_s = (MYSQLND_STATS *) (stats); \ + if ((enabler) && _p_s && _s != _p_s->count) { \ + MYSQLND_UPDATE_VALUE_AND_CALL_TRIGGER(_p_s, _s, 1); \ }\ } -#define MYSQLND_INC_CONN_STATISTIC_W_VALUE(conn_stats, statistic, value) \ +#define MYSQLND_INC_STATISTIC_W_VALUE(enabler, stats, statistic, value) \ { \ - if (MYSQLND_G(collect_statistics) && (statistic) != STAT_LAST) { \ + enum_mysqlnd_collected_stats _s = (statistic);\ + MYSQLND_STATS * _p_s = (MYSQLND_STATS *) (stats); \ + if ((enabler) && _p_s && _s != _p_s->count) { \ uint64_t v = (uint64_t) (value); \ - DBG_INF_FMT("Global&Conn stat increase w value [%s]", mysqlnd_stats_values_names[(statistic)].s); \ - \ - tsrm_mutex_lock(mysqlnd_global_stats->LOCK_access); \ - mysqlnd_global_stats->values[(statistic)] += v; \ - tsrm_mutex_unlock(mysqlnd_global_stats->LOCK_access); \ - if ((conn_stats)) { \ - ((MYSQLND_STATS *) conn_stats)->values[(statistic)]+= v; \ - } \ + MYSQLND_UPDATE_VALUE_AND_CALL_TRIGGER(_p_s, _s, v); \ }\ } -#define MYSQLND_INC_CONN_STATISTIC_W_VALUE2(conn_stats, statistic1, value1, statistic2, value2) \ +#define MYSQLND_INC_STATISTIC_W_VALUE2(enabler, stats, statistic1, value1, statistic2, value2) \ { \ - if (MYSQLND_G(collect_statistics)) { \ + MYSQLND_STATS * _p_s = (MYSQLND_STATS *) (stats); \ + if ((enabler) && _p_s) { \ uint64_t v1 = (uint64_t) (value1); \ uint64_t v2 = (uint64_t) (value2); \ enum_mysqlnd_collected_stats _s1 = (statistic1);\ enum_mysqlnd_collected_stats _s2 = (statistic2);\ - \ - if (_s1 != STAT_LAST) DBG_INF_FMT("Global stat increase1 [%s]", mysqlnd_stats_values_names[_s1].s); \ - if (_s2 != STAT_LAST) DBG_INF_FMT("Global stat increase2 [%s]", mysqlnd_stats_values_names[_s2].s); \ - \ - tsrm_mutex_lock(mysqlnd_global_stats->LOCK_access); \ - if (_s1 != STAT_LAST) mysqlnd_global_stats->values[_s1]+= v1; \ - if (_s2 != STAT_LAST) mysqlnd_global_stats->values[_s2]+= v2; \ - tsrm_mutex_unlock(mysqlnd_global_stats->LOCK_access); \ - if ((conn_stats)) { \ - if (_s1 != STAT_LAST) ((MYSQLND_STATS *) conn_stats)->values[_s1]+= v1; \ - if (_s2 != STAT_LAST) ((MYSQLND_STATS *) conn_stats)->values[_s2]+= v2; \ - } \ - } \ + if (_s1 != _p_s->count) MYSQLND_UPDATE_VALUE_AND_CALL_TRIGGER(_p_s, _s1, v1); \ + if (_s2 != _p_s->count) MYSQLND_UPDATE_VALUE_AND_CALL_TRIGGER(_p_s, _s2, v2); \ + }\ } - -#define MYSQLND_INC_CONN_STATISTIC_W_VALUE3(conn_stats, statistic1, value1, statistic2, value2, statistic3, value3) \ +#define MYSQLND_INC_STATISTIC_W_VALUE3(enabler, stats, statistic1, value1, statistic2, value2, statistic3, value3) \ { \ - if (MYSQLND_G(collect_statistics)) { \ + MYSQLND_STATS * _p_s = (MYSQLND_STATS *) (stats); \ + if ((enabler) && _p_s) { \ uint64_t v1 = (uint64_t) (value1); \ uint64_t v2 = (uint64_t) (value2); \ uint64_t v3 = (uint64_t) (value3); \ - enum_mysqlnd_collected_stats _s1 = (statistic1); \ - enum_mysqlnd_collected_stats _s2 = (statistic2); \ - enum_mysqlnd_collected_stats _s3 = (statistic3); \ - \ - if (_s1 != STAT_LAST) DBG_INF_FMT("Global stat increase1 [%s]", mysqlnd_stats_values_names[_s1].s); \ - if (_s2 != STAT_LAST) DBG_INF_FMT("Global stat increase2 [%s]", mysqlnd_stats_values_names[_s2].s); \ - if (_s3 != STAT_LAST) DBG_INF_FMT("Global stat increase3 [%s]", mysqlnd_stats_values_names[_s3].s); \ - \ - tsrm_mutex_lock(mysqlnd_global_stats->LOCK_access); \ - if (_s1 != STAT_LAST) mysqlnd_global_stats->values[_s1]+= v1; \ - if (_s2 != STAT_LAST) mysqlnd_global_stats->values[_s2]+= v2; \ - if (_s3 != STAT_LAST) mysqlnd_global_stats->values[_s3]+= v3; \ - tsrm_mutex_unlock(mysqlnd_global_stats->LOCK_access); \ - if ((conn_stats)) { \ - if (_s1 != STAT_LAST) ((MYSQLND_STATS *) conn_stats)->values[_s1]+= v1; \ - if (_s2 != STAT_LAST) ((MYSQLND_STATS *) conn_stats)->values[_s2]+= v2; \ - if (_s3 != STAT_LAST) ((MYSQLND_STATS *) conn_stats)->values[_s3]+= v3; \ - } \ - } \ + enum_mysqlnd_collected_stats _s1 = (statistic1);\ + enum_mysqlnd_collected_stats _s2 = (statistic2);\ + enum_mysqlnd_collected_stats _s3 = (statistic3);\ + if (_s1 != _p_s->count) MYSQLND_UPDATE_VALUE_AND_CALL_TRIGGER(_p_s, _s1, v1); \ + if (_s2 != _p_s->count) MYSQLND_UPDATE_VALUE_AND_CALL_TRIGGER(_p_s, _s2, v2); \ + if (_s3 != _p_s->count) MYSQLND_UPDATE_VALUE_AND_CALL_TRIGGER(_p_s, _s3, v3); \ + }\ } -#else /* NON-ZTS */ - #define MYSQLND_INC_GLOBAL_STATISTIC(statistic) \ - { \ - if (MYSQLND_G(collect_statistics) && (statistic) != STAT_LAST) { \ - DBG_INF_FMT("Global stat increase [%s]", mysqlnd_stats_values_names[(statistic)].s); \ - mysqlnd_global_stats->values[(statistic)]++; \ - } \ - } - + MYSQLND_INC_STATISTIC(MYSQLND_G(collect_statistics), mysqlnd_global_stats, (statistic)) #define MYSQLND_DEC_CONN_STATISTIC(conn_stats, statistic) \ - { \ - if (MYSQLND_G(collect_statistics) && (statistic) != STAT_LAST) { \ - DBG_INF_FMT("Global&Conn stat decrease [%s]", mysqlnd_stats_values_names[(statistic)].s); \ - mysqlnd_global_stats->values[(statistic)]--; \ - if ((conn_stats)) { \ - ((MYSQLND_STATS *) conn_stats)->values[(statistic)]--; \ - } \ - } \ - } + MYSQLND_DEC_STATISTIC(MYSQLND_G(collect_statistics), mysqlnd_global_stats, (statistic)) #define MYSQLND_INC_GLOBAL_STATISTIC_W_VALUE2(statistic1, value1, statistic2, value2) \ - { \ - if (MYSQLND_G(collect_statistics)) { \ - uint64_t v1 = (uint64_t) (value1); \ - uint64_t v2 = (uint64_t) (value2); \ - enum_mysqlnd_collected_stats _s1 = (statistic1);\ - enum_mysqlnd_collected_stats _s2 = (statistic2);\ - \ - if (_s1 != STAT_LAST) DBG_INF_FMT("Global stat increase1 [%s]", mysqlnd_stats_values_names[_s1].s); \ - if (_s2 != STAT_LAST) DBG_INF_FMT("Global stat increase2 [%s]", mysqlnd_stats_values_names[_s2].s); \ - \ - if (_s1 != STAT_LAST) mysqlnd_global_stats->values[_s1]+= v1; \ - if (_s2 != STAT_LAST) mysqlnd_global_stats->values[_s2]+= v2; \ - }\ - } + MYSQLND_INC_STATISTIC_W_VALUE2(MYSQLND_G(collect_statistics), mysqlnd_global_stats, (statistic1), (value1), (statistic2), (value2)) #define MYSQLND_INC_CONN_STATISTIC(conn_stats, statistic) \ - { \ - if (MYSQLND_G(collect_statistics) && (statistic) != STAT_LAST) { \ - DBG_INF_FMT("Global&Conn stat increase [%s]", mysqlnd_stats_values_names[(statistic)].s); \ - mysqlnd_global_stats->values[(statistic)]++; \ - if ((conn_stats)) { \ - ((MYSQLND_STATS *) conn_stats)->values[(statistic)]++; \ - } \ - } \ - } + MYSQLND_INC_STATISTIC(MYSQLND_G(collect_statistics), mysqlnd_global_stats, (statistic)); \ + MYSQLND_INC_STATISTIC(MYSQLND_G(collect_statistics), (conn_stats), (statistic)); #define MYSQLND_INC_CONN_STATISTIC_W_VALUE(conn_stats, statistic, value) \ - { \ - if (MYSQLND_G(collect_statistics) && (statistic) != STAT_LAST) { \ - uint64_t v = (uint64_t) (value); \ - DBG_INF_FMT("Global&Conn stats increase w value [%s]", mysqlnd_stats_values_names[(statistic)].s); \ - mysqlnd_global_stats->values[(statistic)] += v; \ - if ((conn_stats)) { \ - ((MYSQLND_STATS *) conn_stats)->values[(statistic)] += v; \ - } \ - } \ - } + MYSQLND_INC_STATISTIC_W_VALUE(MYSQLND_G(collect_statistics), mysqlnd_global_stats, (statistic), (value)); \ + MYSQLND_INC_STATISTIC_W_VALUE(MYSQLND_G(collect_statistics), (conn_stats), (statistic), (value)); #define MYSQLND_INC_CONN_STATISTIC_W_VALUE2(conn_stats, statistic1, value1, statistic2, value2) \ - { \ - if (MYSQLND_G(collect_statistics)) { \ - uint64_t v1 = (uint64_t) (value1); \ - uint64_t v2 = (uint64_t) (value2); \ - enum_mysqlnd_collected_stats _s1 = (statistic1);\ - enum_mysqlnd_collected_stats _s2 = (statistic2);\ - if (_s1 != STAT_LAST) DBG_INF_FMT("Global stat increase1 [%s]", mysqlnd_stats_values_names[_s1].s); \ - if (_s2 != STAT_LAST) DBG_INF_FMT("Global stat increase2 [%s]", mysqlnd_stats_values_names[_s2].s); \ - \ - if (_s1 != STAT_LAST) mysqlnd_global_stats->values[_s1]+= v1; \ - if (_s2 != STAT_LAST) mysqlnd_global_stats->values[_s2]+= v2; \ - if ((conn_stats)) { \ - if (_s1 != STAT_LAST) ((MYSQLND_STATS *) conn_stats)->values[_s1]+= v1; \ - if (_s2 != STAT_LAST) ((MYSQLND_STATS *) conn_stats)->values[_s2]+= v2; \ - } \ - } \ - } + MYSQLND_INC_STATISTIC_W_VALUE2(MYSQLND_G(collect_statistics), mysqlnd_global_stats, (statistic1), (value1), (statistic2), (value2)); \ + MYSQLND_INC_STATISTIC_W_VALUE2(MYSQLND_G(collect_statistics), (conn_stats), (statistic1), (value1), (statistic2), (value2)); #define MYSQLND_INC_CONN_STATISTIC_W_VALUE3(conn_stats, statistic1, value1, statistic2, value2, statistic3, value3) \ - { \ - if (MYSQLND_G(collect_statistics)) { \ - uint64_t v1 = (uint64_t) (value1); \ - uint64_t v2 = (uint64_t) (value2); \ - uint64_t v3 = (uint64_t) (value3); \ - enum_mysqlnd_collected_stats _s1 = (statistic1); \ - enum_mysqlnd_collected_stats _s2 = (statistic2); \ - enum_mysqlnd_collected_stats _s3 = (statistic3); \ - \ - if (_s1 != STAT_LAST) DBG_INF_FMT("Global stat increase1 [%s]", mysqlnd_stats_values_names[_s1].s); \ - if (_s2 != STAT_LAST) DBG_INF_FMT("Global stat increase2 [%s]", mysqlnd_stats_values_names[_s2].s); \ - if (_s3 != STAT_LAST) DBG_INF_FMT("Global stat increase3 [%s]", mysqlnd_stats_values_names[_s3].s); \ - \ - if (_s1 != STAT_LAST) mysqlnd_global_stats->values[_s1]+= v1; \ - if (_s2 != STAT_LAST) mysqlnd_global_stats->values[_s2]+= v2; \ - if (_s3 != STAT_LAST) mysqlnd_global_stats->values[_s3]+= v3; \ - if ((conn_stats)) { \ - if (_s1 != STAT_LAST) ((MYSQLND_STATS *) conn_stats)->values[_s1]+= v1; \ - if (_s2 != STAT_LAST) ((MYSQLND_STATS *) conn_stats)->values[_s2]+= v2; \ - if (_s3 != STAT_LAST) ((MYSQLND_STATS *) conn_stats)->values[_s3]+= v3; \ - } \ - } \ - } + MYSQLND_INC_STATISTIC_W_VALUE3(MYSQLND_G(collect_statistics), mysqlnd_global_stats, (statistic1), (value1), (statistic2), (value2), (statistic3), (value3)); \ + MYSQLND_INC_STATISTIC_W_VALUE3(MYSQLND_G(collect_statistics), (conn_stats), (statistic1), (value1), (statistic2), (value2), (statistic3), (value3)); -#endif -void mysqlnd_fill_stats_hash(const MYSQLND_STATS * const stats, zval *return_value - TSRMLS_DC ZEND_FILE_LINE_DC); +PHPAPI void mysqlnd_fill_stats_hash(const MYSQLND_STATS * const stats, const MYSQLND_STRING * names, zval *return_value TSRMLS_DC ZEND_FILE_LINE_DC); + +PHPAPI void mysqlnd_stats_init(MYSQLND_STATS ** stats, size_t statistic_count); +PHPAPI void mysqlnd_stats_end(MYSQLND_STATS * stats); +PHPAPI mysqlnd_stat_trigger mysqlnd_stats_set_trigger(MYSQLND_STATS * const stats, enum_mysqlnd_collected_stats stat, mysqlnd_stat_trigger trigger TSRMLS_DC); +PHPAPI mysqlnd_stat_trigger mysqlnd_stats_reset_triggers(MYSQLND_STATS * const stats TSRMLS_DC); -void mysqlnd_stats_init(MYSQLND_STATS ** stats); -void mysqlnd_stats_end(MYSQLND_STATS * stats); #endif /* MYSQLND_STATISTICS_H */ diff --git a/ext/mysqlnd/mysqlnd_structs.h b/ext/mysqlnd/mysqlnd_structs.h index ad61d9c6e..99f40169d 100644 --- a/ext/mysqlnd/mysqlnd_structs.h +++ b/ext/mysqlnd/mysqlnd_structs.h @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: mysqlnd_structs.h 289630 2009-10-14 13:51:25Z johannes $ */ +/* $Id: mysqlnd_structs.h 294543 2010-02-04 20:28:55Z johannes $ */ #ifndef MYSQLND_STRUCTS_H #define MYSQLND_STRUCTS_H @@ -48,7 +48,7 @@ struct st_mysqlnd_memory_pool_chunk uint64_t app; MYSQLND_MEMORY_POOL *pool; zend_uchar *ptr; - unsigned int size; + unsigned int size; void (*resize_chunk)(MYSQLND_MEMORY_POOL_CHUNK * chunk, unsigned int size TSRMLS_DC); void (*free_chunk)(MYSQLND_MEMORY_POOL_CHUNK * chunk, zend_bool cache_it TSRMLS_DC); zend_bool from_pool; @@ -96,7 +96,7 @@ typedef struct st_mysqlnd_upsert_result unsigned int server_status; uint64_t affected_rows; uint64_t last_insert_id; -} mysqlnd_upsert_status; +} MYSQLND_UPSERT_STATUS; typedef struct st_mysqlnd_error_info @@ -104,12 +104,7 @@ typedef struct st_mysqlnd_error_info char error[MYSQLND_ERRMSG_SIZE+1]; char sqlstate[MYSQLND_SQLSTATE_LENGTH + 1]; unsigned int error_no; -} mysqlnd_error_info; - - -typedef struct st_mysqlnd_zval_pcache MYSQLND_ZVAL_PCACHE; -typedef struct st_mysqlnd_thread_zval_pcache MYSQLND_THD_ZVAL_PCACHE; -typedef struct st_mysqlnd_qcache MYSQLND_QCACHE; +} MYSQLND_ERROR_INFO; typedef struct st_mysqlnd_infile_info @@ -146,13 +141,8 @@ typedef struct st_mysqlnd_infile void *userdata; } MYSQLND_INFILE; -typedef struct st_mysqlnd_option +typedef struct st_mysqlnd_options { - /* timeouts */ - unsigned int timeout_connect; - unsigned int timeout_read; - unsigned int timeout_write; - ulong flags; /* init commands - we need to send them to server directly after connect */ @@ -179,11 +169,22 @@ typedef struct st_mysqlnd_option #ifdef MYSQLND_STRING_TO_INT_CONVERSION zend_bool int_and_float_native; #endif +} MYSQLND_OPTIONS; + +typedef struct st_mysqlnd_net_options +{ + /* timeouts */ + unsigned int timeout_connect; + unsigned int timeout_read; + unsigned int timeout_write; + unsigned int net_read_buffer_size; -} MYSQLND_OPTION; +} MYSQLND_NET_OPTIONS; typedef struct st_mysqlnd_connection MYSQLND; +typedef struct st_mysqlnd_net MYSQLND_NET; +typedef struct st_mysqlnd_protocol MYSQLND_PROTOCOL; typedef struct st_mysqlnd_res MYSQLND_RES; typedef char** MYSQLND_ROW_C; /* return data as array of strings */ typedef struct st_mysqlnd_stmt MYSQLND_STMT; @@ -195,7 +196,6 @@ typedef struct st_mysqlnd_result_bind MYSQLND_RESULT_BIND; typedef struct st_mysqlnd_result_metadata MYSQLND_RES_METADATA; typedef struct st_mysqlnd_buffered_result MYSQLND_RES_BUFFERED; -typedef struct st_mysqlnd_background_buffered_result MYSQLND_RES_BG_BUFFERED; typedef struct st_mysqlnd_unbuffered_result MYSQLND_RES_UNBUFFERED; typedef struct st_mysqlnd_debug MYSQLND_DEBUG; @@ -208,32 +208,82 @@ typedef enum_func_status (*mysqlnd_fetch_row_func)(MYSQLND_RES *result, zend_bool *fetched_anything TSRMLS_DC); -typedef struct st_mysqlnd_stats +typedef struct st_mysqlnd_stats MYSQLND_STATS; + +typedef void (*mysqlnd_stat_trigger)(MYSQLND_STATS * stats, enum_mysqlnd_collected_stats stat, int64_t change TSRMLS_DC); + +struct st_mysqlnd_stats { - uint64_t values[STAT_LAST]; + uint64_t *values; + mysqlnd_stat_trigger *triggers; + size_t count; + zend_bool in_trigger; #ifdef ZTS MUTEX_T LOCK_access; #endif -} MYSQLND_STATS; +}; + +typedef struct st_mysqlnd_read_buffer { + zend_uchar * data; + size_t offset; + size_t size; + size_t len; + zend_bool (*is_empty)(struct st_mysqlnd_read_buffer *); + void (*read)(struct st_mysqlnd_read_buffer *, size_t count, zend_uchar * dest); + size_t (*bytes_left)(struct st_mysqlnd_read_buffer *); + void (*free_buffer)(struct st_mysqlnd_read_buffer ** TSRMLS_DC); +} MYSQLND_READ_BUFFER; -typedef struct st_mysqlnd_net + +struct st_mysqlnd_net_methods { - php_stream *stream; - /* sequence for simple checking of correct packets */ - zend_uchar packet_no; + enum_func_status (*connect)(MYSQLND_NET * net, const char * const scheme, size_t scheme_len, zend_bool persistent, char **errstr, int * errcode TSRMLS_DC); + size_t (*send)(MYSQLND * const conn, char * const buf, size_t count TSRMLS_DC); + size_t (*receive)(MYSQLND * conn, zend_uchar * buffer, size_t count TSRMLS_DC); + enum_func_status (*set_client_option)(MYSQLND_NET * const net, enum_mysqlnd_option option, const char * const value TSRMLS_DC); + enum_func_status (*network_read)(MYSQLND * conn, zend_uchar * buffer, size_t count TSRMLS_DC); + size_t (*network_write)(MYSQLND * const conn, const zend_uchar * const buf, size_t count TSRMLS_DC); + enum_func_status (*decode)(zend_uchar * uncompressed_data, size_t uncompressed_data_len, const zend_uchar * const compressed_data, size_t compressed_data_len TSRMLS_DC); + enum_func_status (*encode)(zend_uchar * compress_buffer, size_t compress_buffer_len, const zend_uchar * const uncompressed_data, size_t uncompressed_data_len TSRMLS_DC); + size_t (*consume_uneaten_data)(MYSQLND_NET * const net, enum php_mysqlnd_server_command cmd TSRMLS_DC); + void (*free_contents)(MYSQLND_NET * net TSRMLS_DC); +}; -#ifdef MYSQLND_DO_WIRE_CHECK_BEFORE_COMMAND - zend_uchar last_command; -#endif - /* cmd buffer */ - MYSQLND_CMD_BUFFER cmd_buffer; -} MYSQLND_NET; +struct st_mysqlnd_packet_greet; +struct st_mysqlnd_packet_greet; +struct st_mysqlnd_packet_auth; +struct st_mysqlnd_packet_ok; +struct st_mysqlnd_packet_command; +struct st_mysqlnd_packet_eof; +struct st_mysqlnd_packet_rset_header; +struct st_mysqlnd_packet_res_field; +struct st_mysqlnd_packet_row; +struct st_mysqlnd_packet_stats; +struct st_mysqlnd_packet_prepare_response; +struct st_mysqlnd_packet_chg_user_resp; + +struct st_mysqlnd_protocol_methods +{ + struct st_mysqlnd_packet_greet * (*get_greet_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC); + struct st_mysqlnd_packet_auth * (*get_auth_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC); + struct st_mysqlnd_packet_ok * (*get_ok_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC); + struct st_mysqlnd_packet_command * (*get_command_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC); + struct st_mysqlnd_packet_eof * (*get_eof_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC); + struct st_mysqlnd_packet_rset_header * (*get_rset_header_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC); + struct st_mysqlnd_packet_res_field * (*get_result_field_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC); + struct st_mysqlnd_packet_row * (*get_row_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC); + struct st_mysqlnd_packet_stats * (*get_stats_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC); + struct st_mysqlnd_packet_prepare_response *(*get_prepare_response_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC); + struct st_mysqlnd_packet_chg_user_resp*(*get_change_user_response_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC); +}; struct st_mysqlnd_conn_methods { + void (*init)(MYSQLND * conn TSRMLS_DC); + enum_func_status (*connect)(MYSQLND *conn, const char *host, const char * user, const char * passwd, unsigned int passwd_len, const char * db, unsigned int db_len, unsigned int port, const char * socket, unsigned int mysql_flags TSRMLS_DC); ulong (*escape_string)(const MYSQLND * const conn, char *newstr, const char *escapestr, size_t escapestr_len TSRMLS_DC); enum_func_status (*set_charset)(MYSQLND * const conn, const char * const charset TSRMLS_DC); enum_func_status (*query)(MYSQLND *conn, const char *query, unsigned int query_len TSRMLS_DC); @@ -241,7 +291,6 @@ struct st_mysqlnd_conn_methods enum_func_status (*reap_query)(MYSQLND *conn TSRMLS_DC); MYSQLND_RES * (*use_result)(MYSQLND * const conn TSRMLS_DC); MYSQLND_RES * (*store_result)(MYSQLND * const conn TSRMLS_DC); - MYSQLND_RES * (*background_store_result)(MYSQLND * const conn TSRMLS_DC); enum_func_status (*next_result)(MYSQLND * const conn TSRMLS_DC); zend_bool (*more_results)(const MYSQLND * const conn TSRMLS_DC); @@ -254,29 +303,29 @@ struct st_mysqlnd_conn_methods enum_func_status (*kill_connection)(MYSQLND *conn, unsigned int pid TSRMLS_DC); enum_func_status (*select_db)(MYSQLND * const conn, const char * const db, unsigned int db_len TSRMLS_DC); enum_func_status (*server_dump_debug_information)(MYSQLND * const conn TSRMLS_DC); - enum_func_status (*change_user)(MYSQLND * const conn, const char * user, const char * passwd, const char * db TSRMLS_DC); + enum_func_status (*change_user)(MYSQLND * const conn, const char * user, const char * passwd, const char * db, zend_bool silent TSRMLS_DC); - unsigned int (*get_error_no)(const MYSQLND * const conn); - const char * (*get_error_str)(const MYSQLND * const conn); - const char * (*get_sqlstate)(const MYSQLND * const conn); - uint64_t (*get_thread_id)(const MYSQLND * const conn); + unsigned int (*get_error_no)(const MYSQLND * const conn TSRMLS_DC); + const char * (*get_error_str)(const MYSQLND * const conn TSRMLS_DC); + const char * (*get_sqlstate)(const MYSQLND * const conn TSRMLS_DC); + uint64_t (*get_thread_id)(const MYSQLND * const conn TSRMLS_DC); void (*get_statistics)(const MYSQLND * const conn, zval *return_value TSRMLS_DC ZEND_FILE_LINE_DC); - unsigned long (*get_server_version)(const MYSQLND * const conn); - const char * (*get_server_information)(const MYSQLND * const conn); + unsigned long (*get_server_version)(const MYSQLND * const conn TSRMLS_DC); + const char * (*get_server_information)(const MYSQLND * const conn TSRMLS_DC); enum_func_status (*get_server_statistics)(MYSQLND *conn, char **message, unsigned int * message_len TSRMLS_DC); - const char * (*get_host_information)(const MYSQLND * const conn); - unsigned int (*get_protocol_information)(const MYSQLND * const conn); - const char * (*get_last_message)(const MYSQLND * const conn); - const char * (*charset_name)(const MYSQLND * const conn); + const char * (*get_host_information)(const MYSQLND * const conn TSRMLS_DC); + unsigned int (*get_protocol_information)(const MYSQLND * const conn TSRMLS_DC); + const char * (*get_last_message)(const MYSQLND * const conn TSRMLS_DC); + const char * (*charset_name)(const MYSQLND * const conn TSRMLS_DC); MYSQLND_RES * (*list_fields)(MYSQLND *conn, const char *table, const char *achtung_wild TSRMLS_DC); MYSQLND_RES * (*list_method)(MYSQLND *conn, const char *query, const char *achtung_wild, char *par1 TSRMLS_DC); - uint64_t (*get_last_insert_id)(const MYSQLND * const conn); - uint64_t (*get_affected_rows)(const MYSQLND * const conn); - unsigned int (*get_warning_count)(const MYSQLND * const conn); + uint64_t (*get_last_insert_id)(const MYSQLND * const conn TSRMLS_DC); + uint64_t (*get_affected_rows)(const MYSQLND * const conn TSRMLS_DC); + unsigned int (*get_warning_count)(const MYSQLND * const conn TSRMLS_DC); - unsigned int (*get_field_count)(const MYSQLND * const conn); + unsigned int (*get_field_count)(const MYSQLND * const conn TSRMLS_DC); enum_func_status (*set_server_option)(MYSQLND * const conn, enum_mysqlnd_server_option option TSRMLS_DC); enum_func_status (*set_client_option)(MYSQLND * const conn, enum_mysqlnd_option option, const char * const value TSRMLS_DC); @@ -285,10 +334,18 @@ struct st_mysqlnd_conn_methods enum_func_status (*close)(MYSQLND *conn, enum_connection_close_type close_type TSRMLS_DC); void (*dtor)(MYSQLND *conn TSRMLS_DC); /* private */ + enum_func_status (*query_read_result_set_header)(MYSQLND *conn, MYSQLND_STMT *stmt TSRMLS_DC); + MYSQLND * (*get_reference)(MYSQLND * const conn TSRMLS_DC); enum_func_status (*free_reference)(MYSQLND * const conn TSRMLS_DC); enum mysqlnd_connection_state (*get_state)(MYSQLND * const conn TSRMLS_DC); void (*set_state)(MYSQLND * const conn, enum mysqlnd_connection_state new_state TSRMLS_DC); + + enum_func_status (*simple_command)(MYSQLND *conn, enum php_mysqlnd_server_command command, const char * const arg, size_t arg_len, enum mysqlnd_packet_type ok_packet, zend_bool silent, zend_bool ignore_upsert_status TSRMLS_DC); + enum_func_status (*simple_command_handle_response)(MYSQLND *conn, enum mysqlnd_packet_type ok_packet, zend_bool silent, enum php_mysqlnd_server_command command, zend_bool ignore_upsert_status TSRMLS_DC); + + enum_func_status (*restart_psession)(MYSQLND *conn TSRMLS_DC); + enum_func_status (*end_psession)(MYSQLND *conn TSRMLS_DC); }; @@ -300,30 +357,38 @@ struct st_mysqlnd_res_methods MYSQLND_RES * (*use_result)(MYSQLND_RES * const result, zend_bool ps_protocol TSRMLS_DC); MYSQLND_RES * (*store_result)(MYSQLND_RES * result, MYSQLND * const conn, zend_bool ps TSRMLS_DC); - MYSQLND_RES * (*background_store_result)(MYSQLND_RES * result, MYSQLND * const conn, zend_bool ps TSRMLS_DC); void (*fetch_into)(MYSQLND_RES *result, unsigned int flags, zval *return_value, enum_mysqlnd_extension ext TSRMLS_DC ZEND_FILE_LINE_DC); MYSQLND_ROW_C (*fetch_row_c)(MYSQLND_RES *result TSRMLS_DC); void (*fetch_all)(MYSQLND_RES *result, unsigned int flags, zval *return_value TSRMLS_DC ZEND_FILE_LINE_DC); void (*fetch_field_data)(MYSQLND_RES *result, unsigned int offset, zval *return_value TSRMLS_DC); - uint64_t (*num_rows)(const MYSQLND_RES * const result); - unsigned int (*num_fields)(const MYSQLND_RES * const result); + uint64_t (*num_rows)(const MYSQLND_RES * const result TSRMLS_DC); + unsigned int (*num_fields)(const MYSQLND_RES * const result TSRMLS_DC); enum_func_status (*skip_result)(MYSQLND_RES * const result TSRMLS_DC); enum_func_status (*seek_data)(MYSQLND_RES * result, uint64_t row TSRMLS_DC); - MYSQLND_FIELD_OFFSET (*seek_field)(MYSQLND_RES * const result, MYSQLND_FIELD_OFFSET field_offset); - MYSQLND_FIELD_OFFSET (*field_tell)(const MYSQLND_RES * const result); + MYSQLND_FIELD_OFFSET (*seek_field)(MYSQLND_RES * const result, MYSQLND_FIELD_OFFSET field_offset TSRMLS_DC); + MYSQLND_FIELD_OFFSET (*field_tell)(const MYSQLND_RES * const result TSRMLS_DC); const MYSQLND_FIELD *(*fetch_field)(MYSQLND_RES * const result TSRMLS_DC); const MYSQLND_FIELD *(*fetch_field_direct)(MYSQLND_RES * const result, MYSQLND_FIELD_OFFSET fieldnr TSRMLS_DC); const MYSQLND_FIELD *(*fetch_fields)(MYSQLND_RES * const result TSRMLS_DC); - enum_func_status (*read_result_metadata)(MYSQLND_RES *result, MYSQLND *conn TSRMLS_DC); - unsigned long * (*fetch_lengths)(MYSQLND_RES * const result); + enum_func_status (*read_result_metadata)(MYSQLND_RES *result, MYSQLND * conn TSRMLS_DC); + unsigned long * (*fetch_lengths)(MYSQLND_RES * const result TSRMLS_DC); + enum_func_status (*store_result_fetch_data)(MYSQLND * const conn, MYSQLND_RES *result, MYSQLND_RES_METADATA *meta, zend_bool binary_protocol, zend_bool to_cache TSRMLS_DC); + void (*initialize_result_set_rest)(MYSQLND_RES * const result TSRMLS_DC); + void (*free_result_buffers)(MYSQLND_RES * result TSRMLS_DC); /* private */ enum_func_status (*free_result)(MYSQLND_RES * result, zend_bool implicit TSRMLS_DC); - void (*free_result_internal)(MYSQLND_RES *result TSRMLS_DC); - void (*free_result_contents)(MYSQLND_RES *result TSRMLS_DC); - - /* for decoding - binary or text protocol */ - void (*row_decoder)(MYSQLND_MEMORY_POOL_CHUNK * row_buffer, zval ** fields, unsigned int field_count, MYSQLND_FIELD *fields_metadata, MYSQLND *conn TSRMLS_DC); + void (*free_result_internal)(MYSQLND_RES *result TSRMLS_DC); + void (*free_result_contents)(MYSQLND_RES *result TSRMLS_DC); + void (*free_buffered_data)(MYSQLND_RES *result TSRMLS_DC); + void (*unbuffered_free_last_data)(MYSQLND_RES *result TSRMLS_DC); + + /* for decoding - binary or text protocol */ + void (*row_decoder)(MYSQLND_MEMORY_POOL_CHUNK * row_buffer, zval ** fields, + unsigned int field_count, MYSQLND_FIELD *fields_metadata, + zend_bool persistent, + zend_bool as_unicode, zend_bool as_int_or_float, + MYSQLND_STATS * stats TSRMLS_DC); }; @@ -332,7 +397,7 @@ struct st_mysqlnd_res_meta_methods const MYSQLND_FIELD * (*fetch_field)(MYSQLND_RES_METADATA * const meta TSRMLS_DC); const MYSQLND_FIELD * (*fetch_field_direct)(const MYSQLND_RES_METADATA * const meta, MYSQLND_FIELD_OFFSET fieldnr TSRMLS_DC); const MYSQLND_FIELD * (*fetch_fields)(MYSQLND_RES_METADATA * const meta TSRMLS_DC); - MYSQLND_FIELD_OFFSET (*field_tell)(const MYSQLND_RES_METADATA * const meta); + MYSQLND_FIELD_OFFSET (*field_tell)(const MYSQLND_RES_METADATA * const meta TSRMLS_DC); enum_func_status (*read_metadata)(MYSQLND_RES_METADATA * const meta, MYSQLND *conn TSRMLS_DC); MYSQLND_RES_METADATA * (*clone_metadata)(const MYSQLND_RES_METADATA * const meta, zend_bool persistent TSRMLS_DC); void (*free_metadata)(MYSQLND_RES_METADATA *meta, zend_bool persistent TSRMLS_DC); @@ -345,7 +410,6 @@ struct st_mysqlnd_stmt_methods enum_func_status (*execute)(MYSQLND_STMT * const stmt TSRMLS_DC); MYSQLND_RES * (*use_result)(MYSQLND_STMT * const stmt TSRMLS_DC); MYSQLND_RES * (*store_result)(MYSQLND_STMT * const stmt TSRMLS_DC); - MYSQLND_RES * (*background_store_result)(MYSQLND_STMT * const stmt TSRMLS_DC); MYSQLND_RES * (*get_result)(MYSQLND_STMT * const stmt TSRMLS_DC); zend_bool (*more_results)(const MYSQLND_STMT * const stmt TSRMLS_DC); enum_func_status (*next_result)(MYSQLND_STMT * const stmt TSRMLS_DC); @@ -364,46 +428,83 @@ struct st_mysqlnd_stmt_methods enum_func_status (*bind_result)(MYSQLND_STMT * const stmt, MYSQLND_RESULT_BIND * const result_bind TSRMLS_DC); enum_func_status (*bind_one_result)(MYSQLND_STMT * const stmt, unsigned int param_no TSRMLS_DC); void (*set_result_bind_dtor)(MYSQLND_STMT * const stmt, void (*result_bind_dtor)(MYSQLND_RESULT_BIND * TSRMLS_DC) TSRMLS_DC); - enum_func_status (*send_long_data)(MYSQLND_STMT * const stmt, unsigned int param_num, - const char * const data, unsigned long length TSRMLS_DC); - MYSQLND_RES * (*get_parameter_metadata)(MYSQLND_STMT * const stmt); + enum_func_status (*send_long_data)(MYSQLND_STMT * const stmt, unsigned int param_num, const char * const data, unsigned long length TSRMLS_DC); + MYSQLND_RES * (*get_parameter_metadata)(MYSQLND_STMT * const stmt TSRMLS_DC); MYSQLND_RES * (*get_result_metadata)(MYSQLND_STMT * const stmt TSRMLS_DC); - uint64_t (*get_last_insert_id)(const MYSQLND_STMT * const stmt); - uint64_t (*get_affected_rows)(const MYSQLND_STMT * const stmt); - uint64_t (*get_num_rows)(const MYSQLND_STMT * const stmt); + uint64_t (*get_last_insert_id)(const MYSQLND_STMT * const stmt TSRMLS_DC); + uint64_t (*get_affected_rows)(const MYSQLND_STMT * const stmt TSRMLS_DC); + uint64_t (*get_num_rows)(const MYSQLND_STMT * const stmt TSRMLS_DC); - unsigned int (*get_param_count)(const MYSQLND_STMT * const stmt); - unsigned int (*get_field_count)(const MYSQLND_STMT * const stmt); - unsigned int (*get_warning_count)(const MYSQLND_STMT * const stmt); + unsigned int (*get_param_count)(const MYSQLND_STMT * const stmt TSRMLS_DC); + unsigned int (*get_field_count)(const MYSQLND_STMT * const stmt TSRMLS_DC); + unsigned int (*get_warning_count)(const MYSQLND_STMT * const stmt TSRMLS_DC); - unsigned int (*get_error_no)(const MYSQLND_STMT * const stmt); - const char * (*get_error_str)(const MYSQLND_STMT * const stmt); - const char * (*get_sqlstate)(const MYSQLND_STMT * const stmt); + unsigned int (*get_error_no)(const MYSQLND_STMT * const stmt TSRMLS_DC); + const char * (*get_error_str)(const MYSQLND_STMT * const stmt TSRMLS_DC); + const char * (*get_sqlstate)(const MYSQLND_STMT * const stmt TSRMLS_DC); enum_func_status (*get_attribute)(const MYSQLND_STMT * const stmt, enum mysqlnd_stmt_attr attr_type, void * const value TSRMLS_DC); enum_func_status (*set_attribute)(MYSQLND_STMT * const stmt, enum mysqlnd_stmt_attr attr_type, const void * const value TSRMLS_DC); }; +struct st_mysqlnd_net +{ + php_stream *stream; + struct st_mysqlnd_net_methods m; + + /* sequence for simple checking of correct packets */ + zend_uchar packet_no; + zend_bool compressed; + zend_uchar compressed_envelope_packet_no; +#ifdef MYSQLND_COMPRESSION_ENABLED + MYSQLND_READ_BUFFER * uncompressed_data; +#endif +#ifdef MYSQLND_DO_WIRE_CHECK_BEFORE_COMMAND + zend_uchar last_command; +#endif + /* cmd buffer */ + MYSQLND_CMD_BUFFER cmd_buffer; + + MYSQLND_NET_OPTIONS options; + + zend_bool persistent; +}; + + +struct st_mysqlnd_protocol +{ + struct st_mysqlnd_protocol_methods m; + zend_bool persistent; +}; + + struct st_mysqlnd_connection { /* Operation related */ - MYSQLND_NET net; + MYSQLND_NET * net; + MYSQLND_PROTOCOL * protocol; /* Information related */ char *host; + unsigned int host_len; char *unix_socket; + unsigned int unix_socket_len; char *user; + unsigned int user_len; char *passwd; - unsigned int *passwd_len; + unsigned int passwd_len; char *scheme; + unsigned int scheme_len; uint64_t thread_id; char *server_version; char *host_info; unsigned char *scramble; const MYSQLND_CHARSET *charset; const MYSQLND_CHARSET *greet_charset; + char *connect_or_select_db; + unsigned int connect_or_select_db_len; MYSQLND_INFILE infile; unsigned int protocol_version; unsigned long max_packet_size; @@ -412,12 +513,12 @@ struct st_mysqlnd_connection unsigned long server_capabilities; /* For UPSERT queries */ - mysqlnd_upsert_status upsert_status; + MYSQLND_UPSERT_STATUS upsert_status; char *last_message; unsigned int last_message_len; /* If error packet, we use these */ - mysqlnd_error_info error_info; + MYSQLND_ERROR_INFO error_info; /* To prevent queries during unbuffered fetches. Also to @@ -439,43 +540,19 @@ struct st_mysqlnd_connection /* Temporal storage for mysql_query */ unsigned int field_count; - + /* persistent connection */ zend_bool persistent; /* options */ - MYSQLND_OPTION options; - - /* zval cache */ - MYSQLND_THD_ZVAL_PCACHE *zval_cache; - - /* qcache */ - MYSQLND_QCACHE *qcache; - - MYSQLND_MEMORY_POOL * result_set_memory_pool; + MYSQLND_OPTIONS options; /* stats */ - MYSQLND_STATS stats; - -#ifdef MYSQLND_THREADED - MUTEX_T LOCK_state; - - pthread_cond_t COND_work_done; - - pthread_mutex_t LOCK_work; - pthread_cond_t COND_work; - pthread_cond_t COND_thread_ended; - zend_bool thread_is_running; - zend_bool thread_killed; - void *** tsrm_ls; -#endif - + MYSQLND_STATS * stats; struct st_mysqlnd_conn_methods *m; }; -typedef struct st_php_mysql_packet_row php_mysql_packet_row; - struct mysqlnd_field_hash_key { @@ -484,7 +561,7 @@ struct mysqlnd_field_hash_key #if PHP_MAJOR_VERSION >= 6 zstr ustr; unsigned int ulen; -#endif +#endif }; @@ -502,31 +579,6 @@ struct st_mysqlnd_result_metadata }; -struct st_mysqlnd_background_buffered_result -{ - zval ***data; - uint64_t data_size; - zval ***data_cursor; - MYSQLND_MEMORY_POOL_CHUNK **row_buffers; - uint64_t row_count; - uint64_t initialized_rows; - zend_bool persistent; - - MYSQLND_QCACHE *qcache; - unsigned int references; - - zend_bool decode_in_foreground; - -#ifdef ZTS - zend_bool bg_fetch_finished; - MUTEX_T LOCK; -#endif - - mysqlnd_error_info error_info; - mysqlnd_upsert_status upsert_status; -}; - - struct st_mysqlnd_buffered_result { zval **data; @@ -536,10 +588,9 @@ struct st_mysqlnd_buffered_result uint64_t initialized_rows; zend_bool persistent; - MYSQLND_QCACHE *qcache; unsigned int references; - mysqlnd_error_info error_info; + MYSQLND_ERROR_INFO error_info; }; @@ -567,19 +618,17 @@ struct st_mysqlnd_res /* To be used with store_result() - both normal and PS */ MYSQLND_RES_BUFFERED *stored_data; - MYSQLND_RES_BG_BUFFERED *bg_stored_data; MYSQLND_RES_UNBUFFERED *unbuf; /* Column lengths of current row - both buffered and unbuffered. - For buffered results it duplicates the data found in **data + For buffered results it duplicates the data found in **data */ unsigned long *lengths; - php_mysql_packet_row *row_packet; + struct st_mysqlnd_packet_row * row_packet; - /* zval cache */ - MYSQLND_THD_ZVAL_PCACHE *zval_cache; + MYSQLND_MEMORY_POOL * result_set_memory_pool; }; @@ -612,9 +661,9 @@ struct st_mysqlnd_stmt MYSQLND_RESULT_BIND *result_bind; zend_bool result_zvals_separated_once; - mysqlnd_upsert_status upsert_status; + MYSQLND_UPSERT_STATUS upsert_status; - mysqlnd_error_info error_info; + MYSQLND_ERROR_INFO error_info; zend_bool update_max_length; unsigned long prefetch_rows; diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.c b/ext/mysqlnd/mysqlnd_wireprotocol.c index cc0697cd0..571037788 100644 --- a/ext/mysqlnd/mysqlnd_wireprotocol.c +++ b/ext/mysqlnd/mysqlnd_wireprotocol.c @@ -23,29 +23,18 @@ #include "mysqlnd_priv.h" #include "mysqlnd_wireprotocol.h" #include "mysqlnd_statistics.h" -#include "mysqlnd_palloc.h" #include "mysqlnd_debug.h" #include "mysqlnd_block_alloc.h" #include "ext/standard/sha1.h" -#include "php_network.h" #include "zend_ini.h" -#ifndef PHP_WIN32 -#include -#else -#include -#endif - -#define USE_CORK 0 - #define MYSQLND_SILENT 1 -#define MYSQLND_DUMP_HEADER_N_BODY2 -#define MYSQLND_DUMP_HEADER_N_BODY_FULL2 - +#define MYSQLND_DUMP_HEADER_N_BODY #define PACKET_READ_HEADER_AND_BODY(packet, conn, buf, buf_size, packet_type_as_text, packet_type) \ { \ + DBG_INF_FMT("buf=%p size=%u", (buf), (buf_size)); \ if (FAIL == mysqlnd_read_header((conn), &((packet)->header) TSRMLS_CC)) {\ CONN_SET_STATE(conn, CONN_QUIT_SENT); \ SET_CLIENT_ERROR(conn->error_info, CR_SERVER_GONE_ERROR, UNKNOWN_SQLSTATE, mysqlnd_server_gone);\ @@ -54,36 +43,37 @@ DBG_RETURN(FAIL);\ }\ if ((buf_size) < (packet)->header.size) { \ - DBG_ERR_FMT("Packet buffer wasn't big enough %u bytes will be unread", \ - (packet)->header.size - (buf_size)); \ + DBG_ERR_FMT("Packet buffer %u wasn't big enough %u, %u bytes will be unread", \ + (buf_size), (packet)->header.size, (packet)->header.size - (buf_size)); \ + DBG_RETURN(FAIL); \ }\ - if (!mysqlnd_read_body((conn), (buf), \ - MIN((buf_size), (packet)->header.size) TSRMLS_CC)) { \ + if (FAIL == conn->net->m.receive((conn), (buf), (packet)->header.size TSRMLS_CC)) { \ CONN_SET_STATE(conn, CONN_QUIT_SENT); \ SET_CLIENT_ERROR(conn->error_info, CR_SERVER_GONE_ERROR, UNKNOWN_SQLSTATE, mysqlnd_server_gone);\ php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", mysqlnd_server_gone); \ - DBG_ERR_FMT("Empty %s packet body", (packet_type_as_text)); \ + DBG_ERR_FMT("Empty '%s' packet body", (packet_type_as_text)); \ DBG_RETURN(FAIL);\ } \ - MYSQLND_INC_CONN_STATISTIC_W_VALUE2(&conn->stats, packet_type_to_statistic_byte_count[packet_type], \ + MYSQLND_INC_CONN_STATISTIC_W_VALUE2(conn->stats, packet_type_to_statistic_byte_count[packet_type], \ MYSQLND_HEADER_SIZE + (packet)->header.size, \ packet_type_to_statistic_packet_count[packet_type], \ 1); \ } -extern mysqlnd_packet_methods packet_methods[]; - static const char *unknown_sqlstate= "HY000"; char * const mysqlnd_empty_string = ""; /* Used in mysqlnd_debug.c */ -char * mysqlnd_read_header_name = "mysqlnd_read_header"; -char * mysqlnd_read_body_name = "mysqlnd_read_body"; +const char mysqlnd_read_header_name[] = "mysqlnd_read_header"; +const char mysqlnd_read_body_name[] = "mysqlnd_read_body"; + +#define ERROR_MARKER 0xFF +#define EODATA_MARKER 0xFE -/* {{{ mysqlnd_command_to_text +/* {{{ mysqlnd_command_to_text */ const char * const mysqlnd_command_to_text[COM_END] = { @@ -128,7 +118,7 @@ static enum_mysqlnd_collected_stats packet_type_to_statistic_packet_count[PROT_L }; -/* {{{ php_mysqlnd_net_field_length +/* {{{ php_mysqlnd_net_field_length Get next field's length */ unsigned long php_mysqlnd_net_field_length(zend_uchar **packet) { @@ -157,7 +147,7 @@ unsigned long php_mysqlnd_net_field_length(zend_uchar **packet) /* }}} */ -/* {{{ php_mysqlnd_net_field_length_ll +/* {{{ php_mysqlnd_net_field_length_ll Get next field's length */ uint64_t php_mysqlnd_net_field_length_ll(zend_uchar **packet) { @@ -212,59 +202,11 @@ zend_uchar *php_mysqlnd_net_store_length(zend_uchar *packet, uint64_t length) /* }}} */ -/* {{{ php_mysqlnd_consume_uneaten_data */ -#ifdef MYSQLND_DO_WIRE_CHECK_BEFORE_COMMAND -size_t php_mysqlnd_consume_uneaten_data(MYSQLND * const conn, enum php_mysqlnd_server_command cmd TSRMLS_DC) -{ - - /* - Switch to non-blocking mode and try to consume something from - the line, if possible, then continue. This saves us from looking for - the actuall place where out-of-order packets have been sent. - If someone is completely sure that everything is fine, he can switch it - off. - */ - char tmp_buf[256]; - MYSQLND_NET *net = &conn->net; - size_t skipped_bytes = 0; - int opt = PHP_STREAM_OPTION_BLOCKING; - int was_blocked = net->stream->ops->set_option(net->stream, opt, 0, NULL TSRMLS_CC); - - DBG_ENTER("php_mysqlnd_consume_uneaten_data"); - - if (PHP_STREAM_OPTION_RETURN_ERR != was_blocked) { - /* Do a read of 1 byte */ - int bytes_consumed; - - do { - skipped_bytes += (bytes_consumed = php_stream_read(net->stream, tmp_buf, sizeof(tmp_buf))); - } while (bytes_consumed == sizeof(tmp_buf)); - - if (was_blocked) { - net->stream->ops->set_option(net->stream, opt, 1, NULL TSRMLS_CC); - } - - if (bytes_consumed) { - DBG_ERR_FMT("Skipped %u bytes. Last command %s hasn't consumed all the output from the server", - bytes_consumed, mysqlnd_command_to_text[net->last_command]); - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Skipped %u bytes. Last command %s hasn't " - "consumed all the output from the server", - bytes_consumed, mysqlnd_command_to_text[net->last_command]); - } - } - net->last_command = cmd; - - DBG_RETURN(skipped_bytes); -} -#endif -/* }}} */ - - /* {{{ php_mysqlnd_read_error_from_line */ -static -enum_func_status php_mysqlnd_read_error_from_line(zend_uchar *buf, size_t buf_len, - char *error, int error_buf_len, - unsigned int *error_no, char *sqlstate TSRMLS_DC) +static enum_func_status +php_mysqlnd_read_error_from_line(zend_uchar *buf, size_t buf_len, + char *error, int error_buf_len, + unsigned int *error_no, char *sqlstate TSRMLS_DC) { zend_uchar *p = buf; int error_msg_len= 0; @@ -288,215 +230,46 @@ enum_func_status php_mysqlnd_read_error_from_line(zend_uchar *buf, size_t buf_le } sqlstate[MYSQLND_SQLSTATE_LENGTH] = '\0'; error[error_msg_len]= '\0'; - - DBG_RETURN(FAIL); -} -/* }}} */ - - -/* {{{ mysqlnd_set_sock_no_delay */ -int mysqlnd_set_sock_no_delay(php_stream *stream) -{ - - int socketd = ((php_netstream_data_t*)stream->abstract)->socket; - int ret = SUCCESS; - int flag = 1; - int result = setsockopt(socketd, IPPROTO_TCP, TCP_NODELAY, (char *) &flag, sizeof(int)); - TSRMLS_FETCH(); - - DBG_ENTER("mysqlnd_set_sock_no_delay"); - - if (result == -1) { - ret = FAILURE; - } - - DBG_RETURN(ret); -} -/* }}} */ - - -/* We assume that MYSQLND_HEADER_SIZE is 4 bytes !! */ -#define STORE_HEADER_SIZE(safe_storage, buffer) int4store((safe_storage), (*(uint32_t *)(buffer))) -#define RESTORE_HEADER_SIZE(buffer, safe_storage) STORE_HEADER_SIZE((safe_storage), (buffer)) - -/* {{{ mysqlnd_stream_write_w_header */ -/* - IMPORTANT : It's expected that buf has place in the beginning for MYSQLND_HEADER_SIZE !!!! - This is done for performance reasons in the caller of this function. - Otherwise we will have to do send two TCP packets, or do new alloc and memcpy. - Neither are quick, thus the clients of this function are obligated to do - what they are asked for. - - `count` is actually the length of the payload data. Thus : - count + MYSQLND_HEADER_SIZE = sizeof(buf) (not the pointer but the actual buffer) -*/ -size_t mysqlnd_stream_write_w_header(MYSQLND * const conn, char * const buf, size_t count TSRMLS_DC) -{ - zend_uchar safe_buf[((MYSQLND_HEADER_SIZE) + (sizeof(zend_uchar)) - 1) / (sizeof(zend_uchar))]; - zend_uchar *safe_storage = safe_buf; - MYSQLND_NET *net = &conn->net; - size_t old_chunk_size = net->stream->chunk_size; - size_t ret, left = count, packets_sent = 1; - zend_uchar *p = (zend_uchar *) buf; - - DBG_ENTER("mysqlnd_stream_write_w_header"); - DBG_INF_FMT("conn=%llu count=%lu", conn->thread_id, count); - - net->stream->chunk_size = MYSQLND_MAX_PACKET_SIZE; - - while (left > MYSQLND_MAX_PACKET_SIZE) { - STORE_HEADER_SIZE(safe_storage, p); - int3store(p, MYSQLND_MAX_PACKET_SIZE); - int1store(p + 3, net->packet_no); - net->packet_no++; - ret = php_stream_write(net->stream, (char *)p, MYSQLND_MAX_PACKET_SIZE + MYSQLND_HEADER_SIZE); - RESTORE_HEADER_SIZE(p, safe_storage); - - p += MYSQLND_MAX_PACKET_SIZE; - left -= MYSQLND_MAX_PACKET_SIZE; - - packets_sent++; - } - /* Even for zero size payload we have to send a packet */ - STORE_HEADER_SIZE(safe_storage, p); - int3store(p, left); - int1store(p + 3, net->packet_no); - net->packet_no++; - ret = php_stream_write(net->stream, (char *)p, left + MYSQLND_HEADER_SIZE); - RESTORE_HEADER_SIZE(p, safe_storage); - - if (!ret) { - DBG_ERR_FMT("Can't %u send bytes", count); - conn->state = CONN_QUIT_SENT; - SET_CLIENT_ERROR(conn->error_info, CR_SERVER_GONE_ERROR, UNKNOWN_SQLSTATE, mysqlnd_server_gone); - } - - MYSQLND_INC_CONN_STATISTIC_W_VALUE3(&conn->stats, - STAT_BYTES_SENT, count + packets_sent * MYSQLND_HEADER_SIZE, - STAT_PROTOCOL_OVERHEAD_OUT, packets_sent * MYSQLND_HEADER_SIZE, - STAT_PACKETS_SENT, packets_sent); - net->stream->chunk_size = old_chunk_size; - - DBG_RETURN(ret); -} -/* }}} */ - - -/* {{{ mysqlnd_stream_write_w_command */ -#if USE_CORK && defined(TCP_CORK) -static -size_t mysqlnd_stream_write_w_command(MYSQLND * const conn, enum php_mysqlnd_server_command command, - const char * const buf, size_t count TSRMLS_DC) -{ - zend_uchar safe_buf[((MYSQLND_HEADER_SIZE) + (sizeof(zend_uchar)) - 1) / (sizeof(zend_uchar))]; - zend_uchar *safe_storage = (char *) &safe_buf; - MYSQLND_NET *net = &conn->net; - size_t old_chunk_size = net->stream->chunk_size; - size_t ret, left = count, header_len = MYSQLND_HEADER_SIZE + 1, packets_sent = 1; - const zend_uchar *p = (zend_uchar *) buf; - zend_bool command_sent = FALSE; - int corked = 1; - - DBG_ENTER("mysqlnd_stream_write_w_command"); - - net->stream->chunk_size = MYSQLND_MAX_PACKET_SIZE; - - setsockopt(((php_netstream_data_t*)net->stream->abstract)->socket, - IPPROTO_TCP, TCP_CORK, &corked, sizeof(corked)); - - int1store(safe_storage + MYSQLND_HEADER_SIZE, command); - while (left > MYSQLND_MAX_PACKET_SIZE) { - size_t body_size = MYSQLND_MAX_PACKET_SIZE; - - int3store(safe_storage, MYSQLND_MAX_PACKET_SIZE); - int1store(safe_storage + 3, net->packet_no); - net->packet_no++; - - ret = php_stream_write(net->stream, (char *)safe_storage, header_len); - if (command_sent == FALSE) { - --header_len; - /* Sent one byte less*/ - --body_size; - command_sent = TRUE; - } - - ret = php_stream_write(net->stream, (char *)p, body_size); - - p += body_size; - left -= body_size; - - packets_sent++; - } - /* Even for zero size payload we have to send a packet */ - int3store(safe_storage, header_len == MYSQLND_HEADER_SIZE? left:left+1); - int1store(safe_storage + 3, net->packet_no); - net->packet_no++; - - ret = php_stream_write(net->stream, (char *)safe_storage, header_len); - - if (left) { - ret = php_stream_write(net->stream, (char *)p, left); - } - corked = 0; - setsockopt(((php_netstream_data_t*)net->stream->abstract)->socket, - IPPROTO_TCP, TCP_CORK, &corked, sizeof(corked)); - - MYSQLND_INC_CONN_STATISTIC_W_VALUE3(&conn->stats, STAT_BYTES_SENT, - count + packets_sent * MYSQLND_HEADER_SIZE); - STAT_PROTOCOL_OVERHEAD_OUT, packets_sent * MYSQLND_HEADER_SIZE); - STAT_PACKETS_SENT, packets_sent); - - net->stream->chunk_size = old_chunk_size; - - DBG_RETURN(ret); + DBG_RETURN(FAIL); } -#endif /* }}} */ /* {{{ mysqlnd_read_header */ static enum_func_status -mysqlnd_read_header(MYSQLND *conn, mysqlnd_packet_header *header TSRMLS_DC) +mysqlnd_read_header(MYSQLND * conn, MYSQLND_PACKET_HEADER * header TSRMLS_DC) { - MYSQLND_NET *net = &conn->net; - char buffer[MYSQLND_HEADER_SIZE]; - char *p = buffer; - int to_read = MYSQLND_HEADER_SIZE, ret; + MYSQLND_NET * net = conn->net; + zend_uchar buffer[MYSQLND_HEADER_SIZE]; - DBG_ENTER(mysqlnd_read_header_name); - - do { - if (!(ret= php_stream_read(net->stream, p, to_read))) { - DBG_ERR_FMT("Error while reading header from socket"); - return FAIL; - } - p += ret; - to_read -= ret; - } while (to_read); + DBG_ENTER("mysqlnd_read_header_name"); + DBG_INF_FMT("compressed=%d conn_id=%u", net->compressed, conn->thread_id); + if (FAIL == net->m.receive(conn, buffer, MYSQLND_HEADER_SIZE TSRMLS_CC)) { + DBG_RETURN(FAIL); + } header->size = uint3korr(buffer); header->packet_no = uint1korr(buffer + 3); - MYSQLND_INC_CONN_STATISTIC_W_VALUE3(&conn->stats, - STAT_BYTES_RECEIVED, MYSQLND_HEADER_SIZE, +#ifdef MYSQLND_DUMP_HEADER_N_BODY + DBG_INF_FMT("HEADER: prot_packet_no=%d size=%3d", header->packet_no, header->size); +#endif + MYSQLND_INC_CONN_STATISTIC_W_VALUE2(conn->stats, STAT_PROTOCOL_OVERHEAD_IN, MYSQLND_HEADER_SIZE, STAT_PACKETS_RECEIVED, 1); - if (net->packet_no == header->packet_no) { + if (net->compressed || net->packet_no == header->packet_no) { /* Have to increase the number, so we can send correct number back. It will round at 255 as this is unsigned char. The server needs this for simple flow control checking. */ net->packet_no++; -#ifdef MYSQLND_DUMP_HEADER_N_BODY - DBG_ERR_FMT("HEADER: packet_no=%d size=%3d", header->packet_no, header->size); -#endif DBG_RETURN(PASS); } - DBG_ERR_FMT("Packets out of order. Expected %d received %d. Packet size=%d", + DBG_ERR_FMT("Logical link: packets out of order. Expected %d received %d. Packet size=%d", net->packet_no, header->packet_no, header->size); php_error(E_WARNING, "Packets out of order. Expected %d received %d. Packet size="MYSQLND_SZ_T_SPEC, @@ -506,65 +279,14 @@ mysqlnd_read_header(MYSQLND *conn, mysqlnd_packet_header *header TSRMLS_DC) /* }}} */ -/* {{{ mysqlnd_read_body */ -static -size_t mysqlnd_read_body(MYSQLND *conn, zend_uchar *buf, size_t size TSRMLS_DC) -{ - size_t ret; - char *p = (char *)buf; - unsigned int iter = 0; - MYSQLND_NET *net = &conn->net; - size_t old_chunk_size = net->stream->chunk_size; - - DBG_ENTER(mysqlnd_read_body_name); - DBG_INF_FMT("chunk_size=%d", net->stream->chunk_size); - - net->stream->chunk_size = MIN(size, conn->options.net_read_buffer_size); - do { - size -= (ret = php_stream_read(net->stream, p, size)); - if (size > 0 || iter++) { - DBG_INF_FMT("read=%d buf=%p p=%p chunk_size=%d left=%d", - ret, buf, p , net->stream->chunk_size, size); - } - p += ret; - } while (size > 0); - - MYSQLND_INC_CONN_STATISTIC_W_VALUE(&conn->stats, STAT_BYTES_RECEIVED, p - (char*)buf); - net->stream->chunk_size = old_chunk_size; - -#ifdef MYSQLND_DUMP_HEADER_N_BODY_FULL - { - unsigned int i; - DBG_INF_FMT("BODY: requested=%d last_read=%3d", p - (char*)buf, ret); - for (i = 0 ; i < p - (char*)buf; i++) { - if (i && (i % 30 == 0)) { - printf("\n\t\t"); - } - printf("[%c] ", *(char *)(&(buf[i]))); - } - for (i = 0 ; i < p - (char*)buf; i++) { - if (i && (i % 30 == 0)) { - printf("\n\t\t"); - } - printf("%.2X ", (int)*((char*)&(buf[i]))); - } - php_printf("\n\t\t\t-=-=-=-=-\n"); - } -#endif - - DBG_RETURN(p - (char*)buf); -} -/* }}} */ - - /* {{{ php_mysqlnd_greet_read */ static enum_func_status php_mysqlnd_greet_read(void *_packet, MYSQLND *conn TSRMLS_DC) { - zend_uchar buf[512]; + zend_uchar buf[2048]; zend_uchar *p = buf; zend_uchar *begin = buf; - php_mysql_packet_greet *packet= (php_mysql_packet_greet *) _packet; + MYSQLND_PACKET_GREET *packet= (MYSQLND_PACKET_GREET *) _packet; DBG_ENTER("php_mysqlnd_greet_read"); @@ -573,7 +295,7 @@ php_mysqlnd_greet_read(void *_packet, MYSQLND *conn TSRMLS_DC) packet->protocol_version = uint1korr(p); p++; - if (packet->protocol_version == 0xFF) { + if (ERROR_MARKER == packet->protocol_version) { php_mysqlnd_read_error_from_line(p, packet->header.size - 1, packet->error, sizeof(packet->error), &packet->error_no, packet->sqlstate @@ -589,7 +311,7 @@ php_mysqlnd_greet_read(void *_packet, MYSQLND *conn TSRMLS_DC) DBG_RETURN(PASS); } - packet->server_version = pestrdup((char *)p, conn->persistent); + packet->server_version = estrdup((char *)p); p+= strlen(packet->server_version) + 1; /* eat the '\0' */ packet->thread_id = uint4korr(p); @@ -642,7 +364,7 @@ php_mysqlnd_greet_read(void *_packet, MYSQLND *conn TSRMLS_DC) static void php_mysqlnd_greet_free_mem(void *_packet, zend_bool alloca TSRMLS_DC) { - php_mysql_packet_greet *p= (php_mysql_packet_greet *) _packet; + MYSQLND_PACKET_GREET *p= (MYSQLND_PACKET_GREET *) _packet; if (p->server_version) { mnd_efree(p->server_version); p->server_version = NULL; @@ -678,7 +400,7 @@ void php_mysqlnd_scramble(zend_uchar * const buffer, const zend_uchar * const sc PHP_SHA1_CTX context; zend_uchar sha1[SHA1_MAX_LENGTH]; zend_uchar sha2[SHA1_MAX_LENGTH]; - + /* Phase 1: hash password */ PHP_SHA1Init(&context); @@ -709,7 +431,7 @@ size_t php_mysqlnd_auth_write(void *_packet, MYSQLND *conn TSRMLS_DC) char buffer[1024]; register char *p= buffer + MYSQLND_HEADER_SIZE; /* start after the header */ int len; - register php_mysql_packet_auth *packet= (php_mysql_packet_auth *) _packet; + register MYSQLND_PACKET_AUTH *packet= (MYSQLND_PACKET_AUTH *) _packet; DBG_ENTER("php_mysqlnd_auth_write"); @@ -722,7 +444,7 @@ size_t php_mysqlnd_auth_write(void *_packet, MYSQLND *conn TSRMLS_DC) if (PG(open_basedir) && strlen(PG(open_basedir))) { packet->client_flags ^= CLIENT_LOCAL_FILES; } - + int4store(p, packet->client_flags); p+= 4; @@ -733,7 +455,7 @@ size_t php_mysqlnd_auth_write(void *_packet, MYSQLND *conn TSRMLS_DC) p++; memset(p, 0, 23); /* filler */ - p+= 23; + p+= 23; len= strlen(packet->user); memcpy(p, packet->user, len); @@ -761,40 +483,45 @@ size_t php_mysqlnd_auth_write(void *_packet, MYSQLND *conn TSRMLS_DC) /* Handle CLIENT_CONNECT_WITH_DB */ /* no \0 for no DB */ - DBG_RETURN(mysqlnd_stream_write_w_header(conn, buffer, p - buffer - MYSQLND_HEADER_SIZE TSRMLS_CC)); + DBG_RETURN(conn->net->m.send(conn, buffer, p - buffer - MYSQLND_HEADER_SIZE TSRMLS_CC)); } /* }}} */ + /* {{{ php_mysqlnd_auth_free_mem */ static void php_mysqlnd_auth_free_mem(void *_packet, zend_bool alloca TSRMLS_DC) { if (!alloca) { - mnd_pefree((php_mysql_packet_auth *) _packet, ((php_mysql_packet_auth *)_packet)->header.persistent); + mnd_pefree((MYSQLND_PACKET_AUTH *) _packet, ((MYSQLND_PACKET_AUTH *)_packet)->header.persistent); } } /* }}} */ +#define OK_BUFFER_SIZE 2048 + /* {{{ php_mysqlnd_ok_read */ static enum_func_status php_mysqlnd_ok_read(void *_packet, MYSQLND *conn TSRMLS_DC) { - zend_uchar buf[1024]; + zend_uchar local_buf[OK_BUFFER_SIZE]; + size_t buf_len = conn->net->cmd_buffer.buffer? conn->net->cmd_buffer.length : OK_BUFFER_SIZE; + zend_uchar *buf = conn->net->cmd_buffer.buffer? (zend_uchar *) conn->net->cmd_buffer.buffer : local_buf; zend_uchar *p = buf; zend_uchar *begin = buf; unsigned long i; - register php_mysql_packet_ok *packet= (php_mysql_packet_ok *) _packet; + register MYSQLND_PACKET_OK *packet= (MYSQLND_PACKET_OK *) _packet; DBG_ENTER("php_mysqlnd_ok_read"); - PACKET_READ_HEADER_AND_BODY(packet, conn, buf, sizeof(buf), "OK", PROT_OK_PACKET); + PACKET_READ_HEADER_AND_BODY(packet, conn, buf, buf_len, "OK", PROT_OK_PACKET); - /* Should be always 0x0 or 0xFF for error */ + /* Should be always 0x0 or ERROR_MARKER for error */ packet->field_count = uint1korr(p); p++; - if (0xFF == packet->field_count) { + if (ERROR_MARKER == packet->field_count) { php_mysqlnd_read_error_from_line(p, packet->header.size - 1, packet->error, sizeof(packet->error), &packet->error_no, packet->sqlstate @@ -813,7 +540,7 @@ php_mysqlnd_ok_read(void *_packet, MYSQLND *conn TSRMLS_DC) /* There is a message */ if (packet->header.size > p - buf && (i = php_mysqlnd_net_field_length(&p))) { - packet->message = estrndup((char *)p, MIN(i, sizeof(buf) - (p - buf))); + packet->message = estrndup((char *)p, MIN(i, buf_len - (p - begin))); packet->message_len = i; } else { packet->message = NULL; @@ -838,7 +565,7 @@ php_mysqlnd_ok_read(void *_packet, MYSQLND *conn TSRMLS_DC) static void php_mysqlnd_ok_free_mem(void *_packet, zend_bool alloca TSRMLS_DC) { - php_mysql_packet_ok *p= (php_mysql_packet_ok *) _packet; + MYSQLND_PACKET_OK *p= (MYSQLND_PACKET_OK *) _packet; if (p->message) { mnd_efree(p->message); p->message = NULL; @@ -860,20 +587,21 @@ php_mysqlnd_eof_read(void *_packet, MYSQLND *conn TSRMLS_DC) Error : error_code + '#' + sqlstate + MYSQLND_ERRMSG_SIZE */ - php_mysql_packet_eof *packet= (php_mysql_packet_eof *) _packet; - zend_uchar buf[5 + 10 + sizeof(packet->sqlstate) + sizeof(packet->error)]; + MYSQLND_PACKET_EOF *packet= (MYSQLND_PACKET_EOF *) _packet; + size_t buf_len = conn->net->cmd_buffer.length; + zend_uchar *buf = (zend_uchar *) conn->net->cmd_buffer.buffer; zend_uchar *p = buf; zend_uchar *begin = buf; DBG_ENTER("php_mysqlnd_eof_read"); - PACKET_READ_HEADER_AND_BODY(packet, conn, buf, sizeof(buf), "EOF", PROT_EOF_PACKET); + PACKET_READ_HEADER_AND_BODY(packet, conn, buf, buf_len, "EOF", PROT_EOF_PACKET); - /* Should be always 0xFE */ + /* Should be always EODATA_MARKER */ packet->field_count = uint1korr(p); p++; - if (0xFF == packet->field_count) { + if (ERROR_MARKER == packet->field_count) { php_mysqlnd_read_error_from_line(p, packet->header.size - 1, packet->error, sizeof(packet->error), &packet->error_no, packet->sqlstate @@ -901,7 +629,7 @@ php_mysqlnd_eof_read(void *_packet, MYSQLND *conn TSRMLS_DC) php_error_docref(NULL TSRMLS_CC, E_WARNING, "EOF packet "MYSQLND_SZ_T_SPEC" bytes shorter than expected", p - begin - packet->header.size); } - + DBG_INF_FMT("EOF packet: fields=%d status=%d warnings=%d", packet->field_count, packet->server_status, packet->warning_count); @@ -915,7 +643,7 @@ static void php_mysqlnd_eof_free_mem(void *_packet, zend_bool alloca TSRMLS_DC) { if (!alloca) { - mnd_pefree(_packet, ((php_mysql_packet_eof *)_packet)->header.persistent); + mnd_pefree(_packet, ((MYSQLND_PACKET_EOF *)_packet)->header.persistent); } } /* }}} */ @@ -925,8 +653,8 @@ void php_mysqlnd_eof_free_mem(void *_packet, zend_bool alloca TSRMLS_DC) size_t php_mysqlnd_cmd_write(void *_packet, MYSQLND *conn TSRMLS_DC) { /* Let's have some space, which we can use, if not enough, we will allocate new buffer */ - php_mysql_packet_command *packet= (php_mysql_packet_command *) _packet; - MYSQLND_NET *net = &conn->net; + MYSQLND_PACKET_COMMAND *packet= (MYSQLND_PACKET_COMMAND *) _packet; + MYSQLND_NET *net = conn->net; unsigned int error_reporting = EG(error_reporting); size_t written; @@ -936,27 +664,24 @@ size_t php_mysqlnd_cmd_write(void *_packet, MYSQLND *conn TSRMLS_DC) Every command starts a new TX and packet numbers are reset to 0. */ net->packet_no = 0; + net->compressed_envelope_packet_no = 0; /* this is for the response */ if (error_reporting) { EG(error_reporting) = 0; } - MYSQLND_INC_CONN_STATISTIC(&conn->stats, STAT_PACKETS_SENT_CMD); - + MYSQLND_INC_CONN_STATISTIC(conn->stats, STAT_PACKETS_SENT_CMD); + #ifdef MYSQLND_DO_WIRE_CHECK_BEFORE_COMMAND - php_mysqlnd_consume_uneaten_data(conn, packet->command TSRMLS_CC); + net->m.consume_uneaten_data(net, packet->command TSRMLS_CC); #endif if (!packet->argument || !packet->arg_len) { char buffer[MYSQLND_HEADER_SIZE + 1]; int1store(buffer + MYSQLND_HEADER_SIZE, packet->command); - written = mysqlnd_stream_write_w_header(conn, buffer, 1 TSRMLS_CC); + written = conn->net->m.send(conn, buffer, 1 TSRMLS_CC); } else { -#if USE_CORK && defined(TCP_CORK) - written = mysqlnd_stream_write_w_command(conn, packet->command, packet->argument, - packet->arg_len TSRMLS_CC)); -#else size_t tmp_len = packet->arg_len + 1 + MYSQLND_HEADER_SIZE, ret; zend_uchar *tmp, *p; tmp = (tmp_len > net->cmd_buffer.length)? mnd_emalloc(tmp_len):net->cmd_buffer.buffer; @@ -967,13 +692,12 @@ size_t php_mysqlnd_cmd_write(void *_packet, MYSQLND *conn TSRMLS_DC) memcpy(p, packet->argument, packet->arg_len); - ret = mysqlnd_stream_write_w_header(conn, (char *)tmp, tmp_len - MYSQLND_HEADER_SIZE TSRMLS_CC); + ret = conn->net->m.send(conn, (char *)tmp, tmp_len - MYSQLND_HEADER_SIZE TSRMLS_CC); if (tmp != net->cmd_buffer.buffer) { - MYSQLND_INC_CONN_STATISTIC(&conn->stats, STAT_CMD_BUFFER_TOO_SMALL); + MYSQLND_INC_CONN_STATISTIC(conn->stats, STAT_CMD_BUFFER_TOO_SMALL); mnd_efree(tmp); } written = ret; -#endif } if (error_reporting) { /* restore error reporting */ @@ -989,7 +713,7 @@ static void php_mysqlnd_cmd_free_mem(void *_packet, zend_bool alloca TSRMLS_DC) { if (!alloca) { - mnd_pefree(_packet, ((php_mysql_packet_command *)_packet)->header.persistent); + mnd_pefree(_packet, ((MYSQLND_PACKET_COMMAND *)_packet)->header.persistent); } } /* }}} */ @@ -999,21 +723,22 @@ void php_mysqlnd_cmd_free_mem(void *_packet, zend_bool alloca TSRMLS_DC) static enum_func_status php_mysqlnd_rset_header_read(void *_packet, MYSQLND *conn TSRMLS_DC) { - zend_uchar buf[1024]; + size_t buf_len = conn->net->cmd_buffer.length; + zend_uchar *buf = (zend_uchar *) conn->net->cmd_buffer.buffer; zend_uchar *p = buf; zend_uchar *begin = buf; size_t len; - php_mysql_packet_rset_header *packet= (php_mysql_packet_rset_header *) _packet; + MYSQLND_PACKET_RSET_HEADER *packet= (MYSQLND_PACKET_RSET_HEADER *) _packet; DBG_ENTER("php_mysqlnd_rset_header_read"); - PACKET_READ_HEADER_AND_BODY(packet, conn, buf, sizeof(buf), "resultset header", PROT_RSET_HEADER_PACKET); + PACKET_READ_HEADER_AND_BODY(packet, conn, buf, buf_len, "resultset header", PROT_RSET_HEADER_PACKET); /* - Don't increment. First byte is 0xFF on error, but otherwise is starting byte + Don't increment. First byte is ERROR_MARKER on error, but otherwise is starting byte of encoded sequence for length. */ - if (*p == 0xFF) { + if (ERROR_MARKER == *p) { /* Error */ p++; php_mysqlnd_read_error_from_line(p, packet->header.size - 1, @@ -1076,7 +801,8 @@ php_mysqlnd_rset_header_read(void *_packet, MYSQLND *conn TSRMLS_DC) static void php_mysqlnd_rset_header_free_mem(void *_packet, zend_bool alloca TSRMLS_DC) { - php_mysql_packet_rset_header *p= (php_mysql_packet_rset_header *) _packet; + MYSQLND_PACKET_RSET_HEADER *p= (MYSQLND_PACKET_RSET_HEADER *) _packet; + DBG_ENTER("php_mysqlnd_rset_header_free_mem"); if (p->info_or_local_file) { mnd_efree(p->info_or_local_file); p->info_or_local_file = NULL; @@ -1084,6 +810,7 @@ void php_mysqlnd_rset_header_free_mem(void *_packet, zend_bool alloca TSRMLS_DC) if (!alloca) { mnd_pefree(p, p->header.persistent); } + DBG_VOID_RETURN; } /* }}} */ @@ -1109,12 +836,12 @@ static enum_func_status php_mysqlnd_rset_field_read(void *_packet, MYSQLND *conn TSRMLS_DC) { /* Should be enough for the metadata of a single row */ - php_mysql_packet_res_field *packet= (php_mysql_packet_res_field *) _packet; - zend_uchar *buf = (zend_uchar *) conn->net.cmd_buffer.buffer; + MYSQLND_PACKET_RES_FIELD *packet= (MYSQLND_PACKET_RES_FIELD *) _packet; + size_t buf_len = conn->net->cmd_buffer.length, total_len = 0; + zend_uchar *buf = (zend_uchar *) conn->net->cmd_buffer.buffer; zend_uchar *p = buf; zend_uchar *begin = buf; char *root_ptr; - size_t buf_len = conn->net.cmd_buffer.length, total_len = 0; unsigned long len; MYSQLND_FIELD *meta; unsigned int i, field_count = sizeof(rset_field_offsets)/sizeof(size_t); @@ -1126,7 +853,7 @@ php_mysqlnd_rset_field_read(void *_packet, MYSQLND *conn TSRMLS_DC) if (packet->skip_parsing) { DBG_RETURN(PASS); } - if (*p == 0xFF) { + if (ERROR_MARKER == *p) { /* Error */ p++; php_mysqlnd_read_error_from_line(p, packet->header.size - 1, @@ -1135,7 +862,7 @@ php_mysqlnd_rset_field_read(void *_packet, MYSQLND *conn TSRMLS_DC) TSRMLS_CC); DBG_ERR_FMT("Server error : (%d) %s", packet->error_info.error_no, packet->error_info.error); DBG_RETURN(PASS); - } else if (*p == 0xFE && packet->header.size < 8) { + } else if (EODATA_MARKER == *p && packet->header.size < 8) { /* Premature EOF. That should be COM_FIELD_LIST */ DBG_INF("Premature EOF. That should be COM_FIELD_LIST"); packet->stupid_list_fields_eof = TRUE; @@ -1229,7 +956,8 @@ php_mysqlnd_rset_field_read(void *_packet, MYSQLND *conn TSRMLS_DC) if (meta->db && meta->db != mysqlnd_empty_string) { len = meta->db_length; meta->db = memcpy(root_ptr, meta->db, len); - *(root_ptr + len) = '\0'; + *(root_ptr +=len) = '\0'; + root_ptr++; } if (meta->table && meta->table != mysqlnd_empty_string) { @@ -1278,7 +1006,7 @@ faulty_or_fake: static void php_mysqlnd_rset_field_free_mem(void *_packet, zend_bool alloca TSRMLS_DC) { - php_mysql_packet_res_field *p= (php_mysql_packet_res_field *) _packet; + MYSQLND_PACKET_RES_FIELD *p= (MYSQLND_PACKET_RES_FIELD *) _packet; /* p->metadata was passed to us as temporal buffer */ if (!alloca) { @@ -1288,13 +1016,15 @@ void php_mysqlnd_rset_field_free_mem(void *_packet, zend_bool alloca TSRMLS_DC) /* }}} */ +/* {{{ php_mysqlnd_read_row_ex */ static enum_func_status -php_mysqlnd_read_row_ex(MYSQLND *conn, MYSQLND_MEMORY_POOL_CHUNK **buffer, +php_mysqlnd_read_row_ex(MYSQLND *conn, MYSQLND_MEMORY_POOL * result_set_memory_pool, + MYSQLND_MEMORY_POOL_CHUNK **buffer, uint64_t *data_size, zend_bool persistent_alloc, unsigned int prealloc_more_bytes TSRMLS_DC) { enum_func_status ret = PASS; - mysqlnd_packet_header header; + MYSQLND_PACKET_HEADER header; zend_uchar *p = NULL; zend_bool first_iteration = TRUE; @@ -1323,8 +1053,7 @@ php_mysqlnd_read_row_ex(MYSQLND *conn, MYSQLND_MEMORY_POOL_CHUNK **buffer, We need a trailing \0 for the last string, in case of text-mode, to be able to implement read-only variables. Thus, we add + 1. */ - *buffer = conn->result_set_memory_pool->get_chunk(conn->result_set_memory_pool, - *data_size + 1 TSRMLS_CC); + *buffer = result_set_memory_pool->get_chunk(result_set_memory_pool, *data_size + 1 TSRMLS_CC); p = (*buffer)->ptr; } else if (!first_iteration) { /* Empty packet after MYSQLND_MAX_PACKET_SIZE packet. That's ok, break */ @@ -1343,10 +1072,9 @@ php_mysqlnd_read_row_ex(MYSQLND *conn, MYSQLND_MEMORY_POOL_CHUNK **buffer, p = (*buffer)->ptr + (*data_size - header.size); } - if (!mysqlnd_read_body(conn, p, header.size TSRMLS_CC)) { + if ((ret = conn->net->m.receive(conn, p, header.size TSRMLS_CC))) { DBG_ERR("Empty row packet body"); php_error(E_WARNING, "Empty row packet body"); - ret = FAIL; break; } @@ -1354,56 +1082,42 @@ php_mysqlnd_read_row_ex(MYSQLND *conn, MYSQLND_MEMORY_POOL_CHUNK **buffer, break; } } - if (ret == FAIL) { + if (ret == FAIL && *buffer) { (*buffer)->free_chunk((*buffer), TRUE TSRMLS_CC); *buffer = NULL; } *data_size -= prealloc_more_bytes; DBG_RETURN(ret); } +/* }}} */ /* {{{ php_mysqlnd_rowp_read_binary_protocol */ void php_mysqlnd_rowp_read_binary_protocol(MYSQLND_MEMORY_POOL_CHUNK * row_buffer, zval ** fields, - unsigned int field_count, MYSQLND_FIELD *fields_metadata, - MYSQLND *conn TSRMLS_DC) + unsigned int field_count, MYSQLND_FIELD *fields_metadata, + zend_bool persistent, + zend_bool as_unicode, zend_bool as_int_or_float, + MYSQLND_STATS * stats TSRMLS_DC) { int i; zend_uchar *p = row_buffer->ptr; zend_uchar *null_ptr, bit; zval **current_field, **end_field, **start_field; - zend_bool as_unicode = conn->options.numeric_and_datetime_as_unicode; -#ifdef USE_ZVAL_CACHE - zend_bool allocated; - void *obj; -#endif DBG_ENTER("php_mysqlnd_rowp_read_binary_protocol"); end_field = (current_field = start_field = fields) + field_count; - /* skip the first byte, not 0xFE -> 0x0, status */ + /* skip the first byte, not EODATA_MARKER -> 0x0, status */ p++; null_ptr= p; p += (field_count + 9)/8; /* skip null bits */ bit = 4; /* first 2 bits are reserved */ for (i = 0; current_field < end_field; current_field++, i++) { -#ifdef USE_ZVAL_CACHE - DBG_INF("Trying to use the zval cache"); - obj = mysqlnd_palloc_get_zval(conn->zval_cache, &allocated TSRMLS_CC); - if (allocated) { - *current_field = (zval *) obj; - } else { - /* It's from the cache, so we can upcast here */ - *current_field = &((mysqlnd_zval *) obj)->zv; - ((mysqlnd_zval *) obj)->point_type = MYSQLND_POINTS_EXT_BUFFER; - } -#else DBG_INF("Directly creating zval"); MAKE_STD_ZVAL(*current_field); -#endif DBG_INF_FMT("Into zval=%p decoding column %d [%s.%s.%s] type=%d field->flags&unsigned=%d flags=%u is_bit=%d as_unicode=%d", *current_field, i, @@ -1412,7 +1126,7 @@ void php_mysqlnd_rowp_read_binary_protocol(MYSQLND_MEMORY_POOL_CHUNK * row_buffe if (*null_ptr & bit) { DBG_INF("It's null"); ZVAL_NULL(*current_field); - MYSQLND_INC_CONN_STATISTIC(&conn->stats, STAT_BINARY_TYPE_FETCHED_NULL); + MYSQLND_INC_CONN_STATISTIC(stats, STAT_BINARY_TYPE_FETCHED_NULL); } else { enum_mysqlnd_field_types type = fields_metadata[i].type; mysqlnd_ps_fetch_functions[type].func(*current_field, &fields_metadata[i], @@ -1449,8 +1163,8 @@ void php_mysqlnd_rowp_read_binary_protocol(MYSQLND_MEMORY_POOL_CHUNK * row_buffe case MYSQL_TYPE_STRING: statistic = STAT_BINARY_TYPE_FETCHED_STRING; break; case MYSQL_TYPE_GEOMETRY: statistic = STAT_BINARY_TYPE_FETCHED_GEOMETRY; break; default: statistic = STAT_BINARY_TYPE_FETCHED_OTHER; break; - } - MYSQLND_INC_CONN_STATISTIC(&conn->stats, statistic); + } + MYSQLND_INC_CONN_STATISTIC(stats, statistic); } } if (!((bit<<=1) & 255)) { @@ -1467,7 +1181,9 @@ void php_mysqlnd_rowp_read_binary_protocol(MYSQLND_MEMORY_POOL_CHUNK * row_buffe /* {{{ php_mysqlnd_rowp_read_text_protocol */ void php_mysqlnd_rowp_read_text_protocol(MYSQLND_MEMORY_POOL_CHUNK * row_buffer, zval ** fields, unsigned int field_count, MYSQLND_FIELD *fields_metadata, - MYSQLND *conn TSRMLS_DC) + zend_bool persistent, + zend_bool as_unicode, zend_bool as_int_or_float, + MYSQLND_STATS * stats TSRMLS_DC) { int i; zend_bool last_field_was_string = FALSE; @@ -1475,39 +1191,22 @@ void php_mysqlnd_rowp_read_text_protocol(MYSQLND_MEMORY_POOL_CHUNK * row_buffer, zend_uchar *p = row_buffer->ptr; size_t data_size = row_buffer->app; zend_uchar *bit_area = (zend_uchar*) row_buffer->ptr + data_size + 1; /* we allocate from here */ - zend_bool as_unicode = conn->options.numeric_and_datetime_as_unicode; -#ifdef MYSQLND_STRING_TO_INT_CONVERSION - zend_bool as_int_or_float = conn->options.int_and_float_native; -#endif DBG_ENTER("php_mysqlnd_rowp_read_text_protocol"); end_field = (current_field = start_field = fields) + field_count; for (i = 0; current_field < end_field; current_field++, i++) { /* Don't reverse the order. It is significant!*/ - void *obj = NULL; - zend_bool allocated = TRUE; zend_uchar *this_field_len_pos = p; /* php_mysqlnd_net_field_length() call should be after *this_field_len_pos = p; */ unsigned long len = php_mysqlnd_net_field_length(&p); -#ifdef USE_ZVAL_CACHE - obj = mysqlnd_palloc_get_zval(conn->zval_cache, &allocated TSRMLS_CC); - if (allocated) { - *current_field = (zval *) obj; - } else { - /* It's from the cache, so we can upcast here */ - *current_field = &((mysqlnd_zval *) obj)->zv; - ((mysqlnd_zval *) obj)->point_type = MYSQLND_POINTS_FREE; - } -#else DBG_INF("Directly creating zval"); MAKE_STD_ZVAL(*current_field); -#endif if (current_field > start_field && last_field_was_string) { /* - Normal queries: + Normal queries: We have to put \0 now to the end of the previous field, if it was a string. IS_NULL doesn't matter. Because we have already read our length, then we can overwrite it in the row buffer. @@ -1561,8 +1260,8 @@ void php_mysqlnd_rowp_read_text_protocol(MYSQLND_MEMORY_POOL_CHUNK * row_buffer, case MYSQL_TYPE_STRING: statistic = STAT_TEXT_TYPE_FETCHED_STRING; break; case MYSQL_TYPE_GEOMETRY: statistic = STAT_TEXT_TYPE_FETCHED_GEOMETRY; break; default: statistic = STAT_TEXT_TYPE_FETCHED_OTHER; break; - } - MYSQLND_INC_CONN_STATISTIC(&conn->stats, statistic); + } + MYSQLND_INC_CONN_STATISTIC(stats, statistic); } #ifdef MYSQLND_STRING_TO_INT_CONVERSION @@ -1594,7 +1293,7 @@ void php_mysqlnd_rowp_read_text_protocol(MYSQLND_MEMORY_POOL_CHUNK * row_buffer, #if SIZEOF_LONG==8 if (uns == TRUE && v > 9223372036854775807L) #elif SIZEOF_LONG==4 - if ((uns == TRUE && v > L64(2147483647)) || + if ((uns == TRUE && v > L64(2147483647)) || (uns == FALSE && (( L64(2147483647) < (int64_t) v) || (L64(-2147483648) > (int64_t) v)))) #endif /* SIZEOF */ @@ -1636,14 +1335,11 @@ void php_mysqlnd_rowp_read_text_protocol(MYSQLND_MEMORY_POOL_CHUNK * row_buffer, #if PHP_MAJOR_VERSION >= 6 if (as_unicode) { ZVAL_UTF8_STRINGL(*current_field, start, bit_area - start - 1, 0); - } else + } else #endif { ZVAL_STRINGL(*current_field, (char *) start, bit_area - start - 1, 0); } - if (allocated == FALSE) { - ((mysqlnd_zval *) obj)->point_type = MYSQLND_POINTS_INT_BUFFER; - } } else if (Z_TYPE_PP(current_field) == IS_STRING){ memcpy(bit_area, Z_STRVAL_PP(current_field), Z_STRLEN_PP(current_field)); bit_area += Z_STRLEN_PP(current_field); @@ -1652,26 +1348,20 @@ void php_mysqlnd_rowp_read_text_protocol(MYSQLND_MEMORY_POOL_CHUNK * row_buffer, #if PHP_MAJOR_VERSION >= 6 if (as_unicode) { ZVAL_UTF8_STRINGL(*current_field, start, bit_area - start - 1, 0); - } else + } else #endif { ZVAL_STRINGL(*current_field, (char *) start, bit_area - start - 1, 0); } - if (allocated == FALSE) { - ((mysqlnd_zval *) obj)->point_type = MYSQLND_POINTS_INT_BUFFER; - } } /* IS_UNICODE should not be specially handled. In unicode mode the buffers are not referenced - everything is copied. */ - } else + } else #if PHP_MAJOR_VERSION < 6 { ZVAL_STRINGL(*current_field, (char *)p, len, 0); - if (allocated == FALSE) { - ((mysqlnd_zval *) obj)->point_type = MYSQLND_POINTS_INT_BUFFER; - } } #else /* @@ -1682,10 +1372,6 @@ void php_mysqlnd_rowp_read_text_protocol(MYSQLND_MEMORY_POOL_CHUNK * row_buffer, Also the destruction of the zvals should not call zval_copy_ctor() because then we will leak. - I suppose we can use UG(unicode) in mysqlnd.c/mysqlnd_palloc.c when - freeing a result set - to check if we need to call copy_ctor(). - XXX: Keep in mind that up there there is an open `else` in #ifdef MYSQLND_STRING_TO_INT_CONVERSION which will make with this `if` an `else if`. @@ -1699,20 +1385,6 @@ void php_mysqlnd_rowp_read_text_protocol(MYSQLND_MEMORY_POOL_CHUNK * row_buffer, } else { ZVAL_UTF8_STRINGL(*current_field, (char *)p, len, 0); } - if (allocated == FALSE) { - /* - The zval cache will check and see that the type is IS_STRING. - In this case it will call copy_ctor(). This is valid when - allocated == TRUE . In this case we can't upcast. Thus for non-PS - point_type doesn't matter much, as the valuable information is - in the type of result set. Still good to set it. - */ - if (Z_TYPE_P(*current_field) == IS_STRING) { - ((mysqlnd_zval *) obj)->point_type = MYSQLND_POINTS_INT_BUFFER; - } else { - ((mysqlnd_zval *) obj)->point_type = MYSQLND_POINTS_EXT_BUFFER; - } - } #endif p += len; last_field_was_string = TRUE; @@ -1730,17 +1402,17 @@ void php_mysqlnd_rowp_read_text_protocol(MYSQLND_MEMORY_POOL_CHUNK * row_buffer, /* {{{ php_mysqlnd_rowp_read */ /* - if normal statements => packet->fields is created by this function, + if normal statements => packet->fields is created by this function, if PS => packet->fields is passed from outside */ static enum_func_status php_mysqlnd_rowp_read(void *_packet, MYSQLND *conn TSRMLS_DC) { - MYSQLND_NET *net = &conn->net; + MYSQLND_NET *net = conn->net; zend_uchar *p; enum_func_status ret = PASS; size_t old_chunk_size = net->stream->chunk_size; - php_mysql_packet_row *packet= (php_mysql_packet_row *) _packet; + MYSQLND_PACKET_ROW *packet= (MYSQLND_PACKET_ROW *) _packet; size_t post_alloc_for_bit_fields = 0; uint64_t data_size = 0; @@ -1752,13 +1424,13 @@ php_mysqlnd_rowp_read(void *_packet, MYSQLND *conn TSRMLS_DC) packet->bit_fields_total_len + packet->bit_fields_count; } - ret = php_mysqlnd_read_row_ex(conn, &packet->row_buffer, &data_size, + ret = php_mysqlnd_read_row_ex(conn, packet->result_set_memory_pool, &packet->row_buffer, &data_size, packet->persistent_alloc, post_alloc_for_bit_fields TSRMLS_CC); if (FAIL == ret) { goto end; } - MYSQLND_INC_CONN_STATISTIC_W_VALUE2(&conn->stats, packet_type_to_statistic_byte_count[PROT_ROW_PACKET], + MYSQLND_INC_CONN_STATISTIC_W_VALUE2(conn->stats, packet_type_to_statistic_byte_count[PROT_ROW_PACKET], MYSQLND_HEADER_SIZE + packet->header.size, packet_type_to_statistic_packet_count[PROT_ROW_PACKET], 1); @@ -1767,7 +1439,7 @@ php_mysqlnd_rowp_read(void *_packet, MYSQLND *conn TSRMLS_DC) packet->header.size = data_size; packet->row_buffer->app = data_size; - if ((*(p = packet->row_buffer->ptr)) == 0xFF) { + if (ERROR_MARKER == (*(p = packet->row_buffer->ptr))) { /* Error message as part of the result set, not good but we should not hang. See: @@ -1780,7 +1452,7 @@ php_mysqlnd_rowp_read(void *_packet, MYSQLND *conn TSRMLS_DC) &packet->error_info.error_no, packet->error_info.sqlstate TSRMLS_CC); - } else if (*p == 0xFE && data_size < 8) { /* EOF */ + } else if (EODATA_MARKER == *p && data_size < 8) { /* EOF */ packet->eof = TRUE; p++; if (data_size > 1) { @@ -1792,7 +1464,7 @@ php_mysqlnd_rowp_read(void *_packet, MYSQLND *conn TSRMLS_DC) packet->server_status, packet->warning_count); } } else { - MYSQLND_INC_CONN_STATISTIC(&conn->stats, + MYSQLND_INC_CONN_STATISTIC(conn->stats, packet->binary_protocol? STAT_ROWS_FETCHED_FROM_SERVER_PS: STAT_ROWS_FETCHED_FROM_SERVER_NORMAL); @@ -1816,7 +1488,7 @@ php_mysqlnd_rowp_read(void *_packet, MYSQLND *conn TSRMLS_DC) packet->persistent_alloc); } } else { - MYSQLND_INC_CONN_STATISTIC(&conn->stats, + MYSQLND_INC_CONN_STATISTIC(conn->stats, packet->binary_protocol? STAT_ROWS_SKIPPED_PS: STAT_ROWS_SKIPPED_NORMAL); } @@ -1833,10 +1505,10 @@ end: static void php_mysqlnd_rowp_free_mem(void *_packet, zend_bool alloca TSRMLS_DC) { - php_mysql_packet_row *p; + MYSQLND_PACKET_ROW *p; DBG_ENTER("php_mysqlnd_rowp_free_mem"); - p = (php_mysql_packet_row *) _packet; + p = (MYSQLND_PACKET_ROW *) _packet; if (p->row_buffer) { p->row_buffer->free_chunk(p->row_buffer, TRUE TSRMLS_CC); p->row_buffer = NULL; @@ -1857,17 +1529,17 @@ void php_mysqlnd_rowp_free_mem(void *_packet, zend_bool alloca TSRMLS_DC) /* }}} */ - /* {{{ php_mysqlnd_stats_read */ static enum_func_status php_mysqlnd_stats_read(void *_packet, MYSQLND *conn TSRMLS_DC) { - zend_uchar buf[1024]; - php_mysql_packet_stats *packet= (php_mysql_packet_stats *) _packet; + MYSQLND_PACKET_STATS *packet= (MYSQLND_PACKET_STATS *) _packet; + size_t buf_len = conn->net->cmd_buffer.length; + zend_uchar *buf = (zend_uchar *) conn->net->cmd_buffer.buffer; DBG_ENTER("php_mysqlnd_stats_read"); - PACKET_READ_HEADER_AND_BODY(packet, conn, buf, sizeof(buf), "statistics", PROT_STATS_PACKET); + PACKET_READ_HEADER_AND_BODY(packet, conn, buf, buf_len, "statistics", PROT_STATS_PACKET); packet->message = mnd_emalloc(packet->header.size + 1); memcpy(packet->message, buf, packet->header.size); @@ -1883,7 +1555,7 @@ php_mysqlnd_stats_read(void *_packet, MYSQLND *conn TSRMLS_DC) static void php_mysqlnd_stats_free_mem(void *_packet, zend_bool alloca TSRMLS_DC) { - php_mysql_packet_stats *p= (php_mysql_packet_stats *) _packet; + MYSQLND_PACKET_STATS *p= (MYSQLND_PACKET_STATS *) _packet; if (p->message) { mnd_efree(p->message); p->message = NULL; @@ -1904,21 +1576,22 @@ static enum_func_status php_mysqlnd_prepare_read(void *_packet, MYSQLND *conn TSRMLS_DC) { /* In case of an error, we should have place to put it */ - zend_uchar buf[1024]; + size_t buf_len = conn->net->cmd_buffer.length; + zend_uchar *buf = (zend_uchar *) conn->net->cmd_buffer.buffer; zend_uchar *p = buf; zend_uchar *begin = buf; unsigned int data_size; - php_mysql_packet_prepare_response *packet= (php_mysql_packet_prepare_response *) _packet; + MYSQLND_PACKET_PREPARE_RESPONSE *packet= (MYSQLND_PACKET_PREPARE_RESPONSE *) _packet; DBG_ENTER("php_mysqlnd_prepare_read"); - PACKET_READ_HEADER_AND_BODY(packet, conn, buf, sizeof(buf), "prepare", PROT_PREPARE_RESP_PACKET); - + PACKET_READ_HEADER_AND_BODY(packet, conn, buf, buf_len, "prepare", PROT_PREPARE_RESP_PACKET); + data_size = packet->header.size; packet->error_code = uint1korr(p); p++; - if (0xFF == packet->error_code) { + if (ERROR_MARKER == packet->error_code) { php_mysqlnd_read_error_from_line(p, data_size - 1, packet->error_info.error, sizeof(packet->error_info.error), @@ -1971,7 +1644,7 @@ php_mysqlnd_prepare_read(void *_packet, MYSQLND *conn TSRMLS_DC) static void php_mysqlnd_prepare_free_mem(void *_packet, zend_bool alloca TSRMLS_DC) { - php_mysql_packet_prepare_response *p= (php_mysql_packet_prepare_response *) _packet; + MYSQLND_PACKET_PREPARE_RESPONSE *p= (MYSQLND_PACKET_PREPARE_RESPONSE *) _packet; if (!alloca) { mnd_pefree(p, p->header.persistent); } @@ -1984,31 +1657,31 @@ static enum_func_status php_mysqlnd_chg_user_read(void *_packet, MYSQLND *conn TSRMLS_DC) { /* There could be an error message */ - zend_uchar buf[1024]; + size_t buf_len = conn->net->cmd_buffer.length; + zend_uchar *buf = (zend_uchar *) conn->net->cmd_buffer.buffer; zend_uchar *p = buf; zend_uchar *begin = buf; - php_mysql_packet_chg_user_resp *packet= (php_mysql_packet_chg_user_resp *) _packet; + MYSQLND_PACKET_CHG_USER_RESPONSE *packet= (MYSQLND_PACKET_CHG_USER_RESPONSE *) _packet; DBG_ENTER("php_mysqlnd_chg_user_read"); - PACKET_READ_HEADER_AND_BODY(packet, conn, buf, sizeof(buf), "change user response", PROT_CHG_USER_PACKET); + PACKET_READ_HEADER_AND_BODY(packet, conn, buf, buf_len, "change user response", PROT_CHG_USER_RESP_PACKET); /* - Don't increment. First byte is 0xFF on error, but otherwise is starting byte + Don't increment. First byte is ERROR_MARKER on error, but otherwise is starting byte of encoded sequence for length. */ - /* Should be always 0x0 or 0xFF for error */ + /* Should be always 0x0 or ERROR_MARKER for error */ packet->field_count= uint1korr(p); p++; - if (packet->header.size == 1 && buf[0] == 0xFE && - packet->server_capabilities & CLIENT_SECURE_CONNECTION) { + if (packet->header.size == 1 && buf[0] == EODATA_MARKER && packet->server_capabilities & CLIENT_SECURE_CONNECTION) { /* We don't handle 3.23 authentication */ DBG_RETURN(FAIL); } - if (0xFF == packet->field_count) { + if (ERROR_MARKER == packet->field_count) { php_mysqlnd_read_error_from_line(p, packet->header.size - 1, packet->error_info.error, sizeof(packet->error_info.error), @@ -2032,86 +1705,288 @@ static void php_mysqlnd_chg_user_free_mem(void *_packet, zend_bool alloca TSRMLS_DC) { if (!alloca) { - mnd_pefree(_packet, ((php_mysql_packet_chg_user_resp *)_packet)->header.persistent); + mnd_pefree(_packet, ((MYSQLND_PACKET_CHG_USER_RESPONSE *)_packet)->header.persistent); } } /* }}} */ -/* {{{ packet_methods +/* {{{ packet_methods */ +static mysqlnd_packet_methods packet_methods[PROT_LAST] = { { - sizeof(php_mysql_packet_greet), + sizeof(MYSQLND_PACKET_GREET), php_mysqlnd_greet_read, NULL, /* write */ php_mysqlnd_greet_free_mem, }, /* PROT_GREET_PACKET */ { - sizeof(php_mysql_packet_auth), + sizeof(MYSQLND_PACKET_AUTH), NULL, /* read */ php_mysqlnd_auth_write, php_mysqlnd_auth_free_mem, }, /* PROT_AUTH_PACKET */ { - sizeof(php_mysql_packet_ok), + sizeof(MYSQLND_PACKET_OK), php_mysqlnd_ok_read, /* read */ NULL, /* write */ php_mysqlnd_ok_free_mem, }, /* PROT_OK_PACKET */ { - sizeof(php_mysql_packet_eof), + sizeof(MYSQLND_PACKET_EOF), php_mysqlnd_eof_read, /* read */ NULL, /* write */ php_mysqlnd_eof_free_mem, }, /* PROT_EOF_PACKET */ { - sizeof(php_mysql_packet_command), + sizeof(MYSQLND_PACKET_COMMAND), NULL, /* read */ php_mysqlnd_cmd_write, /* write */ php_mysqlnd_cmd_free_mem, }, /* PROT_CMD_PACKET */ { - sizeof(php_mysql_packet_rset_header), + sizeof(MYSQLND_PACKET_RSET_HEADER), php_mysqlnd_rset_header_read, /* read */ NULL, /* write */ php_mysqlnd_rset_header_free_mem, }, /* PROT_RSET_HEADER_PACKET */ { - sizeof(php_mysql_packet_res_field), + sizeof(MYSQLND_PACKET_RES_FIELD), php_mysqlnd_rset_field_read, /* read */ NULL, /* write */ php_mysqlnd_rset_field_free_mem, }, /* PROT_RSET_FLD_PACKET */ { - sizeof(php_mysql_packet_row), + sizeof(MYSQLND_PACKET_ROW), php_mysqlnd_rowp_read, /* read */ NULL, /* write */ php_mysqlnd_rowp_free_mem, }, /* PROT_ROW_PACKET */ { - sizeof(php_mysql_packet_stats), + sizeof(MYSQLND_PACKET_STATS), php_mysqlnd_stats_read, /* read */ NULL, /* write */ php_mysqlnd_stats_free_mem, }, /* PROT_STATS_PACKET */ { - sizeof(php_mysql_packet_prepare_response), + sizeof(MYSQLND_PACKET_PREPARE_RESPONSE), php_mysqlnd_prepare_read, /* read */ NULL, /* write */ php_mysqlnd_prepare_free_mem, }, /* PROT_PREPARE_RESP_PACKET */ { - sizeof(php_mysql_packet_chg_user_resp), + sizeof(MYSQLND_PACKET_CHG_USER_RESPONSE), php_mysqlnd_chg_user_read, /* read */ NULL, /* write */ php_mysqlnd_chg_user_free_mem, - } /* PROT_CHG_USER_PACKET */ + } /* PROT_CHG_USER_RESP_PACKET */ }; /* }}} */ + +/* {{{ mysqlnd_protocol::get_greet_packet */ +static struct st_mysqlnd_packet_greet * +MYSQLND_METHOD(mysqlnd_protocol, get_greet_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC) +{ + struct st_mysqlnd_packet_greet * packet = pecalloc(1, packet_methods[PROT_GREET_PACKET].struct_size, persistent); + DBG_ENTER("mysqlnd_protocol::get_greet_packet"); + packet->header.m = &packet_methods[PROT_GREET_PACKET]; + packet->header.persistent = persistent; + DBG_RETURN(packet); +} +/* }}} */ + + +/* {{{ mysqlnd_protocol::get_auth_packet */ +static struct st_mysqlnd_packet_auth * +MYSQLND_METHOD(mysqlnd_protocol, get_auth_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC) +{ + struct st_mysqlnd_packet_auth * packet = pecalloc(1, packet_methods[PROT_AUTH_PACKET].struct_size, persistent); + DBG_ENTER("mysqlnd_protocol::get_auth_packet"); + packet->header.m = &packet_methods[PROT_AUTH_PACKET]; + packet->header.persistent = persistent; + DBG_RETURN(packet); +} +/* }}} */ + + +/* {{{ mysqlnd_protocol::get_ok_packet */ +static struct st_mysqlnd_packet_ok * +MYSQLND_METHOD(mysqlnd_protocol, get_ok_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC) +{ + struct st_mysqlnd_packet_ok * packet = pecalloc(1, packet_methods[PROT_OK_PACKET].struct_size, persistent); + DBG_ENTER("mysqlnd_protocol::get_ok_packet"); + packet->header.m = &packet_methods[PROT_OK_PACKET]; + packet->header.persistent = persistent; + DBG_RETURN(packet); +} +/* }}} */ + + +/* {{{ mysqlnd_protocol::get_eof_packet */ +static struct st_mysqlnd_packet_eof * +MYSQLND_METHOD(mysqlnd_protocol, get_eof_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC) +{ + struct st_mysqlnd_packet_eof * packet = pecalloc(1, packet_methods[PROT_EOF_PACKET].struct_size, persistent); + DBG_ENTER("mysqlnd_protocol::get_eof_packet"); + packet->header.m = &packet_methods[PROT_EOF_PACKET]; + packet->header.persistent = persistent; + DBG_RETURN(packet); +} +/* }}} */ + + +/* {{{ mysqlnd_protocol::get_command_packet */ +static struct st_mysqlnd_packet_command * +MYSQLND_METHOD(mysqlnd_protocol, get_command_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC) +{ + struct st_mysqlnd_packet_command * packet = pecalloc(1, packet_methods[PROT_CMD_PACKET].struct_size, persistent); + DBG_ENTER("mysqlnd_protocol::get_command_packet"); + packet->header.m = &packet_methods[PROT_CMD_PACKET]; + packet->header.persistent = persistent; + DBG_RETURN(packet); +} +/* }}} */ + + +/* {{{ mysqlnd_protocol::get_rset_packet */ +static struct st_mysqlnd_packet_rset_header * +MYSQLND_METHOD(mysqlnd_protocol, get_rset_header_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC) +{ + struct st_mysqlnd_packet_rset_header * packet = pecalloc(1, packet_methods[PROT_RSET_HEADER_PACKET].struct_size, persistent); + DBG_ENTER("mysqlnd_protocol::get_rset_header_packet"); + packet->header.m = &packet_methods[PROT_RSET_HEADER_PACKET]; + packet->header.persistent = persistent; + DBG_RETURN(packet); +} +/* }}} */ + + +/* {{{ mysqlnd_protocol::get_result_field_packet */ +static struct st_mysqlnd_packet_res_field * +MYSQLND_METHOD(mysqlnd_protocol, get_result_field_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC) +{ + struct st_mysqlnd_packet_res_field * packet = pecalloc(1, packet_methods[PROT_RSET_FLD_PACKET].struct_size, persistent); + DBG_ENTER("mysqlnd_protocol::get_result_field_packet"); + packet->header.m = &packet_methods[PROT_RSET_FLD_PACKET]; + packet->header.persistent = persistent; + DBG_RETURN(packet); +} +/* }}} */ + + +/* {{{ mysqlnd_protocol::get_row_packet */ +static struct st_mysqlnd_packet_row * +MYSQLND_METHOD(mysqlnd_protocol, get_row_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC) +{ + struct st_mysqlnd_packet_row * packet = pecalloc(1, packet_methods[PROT_ROW_PACKET].struct_size, persistent); + DBG_ENTER("mysqlnd_protocol::get_row_packet"); + packet->header.m = &packet_methods[PROT_ROW_PACKET]; + packet->header.persistent = persistent; + DBG_RETURN(packet); +} +/* }}} */ + + +/* {{{ mysqlnd_protocol::get_stats_packet */ +static struct st_mysqlnd_packet_stats * +MYSQLND_METHOD(mysqlnd_protocol, get_stats_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC) +{ + struct st_mysqlnd_packet_stats * packet = pecalloc(1, packet_methods[PROT_STATS_PACKET].struct_size, persistent); + DBG_ENTER("mysqlnd_protocol::get_stats_packet"); + packet->header.m = &packet_methods[PROT_STATS_PACKET]; + packet->header.persistent = persistent; + DBG_RETURN(packet); +} +/* }}} */ + + +/* {{{ mysqlnd_protocol::get_prepare_response_packet */ +static struct st_mysqlnd_packet_prepare_response * +MYSQLND_METHOD(mysqlnd_protocol, get_prepare_response_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC) +{ + struct st_mysqlnd_packet_prepare_response * packet = pecalloc(1, packet_methods[PROT_PREPARE_RESP_PACKET].struct_size, persistent); + DBG_ENTER("mysqlnd_protocol::get_prepare_response_packet"); + packet->header.m = &packet_methods[PROT_PREPARE_RESP_PACKET]; + packet->header.persistent = persistent; + DBG_RETURN(packet); +} +/* }}} */ + + +/* {{{ mysqlnd_protocol::get_change_user_response_packet */ +static struct st_mysqlnd_packet_chg_user_resp* +MYSQLND_METHOD(mysqlnd_protocol, get_change_user_response_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC) +{ + struct st_mysqlnd_packet_chg_user_resp * packet = pecalloc(1, packet_methods[PROT_CHG_USER_RESP_PACKET].struct_size, persistent); + DBG_ENTER("mysqlnd_protocol::get_change_user_response_packet"); + packet->header.m = &packet_methods[PROT_CHG_USER_RESP_PACKET]; + packet->header.persistent = persistent; + DBG_RETURN(packet); +} +/* }}} */ + + +/* {{{ mysqlnd_protocol_init */ +PHPAPI MYSQLND_PROTOCOL * +mysqlnd_protocol_init(zend_bool persistent TSRMLS_DC) +{ + size_t alloc_size = sizeof(MYSQLND_PROTOCOL) + mysqlnd_plugin_count() * sizeof(void *); + MYSQLND_PROTOCOL *ret = mnd_pecalloc(1, alloc_size, persistent); + + DBG_ENTER("mysqlnd_protocol_init"); + DBG_INF_FMT("persistent=%d", persistent); + ret->persistent = persistent; + + ret->m.get_greet_packet = MYSQLND_METHOD(mysqlnd_protocol, get_greet_packet); + ret->m.get_auth_packet = MYSQLND_METHOD(mysqlnd_protocol, get_auth_packet); + ret->m.get_ok_packet = MYSQLND_METHOD(mysqlnd_protocol, get_ok_packet); + ret->m.get_command_packet = MYSQLND_METHOD(mysqlnd_protocol, get_command_packet); + ret->m.get_eof_packet = MYSQLND_METHOD(mysqlnd_protocol, get_eof_packet); + ret->m.get_rset_header_packet = MYSQLND_METHOD(mysqlnd_protocol, get_rset_header_packet); + ret->m.get_result_field_packet = MYSQLND_METHOD(mysqlnd_protocol, get_result_field_packet); + ret->m.get_row_packet = MYSQLND_METHOD(mysqlnd_protocol, get_row_packet); + ret->m.get_stats_packet = MYSQLND_METHOD(mysqlnd_protocol, get_stats_packet); + ret->m.get_prepare_response_packet = MYSQLND_METHOD(mysqlnd_protocol, get_prepare_response_packet); + ret->m.get_change_user_response_packet = MYSQLND_METHOD(mysqlnd_protocol, get_change_user_response_packet); + + DBG_RETURN(ret); +} +/* }}} */ + + +/* {{{ mysqlnd_protocol_free */ +PHPAPI void +mysqlnd_protocol_free(MYSQLND_PROTOCOL * const protocol TSRMLS_DC) +{ + zend_bool pers = protocol->persistent; + + DBG_ENTER("mysqlnd_protocol_free"); + + if (protocol) { + mnd_pefree(protocol, pers); + } + DBG_VOID_RETURN; +} +/* }}} */ + + +/* {{{ _mysqlnd_plugin_get_plugin_protocol_data */ +PHPAPI void ** _mysqlnd_plugin_get_plugin_protocol_data(const MYSQLND_PROTOCOL * protocol, unsigned int plugin_id TSRMLS_DC) +{ + DBG_ENTER("_mysqlnd_plugin_get_plugin_protocol_data"); + DBG_INF_FMT("plugin_id=%u", plugin_id); + if (!protocol || plugin_id >= mysqlnd_plugin_count()) { + return NULL; + } + DBG_RETURN((void *)((char *)protocol + sizeof(MYSQLND_PROTOCOL) + plugin_id * sizeof(void *))); +} +/* }}} */ + + /* * Local variables: * tab-width: 4 diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.h b/ext/mysqlnd/mysqlnd_wireprotocol.h index df813fd20..29116e050 100644 --- a/ext/mysqlnd/mysqlnd_wireprotocol.h +++ b/ext/mysqlnd/mysqlnd_wireprotocol.h @@ -18,28 +18,24 @@ +----------------------------------------------------------------------+ */ -/* $Id: mysqlnd_wireprotocol.h 289630 2009-10-14 13:51:25Z johannes $ */ +/* $Id: mysqlnd_wireprotocol.h 293779 2010-01-20 17:09:28Z johannes $ */ #ifndef MYSQLND_WIREPROTOCOL_H #define MYSQLND_WIREPROTOCOL_H +#include "mysqlnd_net.h" + #define MYSQLND_HEADER_SIZE 4 +#define COMPRESSED_HEADER_SIZE 3 #define MYSQLND_NULL_LENGTH (unsigned long) ~0 /* Used in mysqlnd_debug.c */ -extern char * mysqlnd_read_header_name; -extern char * mysqlnd_read_body_name; +PHPAPI extern const char mysqlnd_read_header_name[]; +PHPAPI extern const char mysqlnd_read_body_name[]; /* Packet handling */ -#define PACKET_INIT(packet, enum_type, c_type, pers) \ - { \ - packet = (c_type) pecalloc(1, packet_methods[(enum_type)].struct_size, (pers)); \ - ((c_type) (packet))->header.m = &packet_methods[(enum_type)]; \ - ((c_type) (packet))->header.persistent = (pers); \ - DBG_INF_FMT("PACKET_INIT(%p, %d, %d)", packet, (int) enum_type, (int) pers); \ - } #define PACKET_WRITE(packet, conn) ((packet)->header.m->write_to_net((packet), (conn) TSRMLS_CC)) #define PACKET_READ(packet, conn) ((packet)->header.m->read_from_net((packet), (conn) TSRMLS_CC)) #define PACKET_FREE(packet) \ @@ -48,69 +44,7 @@ extern char * mysqlnd_read_body_name; ((packet)->header.m->free_mem((packet), FALSE TSRMLS_CC)); \ } while (0); -#define PACKET_INIT_ALLOCA(packet, enum_type) \ - { \ - memset(&(packet), 0, packet_methods[enum_type].struct_size); \ - (packet).header.m = &packet_methods[enum_type]; \ - } -#define PACKET_WRITE_ALLOCA(packet, conn) PACKET_WRITE(&(packet), (conn)) -#define PACKET_READ_ALLOCA(packet, conn) PACKET_READ(&(packet), (conn)) -#define PACKET_FREE_ALLOCA(packet) (packet.header.m->free_mem(&(packet), TRUE TSRMLS_CC)) - -/* Enums */ -enum php_mysql_packet_type -{ - PROT_GREET_PACKET= 0, - PROT_AUTH_PACKET, - PROT_OK_PACKET, - PROT_EOF_PACKET, - PROT_CMD_PACKET, - PROT_RSET_HEADER_PACKET, - PROT_RSET_FLD_PACKET, - PROT_ROW_PACKET, - PROT_STATS_PACKET, - PROT_PREPARE_RESP_PACKET, - PROT_CHG_USER_PACKET, - PROT_LAST, /* should always be last */ -}; - - -enum php_mysqlnd_server_command -{ - COM_SLEEP = 0, - COM_QUIT, - COM_INIT_DB, - COM_QUERY, - COM_FIELD_LIST, - COM_CREATE_DB, - COM_DROP_DB, - COM_REFRESH, - COM_SHUTDOWN, - COM_STATISTICS, - COM_PROCESS_INFO, - COM_CONNECT, - COM_PROCESS_KILL, - COM_DEBUG, - COM_PING, - COM_TIME = 15, - COM_DELAYED_INSERT, - COM_CHANGE_USER, - COM_BINLOG_DUMP, - COM_TABLE_DUMP, - COM_CONNECT_OUT = 20, - COM_REGISTER_SLAVE, - COM_STMT_PREPARE = 22, - COM_STMT_EXECUTE = 23, - COM_STMT_SEND_LONG_DATA = 24, - COM_STMT_CLOSE = 25, - COM_STMT_RESET = 26, - COM_SET_OPTION = 27, - COM_STMT_FETCH = 28, - COM_DAEMON, - COM_END -}; - -extern const char * const mysqlnd_command_to_text[COM_END]; +PHPAPI extern const char * const mysqlnd_command_to_text[COM_END]; /* Low-level extraction functionality */ typedef struct st_mysqlnd_packet_methods { @@ -120,19 +54,17 @@ typedef struct st_mysqlnd_packet_methods { void (*free_mem)(void *packet, zend_bool alloca TSRMLS_DC); } mysqlnd_packet_methods; -extern mysqlnd_packet_methods packet_methods[]; - typedef struct st_mysqlnd_packet_header { size_t size; mysqlnd_packet_methods *m; zend_uchar packet_no; zend_bool persistent; -} mysqlnd_packet_header; +} MYSQLND_PACKET_HEADER; /* Server greets the client */ -typedef struct st_php_mysql_packet_greet { - mysqlnd_packet_header header; +typedef struct st_mysqlnd_packet_greet { + MYSQLND_PACKET_HEADER header; uint8_t protocol_version; char *server_version; uint32_t thread_id; @@ -147,12 +79,12 @@ typedef struct st_php_mysql_packet_greet { char error[MYSQLND_ERRMSG_SIZE+1]; char sqlstate[MYSQLND_SQLSTATE_LENGTH + 1]; unsigned int error_no; -} php_mysql_packet_greet; +} MYSQLND_PACKET_GREET; /* Client authenticates */ -typedef struct st_php_mysql_packet_auth { - mysqlnd_packet_header header; +typedef struct st_mysqlnd_packet_auth { + MYSQLND_PACKET_HEADER header; uint32_t client_flags; uint32_t max_packet_size; uint8_t charset_no; @@ -167,11 +99,11 @@ typedef struct st_php_mysql_packet_auth { /* +1 for \0 because of scramble() */ unsigned char *server_scramble_buf; size_t db_len; -} php_mysql_packet_auth; +} MYSQLND_PACKET_AUTH; /* OK packet */ -typedef struct st_php_mysql_packet_ok { - mysqlnd_packet_header header; +typedef struct st_mysqlnd_packet_ok { + MYSQLND_PACKET_HEADER header; uint8_t field_count; /* always 0x0 */ uint64_t affected_rows; uint64_t last_insert_id; @@ -183,21 +115,21 @@ typedef struct st_php_mysql_packet_ok { char error[MYSQLND_ERRMSG_SIZE+1]; char sqlstate[MYSQLND_SQLSTATE_LENGTH + 1]; unsigned int error_no; -} php_mysql_packet_ok; +} MYSQLND_PACKET_OK; /* Command packet */ -typedef struct st_php_mysql_packet_command { - mysqlnd_packet_header header; +typedef struct st_mysqlnd_packet_command { + MYSQLND_PACKET_HEADER header; enum php_mysqlnd_server_command command; const char *argument; size_t arg_len; -} php_mysql_packet_command; +} MYSQLND_PACKET_COMMAND; /* EOF packet */ -typedef struct st_php_mysql_packet_eof { - mysqlnd_packet_header header; +typedef struct st_mysqlnd_packet_eof { + MYSQLND_PACKET_HEADER header; uint8_t field_count; /* 0xFE */ uint16_t warning_count; uint16_t server_status; @@ -205,13 +137,13 @@ typedef struct st_php_mysql_packet_eof { char error[MYSQLND_ERRMSG_SIZE+1]; char sqlstate[MYSQLND_SQLSTATE_LENGTH + 1]; unsigned int error_no; -} php_mysql_packet_eof; +} MYSQLND_PACKET_EOF; /* EOF packet */ /* Result Set header*/ -typedef struct st_php_mysql_packet_rset_header { - mysqlnd_packet_header header; +typedef struct st_mysqlnd_packet_rset_header { + MYSQLND_PACKET_HEADER header; /* 0x00 => ok ~0 => LOAD DATA LOCAL @@ -231,25 +163,25 @@ typedef struct st_php_mysql_packet_rset_header { char *info_or_local_file; size_t info_or_local_file_len; /* If error packet, we use these */ - mysqlnd_error_info error_info; -} php_mysql_packet_rset_header; + MYSQLND_ERROR_INFO error_info; +} MYSQLND_PACKET_RSET_HEADER; /* Result set field packet */ -typedef struct st_php_mysql_packet_res_field { - mysqlnd_packet_header header; +typedef struct st_mysqlnd_packet_res_field { + MYSQLND_PACKET_HEADER header; MYSQLND_FIELD *metadata; /* For table definitions, empty for result sets */ zend_bool skip_parsing; zend_bool stupid_list_fields_eof; - mysqlnd_error_info error_info; -} php_mysql_packet_res_field; + MYSQLND_ERROR_INFO error_info; +} MYSQLND_PACKET_RES_FIELD; /* Row packet */ -struct st_php_mysql_packet_row { - mysqlnd_packet_header header; +typedef struct st_mysqlnd_packet_row { + MYSQLND_PACKET_HEADER header; zval **fields; uint32_t field_count; zend_bool eof; @@ -261,6 +193,7 @@ struct st_php_mysql_packet_row { uint16_t server_status; struct st_mysqlnd_memory_pool_chunk *row_buffer; + MYSQLND_MEMORY_POOL * result_set_memory_pool; zend_bool skip_extraction; zend_bool binary_protocol; @@ -271,22 +204,22 @@ struct st_php_mysql_packet_row { size_t bit_fields_total_len; /* trailing \0 not counted */ /* If error packet, we use these */ - mysqlnd_error_info error_info; -}; + MYSQLND_ERROR_INFO error_info; +} MYSQLND_PACKET_ROW; /* Statistics packet */ -typedef struct st_php_mysql_packet_stats { - mysqlnd_packet_header header; +typedef struct st_mysqlnd_packet_stats { + MYSQLND_PACKET_HEADER header; char *message; /* message_len is not part of the packet*/ size_t message_len; -} php_mysql_packet_stats; +} MYSQLND_PACKET_STATS; /* COM_PREPARE response packet */ -typedef struct st_php_mysql_packet_prepare_response { - mysqlnd_packet_header header; +typedef struct st_mysqlnd_packet_prepare_response { + MYSQLND_PACKET_HEADER header; /* also known as field_count 0x00=OK , 0xFF=error */ unsigned char error_code; unsigned long stmt_id; @@ -295,42 +228,47 @@ typedef struct st_php_mysql_packet_prepare_response { unsigned int warning_count; /* present in case of error */ - mysqlnd_error_info error_info; -} php_mysql_packet_prepare_response; + MYSQLND_ERROR_INFO error_info; +} MYSQLND_PACKET_PREPARE_RESPONSE; /* Statistics packet */ -typedef struct st_php_mysql_packet_chg_user_resp { - mysqlnd_packet_header header; +typedef struct st_mysqlnd_packet_chg_user_resp { + MYSQLND_PACKET_HEADER header; uint32_t field_count; - + /* message_len is not part of the packet*/ uint16_t server_capabilities; /* If error packet, we use these */ - mysqlnd_error_info error_info; -} php_mysql_packet_chg_user_resp; - - -size_t mysqlnd_stream_write(MYSQLND * const conn, char * const buf, size_t count TSRMLS_DC); -size_t mysqlnd_stream_write_w_header(MYSQLND * const conn, char * const buf, size_t count TSRMLS_DC); + MYSQLND_ERROR_INFO error_info; +} MYSQLND_PACKET_CHG_USER_RESPONSE; -#ifdef MYSQLND_DO_WIRE_CHECK_BEFORE_COMMAND -size_t php_mysqlnd_consume_uneaten_data(MYSQLND * const conn, enum php_mysqlnd_server_command cmd TSRMLS_DC); -#endif -void php_mysqlnd_scramble(zend_uchar * const buffer, const zend_uchar * const scramble, const zend_uchar * const pass); +PHPAPI void php_mysqlnd_scramble(zend_uchar * const buffer, const zend_uchar * const scramble, const zend_uchar * const pass); unsigned long php_mysqlnd_net_field_length(zend_uchar **packet); zend_uchar * php_mysqlnd_net_store_length(zend_uchar *packet, uint64_t length); -extern char * const mysqlnd_empty_string; +PHPAPI extern char * const mysqlnd_empty_string; void php_mysqlnd_rowp_read_binary_protocol(MYSQLND_MEMORY_POOL_CHUNK * row_buffer, zval ** fields, - unsigned int field_count, MYSQLND_FIELD *fields_metadata, MYSQLND *conn TSRMLS_DC); + unsigned int field_count, MYSQLND_FIELD *fields_metadata, + zend_bool persistent, + zend_bool as_unicode, zend_bool as_int_or_float, + MYSQLND_STATS * stats TSRMLS_DC); + void php_mysqlnd_rowp_read_text_protocol(MYSQLND_MEMORY_POOL_CHUNK * row_buffer, zval ** fields, - unsigned int field_count, MYSQLND_FIELD *fields_metadata, MYSQLND *conn TSRMLS_DC); + unsigned int field_count, MYSQLND_FIELD *fields_metadata, + zend_bool persistent, + zend_bool as_unicode, zend_bool as_int_or_float, + MYSQLND_STATS * stats TSRMLS_DC); + + +PHPAPI MYSQLND_PROTOCOL * mysqlnd_protocol_init(zend_bool persistent TSRMLS_DC); +PHPAPI void mysqlnd_protocol_free(MYSQLND_PROTOCOL * net TSRMLS_DC); + #endif /* MYSQLND_WIREPROTOCOL_H */ diff --git a/ext/mysqlnd/php_mysqlnd.c b/ext/mysqlnd/php_mysqlnd.c index 1a5f929fc..8362a00d3 100644 --- a/ext/mysqlnd/php_mysqlnd.c +++ b/ext/mysqlnd/php_mysqlnd.c @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_mysqlnd.c 289630 2009-10-14 13:51:25Z johannes $ */ +/* $Id: php_mysqlnd.c 293779 2010-01-20 17:09:28Z johannes $ */ #include "php.h" #include "php_ini.h" #include "mysqlnd.h" @@ -45,14 +45,14 @@ PHPAPI void mysqlnd_minfo_print_hash(zval *values) zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(values), &pos_values); while (zend_hash_get_current_data_ex(Z_ARRVAL_P(values), - (void **)&values_entry, &pos_values) == SUCCESS) { - TSRMLS_FETCH(); + (void **)&values_entry, &pos_values) == SUCCESS) { zstr string_key; uint string_key_len; ulong num_key; int s_len; char *s = NULL; + TSRMLS_FETCH(); zend_hash_get_current_key_ex(Z_ARRVAL_P(values), &string_key, &string_key_len, &num_key, 0, &pos_values); convert_to_string(*values_entry); @@ -69,7 +69,7 @@ PHPAPI void mysqlnd_minfo_print_hash(zval *values) } } #else -void mysqlnd_minfo_print_hash(zval *values) +PHPAPI void mysqlnd_minfo_print_hash(zval *values) { zval **values_entry; HashPosition pos_values; @@ -102,6 +102,12 @@ PHP_MINFO_FUNCTION(mysqlnd) php_info_print_table_start(); php_info_print_table_header(2, "mysqlnd", "enabled"); php_info_print_table_row(2, "Version", mysqlnd_get_client_info()); + php_info_print_table_row(2, "Compression", +#ifdef MYSQLND_COMPRESSION_ENABLED + "supported"); +#else + "not supported"); +#endif snprintf(buf, sizeof(buf), "%ld", MYSQLND_G(net_cmd_buffer_size)); php_info_print_table_row(2, "Command buffer size", buf); snprintf(buf, sizeof(buf), "%ld", MYSQLND_G(net_read_buffer_size)); @@ -192,23 +198,20 @@ static PHP_MSHUTDOWN_FUNCTION(mysqlnd) /* }}} */ -#if defined(PHP_DEBUG) || defined(MYSQLND_THREADED) +#if defined(PHP_DEBUG) /* {{{ PHP_RINIT_FUNCTION */ static PHP_RINIT_FUNCTION(mysqlnd) { #if defined(PHP_DEBUG) if (MYSQLND_G(debug)) { - MYSQLND_DEBUG *dbg = mysqlnd_debug_init(TSRMLS_C); + MYSQLND_DEBUG *dbg = mysqlnd_debug_init(mysqlnd_debug_std_no_trace_funcs TSRMLS_CC); if (!dbg) { return FAILURE; } dbg->m->set_mode(dbg, MYSQLND_G(debug)); MYSQLND_G(dbg) = dbg; } -#endif -#ifdef MYSQLND_THREADED - MYSQLND_G(thread_id) = tsrm_thread_id(); #endif return SUCCESS; } @@ -234,15 +237,23 @@ static PHP_RSHUTDOWN_FUNCTION(mysqlnd) #endif + +static const zend_module_dep mysqlnd_deps[] = { + ZEND_MOD_REQUIRED("standard") + {NULL, NULL, NULL} +}; + /* {{{ mysqlnd_module_entry */ zend_module_entry mysqlnd_module_entry = { - STANDARD_MODULE_HEADER, + STANDARD_MODULE_HEADER_EX, + NULL, + mysqlnd_deps, "mysqlnd", mysqlnd_functions, PHP_MINIT(mysqlnd), PHP_MSHUTDOWN(mysqlnd), -#if defined(PHP_DEBUG) || defined(MYSQLND_THREADED) +#if defined(PHP_DEBUG) PHP_RINIT(mysqlnd), #else NULL, diff --git a/ext/mysqlnd/php_mysqlnd.h b/ext/mysqlnd/php_mysqlnd.h index 44d0087bc..11232af0b 100644 --- a/ext/mysqlnd/php_mysqlnd.h +++ b/ext/mysqlnd/php_mysqlnd.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 6 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ | Ulf Wendel | +----------------------------------------------------------------------+ - $Id: php_mysqlnd.h 272370 2008-12-31 11:15:49Z sebastian $ + $Id: php_mysqlnd.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_MYSQLND_H diff --git a/ext/oci8/README b/ext/oci8/README index e725a30be..037d54952 100644 --- a/ext/oci8/README +++ b/ext/oci8/README @@ -1,454 +1,12 @@ -Installing OCI8 ---------------- +The OCI8 Extension +------------------ -0. Overview -1. Common requirements -2. Installing as a shared extension -3. Installing as a statically compiled extension -4. Installing from PECL to an existing PHP -5. Testing OCI8 -6. Oracle DRCP and FAN Support +The OCI8 extension allows PHP to access Oracle databases. It can be +built using Oracle 9.2, 10, or 11 client libraries. It allows Oracle's +standard cross-version connectivity, for example PHP using Oracle 10.2 +libraries can connect to Oracle Database 9.2 onwards. +This release of OCI8 can be used with PHP versions 4.3.9 to 5.x. -0. Overview ------------ - -The OCI8 extension allows you to access Oracle databases. It can be -built using Oracle 9.2, 10.2 or 11.1 client libraries, and allows -Oracle's standard cross-version connectivity. This release can be -used with PHP versions 4.3.9 to 5.x. - -The OCI8 extension is not related to, or used by, PDO_OCI, the PHP -Data Objects (PDO) extension for Oracle. - -1. Common requirements ----------------------- - -This version of PHP OCI8: - - - Will build with Oracle 9.2 (or more recent) client libraries. The - same (or more recent) version of Oracle libraries used when - building OCI8 must also be used at runtime. - - - Can be used with PHP versions 4.3.9 to 5.x. - -If you build PHP with the "ORACLE_HOME" Oracle database or full Oracle -client libraries: - - - you MUST set at least the ORACLE_HOME environment variable and - make it visible for your web server BEFORE it starts. - - - the Oracle software must be readable by the web server. With - Oracle 10.2, see the $ORACLE_HOME/install/changePerm.sh script - included in patch releases. - -If you build PHP with Oracle Instant Client libraries from -http://www.oracle.com/technology/tech/oci/instantclient/index.html - - - either the "basic" or "basic-lite" package is required. - - - the "devel" package is required. - - - you don't have to set ORACLE_HOME and many of the other - environment variables to build PHP with OCI8 support. - -For both ORACLE_HOME and Instant Client installs you may have to set: - - - LD_LIBRARY_PATH: it must include the $ORACLE_HOME/lib or Instant - Client library directory - - - NLS_LANG: if you want to change the default encoding used during - interaction with Oracle servers - -The most appropriate places to add the environment variables are: - - /etc/profile - /etc/profile.local - /etc/profile.d - - -2. Installing as a shared extension ------------------------------------ - -Configure OCI8 using one of the the following configure options: - - a) if you use an Oracle server or Oracle Client installation: - - ./configure --with-oci8=shared,$ORACLE_HOME - - b) with Oracle Instant Client: - - ./configure --with-oci8=shared,instantclient,/path/to/instant/client/lib - - If you use an RPM-based installation of Oracle Instant Client, - your configure line will look like this: - - ./configure --with-oci8=shared,instantclient,/usr/lib/oracle//client/lib - -Follow the usual building procedure, e.g. "make install". The OCI8 -shared extension oci8.so will be created. It may need to be manually -moved to the PHP extension directory, specified by the extension_dir -option in your php.ini file. - -Edit php.ini file and add the line: - - extension=oci8.so - - -3. Installing as a statically compiled extension ------------------------------------------------- - -Configure OCI8 using one of the the following configure options: - - a) with a common Oracle server or full Oracle client installation - - ./configure --with-oci8=$ORACLE_HOME - - b) with Oracle Instant Client - - ./configure --with-oci8=instantclient,/path/to/instant/client/lib - -Run "make install". - -After successful compile, you do not need to add oci8.so to php.ini. -The module will be usable without any additional actions. - - -4. Installing from PECL to an existing PHP ------------------------------------------- - -The OCI8 extension is also available as a PECL module on -http://pecl.php.net/package/oci8. - -Install using either (a) or (b) below. - - a) Do an automated download and install: - - Set PEARs proxy, if necessary: - - pear config-set http_proxy http://my-proxy.example.com:80/ - - Run - - pecl install oci8 - - When prompted, enter either the value of $ORACLE_HOME, or - "instantclient,/path/to/instant/client/lib" (without quotes). - - b) Alternatively, manually download the PECL package, e.g. oci8-1.3.5.tgz - - Extract the package: - - tar -zxf oci8-1.3.5.tgz - cd oci8-1.3.5 - - Prepare the package: - - phpize - - Configure the package, either using $ORACLE_HOME or Instant Client - - ./configure -with-oci8=shared,$ORACLE_HOME - - or - - ./configure -with-oci8=shared,instantclient,/path/to/instant/client/lib - - Install the package: - - make install - -After either install, edit your php.ini file, e.g. /etc/php.ini, and -add the line: - - extension=oci8.so - -Make sure php.ini's "extension_dir" includes the directory that -oci8.so was installed in. - - -5. Testing OCI8 ---------------- - -OCI8 tests are in ext/oci8/tests. When OCI8 tests are run this -directory will contain logs of any failures. - -5.1. Running OCI8 tests on Linux - -5.1.1. Edit ext/oci8/tests/details.inc - - Set the username, password and connection string for the database. - Most tests have been developed using the SYSTEM account: some tests - might fail unless the user has permissions to create necessary - tables, views, procedures etc. - - If the database is on the same machine as PHP, set - $oracle_on_localhost to TRUE. - - If Oracle 11g Database Resident Connection Pooling is being tested, - set $test_drcp to TRUE and ensure the connection string uses an - appropriate pooled server (see section 6.2.2). - - An alternative to editing details.inc is the set the environment - variables - - PHP_OCI8_TEST_USER - PHP_OCI8_TEST_PASS - PHP_OCI8_TEST_DB - PHP_OCI8_TEST_DB_ON_LOCALHOST - PHP_OCI8_TEST_DRCP - - for example: - - $ export PHP_OCI8_TEST_USER=system - $ export PHP_OCI8_TEST_PASS=oracle - $ export PHP_OCI8_TEST_DB=localhost/XE - $ export PHP_OCI8_TEST_DB_ON_LOCALHOST=TRUE - $ export PHP_OCI8_TEST_DRCP=FALSE - -5.1.2. Set any necessary environment variables for the Oracle - database. With Oracle 10g XE do: - - $ . /usr/lib/oracle/xe/app/oracle/product/10.2.0/server/bin/oracle_env.sh - - For other versions of the Oracle database do: - - $ . /usr/local/bin/oraenv - -5.1.3. Check your php.ini has E in the variables_order parameter, for - example: - - variables_order = "EGPCS" - -5.1.4. Run the tests: - - $ cd - $ make test TESTS=ext/oci8 - -5.2. The tests execute rapidly. On fast machines with a local - database configured for light load (e.g. Oracle 10g XE) you might - see random tests fail with ORA-12516 or ORA-12520 errors. To - prevent this, increase the database PROCESSES parameter using the - following steps. - -5.2.1. Connect as the oracle software owner: - - $ su - oracle - -5.2.2. Set the necessary environment variables as in 5.1.2. - -5.2.3. Start the SQL*Plus command line tool and increase PROCESSES - - $ sqlplus / as sysdba - SQL> alter system set processes=100 scope=spfile - -5.2.4. Restart the database: - - SQL> startup force - - -6. Oracle DRCP and FAN Support ------------------------------- - -The PHP OCI8 extension has support for the Oracle Database Resident -Connection Pool (DRCP) and Fast Application Notification (FAN). - -Questions and issues can be raised on the Oracle OTN forum (free -registration required): -http://www.oracle.com/technology/forums/php.html - - -6.1. Oracle Version Compatibility - -The OCI8 extension will compile with Oracle libraries from version -9iR2 onwards. However, full functionality (e.g. DRCP support) is only -available when Oracle 11g is used. - -For general database functionality the version of the Oracle libraries -used by PHP does not necessarily have to match the version of the -database. - - -6.2. Database Resident Connection Pooling (DRCP) - -DRCP allows more efficient use of database machine memory and provides -high scalability. - -For DRCP to be available in OCI8, Oracle client libraries used by PHP -and the version of the Oracle Database must both be 11g. - -Documentation on DRCP is found in several Oracle manuals. For example, -see "Configuring Database Resident Connection Pooling" in the Oracle -Database Administrator's Guide 11g Release 1 (11.1) -http://download.oracle.com/docs/cd/B28359_01/server.111/b28310/manproc004.htm#CHDGIDBA -for usage information. A whitepaper -http://www.oracle.com/technology/tech/oci/pdf/oracledrcp11g.pdf -contains background information on DRCP. - -After building PHP with the OCI8 extension and 11g libraries, follow -these steps: - -6.2.0 Important: if Oracle Database 11.1.0.6 with DRCP connections is - used, then the Oracle database patch for bug 6474441 must be - applied (see section 6.5). Without this patch, "ORA-01000: - maximum open cursors exceeded", "ORA-01001 invalid cursor" or - "ORA-01002 fetch out of sequence" errors may occur. - - If the Oracle 11.1.0.6 database patch cannot be applied, one of - the following three workarounds can be used to disable statement - caching instead: - - (i) Connect using Oracle dedicated or shared servers instead of DRCP. - - (ii) Set PHP's oci8.statement_cache_size to 0. - - (iii) Set an event in the database initialization parameter file: - event="56699 trace name context forever, level 128". - - -6.2.1. As a privileged database administrator, use a program like - SQL*Plus to start the connection pool in the database: - - SQL> execute dbms_connection_pool.start_pool; - - Optional settings control the size and characteristics of the - pool. - -6.2.2. For PHP applications that currently connect using a Network Alias - like: - - $c = oci_pconnect("myuser", "mypassword", "MYDB"); - - Modify your tnsnames.ora file and add the "(SERVER=POOLED)" - clause, for example: - - MYDB = (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp) (HOST=myhost.dom.com) - (PORT=1521))(CONNECT_DATA=(SERVICE_NAME=sales) - (SERVER=POOLED))) - - Alternatively, modify the Easy Connect syntax in PHP and add - ":POOLED" after the service name: - - $c = oci_pconnect("myuser", "mypassword", - "myhost.dom.com:1521/sales:POOLED"); - -6.2.3. Edit php.ini and choose a connection class name. This name - indicates a logical division of the connection pool and can be - used to isolate pooling for separate applications. Any PHP - instance with the same connection class value will share - connections in the pool. - - oci8.connection_class = "MY_APPLICATION_NAME" - -6.2.4. Run your application, connecting to the 11g database. - - -6.3. Fast Application Notification (FAN) Support - -FAN support gives fast connection failover, a high availability -feature. This allows PHP OCI8 scripts to be notified when a database -machine or database instance becomes unavailable. Without FAN, OCI8 -can hang until a TCP timeout occurs and an error is returned, which -might be several minutes. Enabling FAN in OCI8 can allow your -applications to detect errors and re-connect to an available database -instance without the web user being aware of an outage. - -FAN support is available when the Oracle client libraries that PHP -links with and the Oracle Database are either version 10gR2 or 11g. - -FAN benefits users of Oracle's clustering technology (RAC) because -connections to surviving database instances can be immediately made. -Users of Oracle's Data Guard with a broker will see the FAN events -generated when the standby database goes online. Standalone databases -will send FAN events when the database restarts. - -For active connections, when a machine or database instance becomes -unavailable, a connection failure error will be returned by the OCI8 -extension function currently being called. On a subsequent PHP script -re-connect, a connection to a surviving database instance will be -established. The OCI8 extension also transparently cleans up any idle -connections affected by a database machine or instance failure so PHP -connect calls will establish a fresh connection without the script -being aware of any service disruption. - -When oci8.events is On, it is suggested to set oci8.ping_interval to --1 to disable pinging, since enabling FAN events provide pro-active -connection management of idle connections made invalid by a service -disruption. - -To enable FAN support in PHP, after building PHP with Oracle 10gR2 or -11g libraries follow these steps: - -6.3.1. As a privileged database administrator, use a program like - SQL*Plus to enable the database service to post FAN events, for - example: - - SQL> execute dbms_service.modify_service( - SERVICE_NAME => 'sales', - AQ_HA_NOTIFICATIONS => TRUE); - -6.3.2. Edit php.ini and add - - oci8.events = On - -6.3.3. If your application does not already handle OCI8 error - conditions, modify it to detect failures and take appropriate - action. This may include re-connecting and re-executing - statements. - -6.3.4. Run your application, connecting to a 10gR2 or 11g database. - - -6.4. Recommendations and Known Limitations - -6.4.1 Changing Password for DRCP connections - -Changing a password over DRCP connections will fail with the error -"ORA-56609: Usage not supported with DRCP". This is an documented -restriction of Oracle Database 11g. - -6.4.2 Closing Connections - -With the PHP OCI8 extension, persistent connections can now be closed -by the user, allowing greater control over connection resource usage. -Persistent connections will now also be closed automatically when -there is no PHP variable referencing them, such as at the end of scope -of a PHP user function. This will rollback any uncommitted -transaction. These changes to persistent connections make them behave -similarly to non-persistent connections, simplifying the interface, -allowing for greater application consistency and predictability. Use -oci8.old_oci_close_semantics=1 to retain the historical behavior. - -6.4.3 LOGON Triggers can be used to set session properties - -The patch for Oracle Database 11.1.0.6 bug 6474441 (see section 6.5) -allows PHP applications with DRCP connection to use a database LOGON -trigger to set session properties at the time of session creation. -Examples of such settings are the NLS language and the date format. - -If the Oracle 11.1.0.6 database patch cannot be applied, one of the -following workarounds can be used: - -(i) After logon, explicitly set the session properties using PHP -application code. - -(ii) Connect using Oracle dedicated or shared servers instead of DRCP. - -With DRCP there is an connection management relationship between (i) -DRCP's automatic pool expansion and reduction, (ii) PHP's persistent -connection caching, (iii) with the way LOGON triggers fire with DRCP -authentication. Because of this interplay, LOGON triggers in PHP -(when DRCP is used) are only recommended for setting session -attributes and not for per-PHP connection events. - - -6.5. Patching Oracle Database 11g - -The patch for bug 6474441 is available from Oracle Support's Metalink -system. - -The bug is specific to Oracle 11.1.0.6 with DRCP connections. The -issues it fixes do not affect connections using Oracle's dedicated -(the default connection mode) or shared servers. They do not affect -earlier versions of Oracle. The bug is intended to be fixed in Oracle -Database 11.1.0.7 (as yet unreleased). +OCI8 installation instructions and documentation is available at +http://www.php.net/oci8 diff --git a/ext/oci8/oci8.c b/ext/oci8/oci8.c index ec0ebdf70..589b5fd67 100644 --- a/ext/oci8/oci8.c +++ b/ext/oci8/oci8.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -26,7 +26,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: oci8.c 289423 2009-10-09 14:44:43Z pajoye $ */ +/* $Id: oci8.c 294447 2010-02-03 20:08:42Z pajoye $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -91,7 +91,7 @@ zend_class_entry *oci_coll_class_entry_ptr; #define SQLT_CFILEE 115 #endif -#define PHP_OCI_ERRBUF_LEN 512 +#define PHP_OCI_ERRBUF_LEN 1024 #if ZEND_MODULE_API_NO > 20020429 #define ONUPDATELONGFUNC OnUpdateLong @@ -407,6 +407,30 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_oci_set_prefetch, 0, 0, 2) ZEND_ARG_INFO(0, number_of_rows) ZEND_END_ARG_INFO() +ZEND_BEGIN_ARG_INFO_EX(arginfo_oci_set_client_identifier, 0, 0, 2) + ZEND_ARG_INFO(0, connection_resource) + ZEND_ARG_INFO(0, client_identifier) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX(arginfo_oci_set_edition, 0, 0, 1) + ZEND_ARG_INFO(0, edition_name) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX(arginfo_oci_set_module_name, 0, 0, 2) + ZEND_ARG_INFO(0, connection_resource) + ZEND_ARG_INFO(0, module_name) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX(arginfo_oci_set_action, 0, 0, 2) + ZEND_ARG_INFO(0, connection_resource) + ZEND_ARG_INFO(0, action) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX(arginfo_oci_set_client_info, 0, 0, 2) + ZEND_ARG_INFO(0, connection_resource) + ZEND_ARG_INFO(0, client_information) +ZEND_END_ARG_INFO() + ZEND_BEGIN_ARG_INFO_EX(arginfo_oci_password_change, 0, 0, 4) ZEND_ARG_INFO(0, connection_resource_or_connection_string) ZEND_ARG_INFO(0, username) @@ -649,6 +673,11 @@ static unsigned char arginfo_oci_bind_array_by_name[] = { 3, BYREF_NONE, BYREF_N #define arginfo_oci_num_fields NULL #define arginfo_oci_parse NULL #define arginfo_oci_set_prefetch NULL +#define arginfo_oci_set_client_identifier NULL +#define arginfo_oci_set_edition NULL +#define arginfo_oci_set_module_name NULL +#define arginfo_oci_set_action NULL +#define arginfo_oci_set_client_info NULL #define arginfo_oci_password_change NULL #define arginfo_oci_new_cursor NULL #define arginfo_oci_result NULL @@ -736,6 +765,11 @@ PHP_FUNCTION(oci_server_version); PHP_FUNCTION(oci_statement_type); PHP_FUNCTION(oci_num_rows); PHP_FUNCTION(oci_set_prefetch); +PHP_FUNCTION(oci_set_client_identifier); +PHP_FUNCTION(oci_set_edition); +PHP_FUNCTION(oci_set_module_name); +PHP_FUNCTION(oci_set_action); +PHP_FUNCTION(oci_set_client_info); PHP_FUNCTION(oci_password_change); PHP_FUNCTION(oci_lob_save); PHP_FUNCTION(oci_lob_import); @@ -834,6 +868,11 @@ zend_function_entry php_oci_functions[] = { PHP_FE(oci_rollback, arginfo_oci_rollback) PHP_FE(oci_new_descriptor, arginfo_oci_new_descriptor) PHP_FE(oci_set_prefetch, arginfo_oci_set_prefetch) + PHP_FE(oci_set_client_identifier, arginfo_oci_set_client_identifier) + PHP_FE(oci_set_edition, arginfo_oci_set_edition) + PHP_FE(oci_set_module_name, arginfo_oci_set_module_name) + PHP_FE(oci_set_action, arginfo_oci_set_action) + PHP_FE(oci_set_client_info, arginfo_oci_set_client_info) PHP_FE(oci_password_change, arginfo_oci_password_change) PHP_FE(oci_free_collection, arginfo_oci_free_collection) PHP_FE(oci_collection_append, arginfo_oci_collection_append) @@ -1128,6 +1167,7 @@ PHP_MINIT_FUNCTION(oci) REGISTER_LONG_CONSTANT("OCI_CRED_EXT",PHP_OCI_CRED_EXT, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("OCI_DESCRIBE_ONLY",OCI_DESCRIBE_ONLY, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("OCI_COMMIT_ON_SUCCESS",OCI_COMMIT_ON_SUCCESS, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("OCI_NO_AUTO_COMMIT",OCI_DEFAULT, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("OCI_EXACT_FETCH",OCI_EXACT_FETCH, CONST_CS | CONST_PERSISTENT); /* for $LOB->seek() */ @@ -1210,6 +1250,7 @@ PHP_RINIT_FUNCTION(oci) OCI_G(debug_mode) = 0; /* start "fresh" */ OCI_G(num_links) = OCI_G(num_persistent); OCI_G(errcode) = 0; + OCI_G(edition) = NULL; return SUCCESS; } @@ -1238,6 +1279,10 @@ PHP_RSHUTDOWN_FUNCTION(oci) */ zend_hash_apply(&EG(persistent_list), (apply_func_t) php_oci_persistent_helper TSRMLS_CC); + if (OCI_G(edition)) { + efree(OCI_G(edition)); + } + return SUCCESS; } @@ -1248,7 +1293,7 @@ PHP_MINFO_FUNCTION(oci) php_info_print_table_start(); php_info_print_table_row(2, "OCI8 Support", "enabled"); php_info_print_table_row(2, "Version", PHP_OCI8_VERSION); - php_info_print_table_row(2, "Revision", "$Revision: 289423 $"); + php_info_print_table_row(2, "Revision", "$Revision: 294447 $"); snprintf(buf, sizeof(buf), "%ld", OCI_G(num_persistent)); php_info_print_table_row(2, "Active Persistent Connections", buf); @@ -1485,23 +1530,21 @@ void php_oci_descriptor_flush_hash_dtor(void *data) } /* }}} */ -/* {{{ php_oci_descriptor_delete_from_hash() +/* }}} */ + +/* {{{ php_oci_connection_descriptors_free() * - * Delete descriptor from the hash + * Free descriptors for a connection */ -int php_oci_descriptor_delete_from_hash(void *data, void *id TSRMLS_DC) +void php_oci_connection_descriptors_free(php_oci_connection *connection TSRMLS_DC) { - php_oci_descriptor *descriptor = *(php_oci_descriptor **)data; - int *desc_id = (int *) id; - - if (descriptor && desc_id && descriptor->id == *desc_id) { - return 1; - } - return 0; + zend_hash_destroy(connection->descriptors); + efree(connection->descriptors); + connection->descriptors = NULL; + connection->descriptor_count = 0; } /* }}} */ -/* }}} */ /* {{{ php_oci_error() * @@ -1571,8 +1614,6 @@ sb4 php_oci_fetch_errmsg(OCIError *error_handle, text **error_buf TSRMLS_DC) sb4 error_code = 0; text err_buf[PHP_OCI_ERRBUF_LEN]; - err_buf[0] = '\0'; - memset(err_buf, 0, sizeof(err_buf)); PHP_OCI_CALL(OCIErrorGet, (error_handle, (ub4)1, NULL, &error_code, err_buf, (ub4)PHP_OCI_ERRBUF_LEN, (ub4)OCI_HTYPE_ERROR)); @@ -1735,6 +1776,12 @@ php_oci_connection *php_oci_do_connect_ex(char *username, int username_len, char } smart_str_appendl_ex(&hashed_details, "**", sizeof("**") - 1, 0); + /* Add edition attribute to the hash */ + if (OCI_G(edition)){ + smart_str_appendl_ex(&hashed_details, OCI_G(edition), strlen(OCI_G(edition)), 0); + } + smart_str_appendl_ex(&hashed_details, "**", sizeof("**") - 1, 0); + if (password_len) { ulong password_hash; password_hash = zend_inline_hash_func(password, password_len); @@ -2220,9 +2267,7 @@ int php_oci_connection_release(php_oci_connection *connection TSRMLS_DC) } if (connection->descriptors) { - zend_hash_destroy(connection->descriptors); - efree(connection->descriptors); - connection->descriptors = NULL; + php_oci_connection_descriptors_free(connection TSRMLS_CC); } if (connection->svc) { @@ -2555,6 +2600,7 @@ static php_oci_spool *php_oci_create_spool(char *username, int username_len, cha php_oci_spool *session_pool = NULL; zend_bool iserror = 0; ub4 poolmode = OCI_DEFAULT; /* Mode to be passed to OCISessionPoolCreate */ + OCIAuthInfo *spoolAuth = NULL; /*Allocate sessionpool out of persistent memory */ session_pool = (php_oci_spool *) calloc(1, sizeof(php_oci_spool)); @@ -2598,6 +2644,46 @@ static php_oci_spool *php_oci_create_spool(char *username, int username_len, cha poolmode = OCI_SPC_HOMOGENEOUS; #endif +#if ((OCI_MAJOR_VERSION > 11) || ((OCI_MAJOR_VERSION == 11) && (OCI_MINOR_VERSION >= 2))) + /* Allocate auth handle for session pool {{{ */ + PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIHandleAlloc, (session_pool->env, (dvoid **)&(spoolAuth), OCI_HTYPE_AUTHINFO, 0, NULL)); + + if (OCI_G(errcode) != OCI_SUCCESS) { + php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC); + iserror = 1; + goto exit_create_spool; + } /* }}} */ + + /* Set the edition attribute on the auth handle {{{ */ + if (OCI_G(edition)) { + PHP_OCI_CALL_RETURN(OCI_G(errcode),OCIAttrSet, ((dvoid *) spoolAuth, (ub4) OCI_HTYPE_AUTHINFO, (dvoid *) OCI_G(edition), (ub4)(strlen(OCI_G(edition))), (ub4)OCI_ATTR_EDITION, OCI_G(err))); + + if (OCI_G(errcode) != OCI_SUCCESS) { + php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC); + iserror = 1; + goto exit_create_spool; + } + } /* }}} */ + + /* Set the driver name attribute on the auth handle {{{ */ + PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIAttrSet, ((dvoid *) spoolAuth, (ub4) OCI_HTYPE_AUTHINFO, (dvoid *) PHP_OCI8_DRIVER_NAME, (ub4) sizeof(PHP_OCI8_DRIVER_NAME)-1, (ub4) OCI_ATTR_DRIVER_NAME, OCI_G(err))); + + if (OCI_G(errcode) != OCI_SUCCESS) { + php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC); + iserror = 1; + goto exit_create_spool; + } /* }}} */ + + /* Set the auth handle on the session pool {{{ */ + PHP_OCI_CALL_RETURN(OCI_G(errcode),OCIAttrSet, ((dvoid *) (session_pool->poolh),(ub4) OCI_HTYPE_SPOOL, (dvoid *) spoolAuth, (ub4)0, (ub4)OCI_ATTR_SPOOL_AUTH, OCI_G(err))); + + if (OCI_G(errcode) != OCI_SUCCESS) { + php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC); + iserror = 1; + goto exit_create_spool; + } /* }}} */ +#endif + /* Create the homogeneous session pool - We have different session pools for every different * username, password, charset and dbname. */ @@ -2628,6 +2714,10 @@ exit_create_spool: session_pool = NULL; } + if (spoolAuth) { + PHP_OCI_CALL(OCIHandleFree, ((dvoid *) spoolAuth, (ub4) OCI_HTYPE_AUTHINFO)); + } + if (OCI_G(debug_mode)) { php_printf ("OCI8 DEBUG L1: create_spool: (%p) at (%s:%d) \n", session_pool, __FILE__, __LINE__); } @@ -2652,6 +2742,11 @@ static php_oci_spool *php_oci_get_spool(char *username, int username_len, char * smart_str_appendl_ex(&spool_hashed_details, "oci8spool***", sizeof("oci8spool***") - 1, 0); smart_str_appendl_ex(&spool_hashed_details, username, username_len, 0); smart_str_appendl_ex(&spool_hashed_details, "**", sizeof("**") - 1, 0); + /* Add edition attribute to the hash */ + if (OCI_G(edition)){ + smart_str_appendl_ex(&spool_hashed_details, OCI_G(edition), strlen(OCI_G(edition)), 0); + } + smart_str_appendl_ex(&spool_hashed_details, "**", sizeof("**") - 1, 0); if (password_len) { ulong password_hash; password_hash = zend_inline_hash_func(password, password_len); @@ -2666,7 +2761,7 @@ static php_oci_spool *php_oci_get_spool(char *username, int username_len, char * smart_str_append_unsigned_ex(&spool_hashed_details, charsetid, 0); - /* Session Pool Hash Key : oci8spool***username**hashedpassword**dbname**charset */ + /* Session Pool Hash Key : oci8spool***username**edition**hashedpassword**dbname**charset */ smart_str_0(&spool_hashed_details); php_strtolower(spool_hashed_details.c, spool_hashed_details.len); @@ -2803,6 +2898,28 @@ static int php_oci_old_create_session(php_oci_connection *connection, char *dbna } }/* }}} */ + /* Set the edition attribute on the session handle {{{ */ +#if ((OCI_MAJOR_VERSION > 11) || ((OCI_MAJOR_VERSION == 11) && (OCI_MINOR_VERSION >= 2))) + if (OCI_G(edition)) { + PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIAttrSet, ((dvoid *) connection->session, (ub4) OCI_HTYPE_SESSION, (dvoid *) OCI_G(edition), (ub4) (strlen(OCI_G(edition))), (ub4) OCI_ATTR_EDITION, OCI_G(err))); + + if (OCI_G(errcode) != OCI_SUCCESS) { + php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC); + return 1; + } + } +#endif /* }}} */ + + /* Set the driver name attribute on the session handle {{{ */ +#if (OCI_MAJOR_VERSION >= 11) + PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIAttrSet, ((dvoid *) connection->session, (ub4) OCI_HTYPE_SESSION, (dvoid *) PHP_OCI8_DRIVER_NAME, (ub4) sizeof(PHP_OCI8_DRIVER_NAME)-1, (ub4) OCI_ATTR_DRIVER_NAME, OCI_G(err))); + + if (OCI_G(errcode) != OCI_SUCCESS) { + php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC); + return 1; + } +#endif /* }}} */ + /* Set the server handle in the service handle {{{ */ PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIAttrSet, (connection->svc, OCI_HTYPE_SVCCTX, connection->server, 0, OCI_ATTR_SERVER, OCI_G(err))); diff --git a/ext/oci8/oci8_collection.c b/ext/oci8/oci8_collection.c index 7e514df73..a06b61bad 100644 --- a/ext/oci8/oci8_collection.c +++ b/ext/oci8/oci8_collection.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -25,7 +25,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: oci8_collection.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: oci8_collection.c 293036 2010-01-03 09:23:27Z sebastian $ */ diff --git a/ext/oci8/oci8_interface.c b/ext/oci8/oci8_interface.c index b5ed50187..1c20b84a8 100644 --- a/ext/oci8/oci8_interface.c +++ b/ext/oci8/oci8_interface.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -25,7 +25,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: oci8_interface.c 276933 2009-03-09 20:20:07Z sixd $ */ +/* $Id: oci8_interface.c 294441 2010-02-03 19:37:35Z pajoye $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -1066,9 +1066,7 @@ PHP_FUNCTION(oci_rollback) PHP_OCI_ZVAL_TO_CONNECTION(z_connection, connection); if (connection->descriptors) { - zend_hash_destroy(connection->descriptors); - efree(connection->descriptors); - connection->descriptors = NULL; + php_oci_connection_descriptors_free(connection TSRMLS_CC); } if (php_oci_connection_rollback(connection TSRMLS_CC)) { @@ -1092,9 +1090,7 @@ PHP_FUNCTION(oci_commit) PHP_OCI_ZVAL_TO_CONNECTION(z_connection, connection); if (connection->descriptors) { - zend_hash_destroy(connection->descriptors); - efree(connection->descriptors); - connection->descriptors = NULL; + php_oci_connection_descriptors_free(connection TSRMLS_CC); } if (php_oci_connection_commit(connection TSRMLS_CC)) { @@ -1584,7 +1580,7 @@ PHP_FUNCTION(oci_pconnect) Return the last error of stmt|connection|global. If no error happened returns false. */ PHP_FUNCTION(oci_error) { - zval *arg; + zval *arg = NULL; php_oci_statement *statement; php_oci_connection *connection; text *errbuf; @@ -1716,12 +1712,162 @@ PHP_FUNCTION(oci_set_prefetch) } /* }}} */ +/* {{{ proto bool oci_set_client_identifier(resource connection, string value) + Sets the client identifier attribute on the connection */ +PHP_FUNCTION(oci_set_client_identifier) +{ + zval *z_connection; + php_oci_connection *connection; + char *client_id; + long client_id_len; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &z_connection, &client_id, &client_id_len) == FAILURE) { + return; + } + + PHP_OCI_ZVAL_TO_CONNECTION(z_connection, connection); + + PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIAttrSet, ((dvoid *) connection->session, (ub4) OCI_HTYPE_SESSION, (dvoid *) client_id, (ub4) client_id_len, (ub4) OCI_ATTR_CLIENT_IDENTIFIER, OCI_G(err))); + + if (OCI_G(errcode) != OCI_SUCCESS) { + php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC); + RETURN_FALSE; + } + + RETURN_TRUE; +} +/* }}} */ + +/* {{{ proto bool oci_set_edition(string value) + Sets the edition attribute for all subsequent connections created */ +PHP_FUNCTION(oci_set_edition) +{ +#if ((OCI_MAJOR_VERSION > 11) || ((OCI_MAJOR_VERSION == 11) && (OCI_MINOR_VERSION >= 2))) + char *edition; + long edition_len; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &edition, &edition_len) == FAILURE) { + return; + } + + if (OCI_G(edition)) { + efree(OCI_G(edition)); + OCI_G(edition) = NULL; + } + + if (edition) { + OCI_G(edition) = (char *)safe_emalloc(edition_len+1, sizeof(text), 0); + memcpy(OCI_G(edition), edition, edition_len); + OCI_G(edition)[edition_len] = '\0'; + } + + RETURN_TRUE; +#else + php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Unsupported attribute type"); + RETURN_FALSE; +#endif +} +/* }}} */ + +/* {{{ proto bool oci_set_module_name(resource connection, string value) + Sets the module attribute on the connection */ +PHP_FUNCTION(oci_set_module_name) +{ +#if (OCI_MAJOR_VERSION >= 10) + zval *z_connection; + php_oci_connection *connection; + char *module; + long module_len; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &z_connection, &module, &module_len) == FAILURE) { + return; + } + + PHP_OCI_ZVAL_TO_CONNECTION(z_connection, connection); + + PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIAttrSet, ((dvoid *) connection->session, (ub4) OCI_HTYPE_SESSION, (dvoid *) module, (ub4) module_len, (ub4) OCI_ATTR_MODULE, OCI_G(err))); + + if (OCI_G(errcode) != OCI_SUCCESS) { + php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC); + RETURN_FALSE; + } + + RETURN_TRUE; +#else + php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Unsupported attribute type"); + RETURN_FALSE; +#endif +} +/* }}} */ + +/* {{{ proto bool oci_set_action(resource connection, string value) + Sets the action attribute on the connection */ +PHP_FUNCTION(oci_set_action) +{ +#if (OCI_MAJOR_VERSION >= 10) + zval *z_connection; + php_oci_connection *connection; + char *action; + long action_len; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &z_connection, &action, &action_len) == FAILURE) { + return; + } + + PHP_OCI_ZVAL_TO_CONNECTION(z_connection, connection); + + PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIAttrSet, ((dvoid *) connection->session, (ub4) OCI_HTYPE_SESSION, (dvoid *) action, (ub4) action_len, (ub4) OCI_ATTR_ACTION, OCI_G(err))); + + if (OCI_G(errcode) != OCI_SUCCESS) { + php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC); + RETURN_FALSE; + } + + RETURN_TRUE; +#else + php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Unsupported attribute type"); + RETURN_FALSE; +#endif +} +/* }}} */ + +/* {{{ proto bool oci_set_client_info(resource connection, string value) + Sets the client info attribute on the connection */ +PHP_FUNCTION(oci_set_client_info) +{ +#if (OCI_MAJOR_VERSION >= 10) + zval *z_connection; + php_oci_connection *connection; + char *client_info; + long client_info_len; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &z_connection, &client_info, &client_info_len) == FAILURE) { + return; + } + + PHP_OCI_ZVAL_TO_CONNECTION(z_connection, connection); + + PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIAttrSet, ((dvoid *) connection->session, (ub4) OCI_HTYPE_SESSION, (dvoid *) client_info, (ub4) client_info_len, (ub4) OCI_ATTR_CLIENT_INFO, OCI_G(err))); + + if (OCI_G(errcode) != OCI_SUCCESS) { + php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC); + RETURN_FALSE; + } + + RETURN_TRUE; +#else + php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Unsupported attribute type"); + RETURN_FALSE; +#endif +} +/* }}} */ + /* {{{ proto bool oci_password_change(resource connection, string username, string old_password, string new_password) Changes the password of an account */ PHP_FUNCTION(oci_password_change) { zval *z_connection; - text *user, *pass_old, *pass_new, *dbname; + char *user, *pass_old, *pass_new, *dbname; int user_len, pass_old_len, pass_new_len, dbname_len; php_oci_connection *connection; @@ -1747,7 +1893,7 @@ PHP_FUNCTION(oci_password_change) RETURN_FALSE; } - if (php_oci_password_change(connection, (char *)user, user_len, (char *)pass_old, pass_old_len, (char *)pass_new, pass_new_len TSRMLS_CC)) { + if (php_oci_password_change(connection, user, user_len, pass_old, pass_old_len, pass_new, pass_new_len TSRMLS_CC)) { RETURN_FALSE; } RETURN_TRUE; @@ -1766,7 +1912,7 @@ PHP_FUNCTION(oci_password_change) RETURN_FALSE; } - connection = php_oci_do_connect_ex((char *)user, user_len, (char *)pass_old, pass_old_len, (char *)pass_new, pass_new_len, (char *)dbname, dbname_len, NULL, OCI_DEFAULT, 0, 0 TSRMLS_CC); + connection = php_oci_do_connect_ex(user, user_len, pass_old, pass_old_len, pass_new, pass_new_len, dbname, dbname_len, NULL, OCI_DEFAULT, 0, 0 TSRMLS_CC); if (!connection) { RETURN_FALSE; } diff --git a/ext/oci8/oci8_lob.c b/ext/oci8/oci8_lob.c index 521174029..6388e85b7 100644 --- a/ext/oci8/oci8_lob.c +++ b/ext/oci8/oci8_lob.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -25,7 +25,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: oci8_lob.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: oci8_lob.c 294441 2010-02-03 19:37:35Z pajoye $ */ @@ -95,9 +95,17 @@ php_oci_descriptor *php_oci_lob_create (php_oci_connection *connection, long typ if (!connection->descriptors) { ALLOC_HASHTABLE(connection->descriptors); zend_hash_init(connection->descriptors, 0, NULL, php_oci_descriptor_flush_hash_dtor, 0); + connection->descriptor_count = 0; + } + + descriptor->index = (connection->descriptor_count)++; + if (connection->descriptor_count == LONG_MAX) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Internal descriptor counter has reached limit"); + php_oci_connection_descriptors_free(connection TSRMLS_CC); + return NULL; } - zend_hash_next_index_insert(connection->descriptors,&descriptor,sizeof(php_oci_descriptor *),NULL); + zend_hash_index_update(connection->descriptors,descriptor->index,&descriptor,sizeof(php_oci_descriptor *),NULL); } return descriptor; @@ -669,7 +677,25 @@ void php_oci_lob_free (php_oci_descriptor *descriptor TSRMLS_DC) if (descriptor->connection->descriptors) { /* delete descriptor from the hash */ - zend_hash_apply_with_argument(descriptor->connection->descriptors, php_oci_descriptor_delete_from_hash, (void *)&descriptor->id TSRMLS_CC); + zend_hash_index_del(descriptor->connection->descriptors, descriptor->index); + if (zend_hash_num_elements(descriptor->connection->descriptors) == 0) { + descriptor->connection->descriptor_count = 0; + } else { + if (descriptor->index + 1 == descriptor->connection->descriptor_count) { + /* If the descriptor being freed is the end-most one + * allocated, then the descriptor_count is reduced so + * a future descriptor can reuse the hash table index. + * This can prevent the hash index range increasing in + * the common case that each descriptor is + * allocated/used/freed before another descriptor is + * needed. However it is possible that a script frees + * descriptors in arbitrary order which would prevent + * descriptor_count ever being reduced to zero until + * zend_hash_num_elements() returns 0. + */ + descriptor->connection->descriptor_count--; + } + } } /* flushing Lobs & Files with buffering enabled */ diff --git a/ext/oci8/oci8_statement.c b/ext/oci8/oci8_statement.c index 00c6079d9..bdba6dcce 100644 --- a/ext/oci8/oci8_statement.c +++ b/ext/oci8/oci8_statement.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -25,7 +25,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: oci8_statement.c 277003 2009-03-11 16:47:14Z sixd $ */ +/* $Id: oci8_statement.c 294441 2010-02-03 19:37:35Z pajoye $ */ #ifdef HAVE_CONFIG_H @@ -93,10 +93,11 @@ php_oci_statement *php_oci_statement_create (php_oci_connection *connection, cha statement->connection = connection; statement->has_data = 0; + statement->has_descr = 0; statement->parent_stmtid = 0; zend_list_addref(statement->connection->rsrc_id); - if (OCI_G(default_prefetch) > 0) { + if (OCI_G(default_prefetch) >= 0) { php_oci_statement_set_prefetch(statement, OCI_G(default_prefetch) TSRMLS_CC); } @@ -114,8 +115,8 @@ int php_oci_statement_set_prefetch(php_oci_statement *statement, long size TSRML { ub4 prefetch = size; - if (size < 1) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Number of rows has to be greater than or equal to 1"); + if (size < 0) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Number of rows to be prefetched has to be greater than or equal to 0"); return 1; } @@ -131,6 +132,40 @@ int php_oci_statement_set_prefetch(php_oci_statement *statement, long size TSRML } /* }}} */ +/* {{{ php_oci_cleanup_pre_fetch() + Helper function to cleanup ref-cursors and descriptors from the previous row */ +int php_oci_cleanup_pre_fetch(void *data TSRMLS_DC) +{ + php_oci_out_column *outcol = data; + + if (!outcol->is_descr && !outcol->is_cursor) + return ZEND_HASH_APPLY_KEEP; + + switch(outcol->data_type) { + case SQLT_CLOB: + case SQLT_BLOB: + case SQLT_RDD: + case SQLT_BFILE: + if (outcol->descid) { + zend_list_delete(outcol->descid); + outcol->descid = 0; + } + break; + case SQLT_RSET: + if (outcol->stmtid) { + zend_list_delete(outcol->stmtid); + outcol->stmtid = 0; + outcol->nested_statement = NULL; + } + break; + default: + break; + } + return ZEND_HASH_APPLY_KEEP; + +} /* }}} */ + + /* {{{ php_oci_statement_fetch() Fetch a row from the statement */ int php_oci_statement_fetch(php_oci_statement *statement, ub4 nrows TSRMLS_DC) @@ -143,6 +178,10 @@ int php_oci_statement_fetch(php_oci_statement *statement, ub4 nrows TSRMLS_DC) php_oci_out_column *column; + if (statement->has_descr && statement->columns) { + zend_hash_apply(statement->columns, (apply_func_t) php_oci_cleanup_pre_fetch TSRMLS_CC); + } + PHP_OCI_CALL_RETURN(statement->errcode, OCIStmtFetch, (statement->stmt, statement->err, nrows, OCI_FETCH_NEXT, OCI_DEFAULT)); if ( statement->errcode == OCI_NO_DATA || nrows == 0 ) { @@ -413,7 +452,11 @@ int php_oci_statement_execute(php_oci_statement *statement, ub4 mode TSRMLS_DC) we don't want to execute!!! */ if (statement->binds) { - zend_hash_apply(statement->binds, (apply_func_t) php_oci_bind_pre_exec TSRMLS_CC); + int result = 0; + zend_hash_apply_with_argument(statement->binds, (apply_func_arg_t) php_oci_bind_pre_exec, (void *)&result TSRMLS_CC); + if (result) { + return 1; + } } /* execute statement */ @@ -566,6 +609,7 @@ int php_oci_statement_execute(php_oci_statement *statement, ub4 mode TSRMLS_DC) define_type = SQLT_RSET; outcol->is_cursor = 1; + outcol->statement->has_descr = 1; outcol->storage_size4 = -1; outcol->retlen = -1; dynamic = OCI_DYNAMIC_FETCH; @@ -579,6 +623,7 @@ int php_oci_statement_execute(php_oci_statement *statement, ub4 mode TSRMLS_DC) define_type = outcol->data_type; outcol->is_descr = 1; + outcol->statement->has_descr = 1; outcol->storage_size4 = -1; dynamic = OCI_DYNAMIC_FETCH; break; @@ -763,10 +808,51 @@ void php_oci_statement_free(php_oci_statement *statement TSRMLS_DC) /* {{{ php_oci_bind_pre_exec() Helper function */ -int php_oci_bind_pre_exec(void *data TSRMLS_DC) +int php_oci_bind_pre_exec(void *data, void *result TSRMLS_DC) { php_oci_bind *bind = (php_oci_bind *) data; + *(int *)result = 0; + switch (bind->type) { + case SQLT_NTY: + case SQLT_BFILEE: + case SQLT_CFILEE: + case SQLT_CLOB: + case SQLT_BLOB: + case SQLT_RDD: + if (Z_TYPE_P(bind->zval) != IS_OBJECT) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid variable used for bind"); + *(int *)result = 1; + } + break; + + case SQLT_INT: + case SQLT_NUM: + if (Z_TYPE_P(bind->zval) == IS_RESOURCE || Z_TYPE_P(bind->zval) == IS_OBJECT) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid variable used for bind"); + *(int *)result = 1; + } + break; + + case SQLT_LBI: + case SQLT_BIN: + case SQLT_LNG: + case SQLT_AFC: + case SQLT_CHR: + if (Z_TYPE_P(bind->zval) == IS_RESOURCE || Z_TYPE_P(bind->zval) == IS_OBJECT) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid variable used for bind"); + *(int *)result = 1; + } + break; + + case SQLT_RSET: + if (Z_TYPE_P(bind->zval) != IS_RESOURCE) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid variable used for bind"); + *(int *)result = 1; + } + break; + } + /* reset all bind stuff to a normal state..-. */ bind->indicator = 0; @@ -942,6 +1028,10 @@ int php_oci_bind_by_name(php_oci_statement *statement, char *name, int name_len, case SQLT_INT: case SQLT_NUM: + if (Z_TYPE_P(var) == IS_RESOURCE || Z_TYPE_P(var) == IS_OBJECT) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid variable used for bind"); + return 1; + } convert_to_long(var); bind_data = (ub4 *)&Z_LVAL_P(var); value_sz = sizeof(ub4); @@ -953,6 +1043,10 @@ int php_oci_bind_by_name(php_oci_statement *statement, char *name, int name_len, case SQLT_LNG: case SQLT_AFC: case SQLT_CHR: /* SQLT_CHR is the default value when type was not specified */ + if (Z_TYPE_P(var) == IS_RESOURCE || Z_TYPE_P(var) == IS_OBJECT) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid variable used for bind"); + return 1; + } if (Z_TYPE_P(var) != IS_NULL) { convert_to_string(var); } @@ -964,6 +1058,10 @@ int php_oci_bind_by_name(php_oci_statement *statement, char *name, int name_len, break; case SQLT_RSET: + if (Z_TYPE_P(var) != IS_RESOURCE) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid variable used for bind"); + return 1; + } PHP_OCI_ZVAL_TO_STATEMENT_EX(var, bind_statement); value_sz = sizeof(void*); @@ -1003,6 +1101,7 @@ int php_oci_bind_by_name(php_oci_statement *statement, char *name, int name_len, bindp->statement = oci_stmt; bindp->parent_statement = statement; bindp->zval = var; + bindp->type = type; zval_add_ref(&var); PHP_OCI_CALL_RETURN(statement->errcode, diff --git a/ext/oci8/package.xml b/ext/oci8/package.xml index 329d14329..92faa15a9 100644 --- a/ext/oci8/package.xml +++ b/ext/oci8/package.xml @@ -6,7 +6,7 @@ http://pear.php.net/dtd/package-2.0.xsd"> oci8 pecl.php.net Extension for Oracle Database - This extension allows you to access Oracle databases using the Oracle Call Interface (OCI8). It can be built with PHP 4.3.9 to 5.x. It can be linked with Oracle 9.2, 10.2 or 11.1 client libraries. + This extension allows you to access Oracle databases using the Oracle Call Interface (OCI8). It can be built with PHP 4.3.9 to 5.x. It can be linked with Oracle 9.2, 10.2, 11.1, or 11.2 client libraries. Christopher Jones @@ -33,25 +33,21 @@ http://pear.php.net/dtd/package-2.0.xsd"> no - 2009-03-16 - + 2010-??-?? + - 1.3.5 - 1.3.4 + 1.4.1 + 1.4.1 stable stable PHP - Fixed Bug #47243 (Crash at end of request shutdown on Windows) -Fixed Bug #46994 (CLOB size does not update when using CLOB IN OUT param in stored procedure) -Fixed Bug #46623 (phpinfo doesn't show compile time ORACLE_HOME with phpize) -Fixed bug #45458 (Numeric keys for associative arrays are not handled properly) Note: not fixed when building with PHP 4 due to lack of PHP internal helper. -Fixed PECL Bug #16035 (oci_connect without ORACLE_HOME defined causes segfault) -Fixed PECL Bug #15988 (sqlnet.ora isn't read with older Oracle libraries) -Fixed PECL Bug #14268 (Allow "pecl install oci8" command to "autodetect" an Instant Client RPM install) + +Fixed bug #49560 (Using LOBs causes slow PHP shutdown) +Fixed bug #47281 ($php_errormsg is limited in size of characters) @@ -86,6 +82,7 @@ Fixed PECL Bug #14268 (Allow "pecl install oci8" command to "autodetect" an Inst + @@ -98,6 +95,7 @@ Fixed PECL Bug #14268 (Allow "pecl install oci8" command to "autodetect" an Inst + @@ -120,6 +118,7 @@ Fixed PECL Bug #14268 (Allow "pecl install oci8" command to "autodetect" an Inst + @@ -156,6 +155,12 @@ Fixed PECL Bug #14268 (Allow "pecl install oci8" command to "autodetect" an Inst + + + + + + @@ -207,8 +212,11 @@ Fixed PECL Bug #14268 (Allow "pecl install oci8" command to "autodetect" an Inst + + + @@ -221,12 +229,15 @@ Fixed PECL Bug #14268 (Allow "pecl install oci8" command to "autodetect" an Inst + + + @@ -278,6 +289,7 @@ Fixed PECL Bug #14268 (Allow "pecl install oci8" command to "autodetect" an Inst + @@ -297,12 +309,16 @@ Fixed PECL Bug #14268 (Allow "pecl install oci8" command to "autodetect" an Inst + + + + @@ -317,6 +333,7 @@ Fixed PECL Bug #14268 (Allow "pecl install oci8" command to "autodetect" an Inst + @@ -350,6 +367,77 @@ Fixed PECL Bug #14268 (Allow "pecl install oci8" command to "autodetect" an Inst + + + 1.4.0 + 1.4.0 + + + alpha + alpha + + PHP + + 1. Introduce connection attribute functions: + + oci_set_module_name + oci_set_action + oci_set_client_info + oci_set_client_identifier + + These set values that are visible/used by the database. They + are useful for tracing, authentication and auditing. + + 2. Introduce connection attribute function: + + oci_set_edition + + Oracle 11g R2 "editions" allow multiple versions of DB objects + to exist at one time. By setting different editions, two + different versions of an application can run concurrently, + making upgrading easier and faster. + + 3. Set the DRIVER_NAME attribute of Oracle Database 11gR2 + connections to aid application tracing. The value used is to + "PHP OCI8" followed by the OCI8 version number. Note the + version number may get truncated in DB views such as + v$session_connect_info. + + 4. Allow the oci_set_prefetch value to be 0. This is important in + some cases using REF CURSORS in Oracle 11gR2. + + 5. Introduce OCI_NO_AUTO_COMMIT as an alias for the OCI_DEFAULT + constant (which is not the default value) used by oci_execute(). + + 6. Generate an error if an invalid resource type is used in + oci_bind_by_name + + 7. Bug fixes: + PECL bug #16842 (oci_error returns false when NO_DATA_FOUND is raised) + + + + + + 1.3.5 + 1.3.4 + + + stable + stable + + PHP + +Fixed bug #47243 (Crash at end of request shutdown on Windows) +Fixed bug #46994 (CLOB size does not update when using CLOB IN OUT param in stored procedure) +Fixed bug #46623 (phpinfo doesn't show compile time ORACLE_HOME with phpize) +Fixed bug #45458 (Numeric keys for associative arrays are not handled properly) Note: not fixed when building with PHP 4 due to lack of PHP internal helper. +Fixed PECL bug #16035 (oci_connect without ORACLE_HOME defined causes segfault) +Fixed PECL bug #15988 (sqlnet.ora isn't read with older Oracle libraries) +Fixed PECL bug #14268 (Allow "pecl install oci8" command to "autodetect" an Instant Client RPM install) + + + 1.3.4 diff --git a/ext/oci8/php_oci8.h b/ext/oci8/php_oci8.h index bb4cfea1c..dfc667260 100644 --- a/ext/oci8/php_oci8.h +++ b/ext/oci8/php_oci8.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -25,7 +25,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_oci8.h 277243 2009-03-16 05:44:49Z sixd $ */ +/* $Id: php_oci8.h 294445 2010-02-03 20:00:49Z pajoye $ */ #if HAVE_OCI8 # ifndef PHP_OCI8_H @@ -46,7 +46,7 @@ */ #undef PHP_OCI8_VERSION #endif -#define PHP_OCI8_VERSION "1.3.5" +#define PHP_OCI8_VERSION "1.4.1" extern zend_module_entry oci8_module_entry; #define phpext_oci8_ptr &oci8_module_entry diff --git a/ext/oci8/php_oci8_int.h b/ext/oci8/php_oci8_int.h index 6e8d565b9..eb594392c 100644 --- a/ext/oci8/php_oci8_int.h +++ b/ext/oci8/php_oci8_int.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -25,7 +25,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_oci8_int.h 276935 2009-03-09 20:58:51Z sixd $ */ +/* $Id: php_oci8_int.h 294441 2010-02-03 19:37:35Z pajoye $ */ #if HAVE_OCI8 # ifndef PHP_OCI8_INT_H @@ -101,6 +101,12 @@ extern zend_class_entry *oci_coll_class_entry_ptr; #error Invalid value for PHP_OCI_CRED_EXT #endif +/* + * Name passed to Oracle for tracing. Note some DB views only show + * the first nine characters of the driver name. + */ +#define PHP_OCI8_DRIVER_NAME "PHP OCI8 " PHP_OCI8_VERSION + /* }}} */ typedef struct { /* php_oci_spool {{{ */ @@ -124,6 +130,7 @@ typedef struct { /* php_oci_connection {{{ */ sword errcode; /* last errcode */ HashTable *descriptors; /* descriptors hash, used to flush all the LOBs using this connection on commit */ + ulong descriptor_count; /* used to index the descriptors hash table. Not an accurate count */ unsigned is_open:1; /* hels to determine if the connection is dead or not */ unsigned is_attached:1; /* hels to determine if we should detach from the server when closing/freeing the connection */ unsigned is_persistent:1; /* self-descriptive */ @@ -140,6 +147,7 @@ typedef struct { /* php_oci_connection {{{ */ typedef struct { /* php_oci_descriptor {{{ */ int id; + ulong index; /* descriptors hash table index */ php_oci_connection *connection; /* parent connection handle */ dvoid *descriptor; /* OCI descriptor handle */ ub4 type; /* descriptor type (FILE/LOB) */ @@ -191,6 +199,7 @@ typedef struct { /* php_oci_statement {{{ */ int ncolumns; /* number of columns in the result */ unsigned executed:1; /* statement executed flag */ unsigned has_data:1; /* statement has more data flag */ + unsigned has_descr:1; /* statement has at least one descriptor or cursor column */ ub2 stmttype; /* statement type */ } php_oci_statement; /* }}} */ @@ -200,6 +209,7 @@ typedef struct { /* php_oci_bind {{{ */ dvoid *descriptor; /* used for binding of LOBS etc */ OCIStmt *statement; /* used for binding REFCURSORs */ php_oci_statement *parent_statement; /* pointer to the parent statement */ + ub2 type; /* bind type */ struct { void *elements; sb2 *indicators; @@ -360,7 +370,8 @@ void php_oci_column_hash_dtor (void *data); void php_oci_define_hash_dtor (void *data); void php_oci_bind_hash_dtor (void *data); void php_oci_descriptor_flush_hash_dtor (void *data); -int php_oci_descriptor_delete_from_hash(void *data, void *id TSRMLS_DC); + +void php_oci_connection_descriptors_free(php_oci_connection *connection TSRMLS_DC); sb4 php_oci_error (OCIError *, sword TSRMLS_DC); sb4 php_oci_fetch_errmsg(OCIError *, text ** TSRMLS_DC); @@ -439,12 +450,13 @@ php_oci_out_column * php_oci_statement_get_column (php_oci_statement *, long, ch int php_oci_statement_execute (php_oci_statement *, ub4 TSRMLS_DC); int php_oci_statement_cancel (php_oci_statement * TSRMLS_DC); void php_oci_statement_free (php_oci_statement * TSRMLS_DC); -int php_oci_bind_pre_exec(void *data TSRMLS_DC); +int php_oci_bind_pre_exec(void *data, void *result TSRMLS_DC); int php_oci_bind_post_exec(void *data TSRMLS_DC); int php_oci_bind_by_name(php_oci_statement *, char *, int, zval*, long, ub2 TSRMLS_DC); sb4 php_oci_bind_in_callback(dvoid *, OCIBind *, ub4, ub4, dvoid **, ub4 *, ub1 *, dvoid **); sb4 php_oci_bind_out_callback(dvoid *, OCIBind *, ub4, ub4, dvoid **, ub4 **, ub1 *, dvoid **, ub2 **); php_oci_out_column *php_oci_statement_get_column_helper(INTERNAL_FUNCTION_PARAMETERS, int need_data); +int php_oci_cleanup_pre_fetch(void *data TSRMLS_DC); int php_oci_statement_get_type(php_oci_statement *, ub2 * TSRMLS_DC); int php_oci_statement_get_numrows(php_oci_statement *, ub4 * TSRMLS_DC); @@ -480,6 +492,7 @@ ZEND_BEGIN_MODULE_GLOBALS(oci) /* {{{ */ zend_bool in_call; char *connection_class; zend_bool events; + char *edition; ZEND_END_MODULE_GLOBALS(oci) /* }}} */ #ifdef ZTS diff --git a/ext/oci8/tests/bind_char_1.phpt b/ext/oci8/tests/bind_char_1.phpt index d2dddc908..36574dbfb 100644 --- a/ext/oci8/tests/bind_char_1.phpt +++ b/ext/oci8/tests/bind_char_1.phpt @@ -5,9 +5,9 @@ SELECT oci_bind_by_name with SQLT_AFC aka CHAR if (!extension_loaded('oci8')) die ("skip no oci8 extension"); require(dirname(__FILE__)."/connect.inc"); $sv = oci_server_version($c); -$sv = preg_match('/11.1/', $sv, $matches); +$sv = preg_match('/Release 1[12]\./', $sv, $matches); if ($sv !== 1) { - die ("skip expected output only valid when using Oracle 11g database"); + die ("skip expected output only valid when using Oracle 11g+ database"); } ?> --FILE-- diff --git a/ext/oci8/tests/bind_char_2.phpt b/ext/oci8/tests/bind_char_2.phpt index 183c09acb..f0f41663f 100644 --- a/ext/oci8/tests/bind_char_2.phpt +++ b/ext/oci8/tests/bind_char_2.phpt @@ -5,9 +5,9 @@ SELECT oci_bind_by_name with SQLT_AFC aka CHAR and dates if (!extension_loaded('oci8')) die ("skip no oci8 extension"); require(dirname(__FILE__)."/connect.inc"); $sv = oci_server_version($c); -$sv = preg_match('/11.1/', $sv, $matches); +$sv = preg_match('/Release 1[12]\./', $sv, $matches); if ($sv !== 1) { - die ("skip expected output only valid when using Oracle 11g database"); + die ("skip expected output only valid when using Oracle 11g+ database"); } ?> --FILE-- diff --git a/ext/oci8/tests/bind_char_3.phpt b/ext/oci8/tests/bind_char_3.phpt index f1e6a93c0..6d1b31150 100644 --- a/ext/oci8/tests/bind_char_3.phpt +++ b/ext/oci8/tests/bind_char_3.phpt @@ -5,9 +5,9 @@ PL/SQL oci_bind_by_name with SQLT_AFC aka CHAR to CHAR parameter if (!extension_loaded('oci8')) die ("skip no oci8 extension"); require(dirname(__FILE__)."/connect.inc"); $sv = oci_server_version($c); -$sv = preg_match('/11.1/', $sv, $matches); +$sv = preg_match('/Release 1[12]\./', $sv, $matches); if ($sv !== 1) { - die ("skip expected output only valid when using Oracle 11g database"); + die ("skip expected output only valid when using Oracle 11g+ database"); } ?> --FILE-- diff --git a/ext/oci8/tests/bind_char_4.phpt b/ext/oci8/tests/bind_char_4.phpt index ddd07dcb2..7377604b0 100644 --- a/ext/oci8/tests/bind_char_4.phpt +++ b/ext/oci8/tests/bind_char_4.phpt @@ -5,9 +5,9 @@ PL/SQL oci_bind_by_name with SQLT_AFC aka CHAR to VARCHAR2 parameter if (!extension_loaded('oci8')) die ("skip no oci8 extension"); require(dirname(__FILE__)."/connect.inc"); $sv = oci_server_version($c); -$sv = preg_match('/11.1/', $sv, $matches); +$sv = preg_match('/Release 1[12]\./', $sv, $matches); if ($sv !== 1) { - die ("skip expected output only valid when using Oracle 11g database"); + die ("skip expected output only valid when using Oracle 11g+ database"); } ?> --FILE-- diff --git a/ext/oci8/tests/bind_error.phpt b/ext/oci8/tests/bind_error.phpt new file mode 100644 index 000000000..ad66ad59f --- /dev/null +++ b/ext/oci8/tests/bind_error.phpt @@ -0,0 +1,70 @@ +--TEST-- +Test some oci_bind_by_name error conditions +--SKIPIF-- + +--FILE-- + +--EXPECTF-- +Insert value +bool(true) +Test 1 - Assign a resource to the bind variable and execute + +Warning: oci_execute(): Invalid variable used for bind in %s on line %d +bool(false) +Test 2 - Re-bind a resource + +Warning: oci_bind_by_name(): Invalid variable used for bind in %s on line %d + +Warning: oci_execute(): Invalid variable used for bind in %s on line %d +bool(false) +resource(%d) of type (oci8 connection) +Test 3 - Resource mismatch !! + +Warning: oci_bind_by_name(): Invalid variable used for bind in %s on line %d + +Warning: oci_execute(): ORA-01008: %s on line %d +bool(false) +Done diff --git a/ext/oci8/tests/bug26133.phpt b/ext/oci8/tests/bug26133.phpt index df319feb0..2463e70c7 100644 --- a/ext/oci8/tests/bug26133.phpt +++ b/ext/oci8/tests/bug26133.phpt @@ -5,30 +5,58 @@ Bug #26133 (ocifreedesc() segfault) --FILE-- free(); - } - - require dirname(__FILE__).'/drop_table.inc'; - - echo "Done\n"; +require(dirname(__FILE__).'/connect.inc'); + +// Initialize + +$stmtarray = array( + "drop table bug26133_tab", + "create table bug26133_tab (id number, value number)", +); + +foreach ($stmtarray as $stmt) { + $s = oci_parse($c, $stmt); + $r = @oci_execute($s); + if (!$r) { + $m = oci_error($s); + if (!in_array($m['code'], array( // ignore expected errors + 942 // table or view does not exist + ))) { + echo $stmt . PHP_EOL . $m['message'] . PHP_EOL; + } + } +} + +foreach ($stmtarray as $stmt) { + $s = oci_parse($c, $stmt); + oci_execute($s); +} + +// Run Test + +$ora_sql = "INSERT INTO bug26133_tab (id, value) VALUES ('1','1') RETURNING ROWID INTO :v_rowid "; + +$statement = OCIParse($c,$ora_sql); +$rowid = OCINewDescriptor($c,OCI_D_ROWID); +OCIBindByName($statement,":v_rowid", $rowid,-1,OCI_B_ROWID); +if (OCIExecute($statement)) { + OCICommit($c); +} +OCIFreeStatement($statement); +$rowid->free(); + +// Cleanup + +$stmtarray = array( + "drop table bug26133_tab" +); + +foreach ($stmtarray as $stmt) { + $s = oci_parse($c, $stmt); + oci_execute($s); +} + +echo "Done\n"; ?> --EXPECT-- Done diff --git a/ext/oci8/tests/bug27303.phpt b/ext/oci8/tests/bug27303.phpt index 2cc63d662..4dce84463 100644 --- a/ext/oci8/tests/bug27303.phpt +++ b/ext/oci8/tests/bug27303.phpt @@ -5,9 +5,9 @@ Bug #27303 (OCIBindByName binds numeric PHP values as characters) if (!extension_loaded('oci8')) die ("skip no oci8 extension"); require(dirname(__FILE__)."/connect.inc"); $sv = oci_server_version($c); -$sv = preg_match('/11.1/', $sv, $matches); +$sv = preg_match('/Release 1[12]\./', $sv, $matches); if ($sv !== 1) { - die ("skip expected output only valid when using Oracle 11g database"); + die ("skip expected output only valid when using Oracle 11g+ database"); } ?> --FILE-- diff --git a/ext/oci8/tests/bug27303_2.phpt b/ext/oci8/tests/bug27303_2.phpt index 3520b1ea3..63200ed52 100644 --- a/ext/oci8/tests/bug27303_2.phpt +++ b/ext/oci8/tests/bug27303_2.phpt @@ -5,9 +5,9 @@ Bug #27303 (OCIBindByName binds numeric PHP values as characters) if (!extension_loaded('oci8')) die ("skip no oci8 extension"); require(dirname(__FILE__)."/connect.inc"); $sv = oci_server_version($c); -$sv = preg_match('/11.1/', $sv, $matches); +$sv = preg_match('/Release 1[12]\./', $sv, $matches); if ($sv !== 1) { - die ("skip expected output only valid when using Oracle 11g database"); + die ("skip expected output only valid when using Oracle 11g+ database"); } ?> --FILE-- diff --git a/ext/oci8/tests/bug27303_4.phpt b/ext/oci8/tests/bug27303_4.phpt index f0c960e93..031f0d1e1 100644 --- a/ext/oci8/tests/bug27303_4.phpt +++ b/ext/oci8/tests/bug27303_4.phpt @@ -5,9 +5,9 @@ Bug #27303 (OCIBindByName binds numeric PHP values as characters) if (!extension_loaded('oci8')) die ("skip no oci8 extension"); require(dirname(__FILE__)."/connect.inc"); $sv = oci_server_version($c); -$sv = preg_match('/11.1/', $sv, $matches); +$sv = preg_match('/Release 1[12]\./', $sv, $matches); if ($sv !== 1) { - die ("skip expected output only valid when using Oracle 11g database"); + die ("skip expected output only valid when using Oracle 11g+ database"); } ?> --FILE-- diff --git a/ext/oci8/tests/bug32325.phpt b/ext/oci8/tests/bug32325.phpt index 00054f51e..257c6977b 100644 --- a/ext/oci8/tests/bug32325.phpt +++ b/ext/oci8/tests/bug32325.phpt @@ -1,21 +1,37 @@ --TEST-- -Bug #32325 (Can't retrieve collection using OCI8) +Bug #32325 (Cannot retrieve collection using OCI8) --SKIPIF-- --FILE-- size()); var_dump($collection->getelem(1)); var_dump($collection->getelem(2)); -$drop_stmt = oci_parse($c, "drop type ut_num_list_t"); -oci_execute($drop_stmt); +// Cleanup + +$stmtarray = array( + "drop type bug32325_t" +); + +foreach ($stmtarray as $stmt) { + $s = oci_parse($c, $stmt); + oci_execute($s); +} echo "Done\n"; ?> ---EXPECTF-- +--EXPECT-- int(4) float(2) float(3) diff --git a/ext/oci8/tests/bug36403.phpt b/ext/oci8/tests/bug36403.phpt new file mode 100644 index 000000000..68c5f7b0a --- /dev/null +++ b/ext/oci8/tests/bug36403.phpt @@ -0,0 +1,76 @@ +--TEST-- +Bug #36403 (oci_execute no longer supports OCI_DESCRIBE_ONLY) +--SKIPIF-- + +--FILE-- + 0; $i--) { + echo oci_field_name($s, $i) . "\n"; +} + +echo "Test 2\n"; + +// Should generate an error: ORA-24338: statement handle not executed +// since the statement handle was only described and not executed +$row = oci_fetch_array($s); + +// Clean up + +//require(dirname(__FILE__).'/drop_table.inc'); + +$stmtarray = array( + "drop table bug36403_tab" +); + +foreach ($stmtarray as $stmt) { + $s = oci_parse($c, $stmt); + oci_execute($s); +} + +oci_close($c); + +?> +===DONE=== + +--EXPECTF-- +Test 1 +COL4 +COLUMN3 +COL2 +C1 +Test 2 + +Warning: oci_fetch_array(): ORA-24338: %sbug36403.php on line %d +===DONE=== diff --git a/ext/oci8/tests/bug43497.phpt b/ext/oci8/tests/bug43497.phpt index 0fc6a97b3..1ea46b40d 100644 --- a/ext/oci8/tests/bug43497.phpt +++ b/ext/oci8/tests/bug43497.phpt @@ -157,7 +157,7 @@ for ($i = 1; $i <= 10; $i++) { readxmltab_im($c); } -echo "\nExplicit LOB with no free (i.e. a temp lob leak)\n"; +echo "\nExplicit LOB with no free\n"; for ($i = 1; $i <= 10; $i++) { echo "\nRun = " . $i . "\n"; echo "Temporary LOBs = " . templobs($c, $sid) . "\n"; @@ -259,45 +259,45 @@ Run = 10 Temporary LOBs = 0 Loop count check = 100 -Explicit LOB with no free (i.e. a temp lob leak) +Explicit LOB with no free Run = 1 Temporary LOBs = 0 Loop count check = 100 Run = 2 -Temporary LOBs = 99 +Temporary LOBs = 0 Loop count check = 100 Run = 3 -Temporary LOBs = 198 +Temporary LOBs = 0 Loop count check = 100 Run = 4 -Temporary LOBs = 297 +Temporary LOBs = 0 Loop count check = 100 Run = 5 -Temporary LOBs = 396 +Temporary LOBs = 0 Loop count check = 100 Run = 6 -Temporary LOBs = 495 +Temporary LOBs = 0 Loop count check = 100 Run = 7 -Temporary LOBs = 594 +Temporary LOBs = 0 Loop count check = 100 Run = 8 -Temporary LOBs = 693 +Temporary LOBs = 0 Loop count check = 100 Run = 9 -Temporary LOBs = 792 +Temporary LOBs = 0 Loop count check = 100 Run = 10 -Temporary LOBs = 891 +Temporary LOBs = 0 Loop count check = 100 Done diff --git a/ext/oci8/tests/bug47281.phpt b/ext/oci8/tests/bug47281.phpt new file mode 100644 index 000000000..710246738 --- /dev/null +++ b/ext/oci8/tests/bug47281.phpt @@ -0,0 +1,73 @@ +--TEST-- +Bug #47281 ($php_errormsg is limited in size of characters) +--SKIPIF-- + +--ENV-- +NLS_LANG=.AL32UTF8 +--FILE-- + +===DONE=== + +--EXPECTF-- +Test 1 +ORA-20000: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccDeeeeeeeeeeee +Test 2 +oci_execute(): ORA-20000: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +===DONE=== diff --git a/ext/oci8/tests/commit.phpt b/ext/oci8/tests/commit.phpt index 3bef318c8..836d2cd1d 100644 --- a/ext/oci8/tests/commit.phpt +++ b/ext/oci8/tests/commit.phpt @@ -1,28 +1,36 @@ --TEST-- -oci_commit()/oci_rollback() +Test OCI_NO_AUTO_COMMIT constant --SKIPIF-- --FILE-- ---EXPECT-- +--EXPECTF-- bool(true) int(0) array(5) { - ["ID"]=> + [%u|b%"ID"]=> array(0) { } - ["VALUE"]=> + [%u|b%"VALUE"]=> array(0) { } - ["BLOB"]=> + [%u|b%"BLOB"]=> array(0) { } - ["CLOB"]=> + [%u|b%"CLOB"]=> array(0) { } - ["STRING"]=> + [%u|b%"STRING"]=> array(0) { } } bool(true) int(4) array(5) { - ["ID"]=> + [%u|b%"ID"]=> array(4) { [0]=> - string(1) "1" + %string|unicode%(1) "1" [1]=> - string(1) "1" + %string|unicode%(1) "1" [2]=> - string(1) "1" + %string|unicode%(1) "1" [3]=> - string(1) "1" + %string|unicode%(1) "1" } - ["VALUE"]=> + [%u|b%"VALUE"]=> array(4) { [0]=> - string(1) "1" + %string|unicode%(1) "1" [1]=> - string(1) "1" + %string|unicode%(1) "1" [2]=> - string(1) "1" + %string|unicode%(1) "1" [3]=> - string(1) "1" + %string|unicode%(1) "1" } - ["BLOB"]=> + [%u|b%"BLOB"]=> array(4) { [0]=> NULL @@ -122,7 +130,7 @@ array(5) { [3]=> NULL } - ["CLOB"]=> + [%u|b%"CLOB"]=> array(4) { [0]=> NULL @@ -133,7 +141,7 @@ array(5) { [3]=> NULL } - ["STRING"]=> + [%u|b%"STRING"]=> array(4) { [0]=> NULL diff --git a/ext/oci8/tests/conn_attr.inc b/ext/oci8/tests/conn_attr.inc new file mode 100644 index 000000000..2c086b189 --- /dev/null +++ b/ext/oci8/tests/conn_attr.inc @@ -0,0 +1,151 @@ + 1[012]\./', $phpinfo); + if ($iv != 1) { + die ("skip test expected to work only with Oracle 10g or greater client "); + } +} +else { + die ("skip test expected to work only with Oracle 10g or greater server"); +} + +?> +--FILE-- + +--EXPECTF-- +**Test 1.1 - Default values for the attributes ************** +Testing with oci_connect() +The value of MODULE is %s +The value of ACTION is +The value of CLIENT_INFO is +The value of CLIENT_IDENTIFIER is +**Test 1.2 - Set and get values for the attributes ************** +Testing with oci_connect() +Value of MODULE has been set successfully +The value of MODULE is PHP TEST1 +Value of ACTION has been set successfully +The value of ACTION is TASK1 +Value of CLIENT_INFO has been set successfully +The value of CLIENT_INFO is INFO11 +Value of CLIENT_IDENTIFIER has been set successfully +The value of CLIENT_IDENTIFIER is ID001 +Testing with oci_pconnect() +Value of MODULE has been set successfully +The value of MODULE is PHP TEST2 +Value of ACTION has been set successfully +The value of ACTION is TASK2 +Value of CLIENT_INFO has been set successfully +The value of CLIENT_INFO is INFO12 +Value of CLIENT_IDENTIFIER has been set successfully +The value of CLIENT_IDENTIFIER is ID002 +Testing with oci_new_connect() +Value of MODULE has been set successfully +The value of MODULE is PHP TEST3 +Value of ACTION has been set successfully +The value of ACTION is TASK3 +Value of CLIENT_INFO has been set successfully +The value of CLIENT_INFO is INFO13 +Value of CLIENT_IDENTIFIER has been set successfully +The value of CLIENT_IDENTIFIER is ID003 +Done diff --git a/ext/oci8/tests/conn_attr_2.phpt b/ext/oci8/tests/conn_attr_2.phpt new file mode 100644 index 000000000..4765d5eb7 --- /dev/null +++ b/ext/oci8/tests/conn_attr_2.phpt @@ -0,0 +1,111 @@ +--TEST-- +Set and get of connection attributes across persistent connections and sysdba connection. +--SKIPIF-- + 1[012]\./', $phpinfo); + if ($iv != 1) { + die ("skip test expected to work only with Oracle 10g or greater version of client"); + } +} +else { + die ("skip test expected to work only with Oracle 10g or greater version of server"); +} +?> +--INI-- +oci8.privileged_connect = On +--FILE-- + + +--EXPECTF-- +**Set values using pconnect-1** +resource(%d) of type (oci8 persistent connection) +Value of MODULE has been set successfully +Value of ACTION has been set successfully +Value of CLIENT_INFO has been set successfully +Value of CLIENT_IDENTIFIER has been set successfully + +**Get values using pconnect-2** +resource(%d) of type (oci8 persistent connection) +The value of MODULE is PHP TEST100 +The value of ACTION is TASK100 +The value of CLIENT_INFO is INFO1100 +The value of CLIENT_IDENTIFIER is ID00100 + +**Get values using pconnect-3** +resource(%d) of type (oci8 persistent connection) +The value of MODULE is %s +The value of ACTION is +The value of CLIENT_INFO is +The value of CLIENT_IDENTIFIER is + +**Re-open a pconnect()** +resource(%d) of type (oci8 persistent connection) +The value of MODULE is PHP TEST100 +The value of ACTION is TASK100 +The value of CLIENT_INFO is INFO1100 +The value of CLIENT_IDENTIFIER is ID00100 + +Warning: oci_pconnect(): ORA-01031: %s on line %d +bool(false) +Done diff --git a/ext/oci8/tests/conn_attr_3.phpt b/ext/oci8/tests/conn_attr_3.phpt new file mode 100644 index 000000000..8b6d92123 --- /dev/null +++ b/ext/oci8/tests/conn_attr_3.phpt @@ -0,0 +1,94 @@ +--TEST-- +Set and get of connection attributes with oci_close(). +--SKIPIF-- + 1[012]\./', $phpinfo); + if ($iv != 1) { + die ("skip test expected to work only with Oracle 10g or greater version of client"); + } +} +else { + die ("skip test expected to work only with Oracle 10g or greater version of server"); +} +?> +--FILE-- + +--EXPECTF-- +**Test Set and get values for the attributes with oci_close() ************ +Testing with oci_connect() +resource(%d) of type (oci8 connection) +Value of ACTION has been set successfully +The value of ACTION is TASK1 +Testing with oci_connect() +resource(%d) of type (oci8 connection) +The value of ACTION is +Testing with oci_pconnect() +resource(%d) of type (oci8 persistent connection) +Value of MODULE has been set successfully +The value of MODULE is PHP TEST2 +Testing with oci_pconnect() +resource(%d) of type (oci8 persistent connection) +The value of MODULE is PHP TEST2 +Testing with oci_new_connect() +resource(%d) of type (oci8 connection) +Value of CLIENT_INFO has been set successfully +Value of CLIENT_IDENTIFIER has been set successfully +The value of CLIENT_INFO is INFO13 +The value of CLIENT_IDENTIFIER is ID003 +Testing with oci_new_connect() +resource(%d) of type (oci8 connection) +The value of CLIENT_INFO is +The value of CLIENT_IDENTIFIER is +Done diff --git a/ext/oci8/tests/conn_attr_4.phpt b/ext/oci8/tests/conn_attr_4.phpt new file mode 100644 index 000000000..2ef2673fd --- /dev/null +++ b/ext/oci8/tests/conn_attr_4.phpt @@ -0,0 +1,121 @@ +--TEST-- +Set and get of connection attributes with errors. +--SKIPIF-- + 1[012]\./', $phpinfo); + if ($iv != 1) { + die ("skip test expected to work only with Oracle 10g or greater version of client"); + } +} +else { + die ("skip test expected to work only with Oracle 10g or greater version of server"); +} +?> +--FILE-- + 64 !!!!!this is a very huge string with a length > 64 !!!!!this is a very huge string with a length > 64 !!!!!this is a very huge string with a length > 64 !!!!!'); + +foreach($values_array as $val ) { + oci_set_module_name($c1,$val); + oci_set_client_identifier($c1,$val); + oci_set_client_info($c1,$val); + $r = oci_set_action($c1,$val); + if ($r) { + echo "Values set succesfully to $val\n"; + foreach($attr_array as $attr) { + get_attr($c1,$attr); + } + } +} + +clean_up($c); +echo "Done\n"; +?> +--EXPECTF-- +**Test Negative cases************ + +Invalid Connection resource + +Warning: oci_set_action() expects parameter 1 to be resource, null given in %s on line %d +NULL + +Invalid Connection resource 2 + +Warning: oci_set_client_info() expects parameter 1 to be resource, %s given in %s on line %d +NULL + +Invalid Value + +Warning: oci_set_action() expects parameter 2 to be %s, resource given in %s on line %d +NULL + +Set Values multiple times +bool(true) +bool(true) +bool(true) +bool(true) +The value of ACTION is ACTION1 + +Setting to different values +Values set succesfully to 1000 +The value of MODULE is 1000 +The value of ACTION is 1000 +The value of CLIENT_INFO is 1000 +The value of CLIENT_IDENTIFIER is 1000 +Values set succesfully to +The value of MODULE is +The value of ACTION is +The value of CLIENT_INFO is +The value of CLIENT_IDENTIFIER is + +Warning: oci_set_module_name(): ORA-24960: %s OCI_ATTR_MODULE %s on line %d + +Warning: oci_set_client_identifier(): ORA-24960: %s OCI_ATTR_CLIENT_IDENTIFIER %s on line %d + +Warning: oci_set_client_info(): ORA-24960: %s OCI_ATTR_CLIENT_INFO %s on line %d + +Warning: oci_set_action(): ORA-24960: %s OCI_ATTR_ACTION %s on line %d +Done diff --git a/ext/oci8/tests/conn_attr_5.phpt b/ext/oci8/tests/conn_attr_5.phpt new file mode 100644 index 000000000..9f6b6c724 --- /dev/null +++ b/ext/oci8/tests/conn_attr_5.phpt @@ -0,0 +1,76 @@ +--TEST-- +Set and get connection attributes with scope end. +--SKIPIF-- + 1[012]\./', $phpinfo); + if ($iv != 1) { + die ("skip test expected to work only with Oracle 10g or greater version of client"); + } +} +else { + die ("skip test expected to work only with Oracle 10g or greater version of server"); +} +?> +--FILE-- + +--EXPECTF-- +**Test - Set and get values for the attributes with scope end ************ +Testing with oci_connect() +Value of CLIENT_INFO has been set successfully +Value of CLIENT_IDENTIFIER has been set successfully +Testing with oci_new_connect() +Value of ACTION has been set successfully +Testing with oci_pconnect() +Value of MODULE has been set successfully +Get the Values from a different scope +Testing with oci_connect() +The value of CLIENT_INFO is +The value of CLIENT_IDENTIFIER is +Testing with oci_new_connect() +The value of ACTION is +Testing with oci_pconnect() +The value of MODULE is PHP TEST50 +Done diff --git a/ext/oci8/tests/cursor_bind_err.phpt b/ext/oci8/tests/cursor_bind_err.phpt index 267c4d94f..33bd04b6d 100644 --- a/ext/oci8/tests/cursor_bind_err.phpt +++ b/ext/oci8/tests/cursor_bind_err.phpt @@ -5,26 +5,39 @@ binding a cursor (with errors) --FILE-- --EXPECTF-- -Warning: oci_bind_by_name(): ORA-01036: illegal variable name/number in %s on line %d +Warning: oci_bind_by_name(): ORA-01036: %s in %s on line %d -Warning: oci_fetch_assoc(): ORA-24338: statement handle not executed in %s on line %d +Warning: oci_fetch_assoc(): ORA-24338: %s in %s on line %d bool(false) Done diff --git a/ext/oci8/tests/cursors_old.phpt b/ext/oci8/tests/cursors_old.phpt index cf3b5f957..73447c82b 100644 --- a/ext/oci8/tests/cursors_old.phpt +++ b/ext/oci8/tests/cursors_old.phpt @@ -5,26 +5,39 @@ fetching cursor from a statement --FILE-- --EXPECTF-- array(2) { - ["ID"]=> - string(1) "1" - ["VALUE"]=> - string(1) "1" + [%u|b%"ID"]=> + %unicode|string%(1) "1" + [%u|b%"VALUE"]=> + %unicode|string%(1) "1" } bool(true) -Warning: ocifetchinto():%sORA-01002: fetch out of sequence in %scursors_old.php on line %d +Warning: ocifetchinto():%sORA-01002: %s in %scursors_old.php on line %d array(2) { - ["ID"]=> - string(1) "1" - ["VALUE"]=> - string(1) "1" + [%u|b%"ID"]=> + %unicode|string%(1) "1" + [%u|b%"VALUE"]=> + %unicode|string%(1) "1" } bool(true) Done diff --git a/ext/oci8/tests/debug.phpt b/ext/oci8/tests/debug.phpt index cdd56a081..49e3d4cfd 100644 --- a/ext/oci8/tests/debug.phpt +++ b/ext/oci8/tests/debug.phpt @@ -6,9 +6,9 @@ if (!extension_loaded('oci8')) die("skip no oci8 extension"); ob_start(); phpinfo(INFO_MODULES); $phpinfo = ob_get_clean(); -$iv = preg_match('/Oracle .*Version => 11/', $phpinfo); +$iv = preg_match('/Oracle .*Version => (11\.2|12\.)/', $phpinfo); if ($iv !== 1) { - die ("skip expected output only valid when using Oracle 11g client libraries"); + die ("skip expected output only valid when using Oracle 11gR2+ client libraries"); } ?> --FILE-- @@ -34,8 +34,12 @@ OCI8 DEBUG L1: Got NO cached connection at (%s:%d) OCI8 DEBUG: OCIEnvNlsCreate at (%s:%d) OCI8 DEBUG: OCIHandleAlloc at (%s:%d) OCI8 DEBUG: OCIHandleAlloc at (%s:%d) +OCI8 DEBUG: OCIHandleAlloc at (%s:%d) +OCI8 DEBUG: OCIAttrSet at (%s:%d) +OCI8 DEBUG: OCIAttrSet at (%s:%d) OCI8 DEBUG: OCISessionPoolCreate at (%s:%d) OCI8 DEBUG: OCIAttrSet at (%s:%d) +OCI8 DEBUG: OCIHandleFree at (%s:%d) OCI8 DEBUG L1: create_spool: (%s:%d) OCI8 DEBUG L1: using shared pool: (%s:%d) OCI8 DEBUG: OCIHandleAlloc at (%s:%d) @@ -44,7 +48,7 @@ OCI8 DEBUG: OCIAttrSet at (%s:%d) OCI8 DEBUG: OCIAttrSet at (%s:%d) OCI8 DEBUG: OCIAttrGet at (%s:%d) OCI8 DEBUG: OCIAttrGet at (%s:%d) -OCI8 DEBUG L1: (%s:%d) +OCI8 DEBUG L1: (numopen=0)(numbusy=0) at (%s:%d) OCI8 DEBUG: OCISessionGet at (%s:%d) OCI8 DEBUG: OCIAttrGet at (%s:%d) OCI8 DEBUG: OCIAttrGet at (%s:%d) diff --git a/ext/oci8/tests/default_prefetch.phpt b/ext/oci8/tests/default_prefetch.phpt index cc02b6a1c..47191c858 100644 --- a/ext/oci8/tests/default_prefetch.phpt +++ b/ext/oci8/tests/default_prefetch.phpt @@ -7,26 +7,39 @@ oci8.default_prefetch=20 --FILE-- diff --git a/ext/oci8/tests/default_prefetch1.phpt b/ext/oci8/tests/default_prefetch1.phpt index aa130e9f9..bcd66fa38 100644 --- a/ext/oci8/tests/default_prefetch1.phpt +++ b/ext/oci8/tests/default_prefetch1.phpt @@ -7,26 +7,39 @@ oci8.default_prefetch=100 --FILE-- diff --git a/ext/oci8/tests/default_prefetch2.phpt b/ext/oci8/tests/default_prefetch2.phpt index ac623a274..7b3f29f29 100644 --- a/ext/oci8/tests/default_prefetch2.phpt +++ b/ext/oci8/tests/default_prefetch2.phpt @@ -7,26 +7,39 @@ oci8.default_prefetch=100 --FILE-- diff --git a/ext/oci8/tests/define.phpt b/ext/oci8/tests/define.phpt index c76f360f2..d99bc7e1a 100644 --- a/ext/oci8/tests/define.phpt +++ b/ext/oci8/tests/define.phpt @@ -5,24 +5,36 @@ oci_define_by_name() --FILE-- ---EXPECT-- -string(4) "some" +--EXPECTF-- +%unicode|string%(%d) "some" Done diff --git a/ext/oci8/tests/define1.phpt b/ext/oci8/tests/define1.phpt index f6e04cc18..341bc9ed8 100644 --- a/ext/oci8/tests/define1.phpt +++ b/ext/oci8/tests/define1.phpt @@ -5,24 +5,36 @@ oci_define_by_name() --FILE-- ---EXPECT-- -bool(true) -bool(true) +--EXPECTF-- Test 1 - must do define before execute bool(true) NULL -string(4) "some" +%unicode|string%(4) "some" Test 2 - normal define order bool(true) -string(4) "some" +%unicode|string%(4) "some" Test 3 - no new define done -string(4) "some" -string(5) "thing" +%unicode|string%(4) "some" +%unicode|string%(5) "thing" Done diff --git a/ext/oci8/tests/define_old.phpt b/ext/oci8/tests/define_old.phpt index da52e619c..618f9d5f5 100644 --- a/ext/oci8/tests/define_old.phpt +++ b/ext/oci8/tests/define_old.phpt @@ -5,24 +5,36 @@ ocidefinebyname() --FILE-- ---EXPECT-- -string(4) "some" +--EXPECTF-- +%unicode|string%(4) "some" Done diff --git a/ext/oci8/tests/driver_name.phpt b/ext/oci8/tests/driver_name.phpt new file mode 100644 index 000000000..187d7e186 --- /dev/null +++ b/ext/oci8/tests/driver_name.phpt @@ -0,0 +1,71 @@ +--TEST-- +Verify that the Driver Name attribute is set +--SKIPIF-- + (11.2|12)/', $phpinfo); + if ($iv != 1) { + die ("skip test expected to work only with Oracle 11g or greater version of client"); + } +} +else { + die ("skip test expected to work only with Oracle 11g or greater version of server"); +} + +?> +--FILE-- + +--EXPECT-- +**Test 1.1 - Default values for the attribute ************** +The value of DRIVER_NAME is PHP OCI8 + +***Test 1.2 - Get the values from different connections ************** +Testing with oci_pconnect() +The value of DRIVER_NAME is PHP OCI8 +Testing with oci_new_connect() +The value of DRIVER_NAME is PHP OCI8 +Done diff --git a/ext/oci8/tests/drop_table.inc b/ext/oci8/tests/drop_table.inc index ffd99f5af..592a95a3d 100644 --- a/ext/oci8/tests/drop_table.inc +++ b/ext/oci8/tests/drop_table.inc @@ -1,12 +1,7 @@ diff --git a/ext/oci8/tests/drop_type.inc b/ext/oci8/tests/drop_type.inc index 047968ef2..98542a808 100644 --- a/ext/oci8/tests/drop_type.inc +++ b/ext/oci8/tests/drop_type.inc @@ -1,12 +1,7 @@ diff --git a/ext/oci8/tests/edition_1.phpt b/ext/oci8/tests/edition_1.phpt new file mode 100644 index 000000000..9a4b0f3b6 --- /dev/null +++ b/ext/oci8/tests/edition_1.phpt @@ -0,0 +1,156 @@ +--TEST-- +Basic test for setting Oracle 11gR2 "edition" attribute +--SKIPIF-- + (11\.2|12)/', $phpinfo); + if ($iv != 1) { + die ("skip tests a feature that works only with Oracle 11gR2 or greater version of client"); + } +} +else { + die ("skip tests a feature that works only with Oracle 11gR2 or greater version of server"); +} + +?> +--FILE-- + +--EXPECTF-- +The value of edition has been successfully set +The value of current EDITION is MYEDITION +array(3) { + [0]=> + %unicode|string%(%d) "mike" + [1]=> + %unicode|string%(%d) "30" + [2]=> + %unicode|string%(%d) "Senior engineer" +} +array(3) { + [0]=> + %unicode|string%(%d) "juan" + [1]=> + %unicode|string%(%d) "25" + [2]=> + %unicode|string%(%d) "engineer" +} + The value of edition has been successfully set +The value of current EDITION is MYEDITION1 +array(4) { + [0]=> + %unicode|string%(%d) "mike" + [1]=> + %unicode|string%(%d) "30" + [2]=> + %unicode|string%(%d) "Senior engineer" + [3]=> + %unicode|string%(%d) "200" +} +array(4) { + [0]=> + %unicode|string%(%d) "juan" + [1]=> + %unicode|string%(%d) "25" + [2]=> + %unicode|string%(%d) "engineer" + [3]=> + %unicode|string%(%d) "100" +} +version of view_ed in MYEDITION +The value of current EDITION is MYEDITION +array(3) { + [0]=> + %unicode|string%(%d) "mike" + [1]=> + %unicode|string%(%d) "30" + [2]=> + %unicode|string%(%d) "Senior engineer" +} +array(3) { + [0]=> + %unicode|string%(%d) "juan" + [1]=> + %unicode|string%(%d) "25" + [2]=> + %unicode|string%(%d) "engineer" +} +Done diff --git a/ext/oci8/tests/edition_2.phpt b/ext/oci8/tests/edition_2.phpt new file mode 100644 index 000000000..f7ab979bc --- /dev/null +++ b/ext/oci8/tests/edition_2.phpt @@ -0,0 +1,248 @@ +--TEST-- +Set and check Oracle 11gR2 "edition" attribute +--SKIPIF-- + (11\.2|12)/', $phpinfo); + if ($iv != 1) { + die ("skip tests a feature that works only with Oracle 11gR2 or greater version of client"); + } +} +else { + die ("skip tests a feature that works only with Oracle 11gR2 or greater version of server"); +} + +?> +--FILE-- + +--EXPECTF-- +**Test 1.1 - Default value for the attribute ************** +The value of current EDITION is ORA$BASE + + +**Test 1.2 - Set a value and get the same with different connections ********* + The value of edition has been successfully set +Testing with oci_connect() +The value of current EDITION is MYEDITION +Testing with oci_pconnect() +The value of current EDITION is MYEDITION +Testing with oci_new_connect() +The value of current EDITION is MYEDITION +The value of current EDITION is MYEDITION + + +**Test 1.3 change the value and verify with existing conenctions.********* + The value of edition has been successfully set +The value of current EDITION is MYEDITION +The value of current EDITION is MYEDITION +Testing with oci_new_connect() +The value of current EDITION is MYEDITION1 +Testing with oci_pconnect() +The value of current EDITION is MYEDITION1 +Testing with oci_connect() +The value of current EDITION is MYEDITION1 + + +**Test 1.4 - with different type of values ********* + The value of edition has been successfully set +Testing with oci_connect() + +Warning: oci_connect(): ORA-38801: %s ORA_EDITION in %s on line %d + The value of edition has been successfully set +Testing with oci_connect() +The value of current EDITION is ORA$BASE + The value of edition has been successfully set +Testing with oci_connect() + +Warning: oci_connect(): ORA-38801: %s ORA_EDITION in %s on line %d + The value of edition has been successfully set +Testing with oci_connect() + +Warning: oci_connect(): ORA-38801: %s ORA_EDITION in %s on line %d + + +**Test 1.5 - Negative case with an invalid string value. ********* +Testing with oci_new_connect() + +Warning: oci_new_connect(): ORA-38801: %s ORA_EDITION in %s on line %d + The value of edition has been successfully set + + +**Test 1.6 - Set Multiple times.***** + The value of edition has been successfully set + The value of edition has been successfully set +Testing with oci_connect() +The value of current EDITION is MYEDITION1 + + +**Test 1.7 - Test with ALTER SESSION statement to change the edition ******* + The value of edition has been successfully set +Testing with oci_new_connect() +get the value set to MYEDITION with oci_set_edition +The value of current EDITION is MYEDITION +Get the value set to MYEDITION1 with alter session +The value of current EDITION is MYEDITION1 + Get the value with a new connection +Testing with oci_connect() +The value of current EDITION is MYEDITION + Set the value back using oci-set_edition + The value of edition has been successfully set +The value of current EDITION is MYEDITION + Get the value with a new conenction +Testing with oci_connect() +The value of current EDITION is MYEDITION + + +**Test 1.8 - Test setting the attribute with scope ends******* + The value of edition has been successfully set +The value of current EDITION is MYEDITION1 +Done + diff --git a/ext/oci8/tests/extauth_01.phpt b/ext/oci8/tests/extauth_01.phpt index e054a2216..30250ec24 100644 --- a/ext/oci8/tests/extauth_01.phpt +++ b/ext/oci8/tests/extauth_01.phpt @@ -139,12 +139,12 @@ bool(false) bool(false) Test 7 -Warning: oci_connect(): ORA-12154: TNS:could not resolve the connect identifier specified in %s on line %d +Warning: oci_connect(): ORA-12154: %s in %s on line %d array(4) { [%u|b%"code"]=> int(12154) [%u|b%"message"]=> - %unicode|string%(65) "ORA-12154: %s" + %unicode|string%(%d) "ORA-12154: %s" [%u|b%"offset"]=> int(0) [%u|b%"sqltext"]=> @@ -153,12 +153,12 @@ array(4) { bool(false) Test 8 -Warning: oci_connect(): ORA-12154: TNS:could not resolve the connect identifier specified in %s on line %d +Warning: oci_connect(): ORA-12154: %s in %s on line %d array(4) { [%u|b%"code"]=> int(12154) [%u|b%"message"]=> - %unicode|string%(65) "ORA-12154: %s" + %unicode|string%(%d) "ORA-12154: %s" [%u|b%"offset"]=> int(0) [%u|b%"sqltext"]=> diff --git a/ext/oci8/tests/extauth_02.phpt b/ext/oci8/tests/extauth_02.phpt index b27522961..d648eef08 100644 --- a/ext/oci8/tests/extauth_02.phpt +++ b/ext/oci8/tests/extauth_02.phpt @@ -139,12 +139,12 @@ bool(false) bool(false) Test 7 -Warning: oci_new_connect(): ORA-12154: TNS:could not resolve the connect identifier specified in %s on line %d +Warning: oci_new_connect(): ORA-12154: %s in %s on line %d array(4) { [%u|b%"code"]=> int(12154) [%u|b%"message"]=> - %unicode|string%(65) "ORA-12154: %s" + %unicode|string%(%d) "ORA-12154: %s" [%u|b%"offset"]=> int(0) [%u|b%"sqltext"]=> @@ -153,12 +153,12 @@ array(4) { bool(false) Test 8 -Warning: oci_new_connect(): ORA-12154: TNS:could not resolve the connect identifier specified in %s on line %d +Warning: oci_new_connect(): ORA-12154: %s in %s on line %d array(4) { [%u|b%"code"]=> int(12154) [%u|b%"message"]=> - %unicode|string%(65) "ORA-12154: %s" + %unicode|string%(%d) "ORA-12154: %s" [%u|b%"offset"]=> int(0) [%u|b%"sqltext"]=> diff --git a/ext/oci8/tests/extauth_03.phpt b/ext/oci8/tests/extauth_03.phpt index 50be0e724..021492f76 100644 --- a/ext/oci8/tests/extauth_03.phpt +++ b/ext/oci8/tests/extauth_03.phpt @@ -139,12 +139,12 @@ bool(false) bool(false) Test 7 -Warning: oci_pconnect(): ORA-12154: TNS:could not resolve the connect identifier specified in %s on line %d +Warning: oci_pconnect(): ORA-12154: %s in %s on line %d array(4) { [%u|b%"code"]=> int(12154) [%u|b%"message"]=> - %unicode|string%(65) "ORA-12154: %s" + %unicode|string%(%d) "ORA-12154: %s" [%u|b%"offset"]=> int(0) [%u|b%"sqltext"]=> @@ -153,12 +153,12 @@ array(4) { bool(false) Test 8 -Warning: oci_pconnect(): ORA-12154: TNS:could not resolve the connect identifier specified in %s on line %d +Warning: oci_pconnect(): ORA-12154: %s in %s on line %d array(4) { [%u|b%"code"]=> int(12154) [%u|b%"message"]=> - %unicode|string%(65) "ORA-12154: %s" + %unicode|string%(%d) "ORA-12154: %s" [%u|b%"offset"]=> int(0) [%u|b%"sqltext"]=> diff --git a/ext/oci8/tests/fetch.phpt b/ext/oci8/tests/fetch.phpt index 33cba657b..520632494 100644 --- a/ext/oci8/tests/fetch.phpt +++ b/ext/oci8/tests/fetch.phpt @@ -5,28 +5,39 @@ ocifetch() & ociresult() --FILE-- ---EXPECT-- -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" +--EXPECTF-- +%unicode|string%(1) "1" +%unicode|string%(1) "1" +%unicode|string%(1) "1" +%unicode|string%(1) "1" +%unicode|string%(1) "1" +%unicode|string%(1) "1" Done diff --git a/ext/oci8/tests/fetch_all.phpt b/ext/oci8/tests/fetch_all.phpt index 5d3738b89..a007bac83 100644 --- a/ext/oci8/tests/fetch_all.phpt +++ b/ext/oci8/tests/fetch_all.phpt @@ -5,28 +5,32 @@ oci_fetch_all() --FILE-- ---EXPECT-- +--EXPECTF-- int(3) -array(5) { - ["ID"]=> +array(2) { + [%u|b%"ID"]=> array(3) { [0]=> - string(1) "1" + %unicode|string%(1) "1" [1]=> - string(1) "1" + %unicode|string%(1) "1" [2]=> - string(1) "1" + %unicode|string%(1) "1" } - ["VALUE"]=> + [%u|b%"VALUE"]=> array(3) { [0]=> - string(1) "1" + %unicode|string%(1) "1" [1]=> - string(1) "1" + %unicode|string%(1) "1" [2]=> - string(1) "1" - } - ["BLOB"]=> - array(3) { - [0]=> - NULL - [1]=> - NULL - [2]=> - NULL - } - ["CLOB"]=> - array(3) { - [0]=> - NULL - [1]=> - NULL - [2]=> - NULL - } - ["STRING"]=> - array(3) { - [0]=> - NULL - [1]=> - NULL - [2]=> - NULL + %unicode|string%(1) "1" } } int(3) -array(5) { - ["ID"]=> - array(3) { - [0]=> - string(1) "1" - [1]=> - string(1) "1" - [2]=> - string(1) "1" - } - ["VALUE"]=> - array(3) { - [0]=> - string(1) "1" - [1]=> - string(1) "1" - [2]=> - string(1) "1" - } - ["BLOB"]=> - array(3) { - [0]=> - NULL - [1]=> - NULL - [2]=> - NULL - } - ["CLOB"]=> +array(2) { + [%u|b%"ID"]=> array(3) { [0]=> - NULL + %unicode|string%(1) "1" [1]=> - NULL + %unicode|string%(1) "1" [2]=> - NULL + %unicode|string%(1) "1" } - ["STRING"]=> + [%u|b%"VALUE"]=> array(3) { [0]=> - NULL + %unicode|string%(1) "1" [1]=> - NULL + %unicode|string%(1) "1" [2]=> - NULL + %unicode|string%(1) "1" } } Done diff --git a/ext/oci8/tests/fetch_all3.phpt b/ext/oci8/tests/fetch_all3.phpt index 503e5dd88..42fe617dc 100644 --- a/ext/oci8/tests/fetch_all3.phpt +++ b/ext/oci8/tests/fetch_all3.phpt @@ -5,11 +5,34 @@ oci_fetch_all() - all combinations of flags --FILE-- ---EXPECT-- +--EXPECTF-- None int(4) array(2) { - ["ID"]=> + [%u|b%"ID"]=> array(4) { [0]=> - string(1) "1" + %unicode|string%(1) "1" [1]=> - string(1) "2" + %unicode|string%(1) "2" [2]=> - string(1) "3" + %unicode|string%(1) "3" [3]=> - string(1) "4" + %unicode|string%(1) "4" } - ["VALUE"]=> + [%u|b%"VALUE"]=> array(4) { [0]=> - string(2) "-1" + %unicode|string%(2) "-1" [1]=> - string(2) "-2" + %unicode|string%(2) "-2" [2]=> - string(2) "-3" + %unicode|string%(2) "-3" [3]=> - string(2) "-4" + %unicode|string%(2) "-4" } } OCI_ASSOC int(4) array(2) { - ["ID"]=> + [%u|b%"ID"]=> array(4) { [0]=> - string(1) "1" + %unicode|string%(1) "1" [1]=> - string(1) "2" + %unicode|string%(1) "2" [2]=> - string(1) "3" + %unicode|string%(1) "3" [3]=> - string(1) "4" + %unicode|string%(1) "4" } - ["VALUE"]=> + [%u|b%"VALUE"]=> array(4) { [0]=> - string(2) "-1" + %unicode|string%(2) "-1" [1]=> - string(2) "-2" + %unicode|string%(2) "-2" [2]=> - string(2) "-3" + %unicode|string%(2) "-3" [3]=> - string(2) "-4" + %unicode|string%(2) "-4" } } OCI_FETCHSTATEMENT_BY_COLUMN int(4) array(2) { - ["ID"]=> + [%u|b%"ID"]=> array(4) { [0]=> - string(1) "1" + %unicode|string%(1) "1" [1]=> - string(1) "2" + %unicode|string%(1) "2" [2]=> - string(1) "3" + %unicode|string%(1) "3" [3]=> - string(1) "4" + %unicode|string%(1) "4" } - ["VALUE"]=> + [%u|b%"VALUE"]=> array(4) { [0]=> - string(2) "-1" + %unicode|string%(2) "-1" [1]=> - string(2) "-2" + %unicode|string%(2) "-2" [2]=> - string(2) "-3" + %unicode|string%(2) "-3" [3]=> - string(2) "-4" + %unicode|string%(2) "-4" } } OCI_FETCHSTATEMENT_BY_COLUMN|OCI_ASSOC int(4) array(2) { - ["ID"]=> + [%u|b%"ID"]=> array(4) { [0]=> - string(1) "1" + %unicode|string%(1) "1" [1]=> - string(1) "2" + %unicode|string%(1) "2" [2]=> - string(1) "3" + %unicode|string%(1) "3" [3]=> - string(1) "4" + %unicode|string%(1) "4" } - ["VALUE"]=> + [%u|b%"VALUE"]=> array(4) { [0]=> - string(2) "-1" + %unicode|string%(2) "-1" [1]=> - string(2) "-2" + %unicode|string%(2) "-2" [2]=> - string(2) "-3" + %unicode|string%(2) "-3" [3]=> - string(2) "-4" + %unicode|string%(2) "-4" } } OCI_FETCHSTATEMENT_BY_COLUMN|OCI_NUM @@ -220,24 +255,24 @@ array(2) { [0]=> array(4) { [0]=> - string(1) "1" + %unicode|string%(1) "1" [1]=> - string(1) "2" + %unicode|string%(1) "2" [2]=> - string(1) "3" + %unicode|string%(1) "3" [3]=> - string(1) "4" + %unicode|string%(1) "4" } [1]=> array(4) { [0]=> - string(2) "-1" + %unicode|string%(2) "-1" [1]=> - string(2) "-2" + %unicode|string%(2) "-2" [2]=> - string(2) "-3" + %unicode|string%(2) "-3" [3]=> - string(2) "-4" + %unicode|string%(2) "-4" } } OCI_FETCHSTATEMENT_BY_COLUMN|OCI_NUM|OCI_ASSOC @@ -246,24 +281,24 @@ array(2) { [0]=> array(4) { [0]=> - string(1) "1" + %unicode|string%(1) "1" [1]=> - string(1) "2" + %unicode|string%(1) "2" [2]=> - string(1) "3" + %unicode|string%(1) "3" [3]=> - string(1) "4" + %unicode|string%(1) "4" } [1]=> array(4) { [0]=> - string(2) "-1" + %unicode|string%(2) "-1" [1]=> - string(2) "-2" + %unicode|string%(2) "-2" [2]=> - string(2) "-3" + %unicode|string%(2) "-3" [3]=> - string(2) "-4" + %unicode|string%(2) "-4" } } OCI_FETCHSTATEMENT_BY_ROW @@ -271,31 +306,31 @@ int(4) array(4) { [0]=> array(2) { - ["ID"]=> - string(1) "1" - ["VALUE"]=> - string(2) "-1" + [%u|b%"ID"]=> + %unicode|string%(1) "1" + [%u|b%"VALUE"]=> + %unicode|string%(2) "-1" } [1]=> array(2) { - ["ID"]=> - string(1) "2" - ["VALUE"]=> - string(2) "-2" + [%u|b%"ID"]=> + %unicode|string%(1) "2" + [%u|b%"VALUE"]=> + %unicode|string%(2) "-2" } [2]=> array(2) { - ["ID"]=> - string(1) "3" - ["VALUE"]=> - string(2) "-3" + [%u|b%"ID"]=> + %unicode|string%(1) "3" + [%u|b%"VALUE"]=> + %unicode|string%(2) "-3" } [3]=> array(2) { - ["ID"]=> - string(1) "4" - ["VALUE"]=> - string(2) "-4" + [%u|b%"ID"]=> + %unicode|string%(1) "4" + [%u|b%"VALUE"]=> + %unicode|string%(2) "-4" } } OCI_FETCHSTATEMENT_BY_ROW|OCI_ASSOC @@ -303,31 +338,31 @@ int(4) array(4) { [0]=> array(2) { - ["ID"]=> - string(1) "1" - ["VALUE"]=> - string(2) "-1" + [%u|b%"ID"]=> + %unicode|string%(1) "1" + [%u|b%"VALUE"]=> + %unicode|string%(2) "-1" } [1]=> array(2) { - ["ID"]=> - string(1) "2" - ["VALUE"]=> - string(2) "-2" + [%u|b%"ID"]=> + %unicode|string%(1) "2" + [%u|b%"VALUE"]=> + %unicode|string%(2) "-2" } [2]=> array(2) { - ["ID"]=> - string(1) "3" - ["VALUE"]=> - string(2) "-3" + [%u|b%"ID"]=> + %unicode|string%(1) "3" + [%u|b%"VALUE"]=> + %unicode|string%(2) "-3" } [3]=> array(2) { - ["ID"]=> - string(1) "4" - ["VALUE"]=> - string(2) "-4" + [%u|b%"ID"]=> + %unicode|string%(1) "4" + [%u|b%"VALUE"]=> + %unicode|string%(2) "-4" } } OCI_FETCHSTATEMENT_BY_ROW|OCI_FETCHSTATEMENT_BY_COLUMN @@ -335,31 +370,31 @@ int(4) array(4) { [0]=> array(2) { - ["ID"]=> - string(1) "1" - ["VALUE"]=> - string(2) "-1" + [%u|b%"ID"]=> + %unicode|string%(1) "1" + [%u|b%"VALUE"]=> + %unicode|string%(2) "-1" } [1]=> array(2) { - ["ID"]=> - string(1) "2" - ["VALUE"]=> - string(2) "-2" + [%u|b%"ID"]=> + %unicode|string%(1) "2" + [%u|b%"VALUE"]=> + %unicode|string%(2) "-2" } [2]=> array(2) { - ["ID"]=> - string(1) "3" - ["VALUE"]=> - string(2) "-3" + [%u|b%"ID"]=> + %unicode|string%(1) "3" + [%u|b%"VALUE"]=> + %unicode|string%(2) "-3" } [3]=> array(2) { - ["ID"]=> - string(1) "4" - ["VALUE"]=> - string(2) "-4" + [%u|b%"ID"]=> + %unicode|string%(1) "4" + [%u|b%"VALUE"]=> + %unicode|string%(2) "-4" } } OCI_FETCHSTATEMENT_BY_ROW|OCI_FETCHSTATEMENT_BY_COLUMN|OCI_ASSOC @@ -367,31 +402,31 @@ int(4) array(4) { [0]=> array(2) { - ["ID"]=> - string(1) "1" - ["VALUE"]=> - string(2) "-1" + [%u|b%"ID"]=> + %unicode|string%(1) "1" + [%u|b%"VALUE"]=> + %unicode|string%(2) "-1" } [1]=> array(2) { - ["ID"]=> - string(1) "2" - ["VALUE"]=> - string(2) "-2" + [%u|b%"ID"]=> + %unicode|string%(1) "2" + [%u|b%"VALUE"]=> + %unicode|string%(2) "-2" } [2]=> array(2) { - ["ID"]=> - string(1) "3" - ["VALUE"]=> - string(2) "-3" + [%u|b%"ID"]=> + %unicode|string%(1) "3" + [%u|b%"VALUE"]=> + %unicode|string%(2) "-3" } [3]=> array(2) { - ["ID"]=> - string(1) "4" - ["VALUE"]=> - string(2) "-4" + [%u|b%"ID"]=> + %unicode|string%(1) "4" + [%u|b%"VALUE"]=> + %unicode|string%(2) "-4" } } OCI_FETCHSTATEMENT_BY_ROW|OCI_FETCHSTATEMENT_BY_COLUMN|OCI_NUM @@ -400,30 +435,30 @@ array(4) { [0]=> array(2) { [0]=> - string(1) "1" + %unicode|string%(1) "1" [1]=> - string(2) "-1" + %unicode|string%(2) "-1" } [1]=> array(2) { [0]=> - string(1) "2" + %unicode|string%(1) "2" [1]=> - string(2) "-2" + %unicode|string%(2) "-2" } [2]=> array(2) { [0]=> - string(1) "3" + %unicode|string%(1) "3" [1]=> - string(2) "-3" + %unicode|string%(2) "-3" } [3]=> array(2) { [0]=> - string(1) "4" + %unicode|string%(1) "4" [1]=> - string(2) "-4" + %unicode|string%(2) "-4" } } OCI_FETCHSTATEMENT_BY_ROW|OCI_FETCHSTATEMENT_BY_COLUMN|OCI_NUM|OCI_ASSOC @@ -432,30 +467,30 @@ array(4) { [0]=> array(2) { [0]=> - string(1) "1" + %unicode|string%(1) "1" [1]=> - string(2) "-1" + %unicode|string%(2) "-1" } [1]=> array(2) { [0]=> - string(1) "2" + %unicode|string%(1) "2" [1]=> - string(2) "-2" + %unicode|string%(2) "-2" } [2]=> array(2) { [0]=> - string(1) "3" + %unicode|string%(1) "3" [1]=> - string(2) "-3" + %unicode|string%(2) "-3" } [3]=> array(2) { [0]=> - string(1) "4" + %unicode|string%(1) "4" [1]=> - string(2) "-4" + %unicode|string%(2) "-4" } } OCI_FETCHSTATEMENT_BY_ROW|OCI_NUM @@ -464,30 +499,30 @@ array(4) { [0]=> array(2) { [0]=> - string(1) "1" + %unicode|string%(1) "1" [1]=> - string(2) "-1" + %unicode|string%(2) "-1" } [1]=> array(2) { [0]=> - string(1) "2" + %unicode|string%(1) "2" [1]=> - string(2) "-2" + %unicode|string%(2) "-2" } [2]=> array(2) { [0]=> - string(1) "3" + %unicode|string%(1) "3" [1]=> - string(2) "-3" + %unicode|string%(2) "-3" } [3]=> array(2) { [0]=> - string(1) "4" + %unicode|string%(1) "4" [1]=> - string(2) "-4" + %unicode|string%(2) "-4" } } OCI_FETCHSTATEMENT_BY_ROW|OCI_NUM|OCI_ASSOC @@ -496,30 +531,30 @@ array(4) { [0]=> array(2) { [0]=> - string(1) "1" + %unicode|string%(1) "1" [1]=> - string(2) "-1" + %unicode|string%(2) "-1" } [1]=> array(2) { [0]=> - string(1) "2" + %unicode|string%(1) "2" [1]=> - string(2) "-2" + %unicode|string%(2) "-2" } [2]=> array(2) { [0]=> - string(1) "3" + %unicode|string%(1) "3" [1]=> - string(2) "-3" + %unicode|string%(2) "-3" } [3]=> array(2) { [0]=> - string(1) "4" + %unicode|string%(1) "4" [1]=> - string(2) "-4" + %unicode|string%(2) "-4" } } OCI_NUM @@ -528,24 +563,24 @@ array(2) { [0]=> array(4) { [0]=> - string(1) "1" + %unicode|string%(1) "1" [1]=> - string(1) "2" + %unicode|string%(1) "2" [2]=> - string(1) "3" + %unicode|string%(1) "3" [3]=> - string(1) "4" + %unicode|string%(1) "4" } [1]=> array(4) { [0]=> - string(2) "-1" + %unicode|string%(2) "-1" [1]=> - string(2) "-2" + %unicode|string%(2) "-2" [2]=> - string(2) "-3" + %unicode|string%(2) "-3" [3]=> - string(2) "-4" + %unicode|string%(2) "-4" } } OCI_NUM|OCI_ASSOC @@ -554,24 +589,24 @@ array(2) { [0]=> array(4) { [0]=> - string(1) "1" + %unicode|string%(1) "1" [1]=> - string(1) "2" + %unicode|string%(1) "2" [2]=> - string(1) "3" + %unicode|string%(1) "3" [3]=> - string(1) "4" + %unicode|string%(1) "4" } [1]=> array(4) { [0]=> - string(2) "-1" + %unicode|string%(2) "-1" [1]=> - string(2) "-2" + %unicode|string%(2) "-2" [2]=> - string(2) "-3" + %unicode|string%(2) "-3" [3]=> - string(2) "-4" + %unicode|string%(2) "-4" } } Done diff --git a/ext/oci8/tests/fetch_all4.phpt b/ext/oci8/tests/fetch_all4.phpt new file mode 100644 index 000000000..9b82262e3 --- /dev/null +++ b/ext/oci8/tests/fetch_all4.phpt @@ -0,0 +1,82 @@ +--TEST-- +Test oci_fetch_* array overwriting when query returns no rows +--SKIPIF-- + +--FILE-- + +===DONE=== + +--EXPECTF-- +Test 1 +int(0) +array(2) { + [%u|b%"MYCOL1"]=> + array(0) { + } + [%u|b%"MYCOL2"]=> + array(0) { + } +} +Test 2 +bool(false) +===DONE=== diff --git a/ext/oci8/tests/fetch_all5.phpt b/ext/oci8/tests/fetch_all5.phpt new file mode 100644 index 000000000..bb9061a44 --- /dev/null +++ b/ext/oci8/tests/fetch_all5.phpt @@ -0,0 +1,127 @@ +--TEST-- +Test oci_fetch_all with 0 and -1 skip & maxrows +--SKIPIF-- + +--FILE-- + +===DONE=== + +--EXPECTF-- +Test 1 +int(3) +array(2) { + [%u|b%"MYCOL1"]=> + array(3) { + [0]=> + %unicode|string%(1) "1" + [1]=> + %unicode|string%(1) "2" + [2]=> + %unicode|string%(1) "3" + } + [%u|b%"MYCOL2"]=> + array(3) { + [0]=> + %unicode|string%(3) "abc" + [1]=> + %unicode|string%(3) "def" + [2]=> + %unicode|string%(3) "ghi" + } +} +Test 1 +int(3) +array(2) { + [%u|b%"MYCOL1"]=> + array(3) { + [0]=> + %unicode|string%(1) "1" + [1]=> + %unicode|string%(1) "2" + [2]=> + %unicode|string%(1) "3" + } + [%u|b%"MYCOL2"]=> + array(3) { + [0]=> + %unicode|string%(3) "abc" + [1]=> + %unicode|string%(3) "def" + [2]=> + %unicode|string%(3) "ghi" + } +} +Test 3 +int(0) +array(0) { +} +===DONE=== diff --git a/ext/oci8/tests/fetch_into.phpt b/ext/oci8/tests/fetch_into.phpt index 379f5fc14..17e06e1cf 100644 --- a/ext/oci8/tests/fetch_into.phpt +++ b/ext/oci8/tests/fetch_into.phpt @@ -5,78 +5,86 @@ ocifetchinto() --FILE-- ---EXPECT-- -int(5) +--EXPECTF-- +int(2) array(2) { [0]=> - string(1) "1" + %unicode|string%(1) "1" [1]=> - string(1) "1" + %unicode|string%(1) "1" } -int(5) -array(10) { +int(2) +array(4) { [0]=> - string(1) "1" - ["ID"]=> - string(1) "1" + %unicode|string%(1) "1" + [%u|b%"ID"]=> + %unicode|string%(1) "1" [1]=> - string(1) "1" - ["VALUE"]=> - string(1) "1" - [2]=> - NULL - ["BLOB"]=> - NULL - [3]=> - NULL - ["CLOB"]=> - NULL - [4]=> - NULL - ["STRING"]=> - NULL + %unicode|string%(1) "1" + [%u|b%"VALUE"]=> + %unicode|string%(1) "1" } Done diff --git a/ext/oci8/tests/fetch_object.phpt b/ext/oci8/tests/fetch_object.phpt index 57b7fc03d..674a88ff2 100644 --- a/ext/oci8/tests/fetch_object.phpt +++ b/ext/oci8/tests/fetch_object.phpt @@ -5,78 +5,133 @@ oci_fetch_object() --FILE-- caseSensitive . "\n"; + echo $row->SECONDCOL . "\n"; + echo $row->ANOTHERCOL . "\n"; +} + +echo "Test 3\n"; + +if (!($s = oci_parse($c, 'select * from fetch_object_tab where rownum < 2 order by "caseSensitive"'))) { + die("oci_parse(select) failed!\n"); +} + +if (!oci_execute($s)) { + die("oci_execute(select) failed!\n"); +} + +$row = oci_fetch_object($s); +echo $row->caseSensitive . "\n"; +echo $row->CASESENSITIVE . "\n"; + +// Clean up + +$stmtarray = array( + "drop table fetch_object_tab" +); + +foreach ($stmtarray as $stmt) { + $s = oci_parse($c, $stmt); + oci_execute($s); +} ?> +===DONE=== + --EXPECTF-- -object(stdClass)#%d (5) { - ["ID"]=> - string(1) "1" - ["VALUE"]=> - string(1) "1" - ["BLOB"]=> - NULL - ["CLOB"]=> - NULL - ["STRING"]=> - NULL +Test 1 +object(stdClass)#1 (3) { + [%u|b%"caseSensitive"]=> + %unicode|string%(3) "123" + [%u|b%"SECONDCOL"]=> + %unicode|string%(19) "1st row col2 string" + [%u|b%"ANOTHERCOL"]=> + %unicode|string%(15) "1 more text " } -object(stdClass)#%d (5) { - ["ID"]=> - string(1) "1" - ["VALUE"]=> - string(1) "1" - ["BLOB"]=> - NULL - ["CLOB"]=> - NULL - ["STRING"]=> - NULL +object(stdClass)#2 (3) { + [%u|b%"caseSensitive"]=> + %unicode|string%(3) "456" + [%u|b%"SECONDCOL"]=> + %unicode|string%(19) "2nd row col2 string" + [%u|b%"ANOTHERCOL"]=> + %unicode|string%(15) "2 more text " } -object(stdClass)#%d (5) { - ["ID"]=> - string(1) "1" - ["VALUE"]=> - string(1) "1" - ["BLOB"]=> - NULL - ["CLOB"]=> - NULL - ["STRING"]=> - NULL +object(stdClass)#1 (3) { + [%u|b%"caseSensitive"]=> + %unicode|string%(3) "789" + [%u|b%"SECONDCOL"]=> + %unicode|string%(19) "3rd row col2 string" + [%u|b%"ANOTHERCOL"]=> + %unicode|string%(15) "3 more text " } -Done +Test 2 +123 +1st row col2 string +1 more text +456 +2nd row col2 string +2 more text +789 +3rd row col2 string +3 more text +Test 3 +123 + +Notice: Undefined property: stdClass::$CASESENSITIVE in %sfetch_object.php on line %d + +===DONE=== diff --git a/ext/oci8/tests/fetch_object_2.phpt b/ext/oci8/tests/fetch_object_2.phpt new file mode 100644 index 000000000..342503d91 --- /dev/null +++ b/ext/oci8/tests/fetch_object_2.phpt @@ -0,0 +1,127 @@ +--TEST-- +oci_fetch_object() with CLOB and NULL +--SKIPIF-- + +--FILE-- +COL1 . "\n"; + echo $row->COL2->load(100) . "\n"; + echo $row->COL3 . "\n"; +} + +// Clean up + +$stmtarray = array( + "drop table fetch_object_2_tab" +); + +foreach ($stmtarray as $stmt) { + $s = oci_parse($c, $stmt); + oci_execute($s); +} + +?> +===DONE=== + +--EXPECTF-- +Test 1 +object(stdClass)#%d (3) { + [%u|b%"COL1"]=> + %unicode|string%(3) "123" + [%u|b%"COL2"]=> + object(OCI-Lob)#%d (1) { + [%u|b%"descriptor"]=> + resource(15) of type (oci8 descriptor) + } + [%u|b%"COL3"]=> + %unicode|string%(11) "1 more text" +} +object(stdClass)#%d (3) { + [%u|b%"COL1"]=> + %unicode|string%(3) "456" + [%u|b%"COL2"]=> + object(OCI-Lob)#%d (1) { + [%u|b%"descriptor"]=> + resource(16) of type (oci8 descriptor) + } + [%u|b%"COL3"]=> + NULL +} +object(stdClass)#%d (3) { + [%u|b%"COL1"]=> + %unicode|string%(3) "789" + [%u|b%"COL2"]=> + object(OCI-Lob)#%d (1) { + [%u|b%"descriptor"]=> + resource(17) of type (oci8 descriptor) + } + [%u|b%"COL3"]=> + %unicode|string%(11) "3 more text" +} +Test 2 +123 +1st row col2 string +1 more text +456 +2nd row col2 string + +789 +3rd row col2 string +3 more text +===DONE=== diff --git a/ext/oci8/tests/fetch_row.phpt b/ext/oci8/tests/fetch_row.phpt index a637ecc6f..c6084d4fe 100644 --- a/ext/oci8/tests/fetch_row.phpt +++ b/ext/oci8/tests/fetch_row.phpt @@ -5,28 +5,39 @@ oci_fetch_row() --FILE-- ---EXPECT-- -array(5) { +--EXPECTF-- +array(2) { [0]=> - string(1) "1" + %unicode|string%(1) "1" [1]=> - string(1) "1" - [2]=> - NULL - [3]=> - NULL - [4]=> - NULL + %unicode|string%(1) "1" } -array(5) { +array(2) { [0]=> - string(1) "1" + %unicode|string%(1) "1" [1]=> - string(1) "1" - [2]=> - NULL - [3]=> - NULL - [4]=> - NULL + %unicode|string%(1) "1" } -array(5) { +array(2) { [0]=> - string(1) "1" + %unicode|string%(1) "1" [1]=> - string(1) "1" - [2]=> - NULL - [3]=> - NULL - [4]=> - NULL + %unicode|string%(1) "1" } Done diff --git a/ext/oci8/tests/field_funcs1.phpt b/ext/oci8/tests/field_funcs1.phpt index b41e743e4..0b4ad76b3 100644 --- a/ext/oci8/tests/field_funcs1.phpt +++ b/ext/oci8/tests/field_funcs1.phpt @@ -5,28 +5,39 @@ oci_field_*() family --FILE-- --EXPECTF-- -array(5) { +array(2) { [0]=> - string(1) "1" + %unicode|string%(1) "1" [1]=> - string(1) "1" - [2]=> - NULL - [3]=> - NULL - [4]=> - NULL + %unicode|string%(1) "1" } Warning: oci_field_is_null(): Invalid column index "-1" in %s on line %d diff --git a/ext/oci8/tests/field_funcs2.phpt b/ext/oci8/tests/field_funcs2.phpt index 9b8d3e5a2..502d07913 100644 --- a/ext/oci8/tests/field_funcs2.phpt +++ b/ext/oci8/tests/field_funcs2.phpt @@ -5,10 +5,9 @@ Bug #41917 (invalid scale and precision) --FILE-- "NUMBER", @@ -29,7 +28,7 @@ $t = array("C01" => "NUMBER", "C16" => "REAL", ); -$stmt = "create table b41917t (\n"; +$stmt = "create table field_funcs2_tab (\n"; foreach ($t as $colname => $type) { $stmt .= "$colname $type,\n"; } @@ -38,7 +37,7 @@ $stmt[strlen($stmt)-2] = ")"; $s = oci_parse($c, $stmt); oci_execute($s); -$s = oci_parse($c, "select * from b41917t"); +$s = oci_parse($c, "select * from field_funcs2_tab"); oci_execute($s); for ($i = 1; $i <= oci_num_fields($s); $i++) { @@ -67,4 +66,4 @@ C13 FLOAT: precision 126, scale -127 C14 FLOAT(9): precision 9, scale -127 C15 DOUBLE PRECISION: precision 126, scale -127 C16 REAL: precision 63, scale -127 -Done \ No newline at end of file +Done diff --git a/ext/oci8/tests/lob_043.phpt b/ext/oci8/tests/lob_043.phpt new file mode 100644 index 000000000..5ae2d45eb --- /dev/null +++ b/ext/oci8/tests/lob_043.phpt @@ -0,0 +1,101 @@ +--TEST-- +Bug #49560 (LOB resource destructor and refcount test) +--SKIPIF-- + +--FILE-- +load(), "\n"; + } +*/ + +// Clean up + +$stmtarray = array( + "drop table lob_043_tab" +); + +foreach ($stmtarray as $stmt) { + $s = oci_parse($c, $stmt); + oci_execute($s); +} + +oci_close($c); + +?> +===DONE=== + +--EXPECTF-- +Test 1 +f1 ended +Test 2 +f2 ended +===DONE=== diff --git a/ext/oci8/tests/num.phpt b/ext/oci8/tests/num.phpt index 458e3774f..e9dc6a8ac 100644 --- a/ext/oci8/tests/num.phpt +++ b/ext/oci8/tests/num.phpt @@ -5,8 +5,34 @@ oci_num_*() family --FILE-- --EXPECTF-- -PHP Warning: Directive 'safe_mode' is deprecated in PHP 5.3 and greater in Unknown on line 0 +%sarning:%sDirective 'safe_mode' is deprecated in PHP 5.3 and greater in Unknown on line 0 Warning: oci_connect(): Privileged connect is disabled in Safe Mode in %s on line %d diff --git a/ext/oci8/tests/password_new.phpt b/ext/oci8/tests/password_new.phpt index e8642abca..ba6baa964 100644 --- a/ext/oci8/tests/password_new.phpt +++ b/ext/oci8/tests/password_new.phpt @@ -3,21 +3,21 @@ oci_password_change() --SKIPIF-- 10/', $phpinfo); if ($iv === 1) { - die ("skip test known to fail using Oracle 10gR2 client libs connecting to Oracle 11.1 (6277160)"); + die ("skip test known to fail using Oracle 10.2.0.4 client libs connecting to Oracle 11 (6277160)"); } } ?> diff --git a/ext/oci8/tests/password_old.phpt b/ext/oci8/tests/password_old.phpt index 157bdebca..abcaeb1e5 100644 --- a/ext/oci8/tests/password_old.phpt +++ b/ext/oci8/tests/password_old.phpt @@ -3,21 +3,21 @@ ocipasswordchange() --SKIPIF-- 10/', $phpinfo); if ($iv === 1) { - die ("skip test known to fail using Oracle 10gR2 client libs connecting to Oracle 11.1 (6277160)"); + die ("skip test known to fail using Oracle 10.2.0.4 client libs connecting to Oracle 11 (6277160)"); } } ?> diff --git a/ext/oci8/tests/prefetch.phpt b/ext/oci8/tests/prefetch.phpt index fa4b8fdc6..26762601d 100644 --- a/ext/oci8/tests/prefetch.phpt +++ b/ext/oci8/tests/prefetch.phpt @@ -5,26 +5,39 @@ oci_set_prefetch() --FILE-- --EXPECT-- diff --git a/ext/oci8/tests/prefetch_old.phpt b/ext/oci8/tests/prefetch_old.phpt index cb9cb390e..c2ac8fe84 100644 --- a/ext/oci8/tests/prefetch_old.phpt +++ b/ext/oci8/tests/prefetch_old.phpt @@ -5,26 +5,41 @@ ocisetprefetch() --FILE-- diff --git a/ext/oci8/tests/refcur_prefetch_1.phpt b/ext/oci8/tests/refcur_prefetch_1.phpt new file mode 100644 index 000000000..c603fdd5b --- /dev/null +++ b/ext/oci8/tests/refcur_prefetch_1.phpt @@ -0,0 +1,256 @@ +--TEST-- +Prefetch with REF cursor. Test different values for prefetch with oci_set_prefetch(). +--SKIPIF-- + (11\.2|12\.)/', $phpinfo); +if ($iv == 1) { + $sv = oci_server_version($c); + $sv = preg_match('/Release 1[012]\./', $sv, $matches); + if ($sv != 1) { + die ("skip expected output only valid when using Oracle 10g or greater server"); + } +} +else { + die ("skip expected output only valid when using Oracle 11.2 or greater client"); +} +?> +--FILE-- + +--EXPECTF-- +----------------------------------------------- +Test with Prefetch value set to 0 +----------------------------------------------- +Fetch Row from PHP +array(2) { + [0]=> + %unicode|string%(%d) "0" + [1]=> + %unicode|string%(%d) "test0" +} +Fetch Row from PL/SQL +%unicode|string%(%d) "1" +%unicode|string%(%d) "test1" +----------------------------------------------- +Test with Prefetch value set to 1 +----------------------------------------------- +Fetch Row from PHP +array(2) { + [0]=> + %unicode|string%(%d) "0" + [1]=> + %unicode|string%(%d) "test0" +} +Fetch Row from PL/SQL +%unicode|string%(%d) "2" +%unicode|string%(%d) "test2" +----------------------------------------------- +Test with Prefetch value set to 501 +----------------------------------------------- +Fetch Row from PHP +array(2) { + [0]=> + %unicode|string%(%d) "0" + [1]=> + %unicode|string%(%d) "test0" +} + +Warning: oci_execute(): ORA-01002: %s +ORA-06512: at "SYSTEM.REFCURPKG", line %d +ORA-06512: at line %d in %s on line %d +Fetch Row from PL/SQL +NULL +NULL +----------------------------------------------- +Test with Prefetch value set to 499 +----------------------------------------------- +Fetch Row from PHP +array(2) { + [0]=> + %unicode|string%(%d) "0" + [1]=> + %unicode|string%(%d) "test0" +} +Fetch Row from PL/SQL +%unicode|string%(%d) "500" +%unicode|string%(%d) "test500" +----------------------------------------------- +Test with Prefetch value set to 250 +----------------------------------------------- +Fetch Row from PHP +array(2) { + [0]=> + %unicode|string%(%d) "0" + [1]=> + %unicode|string%(%d) "test0" +} +Fetch Row from PL/SQL +%unicode|string%(%d) "251" +%unicode|string%(%d) "test251" +----------------------------------------------- +Test with Prefetch value set to 12345 +----------------------------------------------- +Fetch Row from PHP +array(2) { + [0]=> + %unicode|string%(%d) "0" + [1]=> + %unicode|string%(%d) "test0" +} + +Warning: oci_execute(): ORA-01002: %s +ORA-06512: at "SYSTEM.REFCURPKG", line %d +ORA-06512: at line %d in %s on line %d +Fetch Row from PL/SQL +NULL +NULL +----------------------------------------------- +Test with Prefetch value set to -12345 +----------------------------------------------- + +Warning: oci_set_prefetch(): Number of rows to be prefetched has to be greater than or equal to 0 in %s on line %d +Fetch Row from PHP +array(2) { + [0]=> + %unicode|string%(%d) "0" + [1]=> + %unicode|string%(%d) "test0" +} +Fetch Row from PL/SQL +%unicode|string%(%d) "101" +%unicode|string%(%d) "test101" +----------------------------------------------- +Test with Prefetch value set to -1 +----------------------------------------------- + +Warning: oci_set_prefetch(): Number of rows to be prefetched has to be greater than or equal to 0 in %s on line %d +Fetch Row from PHP +array(2) { + [0]=> + %unicode|string%(%d) "0" + [1]=> + %unicode|string%(%d) "test0" +} +Fetch Row from PL/SQL +%unicode|string%(%d) "101" +%unicode|string%(%d) "test101" +Done diff --git a/ext/oci8/tests/refcur_prefetch_2.phpt b/ext/oci8/tests/refcur_prefetch_2.phpt new file mode 100644 index 000000000..751ffa78f --- /dev/null +++ b/ext/oci8/tests/refcur_prefetch_2.phpt @@ -0,0 +1,317 @@ +--TEST-- +Prefetch with REF cursor. Test No 2 +--SKIPIF-- + (11\.2|12\.)/', $phpinfo); +if ($iv == 1) { + $sv = oci_server_version($c); + $sv = preg_match('/Release 1[012]\./', $sv, $matches); + if ($sv != 1) { + die ("skip expected output only valid when using Oracle 10g or greater server"); + } +} +else { + die ("skip expected output only valid when using Oracle 11.1 or greater client"); +} +?> +--FILE-- + +--EXPECTF-- +------Test 1- Check Roundtrips with prefetch 0 and 5 ----------- +array(2) { + [0]=> + %unicode|string%(%d) "0" + [1]=> + %unicode|string%(%d) "test0" +} +array(2) { + [0]=> + %unicode|string%(%d) "1" + [1]=> + %unicode|string%(%d) "test1" +} +array(2) { + [0]=> + %unicode|string%(%d) "2" + [1]=> + %unicode|string%(%d) "test2" +} +array(2) { + [0]=> + %unicode|string%(%d) "3" + [1]=> + %unicode|string%(%d) "test3" +} +array(2) { + [0]=> + %unicode|string%(%d) "4" + [1]=> + %unicode|string%(%d) "test4" +} +Number of roundtrips made with prefetch count 0 for 5 rows is 6 +array(2) { + [0]=> + %unicode|string%(%d) "5" + [1]=> + %unicode|string%(%d) "test5" +} +array(2) { + [0]=> + %unicode|string%(%d) "6" + [1]=> + %unicode|string%(%d) "test6" +} +array(2) { + [0]=> + %unicode|string%(%d) "7" + [1]=> + %unicode|string%(%d) "test7" +} +array(2) { + [0]=> + %unicode|string%(%d) "8" + [1]=> + %unicode|string%(%d) "test8" +} +array(2) { + [0]=> + %unicode|string%(%d) "9" + [1]=> + %unicode|string%(%d) "test9" +} +Number of roundtrips made with prefetch count 5 for 5 rows is 2 +------Test 2 - Set Prefetch before PL/SQL fetch ---------- +Fetch Row from PHP +array(2) { + [0]=> + %unicode|string%(%d) "0" + [1]=> + %unicode|string%(%d) "test0" +} +Fetch Row from PL/SQL +%unicode|string%(%d) "101" +%unicode|string%(%d) "test101" +------Test 3 - Set Prefetch after PL/SQL fetch ---------- + +Warning: oci_execute(): ORA-01001: %s +ORA-06512: at "SYSTEM.REFCURPKG", line %d +ORA-06512: at line %d in %s on line %d +Fetch Row from PL/SQL +%unicode|string%(%d) "101" +%unicode|string%(%d) "test101" +Fetch Row from PHP +array(2) { + [0]=> + %unicode|string%(%d) "0" + [1]=> + %unicode|string%(%d) "test0" +} +------Test 4- Overwrite prefetch----------- +Fetch Row from PHP +array(2) { + [0]=> + %unicode|string%(%d) "0" + [1]=> + %unicode|string%(%d) "test0" +} +Fetch Row from PL/SQL +%unicode|string%(%d) "101" +%unicode|string%(%d) "test101" +Done diff --git a/ext/oci8/tests/refcur_prefetch_3.phpt b/ext/oci8/tests/refcur_prefetch_3.phpt new file mode 100644 index 000000000..0666a96e9 --- /dev/null +++ b/ext/oci8/tests/refcur_prefetch_3.phpt @@ -0,0 +1,161 @@ +--TEST-- +Prefetch with Nested cursors with INI setting. +--INI-- +oci8.default_prefetch=5 +--SKIPIF-- + (11\.2|12\.)/', $phpinfo); +if ($iv == 1) { + $sv = oci_server_version($c); + $sv = preg_match('/Release (11\.2|12\.)/', $sv, $matches); + if ($sv != 1) { + die ("skip expected output only valid when using Oracle 11.2 or greater server"); + } +} +else { + die ("skip expected output only valid when using Oracle 11.2 or greater client"); +} + +?> +--FILE-- + +--EXPECTF-- +----------------------------------------------- +Test with Nested Cursors +----------------------------------------------- +Fetch Row using Nested cursor Query +array(1) { + [0]=> + %unicode|string%(%d) "test0" +} +Fetch Row using Nested cursor Query +array(1) { + [0]=> + %unicode|string%(%d) "test1" +} +Fetch Row using Nested cursor Query +array(1) { + [0]=> + %unicode|string%(%d) "test2" +} +Fetch Row using Nested cursor Query +array(1) { + [0]=> + %unicode|string%(%d) "test3" +} +Fetch Row using Nested cursor Query +array(1) { + [0]=> + %unicode|string%(%d) "test4" +} +Fetch Row using Nested cursor Query +array(1) { + [0]=> + %unicode|string%(%d) "test5" +} +Fetch Row using Nested cursor Query +array(1) { + [0]=> + %unicode|string%(%d) "test6" +} +Fetch Row using Nested cursor Query +array(1) { + [0]=> + %unicode|string%(%d) "test7" +} +Fetch Row using Nested cursor Query +array(1) { + [0]=> + %unicode|string%(%d) "test8" +} +Fetch Row using Nested cursor Query +array(1) { + [0]=> + %unicode|string%(%d) "test9" +} +Number of roundtrips made with prefetch count 5 for 10 rows is 3 +Done diff --git a/ext/oci8/tests/reflection1.phpt b/ext/oci8/tests/reflection1.phpt index 62ee02b84..5f2e73d80 100644 --- a/ext/oci8/tests/reflection1.phpt +++ b/ext/oci8/tests/reflection1.phpt @@ -121,6 +121,11 @@ reflection::export(new reflectionfunction('ocicollassignelem')); reflection::export(new reflectionfunction('ocicollsize')); reflection::export(new reflectionfunction('ocicollmax')); reflection::export(new reflectionfunction('ocicolltrim')); +reflection::export(new reflectionfunction('oci_set_edition')); +reflection::export(new reflectionfunction('oci_set_module_name')); +reflection::export(new reflectionfunction('oci_set_action')); +reflection::export(new reflectionfunction('oci_set_client_info')); +reflection::export(new reflectionfunction('oci_set_client_identifier')); ?> ===DONE=== @@ -1049,4 +1054,43 @@ Function [ function ocicolltrim ] { } } +Function [ function oci_set_edition ] { + + - Parameters [1] { + Parameter #0 [ $edition_name ] + } +} + +Function [ function oci_set_module_name ] { + + - Parameters [2] { + Parameter #0 [ $connection_resource ] + Parameter #1 [ $module_name ] + } +} + +Function [ function oci_set_action ] { + + - Parameters [2] { + Parameter #0 [ $connection_resource ] + Parameter #1 [ $action ] + } +} + +Function [ function oci_set_client_info ] { + + - Parameters [2] { + Parameter #0 [ $connection_resource ] + Parameter #1 [ $client_information ] + } +} + +Function [ function oci_set_client_identifier ] { + + - Parameters [2] { + Parameter #0 [ $connection_resource ] + Parameter #1 [ $client_identifier ] + } +} + ===DONE=== diff --git a/ext/oci8/tests/xmltype_02.phpt b/ext/oci8/tests/xmltype_02.phpt new file mode 100644 index 000000000..9b6fa8ad3 --- /dev/null +++ b/ext/oci8/tests/xmltype_02.phpt @@ -0,0 +1,197 @@ +--TEST-- +Basic XMLType test #2 +--SKIPIF-- + +--FILE-- + + +1 +Southlake, Texas +Owned +25000 +2 +Rear load +true +N +Street +10 + +EOF; + +echo "Test 1 Insert new XML data using a temporary CLOB\n"; +$s = oci_parse($c, + "insert into xmltype_02_tab (warehouse_id, warehouse_spec) + values (:id, XMLType(:clob))"); +oci_bind_by_name($s, ':id', $id); +$lob = oci_new_descriptor($c, OCI_D_LOB); +oci_bind_by_name($s, ':clob', $lob, -1, OCI_B_CLOB); +$lob->writeTemporary($xml); +oci_execute($s); +$lob->close(); + +// Query the row back +$s = oci_parse($c, 'select xmltype.getclobval(warehouse_spec) + from xmltype_02_tab where warehouse_id = :id'); +$r = oci_bind_by_name($s, ':id', $id); +oci_execute($s); +$row = oci_fetch_array($s, OCI_NUM); + +var_dump($row); + +echo "Test 2 Manipulate the data using SimpleXML\n"; + +$sx = simplexml_load_string((binary)$row[0]->load()); +$row[0]->free(); +var_dump($sx); + +$sx->Docks -= 1; // change the data + +var_dump($sx); + +echo "Test 3: Update changes using a temporary CLOB\n"; + +$s = oci_parse($c, 'update xmltype_02_tab + set warehouse_spec = XMLType(:clob) + where warehouse_id = :id'); +oci_bind_by_name($s, ':id', $id); +$lob = oci_new_descriptor($c, OCI_D_LOB); +oci_bind_by_name($s, ':clob', $lob, -1, OCI_B_CLOB); +$lob->writeTemporary($sx->asXml()); +oci_execute($s); +$lob->close(); + +// Query the changed row back and print it +$s = oci_parse($c, 'select xmltype.getclobval(warehouse_spec) + from xmltype_02_tab where warehouse_id = :id'); +$r = oci_bind_by_name($s, ':id', $id); +oci_execute($s); +$row = oci_fetch_array($s, OCI_NUM); +var_dump($row[0]->load()); +$row[0]->free(); + +// Clean up + +//require(dirname(__FILE__).'/drop_table.inc'); + +$stmtarray = array( + "drop table xmltype_02_tab" +); + +foreach ($stmtarray as $stmt) { + $s = oci_parse($c, $stmt); + oci_execute($s); +} + +oci_close($c); + +?> +===DONE=== + +--EXPECTF-- +Test 1 Insert new XML data using a temporary CLOB +array(1) { + [0]=> + object(OCI-Lob)#%d (1) { + [%u|b%"descriptor"]=> + resource(%d) of type (oci8 descriptor) + } +} +Test 2 Manipulate the data using SimpleXML +object(SimpleXMLElement)#%d (10) { + [%u|b%"WarehouseId"]=> + %unicode|string%(1) "1" + [%u|b%"WarehouseName"]=> + %unicode|string%(16) "Southlake, Texas" + [%u|b%"Building"]=> + %unicode|string%(5) "Owned" + [%u|b%"Area"]=> + %unicode|string%(5) "25000" + [%u|b%"Docks"]=> + %unicode|string%(1) "2" + [%u|b%"DockType"]=> + %unicode|string%(9) "Rear load" + [%u|b%"WaterAccess"]=> + %unicode|string%(4) "true" + [%u|b%"RailAccess"]=> + %unicode|string%(1) "N" + [%u|b%"Parking"]=> + %unicode|string%(6) "Street" + [%u|b%"VClearance"]=> + %unicode|string%(2) "10" +} +object(SimpleXMLElement)#%d (10) { + [%u|b%"WarehouseId"]=> + %unicode|string%(1) "1" + [%u|b%"WarehouseName"]=> + %unicode|string%(16) "Southlake, Texas" + [%u|b%"Building"]=> + %unicode|string%(5) "Owned" + [%u|b%"Area"]=> + %unicode|string%(5) "25000" + [%u|b%"Docks"]=> + %unicode|string%(1) "1" + [%u|b%"DockType"]=> + %unicode|string%(9) "Rear load" + [%u|b%"WaterAccess"]=> + %unicode|string%(4) "true" + [%u|b%"RailAccess"]=> + %unicode|string%(1) "N" + [%u|b%"Parking"]=> + %unicode|string%(6) "Street" + [%u|b%"VClearance"]=> + %unicode|string%(2) "10" +} +Test 3: Update changes using a temporary CLOB +%unicode|string%(331) " + +1 +Southlake, Texas +Owned +25000 +1 +Rear load +true +N +Street +10 + +" +===DONE=== \ No newline at end of file diff --git a/ext/odbc/birdstep.c b/ext/odbc/birdstep.c index 6f778a72c..3f04d2118 100644 --- a/ext/odbc/birdstep.c +++ b/ext/odbc/birdstep.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: birdstep.c 281742 2009-06-06 02:40:49Z mattwil $ */ +/* $Id: birdstep.c 293036 2010-01-03 09:23:27Z sebastian $ */ /* * TODO: diff --git a/ext/odbc/php_birdstep.h b/ext/odbc/php_birdstep.h index 791cfb1b4..778e399b1 100644 --- a/ext/odbc/php_birdstep.h +++ b/ext/odbc/php_birdstep.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_birdstep.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_birdstep.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_BIRDSTEP_H #define PHP_BIRDSTEP_H diff --git a/ext/odbc/php_odbc.c b/ext/odbc/php_odbc.c index 4d74b29c7..631b10ec5 100644 --- a/ext/odbc/php_odbc.c +++ b/ext/odbc/php_odbc.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -20,7 +20,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_odbc.c 280531 2009-05-14 17:24:42Z felipe $ */ +/* $Id: php_odbc.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -981,6 +981,10 @@ int odbc_bindcols(odbc_result *result TSRMLS_DC) NULL, 0, NULL, &displaysize); displaysize = displaysize <= result->longreadlen ? displaysize : result->longreadlen; + /* Workaround for Oracle ODBC Driver bug (#50162) when fetching TIMESTAMP column */ + if (result->values[i].coltype == SQL_TIMESTAMP) { + displaysize += 3; + } result->values[i].value = (char *)emalloc(displaysize + 1); rc = SQLBindCol(result->stmt, (SQLUSMALLINT)(i+1), SQL_C_CHAR, result->values[i].value, displaysize + 1, &result->values[i].vallen); @@ -1176,13 +1180,7 @@ PHP_FUNCTION(odbc_prepare) /* Try to set CURSOR_TYPE to dynamic. Driver will replace this with other type if not possible. */ - int cursortype = ODBCG(default_cursortype); - if (SQLSetStmtOption(result->stmt, SQL_CURSOR_TYPE, cursortype) == SQL_ERROR) { - odbc_sql_error(conn, result->stmt, " SQLSetStmtOption"); - SQLFreeStmt(result->stmt, SQL_DROP); - efree(result); - RETURN_FALSE; - } + SQLSetStmtOption(result->stmt, SQL_CURSOR_TYPE, ODBCG(default_cursortype)); } } else { result->fetch_abs = 0; @@ -1572,13 +1570,7 @@ PHP_FUNCTION(odbc_exec) /* Try to set CURSOR_TYPE to dynamic. Driver will replace this with other type if not possible. */ - int cursortype = ODBCG(default_cursortype); - if (SQLSetStmtOption(result->stmt, SQL_CURSOR_TYPE, cursortype) == SQL_ERROR) { - odbc_sql_error(conn, result->stmt, " SQLSetStmtOption"); - SQLFreeStmt(result->stmt, SQL_DROP); - efree(result); - RETURN_FALSE; - } + SQLSetStmtOption(result->stmt, SQL_CURSOR_TYPE, ODBCG(default_cursortype)); } } else { result->fetch_abs = 0; diff --git a/ext/odbc/php_odbc.h b/ext/odbc/php_odbc.h index e2157569a..9045d754b 100644 --- a/ext/odbc/php_odbc.h +++ b/ext/odbc/php_odbc.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_odbc.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_odbc.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_ODBC_H #define PHP_ODBC_H diff --git a/ext/odbc/php_odbc_includes.h b/ext/odbc/php_odbc_includes.h index fce92f12c..fd87efea5 100644 --- a/ext/odbc/php_odbc_includes.h +++ b/ext/odbc/php_odbc_includes.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_odbc_includes.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_odbc_includes.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_ODBC_INCLUDES_H #define PHP_ODBC_INCLUDES_H diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index d3e425eee..8df0d9d69 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -20,7 +20,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: openssl.c 289443 2009-10-09 19:08:56Z pajoye $ */ +/* $Id: openssl.c 294508 2010-02-04 09:23:22Z pajoye $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -51,13 +51,19 @@ /* Common */ #include +#ifdef NETWARE +#define timezone _timezone /* timezone is called _timezone in LibC */ +#endif + #define DEFAULT_KEY_LENGTH 512 #define MIN_KEY_LENGTH 384 #define OPENSSL_ALGO_SHA1 1 #define OPENSSL_ALGO_MD5 2 #define OPENSSL_ALGO_MD4 3 +#ifdef HAVE_OPENSSL_MD2_H #define OPENSSL_ALGO_MD2 4 +#endif #define OPENSSL_ALGO_DSS1 5 #define DEBUG_SMIME 0 @@ -913,9 +919,11 @@ static EVP_MD * php_openssl_get_evp_md_from_algo(long algo) { /* {{{ */ case OPENSSL_ALGO_MD4: mdtype = (EVP_MD *) EVP_md4(); break; +#ifdef HAVE_OPENSSL_MD2_H case OPENSSL_ALGO_MD2: mdtype = (EVP_MD *) EVP_md2(); break; +#endif case OPENSSL_ALGO_DSS1: mdtype = (EVP_MD *) EVP_dss1(); break; @@ -997,7 +1005,9 @@ PHP_MINIT_FUNCTION(openssl) REGISTER_LONG_CONSTANT("OPENSSL_ALGO_SHA1", OPENSSL_ALGO_SHA1, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("OPENSSL_ALGO_MD5", OPENSSL_ALGO_MD5, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("OPENSSL_ALGO_MD4", OPENSSL_ALGO_MD4, CONST_CS|CONST_PERSISTENT); +#ifdef HAVE_OPENSSL_MD2_H REGISTER_LONG_CONSTANT("OPENSSL_ALGO_MD2", OPENSSL_ALGO_MD2, CONST_CS|CONST_PERSISTENT); +#endif REGISTER_LONG_CONSTANT("OPENSSL_ALGO_DSS1", OPENSSL_ALGO_DSS1, CONST_CS|CONST_PERSISTENT); /* flags for S/MIME */ @@ -1037,6 +1047,11 @@ PHP_MINIT_FUNCTION(openssl) REGISTER_LONG_CONSTANT("OPENSSL_KEYTYPE_EC", OPENSSL_KEYTYPE_EC, CONST_CS|CONST_PERSISTENT); #endif +#if OPENSSL_VERSION_NUMBER >= 0x0090806fL && !defined(OPENSSL_NO_TLSEXT) + /* SNI support included in OpenSSL >= 0.9.8j */ + REGISTER_LONG_CONSTANT("OPENSSL_TLSEXT_SERVER_NAME", 1, CONST_CS|CONST_PERSISTENT); +#endif + /* Determine default SSL configuration file */ config_filename = getenv("OPENSSL_CONF"); if (config_filename == NULL) { @@ -1738,18 +1753,18 @@ PHP_FUNCTION(openssl_pkcs12_export_to_file) int filename_len; char * pass; int pass_len; - zval *zcert = NULL, *zpkey = NULL, *args = NULL; + zval **zcert = NULL, *zpkey = NULL, *args = NULL; EVP_PKEY *priv_key = NULL; long certresource, keyresource; zval ** item; STACK_OF(X509) *ca = NULL; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zszs|a", &zcert, &filename, &filename_len, &zpkey, &pass, &pass_len, &args) == FAILURE) + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Zszs|a", &zcert, &filename, &filename_len, &zpkey, &pass, &pass_len, &args) == FAILURE) return; RETVAL_FALSE; - cert = php_openssl_x509_from_zval(&zcert, 0, &certresource TSRMLS_CC); + cert = php_openssl_x509_from_zval(zcert, 0, &certresource TSRMLS_CC); if (cert == NULL) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "cannot get cert from parameter 1"); return; diff --git a/ext/openssl/php_openssl.h b/ext/openssl/php_openssl.h index 1aa8adf8d..bddd8e732 100644 --- a/ext/openssl/php_openssl.h +++ b/ext/openssl/php_openssl.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_openssl.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_openssl.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_OPENSSL_H #define PHP_OPENSSL_H diff --git a/ext/openssl/tests/bug48182.phpt b/ext/openssl/tests/bug48182.phpt index 0af04e1a9..7471c4c5d 100644 --- a/ext/openssl/tests/bug48182.phpt +++ b/ext/openssl/tests/bug48182.phpt @@ -28,12 +28,12 @@ function ssl_server($port) { $r = array($link); $w = array(); $e = array(); - if (stream_select($r, $w, $e, 0, 1000) != 0) + if (stream_select($r, $w, $e, 1, 0) != 0) $data .= fread($link, 8192); $r = array(); $w = array($link); - if (stream_select($r, $w, $e, 0, 1000) != 0) + if (stream_select($r, $w, $e, 1, 0) != 0) $wrote = fwrite($link, $data, strlen($data)); // close stuff @@ -59,7 +59,7 @@ function ssl_async_client($port) { $r = array($socket); $w = array(); $e = array(); - if (stream_select($r, $w, $e, 0, 10) != 0) + if (stream_select($r, $w, $e, 1, 0) != 0) { $data .= fread($socket, 1024); } diff --git a/ext/openssl/tests/sni_001.phpt b/ext/openssl/tests/sni_001.phpt new file mode 100644 index 000000000..3d7798cf8 --- /dev/null +++ b/ext/openssl/tests/sni_001.phpt @@ -0,0 +1,178 @@ +--TEST-- +SNI 001 +--SKIPIF-- + +--FILE-- + array( + 'capture_peer_cert' => true, + ), + )); +} + +function get_CN($context) { + + $ary = stream_context_get_options($context); + assert($ary); + + $cert = $ary['ssl']['peer_certificate']; + assert($cert); + + $cert_ary = openssl_x509_parse($cert); + return $cert_ary['subject']['CN']; +} + +function do_http_test($url, $context) { + + $fh = fopen($url, 'r', false, $context); + assert($fh); + + var_dump(get_CN($context)); +} + +function do_ssl_test($url, $context) { + + $fh = stream_socket_client($url, $errno, $errstr, + ini_get("default_socket_timeout"), STREAM_CLIENT_CONNECT, $context); + assert($fh); + + var_dump(get_CN($context)); +} + +function do_enable_crypto_test($url, $context) { + + $fh = stream_socket_client($url, $errno, $errstr, + ini_get("default_socket_timeout"), STREAM_CLIENT_CONNECT, $context); + assert($fh); + + $r = stream_socket_enable_crypto($fh, true, STREAM_CRYPTO_METHOD_TLS_CLIENT); + assert($r); + + var_dump(get_CN($context)); +} + +/* Test https:// streams */ + +echo "-- auto host name (1) --\n"; +do_http_test('https://alice.sni.velox.ch/', context()); + +echo "-- auto host name (2) --\n"; +do_http_test('https://bob.sni.velox.ch/', context()); + +echo "-- auto host name (3) --\n"; +do_http_test('https://bob.sni.velox.ch./', context()); + +echo "-- user supplied server name --\n"; + +$context = context(); +stream_context_set_option($context, 'ssl', 'SNI_server_name', 'bob.sni.velox.ch'); +stream_context_set_option($context, 'http', 'header', b'Host: bob.sni.velox.ch'); +do_http_test('https://alice.sni.velox.ch/', $context); + +echo "-- sni disabled --\n"; + +$context = context(); +stream_context_set_option($context, 'ssl', 'SNI_enabled', false); +do_http_test('https://bob.sni.velox.ch/', $context); + +/* Test ssl:// socket streams */ + +echo "-- raw SSL stream (1) --\n"; +do_ssl_test('ssl://bob.sni.velox.ch:443', context()); + +echo "-- raw SSL stream (2) --\n"; +do_ssl_test('ssl://mallory.sni.velox.ch:443', context()); + +echo "-- raw SSL stream with user supplied sni --\n"; + +$context = context(); +stream_context_set_option($context, 'ssl', 'SNI_server_name', 'bob.sni.velox.ch'); + +do_ssl_test('ssl://mallory.sni.velox.ch:443', $context); + +echo "-- raw SSL stream with sni disabled --\n"; + +$context = context(); +stream_context_set_option($context, 'ssl', 'SNI_enabled', false); + +do_ssl_test('ssl://mallory.sni.velox.ch:443', $context); + +/* Test tcp:// socket streams with SSL enabled */ + +echo "-- stream_socket_enable_crypto (1) --\n"; + +do_enable_crypto_test('tcp://bob.sni.velox.ch:443', context()); + +echo "-- stream_socket_enable_crypto (2) --\n"; + +do_enable_crypto_test('tcp://mallory.sni.velox.ch:443', context()); + +echo "-- stream_socket_enable_crypto with user supplied sni --\n"; + +$context = context(); +stream_context_set_option($context, 'ssl', 'SNI_server_name', 'bob.sni.velox.ch'); + +do_enable_crypto_test('tcp://mallory.sni.velox.ch:443', $context); + +echo "-- stream_socket_enable_crypto with sni disabled --\n"; + +$context = context(); +stream_context_set_option($context, 'ssl', 'SNI_enabled', false); + +do_enable_crypto_test('tcp://mallory.sni.velox.ch:443', $context); + +echo "-- stream_socket_enable_crypto with long name --\n"; + +$context = context(); +stream_context_set_option($context, 'ssl', 'SNI_server_name', str_repeat('a.', 500) . '.sni.velox.ch'); + +do_enable_crypto_test('tcp://mallory.sni.velox.ch:443', $context); + +?> +--EXPECTF-- +-- auto host name (1) -- +%unicode|string%(18) "alice.sni.velox.ch" +-- auto host name (2) -- +%unicode|string%(16) "bob.sni.velox.ch" +-- auto host name (3) -- +%unicode|string%(16) "bob.sni.velox.ch" +-- user supplied server name -- +%unicode|string%(16) "bob.sni.velox.ch" +-- sni disabled -- +%unicode|string%(18) "alice.sni.velox.ch" +-- raw SSL stream (1) -- +%unicode|string%(16) "bob.sni.velox.ch" +-- raw SSL stream (2) -- +%unicode|string%(14) "*.sni.velox.ch" +-- raw SSL stream with user supplied sni -- +%unicode|string%(16) "bob.sni.velox.ch" +-- raw SSL stream with sni disabled -- +%unicode|string%(18) "alice.sni.velox.ch" +-- stream_socket_enable_crypto (1) -- +%unicode|string%(16) "bob.sni.velox.ch" +-- stream_socket_enable_crypto (2) -- +%unicode|string%(14) "*.sni.velox.ch" +-- stream_socket_enable_crypto with user supplied sni -- +%unicode|string%(16) "bob.sni.velox.ch" +-- stream_socket_enable_crypto with sni disabled -- +%unicode|string%(18) "alice.sni.velox.ch" +-- stream_socket_enable_crypto with long name -- +%unicode|string%(18) "alice.sni.velox.ch" diff --git a/ext/openssl/xp_ssl.c b/ext/openssl/xp_ssl.c index 9462e0f91..212c003a7 100644 --- a/ext/openssl/xp_ssl.c +++ b/ext/openssl/xp_ssl.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,10 +16,11 @@ +----------------------------------------------------------------------+ */ -/* $Id: xp_ssl.c 289416 2009-10-09 14:20:17Z pajoye $ */ +/* $Id: xp_ssl.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php.h" #include "ext/standard/file.h" +#include "ext/standard/url.h" #include "streams/php_streams_int.h" #include "ext/standard/php_smart_str.h" #include "php_network.h" @@ -54,6 +55,7 @@ typedef struct _php_openssl_netstream_data_t { int is_client; int ssl_active; php_stream_xport_crypt_method_t method; + char *sni; unsigned state_set:1; unsigned _spare:31; } php_openssl_netstream_data_t; @@ -283,6 +285,9 @@ static int php_openssl_sockop_close(php_stream *stream, int close_handle TSRMLS_ } } + if (sslsock->sni) { + pefree(sslsock->sni, php_stream_is_persistent(stream)); + } pefree(sslsock, php_stream_is_persistent(stream)); return 0; @@ -393,6 +398,12 @@ static inline int php_openssl_enable_crypto(php_stream *stream, float timeout = sslsock->connect_timeout.tv_sec + sslsock->connect_timeout.tv_usec / 1000000; int blocked = sslsock->s.is_blocked; +#if OPENSSL_VERSION_NUMBER >= 0x0090806fL && !defined(OPENSSL_NO_TLSEXT) + if (sslsock->is_client && sslsock->sni) { + SSL_set_tlsext_host_name(sslsock->ssl_handle, sslsock->sni); + } +#endif + if (!sslsock->state_set) { if (sslsock->is_client) { SSL_set_connect_state(sslsock->ssl_handle); @@ -759,6 +770,52 @@ php_stream_ops php_openssl_socket_ops = { php_openssl_sockop_set_option, }; +static char * get_sni(php_stream_context *ctx, char *resourcename, long resourcenamelen, int is_persistent TSRMLS_DC) { + + php_url *url; + + if (ctx) { + zval **val = NULL; + + if (php_stream_context_get_option(ctx, "ssl", "SNI_enabled", &val) == SUCCESS && !zend_is_true(*val)) { + return NULL; + } + if (php_stream_context_get_option(ctx, "ssl", "SNI_server_name", &val) == SUCCESS) { + convert_to_string_ex(val); + return pestrdup(Z_STRVAL_PP(val), is_persistent); + } + } + + if (!resourcename) { + return NULL; + } + + url = php_url_parse_ex(resourcename, resourcenamelen); + if (!url) { + return NULL; + } + + if (url->host) { + const char * host = url->host; + char * sni = NULL; + size_t len = strlen(host); + + /* skip trailing dots */ + while (len && host[len-1] == '.') { + --len; + } + + if (len) { + sni = pestrndup(host, len, is_persistent); + } + + php_url_free(url); + return sni; + } + + php_url_free(url); + return NULL; +} php_stream *php_openssl_ssl_socket_factory(const char *proto, long protolen, char *resourcename, long resourcenamelen, @@ -795,6 +852,8 @@ php_stream *php_openssl_ssl_socket_factory(const char *proto, long protolen, return NULL; } + sslsock->sni = get_sni(context, resourcename, resourcenamelen, !!persistent_id TSRMLS_CC); + if (strncmp(proto, "ssl", protolen) == 0) { sslsock->enable_on_connect = 1; sslsock->method = STREAM_CRYPTO_METHOD_SSLv23_CLIENT; diff --git a/ext/pcntl/pcntl.c b/ext/pcntl/pcntl.c index eec6aaa33..458e1ad4d 100755 --- a/ext/pcntl/pcntl.c +++ b/ext/pcntl/pcntl.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: pcntl.c 281177 2009-05-26 14:01:39Z lbarnaud $ */ +/* $Id: pcntl.c 293036 2010-01-03 09:23:27Z sebastian $ */ #define PCNTL_DEBUG 0 @@ -727,16 +727,19 @@ PHP_FUNCTION(pcntl_exec) if (return_val == HASH_KEY_IS_LONG) efree(key); } *(pair) = NULL; - } - - if (execve(path, argv, envp) == -1) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Error has occured: (errno %d) %s", errno, strerror(errno)); - } + + if (execve(path, argv, envp) == -1) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Error has occured: (errno %d) %s", errno, strerror(errno)); + } - /* Cleanup */ - if (envp != NULL) { + /* Cleanup */ for (pair = envp; *pair != NULL; pair++) efree(*pair); efree(envp); + } else { + + if (execv(path, argv) == -1) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Error has occured: (errno %d) %s", errno, strerror(errno)); + } } efree(argv); diff --git a/ext/pcntl/php_pcntl.h b/ext/pcntl/php_pcntl.h index 6bd45b212..8b7a1f13e 100644 --- a/ext/pcntl/php_pcntl.h +++ b/ext/pcntl/php_pcntl.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_pcntl.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_pcntl.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_PCNTL_H #define PHP_PCNTL_H diff --git a/ext/pcntl/php_signal.c b/ext/pcntl/php_signal.c index 4396c0531..c0252963e 100644 --- a/ext/pcntl/php_signal.c +++ b/ext/pcntl/php_signal.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_signal.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_signal.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php_signal.h" diff --git a/ext/pcntl/php_signal.h b/ext/pcntl/php_signal.h index 73a395c44..e97cf086f 100644 --- a/ext/pcntl/php_signal.h +++ b/ext/pcntl/php_signal.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_signal.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_signal.h 293036 2010-01-03 09:23:27Z sebastian $ */ #include #ifndef PHP_SIGNAL_H diff --git a/ext/pcre/pcrelib/ChangeLog b/ext/pcre/pcrelib/ChangeLog index 93a5415ee..40600b861 100644 --- a/ext/pcre/pcrelib/ChangeLog +++ b/ext/pcre/pcrelib/ChangeLog @@ -1,6 +1,170 @@ ChangeLog for PCRE ------------------ +Version 8.00 19-Oct-09 +---------------------- + +1. The table for translating pcre_compile() error codes into POSIX error codes + was out-of-date, and there was no check on the pcre_compile() error code + being within the table. This could lead to an OK return being given in + error. + +2. Changed the call to open a subject file in pcregrep from fopen(pathname, + "r") to fopen(pathname, "rb"), which fixed a problem with some of the tests + in a Windows environment. + +3. The pcregrep --count option prints the count for each file even when it is + zero, as does GNU grep. However, pcregrep was also printing all files when + --files-with-matches was added. Now, when both options are given, it prints + counts only for those files that have at least one match. (GNU grep just + prints the file name in this circumstance, but including the count seems + more useful - otherwise, why use --count?) Also ensured that the + combination -clh just lists non-zero counts, with no names. + +4. The long form of the pcregrep -F option was incorrectly implemented as + --fixed_strings instead of --fixed-strings. This is an incompatible change, + but it seems right to fix it, and I didn't think it was worth preserving + the old behaviour. + +5. The command line items --regex=pattern and --regexp=pattern were not + recognized by pcregrep, which required --regex pattern or --regexp pattern + (with a space rather than an '='). The man page documented the '=' forms, + which are compatible with GNU grep; these now work. + +6. No libpcreposix.pc file was created for pkg-config; there was just + libpcre.pc and libpcrecpp.pc. The omission has been rectified. + +7. Added #ifndef SUPPORT_UCP into the pcre_ucd.c module, to reduce its size + when UCP support is not needed, by modifying the Python script that + generates it from Unicode data files. This should not matter if the module + is correctly used as a library, but I received one complaint about 50K of + unwanted data. My guess is that the person linked everything into his + program rather than using a library. Anyway, it does no harm. + +8. A pattern such as /\x{123}{2,2}+/8 was incorrectly compiled; the trigger + was a minimum greater than 1 for a wide character in a possessive + repetition. The same bug could also affect patterns like /(\x{ff}{0,2})*/8 + which had an unlimited repeat of a nested, fixed maximum repeat of a wide + character. Chaos in the form of incorrect output or a compiling loop could + result. + +9. The restrictions on what a pattern can contain when partial matching is + requested for pcre_exec() have been removed. All patterns can now be + partially matched by this function. In addition, if there are at least two + slots in the offset vector, the offset of the earliest inspected character + for the match and the offset of the end of the subject are set in them when + PCRE_ERROR_PARTIAL is returned. + +10. Partial matching has been split into two forms: PCRE_PARTIAL_SOFT, which is + synonymous with PCRE_PARTIAL, for backwards compatibility, and + PCRE_PARTIAL_HARD, which causes a partial match to supersede a full match, + and may be more useful for multi-segment matching. + +11. Partial matching with pcre_exec() is now more intuitive. A partial match + used to be given if ever the end of the subject was reached; now it is + given only if matching could not proceed because another character was + needed. This makes a difference in some odd cases such as Z(*FAIL) with the + string "Z", which now yields "no match" instead of "partial match". In the + case of pcre_dfa_exec(), "no match" is given if every matching path for the + final character ended with (*FAIL). + +12. Restarting a match using pcre_dfa_exec() after a partial match did not work + if the pattern had a "must contain" character that was already found in the + earlier partial match, unless partial matching was again requested. For + example, with the pattern /dog.(body)?/, the "must contain" character is + "g". If the first part-match was for the string "dog", restarting with + "sbody" failed. This bug has been fixed. + +13. The string returned by pcre_dfa_exec() after a partial match has been + changed so that it starts at the first inspected character rather than the + first character of the match. This makes a difference only if the pattern + starts with a lookbehind assertion or \b or \B (\K is not supported by + pcre_dfa_exec()). It's an incompatible change, but it makes the two + matching functions compatible, and I think it's the right thing to do. + +14. Added a pcredemo man page, created automatically from the pcredemo.c file, + so that the demonstration program is easily available in environments where + PCRE has not been installed from source. + +15. Arranged to add -DPCRE_STATIC to cflags in libpcre.pc, libpcreposix.cp, + libpcrecpp.pc and pcre-config when PCRE is not compiled as a shared + library. + +16. Added REG_UNGREEDY to the pcreposix interface, at the request of a user. + It maps to PCRE_UNGREEDY. It is not, of course, POSIX-compatible, but it + is not the first non-POSIX option to be added. Clearly some people find + these options useful. + +17. If a caller to the POSIX matching function regexec() passes a non-zero + value for nmatch with a NULL value for pmatch, the value of + nmatch is forced to zero. + +18. RunGrepTest did not have a test for the availability of the -u option of + the diff command, as RunTest does. It now checks in the same way as + RunTest, and also checks for the -b option. + +19. If an odd number of negated classes containing just a single character + interposed, within parentheses, between a forward reference to a named + subpattern and the definition of the subpattern, compilation crashed with + an internal error, complaining that it could not find the referenced + subpattern. An example of a crashing pattern is /(?&A)(([^m])(?))/. + [The bug was that it was starting one character too far in when skipping + over the character class, thus treating the ] as data rather than + terminating the class. This meant it could skip too much.] + +20. Added PCRE_NOTEMPTY_ATSTART in order to be able to correctly implement the + /g option in pcretest when the pattern contains \K, which makes it possible + to have an empty string match not at the start, even when the pattern is + anchored. Updated pcretest and pcredemo to use this option. + +21. If the maximum number of capturing subpatterns in a recursion was greater + than the maximum at the outer level, the higher number was returned, but + with unset values at the outer level. The correct (outer level) value is + now given. + +22. If (*ACCEPT) appeared inside capturing parentheses, previous releases of + PCRE did not set those parentheses (unlike Perl). I have now found a way to + make it do so. The string so far is captured, making this feature + compatible with Perl. + +23. The tests have been re-organized, adding tests 11 and 12, to make it + possible to check the Perl 5.10 features against Perl 5.10. + +24. Perl 5.10 allows subroutine calls in lookbehinds, as long as the subroutine + pattern matches a fixed length string. PCRE did not allow this; now it + does. Neither allows recursion. + +25. I finally figured out how to implement a request to provide the minimum + length of subject string that was needed in order to match a given pattern. + (It was back references and recursion that I had previously got hung up + on.) This code has now been added to pcre_study(); it finds a lower bound + to the length of subject needed. It is not necessarily the greatest lower + bound, but using it to avoid searching strings that are too short does give + some useful speed-ups. The value is available to calling programs via + pcre_fullinfo(). + +26. While implementing 25, I discovered to my embarrassment that pcretest had + not been passing the result of pcre_study() to pcre_dfa_exec(), so the + study optimizations had never been tested with that matching function. + Oops. What is worse, even when it was passed study data, there was a bug in + pcre_dfa_exec() that meant it never actually used it. Double oops. There + were also very few tests of studied patterns with pcre_dfa_exec(). + +27. If (?| is used to create subpatterns with duplicate numbers, they are now + allowed to have the same name, even if PCRE_DUPNAMES is not set. However, + on the other side of the coin, they are no longer allowed to have different + names, because these cannot be distinguished in PCRE, and this has caused + confusion. (This is a difference from Perl.) + +28. When duplicate subpattern names are present (necessarily with different + numbers, as required by 27 above), and a test is made by name in a + conditional pattern, either for a subpattern having been matched, or for + recursion in such a pattern, all the associated numbered subpatterns are + tested, and the overall condition is true if the condition is true for any + one of them. This is the way Perl works, and is also more like the way + testing by number works. + + Version 7.9 11-Apr-09 --------------------- diff --git a/ext/pcre/pcrelib/HACKING b/ext/pcre/pcrelib/HACKING index 1f30d4c48..8c6a42de3 100644 --- a/ext/pcre/pcrelib/HACKING +++ b/ext/pcre/pcrelib/HACKING @@ -67,22 +67,22 @@ many tests of the mode that might slow it down. So I re-factored the compiling functions to work this way. This got rid of about 600 lines of source. It should make future maintenance and development easier. As this was such a major change, I never released 6.8, instead upping the number to 7.0 (other quite -major changes are also present in the 7.0 release). +major changes were also present in the 7.0 release). -A side effect of this work is that the previous limit of 200 on the nesting +A side effect of this work was that the previous limit of 200 on the nesting depth of parentheses was removed. However, there is a downside: pcre_compile() runs more slowly than before (30% or more, depending on the pattern) because it -is doing a full analysis of the pattern. My hope is that this is not a big -issue. +is doing a full analysis of the pattern. My hope was that this would not be a +big issue, and in the event, nobody has commented on it. Traditional matching function ----------------------------- The "traditional", and original, matching function is called pcre_exec(), and it implements an NFA algorithm, similar to the original Henry Spencer algorithm -and the way that Perl works. Not surprising, since it is intended to be as -compatible with Perl as possible. This is the function most users of PCRE will -use most of the time. +and the way that Perl works. This is not surprising, since it is intended to be +as compatible with Perl as possible. This is the function most users of PCRE +will use most of the time. Supplementary matching function ------------------------------- @@ -119,6 +119,7 @@ quantifiers) are always just two bytes long. A list of the opcodes follows: + Opcodes with no following data ------------------------------ @@ -150,12 +151,12 @@ These items are all just one byte long OP_EXTUNI match an extended Unicode character OP_ANYNL match any Unicode newline sequence - OP_ACCEPT ) - OP_COMMIT ) - OP_FAIL ) These are Perl 5.10's "backtracking - OP_PRUNE ) control verbs". - OP_SKIP ) - OP_THEN ) + OP_ACCEPT ) These are Perl 5.10's "backtracking + OP_COMMIT ) control verbs". If OP_ACCEPT is inside + OP_FAIL ) capturing parentheses, it may be preceded + OP_PRUNE ) by one or more OP_CLOSE, followed by a 2-byte + OP_SKIP ) number, indicating which parentheses must be + OP_THEN ) closed. Repeating single characters @@ -372,12 +373,15 @@ These are like other subpatterns, but they start with the opcode OP_COND, or OP_SCOND for one that might match an empty string in an unbounded repeat. If the condition is a back reference, this is stored at the start of the subpattern using the opcode OP_CREF followed by two bytes containing the -reference number. If the condition is "in recursion" (coded as "(?(R)"), or "in -recursion of group x" (coded as "(?(Rx)"), the group number is stored at the -start of the subpattern using the opcode OP_RREF, and a value of zero for "the -whole pattern". For a DEFINE condition, just the single byte OP_DEF is used (it -has no associated data). Otherwise, a conditional subpattern always starts with -one of the assertions. +reference number. OP_NCREF is used instead if the reference was generated by +name (so that the runtime code knows to check for duplicate names). + +If the condition is "in recursion" (coded as "(?(R)"), or "in recursion of +group x" (coded as "(?(Rx)"), the group number is stored at the start of the +subpattern using the opcode OP_RREF or OP_NRREF (cf OP_NCREF), and a value of +zero for "the whole pattern". For a DEFINE condition, just the single byte +OP_DEF is used (it has no associated data). Otherwise, a conditional subpattern +always starts with one of the assertions. Recursion @@ -415,4 +419,4 @@ at compile time, and so does not cause anything to be put into the compiled data. Philip Hazel -April 2008 +October 2009 diff --git a/ext/pcre/pcrelib/LICENCE b/ext/pcre/pcrelib/LICENCE index ff443a929..73f8cde3d 100644 --- a/ext/pcre/pcrelib/LICENCE +++ b/ext/pcre/pcrelib/LICENCE @@ -4,7 +4,7 @@ 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 7 of PCRE is distributed under the terms of the "BSD" licence, as +Release 8 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. diff --git a/ext/pcre/pcrelib/NEWS b/ext/pcre/pcrelib/NEWS index 2b26fccf5..71cba379e 100644 --- a/ext/pcre/pcrelib/NEWS +++ b/ext/pcre/pcrelib/NEWS @@ -1,6 +1,21 @@ News about PCRE releases ------------------------ +Release 8.00 19-Oct-09 +---------------------- + +Bugs have been fixed in the library and in pcregrep. There are also some +enhancements. Restrictions on patterns used for partial matching have been +removed, extra information is given for partial matches, the partial matching +process has been improved, and an option to make a partial match override a +full match is available. The "study" process has been enhanced by finding a +lower bound matching length. Groups with duplicate numbers may now have +duplicated names without the use of PCRE_DUPNAMES. However, they may not have +different names. The documentation has been revised to reflect these changes. +The version number has been expanded to 3 digits as it is clear that the rate +of change is not slowing down. + + Release 7.9 11-Apr-09 --------------------- diff --git a/ext/pcre/pcrelib/NON-UNIX-USE b/ext/pcre/pcrelib/NON-UNIX-USE index 803e73e98..aca81bd56 100644 --- a/ext/pcre/pcrelib/NON-UNIX-USE +++ b/ext/pcre/pcrelib/NON-UNIX-USE @@ -12,9 +12,10 @@ This document contains the following sections: Comments about Win32 builds Building PCRE on Windows with CMake Use of relative paths with CMake on Windows - Testing with runtest.bat + Testing with RunTest.bat Building under Windows with BCC5.5 Building PCRE on OpenVMS + Building PCRE on Stratus OpenVOS GENERAL @@ -36,10 +37,10 @@ wrapper functions are a separate issue (see below). The PCRE distribution includes a "configure" file for use by the Configure/Make build system, as found in many Unix-like environments. There is also support -support for CMake, which some users prefer, in particular in Windows -environments. There are some instructions for CMake under Windows in the -section entitled "Building PCRE with CMake" below. CMake can also be used to -build PCRE in Unix-like systems. +support for CMake, which some users prefer, especially in Windows environments. +There are some instructions for CMake under Windows in the section entitled +"Building PCRE with CMake" below. CMake can also be used to build PCRE in +Unix-like systems. GENERIC INSTRUCTIONS FOR THE PCRE C LIBRARY @@ -278,40 +279,42 @@ things in this area in future. BUILDING PCRE ON WINDOWS WITH CMAKE -CMake is an alternative build facility that can be used instead of the -traditional Unix "configure". CMake version 2.4.7 supports Borland makefiles, -MinGW makefiles, MSYS makefiles, NMake makefiles, UNIX makefiles, Visual Studio -6, Visual Studio 7, Visual Studio 8, and Watcom W8. The following instructions +CMake is an alternative configuration facility that can be used instead of the +traditional Unix "configure". CMake creates project files (make files, solution +files, etc.) tailored to numerous development environments, including Visual +Studio, Borland, Msys, MinGW, NMake, and Unix. The following instructions were contributed by a PCRE user. -1. Download CMake 2.4.7 or above from http://www.cmake.org/, install and ensure - that cmake\bin is on your path. +1. Install the latest CMake version available from http://www.cmake.org/, and + ensure that cmake\bin is on your path. 2. Unzip (retaining folder structure) the PCRE source tree into a source directory such as C:\pcre. -3. Create a new, empty build directory: C:\pcre\build\ +3. Create a new, empty build directory, for example C:\pcre\build\ -4. Run CMakeSetup from the Shell envirornment of your build tool, e.g., Msys - for Msys/MinGW or Visual Studio Command Prompt for VC/VC++ +4. Run cmake-gui from the Shell envirornment of your build tool, for example, + Msys for Msys/MinGW or Visual Studio Command Prompt for VC/VC++. 5. Enter C:\pcre\pcre-xx and C:\pcre\build for the source and build - directories, respectively + directories, respectively. 6. Hit the "Configure" button. -7. Select the particular IDE / build tool that you are using (Visual Studio, - MSYS makefiles, MinGW makefiles, etc.) +7. Select the particular IDE / build tool that you are using (Visual + Studio, MSYS makefiles, MinGW makefiles, etc.) -8. The GUI will then list several configuration options. This is where you can - enable UTF-8 support, etc. +8. The GUI will then list several configuration options. This is where + you can enable UTF-8 support or other PCRE optional features. -9. Hit "Configure" again. The adjacent "OK" button should now be active. +9. Hit "Configure" again. The adjacent "Generate" button should now be + active. -10. Hit "OK". +10. Hit "Generate". 11. The build directory should now contain a usable build system, be it a - solution file for Visual Studio, makefiles for MinGW, etc. + solution file for Visual Studio, makefiles for MinGW, etc. Exit from + cmake-gui and use the generated build system with your compiler or IDE. USE OF RELATIVE PATHS WITH CMAKE ON WINDOWS @@ -444,5 +447,52 @@ $! Locale could not be set to fr $! ========================= -Last Updated: 17 March 2009 + +BUILDING PCRE ON STRATUS OPENVOS + +These notes on the port of PCRE to VOS (lightly edited) were supplied by +Ashutosh Warikoo, whose email address has the local part awarikoo and the +domain nse.co.in. The port was for version 7.9 in August 2009. + +1. Building PCRE + +I built pcre on OpenVOS Release 17.0.1at using GNU Tools 3.4a without any +problems. I used the following packages to build PCRE: + + ftp://ftp.stratus.com/pub/vos/posix/ga/posix.save.evf.gz + +Please read and follow the instructions that come with these packages. To start +the build of pcre, from the root of the package type: + + ./build.sh + +2. Installing PCRE + +Once you have successfully built PCRE, login to the SysAdmin group, switch to +the root user, and type + + [ !create_dir (master_disk)>usr --if needed ] + [ !create_dir (master_disk)>usr>local --if needed ] + !gmake install + +This installs PCRE and its man pages into /usr/local. You can add +(master_disk)>usr>local>bin to your command search paths, or if you are in +BASH, add /usr/local/bin to the PATH environment variable. + +4. Restrictions + +This port requires readline library optionally. However during the build I +faced some yet unexplored errors while linking with readline. As it was an +optional component I chose to disable it. + +5. Known Problems + +I ran a the test suite, but you will have to be your own judge of whether this +command, and this port, suits your purposes. If you find any problems that +appear to be related to the port itself, please let me know. Please see the +build.log file in the root of the package also. + + +========================= +Last Updated: 05 October 2009 **** diff --git a/ext/pcre/pcrelib/README b/ext/pcre/pcrelib/README index 6b7c83fed..c6156e25c 100644 --- a/ext/pcre/pcrelib/README +++ b/ext/pcre/pcrelib/README @@ -24,6 +24,7 @@ The contents of this README file are: Shared libraries on Unix-like systems Cross-compiling on Unix-like systems Using HP's ANSI C++ compiler (aCC) + Using PCRE from MySQL Making new tarballs Testing PCRE Character tables @@ -111,8 +112,8 @@ Building PCRE on non-Unix systems For a non-Unix system, please read the comments in the file NON-UNIX-USE, though if your system supports the use of "configure" and "make" you may be able to build PCRE in the same way as for Unix-like systems. PCRE can also be -configured in many platform environments using the GUI facility of CMake's -CMakeSetup. It creates Makefiles, solution files, etc. +configured in many platform environments using the GUI facility provided by +CMake's cmake-gui command. This creates Makefiles, solution files, etc. PCRE has been compiled on many different operating systems. It should be straightforward to build PCRE on any system that has a Standard C compiler and @@ -478,6 +479,26 @@ running the "configure" script: CXXLDFLAGS="-lstd_v2 -lCsup_v2" +Using Sun's compilers for Solaris +--------------------------------- + +A user reports that the following configurations work on Solaris 9 sparcv9 and +Solaris 9 x86 (32-bit): + + Solaris 9 sparcv9: ./configure --disable-cpp CC=/bin/cc CFLAGS="-m64 -g" + Solaris 9 x86: ./configure --disable-cpp CC=/bin/cc CFLAGS="-g" + + +Using PCRE from MySQL +--------------------- + +On systems where both PCRE and MySQL are installed, it is possible to make use +of PCRE from within MySQL, as an alternative to the built-in pattern matching. +There is a web page that tells you how to do this: + + http://www.mysqludf.org/lib_mysqludf_preg/index.php + + Making new tarballs ------------------- @@ -553,22 +574,32 @@ document entitled NON-UNIX-USE.] 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.) +running "configure". This file can be also fed directly to the perltest.pl +script, provided you are running Perl 5.8 or higher. 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 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". +The sixth test (which is Perl-5.10 compatible) 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". The seventh, eighth, and ninth tests check the pcre_dfa_exec() alternative matching function, in non-UTF-8 mode, UTF-8 mode, and UTF-8 mode with Unicode property support, respectively. The eighth and ninth tests are not run automatically unless PCRE is build with the relevant support. +The tenth test checks some internal offsets and code size features; it is run +only when the default "link size" of 2 is set (in other cases the sizes +change). + +The eleventh test checks out features that are new in Perl 5.10, and the +twelfth test checks a number internals and non-Perl features concerned with +Unicode property support. 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 ---------------- @@ -712,7 +743,7 @@ The distribution should contain the following files: ) "configure" and config.h depcomp ) script to find program dependencies, generated by ) automake - doc/*.3 man page sources for the PCRE functions + doc/*.3 man page sources for PCRE doc/*.1 man page sources for pcregrep and pcretest doc/index.html.src the base HTML page doc/html/* HTML documentation @@ -721,6 +752,7 @@ The distribution should contain the following files: doc/perltest.txt plain text documentation of Perl test program install-sh a shell script for installing files libpcre.pc.in template for libpcre.pc for pkg-config + libpcreposix.pc.in template for libpcreposix.pc for pkg-config libpcrecpp.pc.in template for libpcrecpp.pc for pkg-config ltmain.sh file used to build a libtool script missing ) common stub for a few missing GNU programs while @@ -764,4 +796,4 @@ The distribution should contain the following files: Philip Hazel Email local part: ph10 Email domain: cam.ac.uk -Last updated: 21 March 2009 +Last updated: 19 October 2009 diff --git a/ext/pcre/pcrelib/config.h b/ext/pcre/pcrelib/config.h index 8133d978b..949a0a209 100644 --- a/ext/pcre/pcrelib/config.h +++ b/ext/pcre/pcrelib/config.h @@ -196,6 +196,12 @@ them both to 0; an emulation function will be used. */ #define LINK_SIZE 2 #endif +/* Define to the sub-directory in which libtool stores uninstalled libraries. + */ +#ifndef LT_OBJDIR +#define LT_OBJDIR ".libs/" +#endif + /* The value of MATCH_LIMIT determines the default number of times the internal match() function can be called during a single execution of pcre_exec(). There is a runtime interface for setting a different limit. @@ -262,13 +268,13 @@ them both to 0; an emulation function will be used. */ #define PACKAGE_NAME "PCRE" /* Define to the full name and version of this package. */ -#define PACKAGE_STRING "PCRE 7.9" +#define PACKAGE_STRING "PCRE 8.00" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "pcre" /* Define to the version of this package. */ -#define PACKAGE_VERSION "7.9" +#define PACKAGE_VERSION "8.00" /* If you are compiling for a system other than a Unix-like system or @@ -324,7 +330,7 @@ them both to 0; an emulation function will be used. */ /* Version number of package */ #ifndef VERSION -#define VERSION "7.9" +#define VERSION "8.00" #endif /* Define to empty if `const' does not conform to ANSI C. */ diff --git a/ext/pcre/pcrelib/doc/pcre.txt b/ext/pcre/pcrelib/doc/pcre.txt index 9a2ce3159..2ccc7bb4b 100644 --- a/ext/pcre/pcrelib/doc/pcre.txt +++ b/ext/pcre/pcrelib/doc/pcre.txt @@ -2,8 +2,9 @@ This file contains a concatenation of the PCRE man pages, converted to plain text format for ease of searching with a text editor, or for use on systems that do not have a man page processor. The small individual files that give -synopses of each function in the library have not been included. There are -separate text files for the pcregrep and pcretest commands. +synopses of each function in the library have not been included. Neither has +the pcredemo program. There are separate text files for the pcregrep and +pcretest commands. ----------------------------------------------------------------------------- @@ -18,23 +19,23 @@ INTRODUCTION The PCRE library is a set of functions that implement regular expres- sion pattern matching using the same syntax and semantics as Perl, with - just a few differences. Certain features that appeared in Python and - PCRE before they appeared in Perl are also available using the Python - syntax. There is also some support for certain .NET and Oniguruma syn- - tax items, and there is an option for requesting some minor changes - that give better JavaScript compatibility. - - The current implementation of PCRE (release 7.x) corresponds approxi- - mately with Perl 5.10, including support for UTF-8 encoded strings and - Unicode general category properties. However, UTF-8 and Unicode support - has to be explicitly enabled; it is not the default. The Unicode tables - correspond to Unicode release 5.1. + just a few differences. Some features that appeared in Python and PCRE + before they appeared in Perl are also available using the Python syn- + tax, there is some support for one or two .NET and Oniguruma syntax + items, and there is an option for requesting some minor changes that + give better JavaScript compatibility. + + The current implementation of PCRE corresponds approximately with Perl + 5.10, including support for UTF-8 encoded strings and Unicode general + category properties. However, UTF-8 and Unicode support has to be + explicitly enabled; it is not the default. The Unicode tables corre- + spond to Unicode release 5.1. In addition to the Perl-compatible matching function, PCRE contains an - alternative matching function that matches the same compiled patterns - in a different way. In certain circumstances, the alternative function - has some advantages. For a discussion of the two matching algorithms, - see the pcrematching page. + alternative function that matches the same compiled patterns in a dif- + ferent way. In certain circumstances, the alternative function has some + advantages. For a discussion of the two matching algorithms, see the + pcrematching page. PCRE is written in C and released as a C library. A number of people have written wrappers and interfaces of various kinds. In particular, @@ -54,8 +55,8 @@ INTRODUCTION library is built. The pcre_config() function makes it possible for a client to discover which features are available. The features them- selves are described in the pcrebuild page. Documentation about build- - ing PCRE for various operating systems can be found in the README file - in the source distribution. + ing PCRE for various operating systems can be found in the README and + NON-UNIX-USE files in the source distribution. The library contains a number of undocumented internal functions and data tables that are used by more than one of the exported external @@ -71,8 +72,9 @@ USER DOCUMENTATION The user documentation for PCRE comprises a number of different sec- tions. In the "man" format, each of these is a separate "man page". In the HTML format, each is a separate page, linked from the index page. - In the plain text format, all the sections are concatenated, for ease - of searching. The sections are as follows: + In the plain text format, all the sections, except the pcredemo sec- + tion, are concatenated, for ease of searching. The sections are as fol- + lows: pcre this document pcre-config show PCRE installation configuration information @@ -81,34 +83,35 @@ USER DOCUMENTATION pcrecallout details of the callout feature pcrecompat discussion of Perl compatibility pcrecpp details of the C++ wrapper + pcredemo a demonstration C program that uses PCRE pcregrep description of the pcregrep command pcrematching discussion of the two matching algorithms pcrepartial details of the partial matching facility pcrepattern syntax and semantics of supported regular expressions - pcresyntax quick syntax reference pcreperform discussion of performance issues pcreposix the POSIX-compatible C API pcreprecompile details of saving and re-using precompiled patterns - pcresample discussion of the sample program + pcresample discussion of the pcredemo program pcrestack discussion of stack usage + pcresyntax quick syntax reference pcretest description of the pcretest testing command - In addition, in the "man" and HTML formats, there is a short page for + In addition, in the "man" and HTML formats, there is a short page for each C library function, listing its arguments and results. LIMITATIONS - There are some size limitations in PCRE but it is hoped that they will + There are some size limitations in PCRE but it is hoped that they will never in practice be relevant. - The maximum length of a compiled pattern is 65539 (sic) bytes if PCRE + The maximum length of a compiled pattern is 65539 (sic) bytes if PCRE is compiled with the default internal linkage size of 2. If you want to - process regular expressions that are truly enormous, you can compile - PCRE with an internal linkage size of 3 or 4 (see the README file in - the source distribution and the pcrebuild documentation for details). - In these cases the limit is substantially larger. However, the speed + process regular expressions that are truly enormous, you can compile + PCRE with an internal linkage size of 3 or 4 (see the README file in + the source distribution and the pcrebuild documentation for details). + In these cases the limit is substantially larger. However, the speed of execution is slower. All values in repeating quantifiers must be less than 65536. @@ -119,131 +122,131 @@ LIMITATIONS The maximum length of name for a named subpattern is 32 characters, and the maximum number of named subpatterns is 10000. - The maximum length of a subject string is the largest positive number - that an integer variable can hold. However, when using the traditional + The maximum length of a subject string is the largest positive number + that an integer variable can hold. However, when using the traditional matching function, PCRE uses recursion to handle subpatterns and indef- - inite repetition. This means that the available stack space may limit + inite repetition. This means that the available stack space may limit the size of a subject string that can be processed by certain patterns. For a discussion of stack issues, see the pcrestack documentation. UTF-8 AND UNICODE PROPERTY SUPPORT - From release 3.3, PCRE has had some support for character strings - encoded in the UTF-8 format. For release 4.0 this was greatly extended - to cover most common requirements, and in release 5.0 additional sup- + From release 3.3, PCRE has had some support for character strings + encoded in the UTF-8 format. For release 4.0 this was greatly extended + to cover most common requirements, and in release 5.0 additional sup- port for Unicode general category properties was added. - In order process UTF-8 strings, you must build PCRE to include UTF-8 - support in the code, and, in addition, you must call pcre_compile() - with the PCRE_UTF8 option flag, or the pattern must start with the - sequence (*UTF8). When either of these is the case, both the pattern - and any subject strings that are matched against it are treated as - UTF-8 strings instead of just strings of bytes. + In order process UTF-8 strings, you must build PCRE to include UTF-8 + support in the code, and, in addition, you must call pcre_compile() + with the PCRE_UTF8 option flag, or the pattern must start with the + sequence (*UTF8). When either of these is the case, both the pattern + and any subject strings that are matched against it are treated as + UTF-8 strings instead of strings of 1-byte characters. - If you compile PCRE with UTF-8 support, but do not use it at run time, - the library will be a bit bigger, but the additional run time overhead + If you compile PCRE with UTF-8 support, but do not use it at run time, + the library will be a bit bigger, but the additional run time overhead is limited to testing the PCRE_UTF8 flag occasionally, so should not be very big. If PCRE is built with Unicode character property support (which implies - UTF-8 support), the escape sequences \p{..}, \P{..}, and \X are sup- + UTF-8 support), the escape sequences \p{..}, \P{..}, and \X are sup- ported. The available properties that can be tested are limited to the - general category properties such as Lu for an upper case letter or Nd - for a decimal number, the Unicode script names such as Arabic or Han, - and the derived properties Any and L&. A full list is given in the + general category properties such as Lu for an upper case letter or Nd + for a decimal number, the Unicode script names such as Arabic or Han, + and the derived properties Any and L&. A full list is given in the pcrepattern documentation. Only the short names for properties are sup- - ported. For example, \p{L} matches a letter. Its Perl synonym, \p{Let- - ter}, is not supported. Furthermore, in Perl, many properties may - optionally be prefixed by "Is", for compatibility with Perl 5.6. PCRE + ported. For example, \p{L} matches a letter. Its Perl synonym, \p{Let- + ter}, is not supported. Furthermore, in Perl, many properties may + optionally be prefixed by "Is", for compatibility with Perl 5.6. PCRE does not support this. Validity of UTF-8 strings - When you set the PCRE_UTF8 flag, the strings passed as patterns and + When you set the PCRE_UTF8 flag, the strings passed as patterns and subjects are (by default) checked for validity on entry to the relevant - functions. From release 7.3 of PCRE, the check is according the rules - of RFC 3629, which are themselves derived from the Unicode specifica- - tion. Earlier releases of PCRE followed the rules of RFC 2279, which - allows the full range of 31-bit values (0 to 0x7FFFFFFF). The current + functions. From release 7.3 of PCRE, the check is according the rules + of RFC 3629, which are themselves derived from the Unicode specifica- + tion. Earlier releases of PCRE followed the rules of RFC 2279, which + allows the full range of 31-bit values (0 to 0x7FFFFFFF). The current check allows only values in the range U+0 to U+10FFFF, excluding U+D800 to U+DFFF. - The excluded code points are the "Low Surrogate Area" of Unicode, of - which the Unicode Standard says this: "The Low Surrogate Area does not - contain any character assignments, consequently no character code + The excluded code points are the "Low Surrogate Area" of Unicode, of + which the Unicode Standard says this: "The Low Surrogate Area does not + contain any character assignments, consequently no character code charts or namelists are provided for this area. Surrogates are reserved - for use with UTF-16 and then must be used in pairs." The code points - that are encoded by UTF-16 pairs are available as independent code - points in the UTF-8 encoding. (In other words, the whole surrogate + for use with UTF-16 and then must be used in pairs." The code points + that are encoded by UTF-16 pairs are available as independent code + points in the UTF-8 encoding. (In other words, the whole surrogate thing is a fudge for UTF-16 which unfortunately messes up UTF-8.) - If an invalid UTF-8 string is passed to PCRE, an error return + If an invalid UTF-8 string is passed to PCRE, an error return (PCRE_ERROR_BADUTF8) is given. In some situations, you may already know that your strings are valid, and therefore want to skip these checks in order to improve performance. If you set the PCRE_NO_UTF8_CHECK flag at - compile time or at run time, PCRE assumes that the pattern or subject - it is given (respectively) contains only valid UTF-8 codes. In this + compile time or at run time, PCRE assumes that the pattern or subject + it is given (respectively) contains only valid UTF-8 codes. In this case, it does not diagnose an invalid UTF-8 string. - If you pass an invalid UTF-8 string when PCRE_NO_UTF8_CHECK is set, - what happens depends on why the string is invalid. If the string con- + If you pass an invalid UTF-8 string when PCRE_NO_UTF8_CHECK is set, + what happens depends on why the string is invalid. If the string con- forms to the "old" definition of UTF-8 (RFC 2279), it is processed as a - string of characters in the range 0 to 0x7FFFFFFF. In other words, + string of characters in the range 0 to 0x7FFFFFFF. In other words, apart from the initial validity test, PCRE (when in UTF-8 mode) handles - strings according to the more liberal rules of RFC 2279. However, if - the string does not even conform to RFC 2279, the result is undefined. + strings according to the more liberal rules of RFC 2279. However, if + the string does not even conform to RFC 2279, the result is undefined. Your program may crash. - If you want to process strings of values in the full range 0 to - 0x7FFFFFFF, encoded in a UTF-8-like manner as per the old RFC, you can + If you want to process strings of values in the full range 0 to + 0x7FFFFFFF, encoded in a UTF-8-like manner as per the old RFC, you can set PCRE_NO_UTF8_CHECK to bypass the more restrictive test. However, in this situation, you will have to apply your own validity check. General comments about UTF-8 mode - 1. An unbraced hexadecimal escape sequence (such as \xb3) matches a + 1. An unbraced hexadecimal escape sequence (such as \xb3) matches a two-byte UTF-8 character if the value is greater than 127. - 2. Octal numbers up to \777 are recognized, and match two-byte UTF-8 + 2. Octal numbers up to \777 are recognized, and match two-byte UTF-8 characters for values greater than \177. - 3. Repeat quantifiers apply to complete UTF-8 characters, not to indi- + 3. Repeat quantifiers apply to complete UTF-8 characters, not to indi- vidual bytes, for example: \x{100}{3}. - 4. The dot metacharacter matches one UTF-8 character instead of a sin- + 4. The dot metacharacter matches one UTF-8 character instead of a sin- gle byte. - 5. The escape sequence \C can be used to match a single byte in UTF-8 - mode, but its use can lead to some strange effects. This facility is + 5. The escape sequence \C can be used to match a single byte in UTF-8 + mode, but its use can lead to some strange effects. This facility is not available in the alternative matching function, pcre_dfa_exec(). - 6. The character escapes \b, \B, \d, \D, \s, \S, \w, and \W correctly - test characters of any code value, but the characters that PCRE recog- - nizes as digits, spaces, or word characters remain the same set as + 6. The character escapes \b, \B, \d, \D, \s, \S, \w, and \W correctly + test characters of any code value, but the characters that PCRE recog- + nizes as digits, spaces, or word characters remain the same set as before, all with values less than 256. This remains true even when PCRE - includes Unicode property support, because to do otherwise would slow - down PCRE in many common cases. If you really want to test for a wider - sense of, say, "digit", you must use Unicode property tests such as - \p{Nd}. Note that this also applies to \b, because it is defined in + includes Unicode property support, because to do otherwise would slow + down PCRE in many common cases. If you really want to test for a wider + sense of, say, "digit", you must use Unicode property tests such as + \p{Nd}. Note that this also applies to \b, because it is defined in terms of \w and \W. - 7. Similarly, characters that match the POSIX named character classes + 7. Similarly, characters that match the POSIX named character classes are all low-valued characters. - 8. However, the Perl 5.10 horizontal and vertical whitespace matching + 8. However, the Perl 5.10 horizontal and vertical whitespace matching escapes (\h, \H, \v, and \V) do match all the appropriate Unicode char- acters. - 9. Case-insensitive matching applies only to characters whose values - are less than 128, unless PCRE is built with Unicode property support. - Even when Unicode property support is available, PCRE still uses its - own character tables when checking the case of low-valued characters, - so as not to degrade performance. The Unicode property information is + 9. Case-insensitive matching applies only to characters whose values + are less than 128, unless PCRE is built with Unicode property support. + Even when Unicode property support is available, PCRE still uses its + own character tables when checking the case of low-valued characters, + so as not to degrade performance. The Unicode property information is used only for characters with higher values. Even when Unicode property support is available, PCRE supports case-insensitive matching only when - there is a one-to-one mapping between a letter's cases. There are a - small number of many-to-one mappings in Unicode; these are not sup- + there is a one-to-one mapping between a letter's cases. There are a + small number of many-to-one mappings in Unicode; these are not sup- ported by PCRE. @@ -253,14 +256,14 @@ AUTHOR University Computing Service Cambridge CB2 3QH, England. - Putting an actual email address here seems to have been a spam magnet, - so I've taken it away. If you want to email me, use my two initials, + Putting an actual email address here seems to have been a spam magnet, + so I've taken it away. If you want to email me, use my two initials, followed by the two digits 10, at the domain cam.ac.uk. REVISION - Last updated: 11 April 2009 + Last updated: 28 September 2009 Copyright (c) 1997-2009 University of Cambridge. ------------------------------------------------------------------------------ @@ -279,20 +282,25 @@ PCRE BUILD-TIME OPTIONS script, where the optional features are selected or deselected by pro- viding options to configure before running the make command. However, the same options can be selected in both Unix-like and non-Unix-like - environments using the GUI facility of CMakeSetup if you are using - CMake instead of configure to build PCRE. + environments using the GUI facility of cmake-gui if you are using CMake + instead of configure to build PCRE. + + There is a lot more information about building PCRE in non-Unix-like + environments in the file called NON_UNIX_USE, which is part of the PCRE + distribution. You should consult this file as well as the README file + if you are building in a non-Unix-like environment. The complete list of options for configure (which includes the standard - ones such as the selection of the installation directory) can be + ones such as the selection of the installation directory) can be obtained by running ./configure --help - The following sections include descriptions of options whose names + The following sections include descriptions of options whose names begin with --enable or --disable. These settings specify changes to the - defaults for the configure command. Because of the way that configure - works, --enable and --disable always come in pairs, so the complemen- - tary option always exists as well, but as it specifies the default, it + defaults for the configure command. Because of the way that configure + works, --enable and --disable always come in pairs, so the complemen- + tary option always exists as well, but as it specifies the default, it is not described. @@ -313,46 +321,46 @@ UTF-8 SUPPORT --enable-utf8 - to the configure command. Of itself, this does not make PCRE treat - strings as UTF-8. As well as compiling PCRE with this option, you also - have have to set the PCRE_UTF8 option when you call the pcre_compile() - function. + to the configure command. Of itself, this does not make PCRE treat + strings as UTF-8. As well as compiling PCRE with this option, you also + have have to set the PCRE_UTF8 option when you call the pcre_compile() + or pcre_compile2() functions. - If you set --enable-utf8 when compiling in an EBCDIC environment, PCRE + If you set --enable-utf8 when compiling in an EBCDIC environment, PCRE expects its input to be either ASCII or UTF-8 (depending on the runtime - option). It is not possible to support both EBCDIC and UTF-8 codes in - the same version of the library. Consequently, --enable-utf8 and + option). It is not possible to support both EBCDIC and UTF-8 codes in + the same version of the library. Consequently, --enable-utf8 and --enable-ebcdic are mutually exclusive. UNICODE CHARACTER PROPERTY SUPPORT - UTF-8 support allows PCRE to process character values greater than 255 - in the strings that it handles. On its own, however, it does not pro- + UTF-8 support allows PCRE to process character values greater than 255 + in the strings that it handles. On its own, however, it does not pro- vide any facilities for accessing the properties of such characters. If - you want to be able to use the pattern escapes \P, \p, and \X, which + you want to be able to use the pattern escapes \P, \p, and \X, which refer to Unicode character properties, you must add --enable-unicode-properties - to the configure command. This implies UTF-8 support, even if you have + to the configure command. This implies UTF-8 support, even if you have not explicitly requested it. - Including Unicode property support adds around 30K of tables to the - PCRE library. Only the general category properties such as Lu and Nd + Including Unicode property support adds around 30K of tables to the + PCRE library. Only the general category properties such as Lu and Nd are supported. Details are given in the pcrepattern documentation. CODE VALUE OF NEWLINE - By default, PCRE interprets the linefeed (LF) character as indicating - the end of a line. This is the normal newline character on Unix-like - systems. You can compile PCRE to use carriage return (CR) instead, by + By default, PCRE interprets the linefeed (LF) character as indicating + the end of a line. This is the normal newline character on Unix-like + systems. You can compile PCRE to use carriage return (CR) instead, by adding --enable-newline-is-cr - to the configure command. There is also a --enable-newline-is-lf + to the configure command. There is also a --enable-newline-is-lf option, which explicitly specifies linefeed as the newline character. Alternatively, you can specify that line endings are to be indicated by @@ -364,35 +372,35 @@ CODE VALUE OF NEWLINE --enable-newline-is-anycrlf - which causes PCRE to recognize any of the three sequences CR, LF, or + which causes PCRE to recognize any of the three sequences CR, LF, or CRLF as indicating a line ending. Finally, a fifth option, specified by --enable-newline-is-any causes PCRE to recognize any Unicode newline sequence. - Whatever line ending convention is selected when PCRE is built can be - overridden when the library functions are called. At build time it is + Whatever line ending convention is selected when PCRE is built can be + overridden when the library functions are called. At build time it is conventional to use the standard for your operating system. WHAT \R MATCHES - By default, the sequence \R in a pattern matches any Unicode newline - sequence, whatever has been selected as the line ending sequence. If + By default, the sequence \R in a pattern matches any Unicode newline + sequence, whatever has been selected as the line ending sequence. If you specify --enable-bsr-anycrlf - the default is changed so that \R matches only CR, LF, or CRLF. What- - ever is selected when PCRE is built can be overridden when the library + the default is changed so that \R matches only CR, LF, or CRLF. What- + ever is selected when PCRE is built can be overridden when the library functions are called. BUILDING SHARED AND STATIC LIBRARIES - The PCRE building process uses libtool to build both shared and static - Unix libraries by default. You can suppress one of these by adding one + The PCRE building process uses libtool to build both shared and static + Unix libraries by default. You can suppress one of these by adding one of --disable-shared @@ -404,9 +412,9 @@ BUILDING SHARED AND STATIC LIBRARIES POSIX MALLOC USAGE When PCRE is called through the POSIX interface (see the pcreposix doc- - umentation), 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 + umentation), 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 default threshold above which the stack is no longer used is 10; it @@ -419,50 +427,49 @@ POSIX MALLOC USAGE HANDLING VERY LARGE PATTERNS - Within a compiled pattern, offset values are used to point from one - part to another (for example, from an opening parenthesis to an alter- - nation metacharacter). By default, two-byte values are used for these - offsets, leading to a maximum size for a compiled pattern of around - 64K. This is sufficient to handle all but the most gigantic patterns. - Nevertheless, some people do want to process enormous patterns, so it - is possible to compile PCRE to use three-byte or four-byte offsets by - adding a setting such as + Within a compiled pattern, offset values are used to point from one + part to another (for example, from an opening parenthesis to an alter- + nation metacharacter). By default, two-byte values are used for these + offsets, leading to a maximum size for a compiled pattern of around + 64K. This is sufficient to handle all but the most gigantic patterns. + Nevertheless, some people do want to process truyl enormous patterns, + so it is possible to compile PCRE to use three-byte or four-byte off- + sets by adding a setting such as --with-link-size=3 - to the configure command. The value given must be 2, 3, or 4. Using - longer offsets slows down the operation of PCRE because it has to load + to the configure command. The value given must be 2, 3, or 4. Using + longer offsets slows down the operation of PCRE because it has to load additional bytes when handling them. AVOIDING EXCESSIVE STACK USAGE When matching with the pcre_exec() function, PCRE implements backtrack- - ing by making recursive calls to an internal function called match(). - In environments where the size of the stack is limited, this can se- - verely limit PCRE's operation. (The Unix environment does not usually + ing by making recursive calls to an internal function called match(). + In environments where the size of the stack is limited, this can se- + verely limit PCRE's operation. (The Unix environment does not usually suffer from this problem, but it may sometimes be necessary to increase - the maximum stack size. There is a discussion in the pcrestack docu- - mentation.) An alternative approach to recursion that uses memory from - the heap to remember data, instead of using recursive function calls, - has been implemented to work round the problem of limited stack size. + the maximum stack size. There is a discussion in the pcrestack docu- + mentation.) An alternative approach to recursion that uses memory from + the heap to remember data, instead of using recursive function calls, + has been implemented to work round the problem of limited stack size. If you want to build a version of PCRE that works this way, add --disable-stack-for-recursion - to the configure command. With this configuration, PCRE will use the - pcre_stack_malloc and pcre_stack_free variables to call memory manage- - ment functions. By default these point to malloc() and free(), but you - can replace the pointers so that your own functions are used. + to the configure command. With this configuration, PCRE will use the + pcre_stack_malloc and pcre_stack_free variables to call memory manage- + ment functions. By default these point to malloc() and free(), but you + can replace the pointers so that your own functions are used instead. - Separate functions are provided rather than using pcre_malloc and - pcre_free because the usage is very predictable: the block sizes - requested are always the same, and the blocks are always freed in - reverse order. A calling program might be able to implement optimized - functions that perform better than malloc() and free(). PCRE runs + Separate functions are provided rather than using pcre_malloc and + pcre_free because the usage is very predictable: the block sizes + requested are always the same, and the blocks are always freed in + reverse order. A calling program might be able to implement optimized + functions that perform better than malloc() and free(). PCRE runs noticeably more slowly when built in this way. This option affects only - the pcre_exec() function; it is not relevant for the the - pcre_dfa_exec() function. + the pcre_exec() function; it is not relevant for pcre_dfa_exec(). LIMITING PCRE RESOURCE USAGE @@ -551,7 +558,7 @@ PCRETEST OPTION FOR LIBREADLINE SUPPORT to the configure command, pcretest is linked with the libreadline library, and when its input is from a terminal, it reads it using the readline() function. This provides line-editing and history facilities. - Note that libreadline is GPL-licenced, so if you distribute a binary of + Note that libreadline is GPL-licensed, so if you distribute a binary of pcretest linked in this way, there may be licensing issues. Setting this option causes the -lreadline option to be added to the @@ -587,7 +594,7 @@ AUTHOR REVISION - Last updated: 17 March 2009 + Last updated: 29 September 2009 Copyright (c) 1997-2009 University of Cambridge. ------------------------------------------------------------------------------ @@ -675,13 +682,19 @@ THE ALTERNATIVE MATCHING ALGORITHM though it is not implemented as a traditional finite state machine (it keeps multiple states active simultaneously). + Although the general principle of this matching algorithm is that it + scans the subject string only once, without backtracking, there is one + exception: when a lookaround assertion is encountered, the characters + following or preceding the current point have to be independently + inspected. + The scan continues until either the end of the subject is reached, or there are no more unterminated paths. At this point, terminated paths represent the different matching possibilities (if there are none, the match has failed). Thus, if there is more than one possible match, this algorithm finds all of them, and in particular, it finds the long- - est. In PCRE, there is an option to stop the algorithm after the first - match (which is necessarily the shortest) has been found. + est. There is an option to stop the algorithm after the first match + (which is necessarily the shortest) is found. Note that all the matches that are found start at the same point in the subject. If the pattern @@ -751,24 +764,19 @@ ADVANTAGES OF THE ALTERNATIVE ALGORITHM more than one match using the standard algorithm, you have to do kludgy things with callouts. - 2. There is much better support for partial matching. The restrictions - on the content of the pattern that apply when using the standard algo- - rithm for partial matching do not apply to the alternative algorithm. - For non-anchored patterns, the starting position of a partial match is - available. - - 3. Because the alternative algorithm scans the subject string just + 2. Because the alternative algorithm scans the subject string just once, and never needs to backtrack, it is possible to pass very long subject strings to the matching function in several pieces, checking - for partial matching each time. + for partial matching each time. The pcrepartial documentation gives + details of partial matching. DISADVANTAGES OF THE ALTERNATIVE ALGORITHM The alternative algorithm suffers from a number of disadvantages: - 1. It is substantially slower than the standard algorithm. This is - partly because it has to search for all possible matches, but is also + 1. It is substantially slower than the standard algorithm. This is + partly because it has to search for all possible matches, but is also because it is less susceptible to optimization. 2. Capturing parentheses and back references are not supported. @@ -786,8 +794,8 @@ AUTHOR REVISION - Last updated: 19 April 2008 - Copyright (c) 1997-2008 University of Cambridge. + Last updated: 29 September 2009 + Copyright (c) 1997-2009 University of Cambridge. ------------------------------------------------------------------------------ @@ -898,16 +906,18 @@ PCRE API OVERVIEW pcre_exec() are used for compiling and matching regular expressions in a Perl-compatible manner. A sample program that demonstrates the sim- plest way of using them is provided in the file called pcredemo.c in - the source distribution. The pcresample documentation describes how to - compile and run it. + the PCRE source distribution. A listing of this program is given in the + pcredemo documentation, and the pcresample documentation describes how + to compile and run it. A second matching function, pcre_dfa_exec(), which is not Perl-compati- - ble, is also provided. This uses a different algorithm for the match- - ing. The alternative algorithm finds all possible matches (at a given - point in the subject), and scans the subject just once. However, this - algorithm does not return captured substrings. A description of the two - matching algorithms and their advantages and disadvantages is given in - the pcrematching documentation. + ble, is also provided. This uses a different algorithm for the match- + ing. The alternative algorithm finds all possible matches (at a given + point in the subject), and scans the subject just once (unless there + are lookbehind assertions). However, this algorithm does not return + captured substrings. A description of the two matching algorithms and + their advantages and disadvantages is given in the pcrematching docu- + mentation. In addition to the main compiling and matching functions, there are convenience functions for extracting captured substrings from a subject @@ -1117,7 +1127,9 @@ COMPILING A PATTERN Either of the functions pcre_compile() or pcre_compile2() can be called to compile a pattern into an internal form. The only difference between the two interfaces is that pcre_compile2() has an additional argument, - errorcodeptr, via which a numerical error code can be returned. + errorcodeptr, via which a numerical error code can be returned. To + avoid too much repetition, we refer just to pcre_compile() below, but + the information applies equally to pcre_compile2(). The pattern is a C string terminated by a binary zero, and is passed in the pattern argument. A pointer to a single block of memory that is @@ -1135,22 +1147,24 @@ COMPILING A PATTERN The options argument contains various bit settings that affect the com- pilation. It should be zero if no options are required. The available options are described below. Some of them (in particular, those that - are compatible with Perl, but also some others) can also be set and + are compatible with Perl, but some others as well) can also be set and unset from within the pattern (see the detailed description in the pcrepattern documentation). For those options that can be different in different parts of the pattern, the contents of the options argument - specifies their initial settings at the start of compilation and execu- - tion. The PCRE_ANCHORED and PCRE_NEWLINE_xxx options can be set at the - time of matching as well as at compile time. + specifies their settings at the start of compilation and execution. The + PCRE_ANCHORED, PCRE_BSR_xxx, and PCRE_NEWLINE_xxx options can be set at + the time of matching as well as at compile time. If errptr is NULL, pcre_compile() returns NULL immediately. Otherwise, if compilation of a pattern fails, pcre_compile() returns NULL, and sets the variable pointed to by errptr to point to a textual error mes- sage. This is a static string that is part of the library. You must not - try to free it. The offset from the start of the pattern to the charac- - ter where the error was discovered is placed in the variable pointed to - by erroffset, which must not be NULL. If it is, an immediate error is - given. + try to free it. The byte offset from the start of the pattern to the + character that was being processed when the error was discovered is + placed in the variable pointed to by erroffset, which must not be NULL. + If it is, an immediate error is given. Some errors are not detected + until checks are carried out when the whole pattern has been scanned; + in this case the offset is set to the end of the pattern. If pcre_compile2() is used instead of pcre_compile(), and the error- codeptr argument is not NULL, a non-zero error code number is returned @@ -1480,14 +1494,14 @@ STUDYING A PATTERN the results of the study. The returned value from pcre_study() can be passed directly to - pcre_exec(). However, a pcre_extra block also contains other fields - that can be set by the caller before the block is passed; these are - described below in the section on matching a pattern. + pcre_exec() or pcre_dfa_exec(). However, a pcre_extra block also con- + tains other fields that can be set by the caller before the block is + passed; these are described below in the section on matching a pattern. - If studying the pattern does not produce any additional information + If studying the pattern does not produce any useful information, pcre_study() returns NULL. In that circumstance, if the calling program - wants to pass any of the other fields to pcre_exec(), it must set up - its own pcre_extra block. + wants to pass any of the other fields to pcre_exec() or + pcre_dfa_exec(), it must set up its own pcre_extra block. The second argument of pcre_study() contains option bits. At present, no options are defined, and this argument should always be zero. @@ -1507,63 +1521,72 @@ STUDYING A PATTERN 0, /* no options exist */ &error); /* set to NULL or points to a message */ - At present, studying a pattern is useful only for non-anchored patterns - that do not have a single fixed starting character. A bitmap of possi- - ble starting bytes is created. + Studying a pattern does two things: first, a lower bound for the length + of subject string that is needed to match the pattern is computed. This + does not mean that there are any strings of that length that match, but + it does guarantee that no shorter strings match. The value is used by + pcre_exec() and pcre_dfa_exec() to avoid wasting time by trying to + match strings that are shorter than the lower bound. You can find out + the value in a calling program via the pcre_fullinfo() function. + + Studying a pattern is also useful for non-anchored patterns that do not + have a single fixed starting character. A bitmap of possible starting + bytes is created. This speeds up finding a position in the subject at + which to start matching. LOCALE SUPPORT - PCRE handles caseless matching, and determines whether characters are - letters, digits, or whatever, by reference to a set of tables, indexed - by character value. When running in UTF-8 mode, this applies only to - characters with codes less than 128. Higher-valued codes never match - escapes such as \w or \d, but can be tested with \p if PCRE is built - with Unicode character property support. The use of locales with Uni- - code is discouraged. If you are handling characters with codes greater - than 128, you should either use UTF-8 and Unicode, or use locales, but + PCRE handles caseless matching, and determines whether characters are + letters, digits, or whatever, by reference to a set of tables, indexed + by character value. When running in UTF-8 mode, this applies only to + characters with codes less than 128. Higher-valued codes never match + escapes such as \w or \d, but can be tested with \p if PCRE is built + with Unicode character property support. The use of locales with Uni- + code is discouraged. If you are handling characters with codes greater + than 128, you should either use UTF-8 and Unicode, or use locales, but not try to mix the two. - PCRE contains an internal set of tables that are used when the final - argument of pcre_compile() is NULL. These are sufficient for many + PCRE contains an internal set of tables that are used when the final + argument of pcre_compile() is NULL. These are sufficient for many applications. Normally, the internal tables recognize only ASCII char- acters. However, when PCRE is built, it is possible to cause the inter- nal tables to be rebuilt in the default "C" locale of the local system, which may cause them to be different. - The internal tables can always be overridden by tables supplied by the + The internal tables can always be overridden by tables supplied by the application that calls PCRE. These may be created in a different locale - from the default. As more and more applications change to using Uni- + from the default. As more and more applications change to using Uni- code, the need for this locale support is expected to die away. - External tables are built by calling the pcre_maketables() function, - which has no arguments, in the relevant locale. The result can then be - passed to pcre_compile() or pcre_exec() as often as necessary. For - example, to build and use tables that are appropriate for the French - locale (where accented characters with values greater than 128 are + External tables are built by calling the pcre_maketables() function, + which has no arguments, in the relevant locale. The result can then be + passed to pcre_compile() or pcre_exec() as often as necessary. For + example, to build and use tables that are appropriate for the French + locale (where accented characters with values greater than 128 are treated as letters), the following code could be used: setlocale(LC_CTYPE, "fr_FR"); tables = pcre_maketables(); re = pcre_compile(..., tables); - The locale name "fr_FR" is used on Linux and other Unix-like systems; + The locale name "fr_FR" is used on Linux and other Unix-like systems; if you are using Windows, the name for the French locale is "french". - When pcre_maketables() runs, the tables are built in memory that is - obtained via pcre_malloc. It is the caller's responsibility to ensure - that the memory containing the tables remains available for as long as + When pcre_maketables() runs, the tables are built in memory that is + obtained via pcre_malloc. It is the caller's responsibility to ensure + that the memory containing the tables remains available for as long as it is needed. The pointer that is passed to pcre_compile() is saved with the compiled - pattern, and the same tables are used via this pointer by pcre_study() + pattern, and the same tables are used via this pointer by pcre_study() and normally also by pcre_exec(). Thus, by default, for any single pat- tern, compilation, studying and matching all happen in the same locale, but different patterns can be compiled in different locales. - It is possible to pass a table pointer or NULL (indicating the use of - the internal tables) to pcre_exec(). Although not intended for this - purpose, this facility could be used to match a pattern in a different + It is possible to pass a table pointer or NULL (indicating the use of + the internal tables) to pcre_exec(). Although not intended for this + purpose, this facility could be used to match a pattern in a different locale from the one in which it was compiled. Passing table pointers at run time is discussed below in the section on matching a pattern. @@ -1573,15 +1596,15 @@ INFORMATION ABOUT A PATTERN int pcre_fullinfo(const pcre *code, const pcre_extra *extra, int what, void *where); - The pcre_fullinfo() function returns information about a compiled pat- + The pcre_fullinfo() function returns information about a compiled pat- tern. It replaces the obsolete pcre_info() function, which is neverthe- less retained for backwards compability (and is documented below). - The first argument for pcre_fullinfo() is a pointer to the compiled - pattern. The second argument is the result of pcre_study(), or NULL if - the pattern was not studied. The third argument specifies which piece - of information is required, and the fourth argument is a pointer to a - variable to receive the data. The yield of the function is zero for + The first argument for pcre_fullinfo() is a pointer to the compiled + pattern. The second argument is the result of pcre_study(), or NULL if + the pattern was not studied. The third argument specifies which piece + of information is required, and the fourth argument is a pointer to a + variable to receive the data. The yield of the function is zero for success, or one of the following negative numbers: PCRE_ERROR_NULL the argument code was NULL @@ -1589,9 +1612,9 @@ INFORMATION ABOUT A PATTERN PCRE_ERROR_BADMAGIC the "magic number" was not found PCRE_ERROR_BADOPTION the value of what was invalid - The "magic number" is placed at the start of each compiled pattern as - an simple check against passing an arbitrary memory pointer. Here is a - typical call of pcre_fullinfo(), to obtain the length of the compiled + The "magic number" is placed at the start of each compiled pattern as + an simple check against passing an arbitrary memory pointer. Here is a + typical call of pcre_fullinfo(), to obtain the length of the compiled pattern: int rc; @@ -1602,111 +1625,131 @@ INFORMATION ABOUT A PATTERN PCRE_INFO_SIZE, /* what is required */ &length); /* where to put the data */ - The possible values for the third argument are defined in pcre.h, and + The possible values for the third argument are defined in pcre.h, and are as follows: PCRE_INFO_BACKREFMAX - Return the number of the highest back reference in the pattern. The - fourth argument should point to an int variable. Zero is returned if + Return the number of the highest back reference in the pattern. The + fourth argument should point to an int variable. Zero is returned if there are no back references. PCRE_INFO_CAPTURECOUNT - Return the number of capturing subpatterns in the pattern. The fourth + Return the number of capturing subpatterns in the pattern. The fourth argument should point to an int variable. PCRE_INFO_DEFAULT_TABLES - Return a pointer to the internal default character tables within PCRE. - The fourth argument should point to an unsigned char * variable. This + Return a pointer to the internal default character tables within PCRE. + The fourth argument should point to an unsigned char * variable. This information call is provided for internal use by the pcre_study() func- - tion. External callers can cause PCRE to use its internal tables by + tion. External callers can cause PCRE to use its internal tables by passing a NULL table pointer. PCRE_INFO_FIRSTBYTE - Return information about the first byte of any matched string, for a - non-anchored pattern. The fourth argument should point to an int vari- - able. (This option used to be called PCRE_INFO_FIRSTCHAR; the old name + Return information about the first byte of any matched string, for a + non-anchored pattern. The fourth argument should point to an int vari- + able. (This option used to be called PCRE_INFO_FIRSTCHAR; the old name is still recognized for backwards compatibility.) - If there is a fixed first byte, for example, from a pattern such as + If there is a fixed first byte, for example, from a pattern such as (cat|cow|coyote), its value is returned. Otherwise, if either - (a) the pattern was compiled with the PCRE_MULTILINE option, and every + (a) the pattern was compiled with the PCRE_MULTILINE option, and every branch starts with "^", or (b) every branch of the pattern starts with ".*" and PCRE_DOTALL is not set (if it were set, the pattern would be anchored), - -1 is returned, indicating that the pattern matches only at the start - of a subject string or after any newline within the string. Otherwise + -1 is returned, indicating that the pattern matches only at the start + of a subject string or after any newline within the string. Otherwise -2 is returned. For anchored patterns, -2 is returned. PCRE_INFO_FIRSTTABLE - If the pattern was studied, and this resulted in the construction of a + If the pattern was studied, and this resulted in the construction of a 256-bit table indicating a fixed set of bytes for the first byte in any - matching string, a pointer to the table is returned. Otherwise NULL is - returned. The fourth argument should point to an unsigned char * vari- + matching string, a pointer to the table is returned. Otherwise NULL is + returned. The fourth argument should point to an unsigned char * vari- able. PCRE_INFO_HASCRORLF - Return 1 if the pattern contains any explicit matches for CR or LF - characters, otherwise 0. The fourth argument should point to an int - variable. An explicit match is either a literal CR or LF character, or + Return 1 if the pattern contains any explicit matches for CR or LF + characters, otherwise 0. The fourth argument should point to an int + variable. An explicit match is either a literal CR or LF character, or \r or \n. PCRE_INFO_JCHANGED - Return 1 if the (?J) or (?-J) option setting is used in the pattern, - otherwise 0. The fourth argument should point to an int variable. (?J) + Return 1 if the (?J) or (?-J) option setting is used in the pattern, + otherwise 0. The fourth argument should point to an int variable. (?J) and (?-J) set and unset the local PCRE_DUPNAMES option, respectively. PCRE_INFO_LASTLITERAL - Return the value of the rightmost literal byte that must exist in any - matched string, other than at its start, if such a byte has been + Return the value of the rightmost literal byte that must exist in any + matched string, other than at its start, if such a byte has been recorded. The fourth argument should point to an int variable. If there - is no such byte, -1 is returned. For anchored patterns, a last literal - byte is recorded only if it follows something of variable length. For + is no such byte, -1 is returned. For anchored patterns, a last literal + byte is recorded only if it follows something of variable length. For example, for the pattern /^a\d+z\d+/ the returned value is "z", but for /^a\dz\d/ the returned value is -1. + PCRE_INFO_MINLENGTH + + If the pattern was studied and a minimum length for matching subject + strings was computed, its value is returned. Otherwise the returned + value is -1. The value is a number of characters, not bytes (this may + be relevant in UTF-8 mode). The fourth argument should point to an int + variable. A non-negative value is a lower bound to the length of any + matching string. There may not be any strings of that length that do + actually match, but every string that does match is at least that long. + PCRE_INFO_NAMECOUNT PCRE_INFO_NAMEENTRYSIZE PCRE_INFO_NAMETABLE - PCRE supports the use of named as well as numbered capturing parenthe- - ses. The names are just an additional way of identifying the parenthe- + PCRE supports the use of named as well as numbered capturing parenthe- + ses. The names are just an additional way of identifying the parenthe- ses, which still acquire numbers. Several convenience functions such as - pcre_get_named_substring() are provided for extracting captured sub- - strings by name. It is also possible to extract the data directly, by - first converting the name to a number in order to access the correct + pcre_get_named_substring() are provided for extracting captured sub- + strings by name. It is also possible to extract the data directly, by + first converting the name to a number in order to access the correct pointers in the output vector (described with pcre_exec() below). To do - the conversion, you need to use the name-to-number map, which is + the conversion, you need to use the name-to-number map, which is described by these three values. The map consists of a number of fixed-size entries. PCRE_INFO_NAMECOUNT gives the number of entries, and PCRE_INFO_NAMEENTRYSIZE gives the size - of each entry; both of these return an int value. The entry size - depends on the length of the longest name. PCRE_INFO_NAMETABLE returns - a pointer to the first entry of the table (a pointer to char). The + of each entry; both of these return an int value. The entry size + depends on the length of the longest name. PCRE_INFO_NAMETABLE returns + a pointer to the first entry of the table (a pointer to char). The first two bytes of each entry are the number of the capturing parenthe- - sis, most significant byte first. The rest of the entry is the corre- - sponding name, zero terminated. The names are in alphabetical order. - When PCRE_DUPNAMES is set, duplicate names are in order of their paren- - theses numbers. For example, consider the following pattern (assume - PCRE_EXTENDED is set, so white space - including newlines - is - ignored): + sis, most significant byte first. The rest of the entry is the corre- + sponding name, zero terminated. + + The names are in alphabetical order. Duplicate names may appear if (?| + is used to create multiple groups with the same number, as described in + the section on duplicate subpattern numbers in the pcrepattern page. + Duplicate names for subpatterns with different numbers are permitted + only if PCRE_DUPNAMES is set. In all cases of duplicate names, they + appear in the table in the order in which they were found in the pat- + tern. In the absence of (?| this is the order of increasing number; + when (?| is used this is not necessarily the case because later subpat- + terns may have lower numbers. + + As a simple example of the name/number table, consider the following + pattern (assume PCRE_EXTENDED is set, so white space - including new- + lines - is ignored): (? (?(\d\d)?\d\d) - (?\d\d) - (?\d\d) ) - There are four named subpatterns, so the table has four entries, and - each entry in the table is eight bytes long. The table is as follows, + There are four named subpatterns, so the table has four entries, and + each entry in the table is eight bytes long. The table is as follows, with non-printing bytes shows in hexadecimal, and undefined bytes shown as ??: @@ -1715,29 +1758,31 @@ INFORMATION ABOUT A PATTERN 00 04 m o n t h 00 00 02 y e a r 00 ?? - When writing code to extract data from named subpatterns using the - name-to-number map, remember that the length of the entries is likely + When writing code to extract data from named subpatterns using the + name-to-number map, remember that the length of the entries is likely to be different for each compiled pattern. PCRE_INFO_OKPARTIAL - Return 1 if the pattern can be used for partial matching, otherwise 0. - The fourth argument should point to an int variable. The pcrepartial - documentation lists the restrictions that apply to patterns when par- - tial matching is used. + Return 1 if the pattern can be used for partial matching with + pcre_exec(), otherwise 0. The fourth argument should point to an int + variable. From release 8.00, this always returns 1, because the + restrictions that previously applied to partial matching have been + lifted. The pcrepartial documentation gives details of partial match- + ing. PCRE_INFO_OPTIONS - Return a copy of the options with which the pattern was compiled. The - fourth argument should point to an unsigned long int variable. These + Return a copy of the options with which the pattern was compiled. The + fourth argument should point to an unsigned long int variable. These option bits are those specified in the call to pcre_compile(), modified by any top-level option settings at the start of the pattern itself. In - other words, they are the options that will be in force when matching - starts. For example, if the pattern /(?im)abc(?-i)d/ is compiled with - the PCRE_EXTENDED option, the result is PCRE_CASELESS, PCRE_MULTILINE, + other words, they are the options that will be in force when matching + starts. For example, if the pattern /(?im)abc(?-i)d/ is compiled with + the PCRE_EXTENDED option, the result is PCRE_CASELESS, PCRE_MULTILINE, and PCRE_EXTENDED. - A pattern is automatically anchored by PCRE if all of its top-level + A pattern is automatically anchored by PCRE if all of its top-level alternatives begin with one of the following: ^ unless PCRE_MULTILINE is set @@ -1751,7 +1796,7 @@ INFORMATION ABOUT A PATTERN PCRE_INFO_SIZE - Return the size of the compiled pattern, that is, the value that was + Return the size of the compiled pattern, that is, the value that was passed as the argument to pcre_malloc() when PCRE was getting memory in which to place the compiled data. The fourth argument should point to a size_t variable. @@ -1759,9 +1804,10 @@ INFORMATION ABOUT A PATTERN PCRE_INFO_STUDYSIZE Return the size of the data block pointed to by the study_data field in - a pcre_extra block. That is, it is the value that was passed to + a pcre_extra block. That is, it is the value that was passed to pcre_malloc() when PCRE was getting memory into which to place the data - created by pcre_study(). The fourth argument should point to a size_t + created by pcre_study(). If pcre_extra is NULL, or there is no study + data, zero is returned. The fourth argument should point to a size_t variable. @@ -1817,7 +1863,7 @@ MATCHING A PATTERN: THE TRADITIONAL FUNCTION The function pcre_exec() is called to match a subject string against a compiled pattern, which is passed in the code argument. If the pattern - has been studied, the result of the study should be passed in the extra + was studied, the result of the study should be passed in the extra argument. This function is the main matching facility of the library, and it operates in a Perl-like manner. For specialist use there is also an alternative matching function, which is described below in the sec- @@ -1876,8 +1922,8 @@ MATCHING A PATTERN: THE TRADITIONAL FUNCTION The match_limit field provides a means of preventing PCRE from using up a vast amount of resources when running patterns that are not going to match, but which have a very large number of possibilities in their - search trees. The classic example is the use of nested unlimited - repeats. + search trees. The classic example is a pattern that uses nested unlim- + ited repeats. Internally, PCRE uses a function called match() which it calls repeat- edly (sometimes recursively). The limit set by match_limit is imposed @@ -1910,8 +1956,8 @@ MATCHING A PATTERN: THE TRADITIONAL FUNCTION PCRE_EXTRA_MATCH_LIMIT_RECURSION is set in the flags field. If the limit is exceeded, pcre_exec() returns PCRE_ERROR_RECURSIONLIMIT. - The pcre_callout field is used in conjunction with the "callout" fea- - ture, which is described in the pcrecallout documentation. + The callout_data field is used in conjunction with the "callout" fea- + ture, and is described in the pcrecallout documentation. The tables field is used to pass a character tables pointer to pcre_exec(); this overrides the value that is stored with the compiled @@ -1928,22 +1974,23 @@ MATCHING A PATTERN: THE TRADITIONAL FUNCTION The unused bits of the options argument for pcre_exec() must be zero. The only bits that may be set are PCRE_ANCHORED, PCRE_NEWLINE_xxx, - PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NO_START_OPTIMIZE, - PCRE_NO_UTF8_CHECK and PCRE_PARTIAL. + PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART, + PCRE_NO_START_OPTIMIZE, PCRE_NO_UTF8_CHECK, PCRE_PARTIAL_SOFT, and + PCRE_PARTIAL_HARD. PCRE_ANCHORED - The PCRE_ANCHORED option limits pcre_exec() to matching at the first - matching position. If a pattern was compiled with PCRE_ANCHORED, or - turned out to be anchored by virtue of its contents, it cannot be made + The PCRE_ANCHORED option limits pcre_exec() to matching at the first + matching position. If a pattern was compiled with PCRE_ANCHORED, or + turned out to be anchored by virtue of its contents, it cannot be made unachored at matching time. PCRE_BSR_ANYCRLF PCRE_BSR_UNICODE These options (which are mutually exclusive) control what the \R escape - sequence matches. The choice is either to match only CR, LF, or CRLF, - or to match any Unicode newline sequence. These options override the + sequence matches. The choice is either to match only CR, LF, or CRLF, + or to match any Unicode newline sequence. These options override the choice that was made or defaulted when the pattern was compiled. PCRE_NEWLINE_CR @@ -1952,76 +1999,83 @@ MATCHING A PATTERN: THE TRADITIONAL FUNCTION PCRE_NEWLINE_ANYCRLF PCRE_NEWLINE_ANY - These options override the newline definition that was chosen or - defaulted when the pattern was compiled. For details, see the descrip- - tion of pcre_compile() above. During matching, the newline choice - affects the behaviour of the dot, circumflex, and dollar metacharac- - ters. It may also alter the way the match position is advanced after a + These options override the newline definition that was chosen or + defaulted when the pattern was compiled. For details, see the descrip- + tion of pcre_compile() above. During matching, the newline choice + affects the behaviour of the dot, circumflex, and dollar metacharac- + ters. It may also alter the way the match position is advanced after a match failure for an unanchored pattern. - When PCRE_NEWLINE_CRLF, PCRE_NEWLINE_ANYCRLF, or PCRE_NEWLINE_ANY is - set, and a match attempt for an unanchored pattern fails when the cur- - rent position is at a CRLF sequence, and the pattern contains no - explicit matches for CR or LF characters, the match position is + When PCRE_NEWLINE_CRLF, PCRE_NEWLINE_ANYCRLF, or PCRE_NEWLINE_ANY is + set, and a match attempt for an unanchored pattern fails when the cur- + rent position is at a CRLF sequence, and the pattern contains no + explicit matches for CR or LF characters, the match position is advanced by two characters instead of one, in other words, to after the CRLF. The above rule is a compromise that makes the most common cases work as - expected. For example, if the pattern is .+A (and the PCRE_DOTALL + expected. For example, if the pattern is .+A (and the PCRE_DOTALL option is not set), it does not match the string "\r\nA" because, after - failing at the start, it skips both the CR and the LF before retrying. - However, the pattern [\r\n]A does match that string, because it con- + failing at the start, it skips both the CR and the LF before retrying. + However, the pattern [\r\n]A does match that string, because it con- tains an explicit CR or LF reference, and so advances only by one char- acter after the first failure. An explicit match for CR of LF is either a literal appearance of one of - those characters, or one of the \r or \n escape sequences. Implicit - matches such as [^X] do not count, nor does \s (which includes CR and + those characters, or one of the \r or \n escape sequences. Implicit + matches such as [^X] do not count, nor does \s (which includes CR and LF in the characters that it matches). - Notwithstanding the above, anomalous effects may still occur when CRLF + Notwithstanding the above, anomalous effects may still occur when CRLF is a valid newline sequence and explicit \r or \n escapes appear in the pattern. PCRE_NOTBOL This option specifies that first character of the subject string is not - the beginning of a line, so the circumflex metacharacter should not - match before it. Setting this without PCRE_MULTILINE (at compile time) - causes circumflex never to match. This option affects only the behav- + the beginning of a line, so the circumflex metacharacter should not + match before it. Setting this without PCRE_MULTILINE (at compile time) + causes circumflex never to match. This option affects only the behav- iour of the circumflex metacharacter. It does not affect \A. PCRE_NOTEOL This option specifies that the end of the subject string is not the end - of a line, so the dollar metacharacter should not match it nor (except - in multiline mode) a newline immediately before it. Setting this with- + of a line, so the dollar metacharacter should not match it nor (except + in multiline mode) a newline immediately before it. Setting this with- out PCRE_MULTILINE (at compile time) causes dollar never to match. This - option affects only the behaviour of the dollar metacharacter. It does + option affects only the behaviour of the dollar metacharacter. It does not affect \Z or \z. PCRE_NOTEMPTY An empty string is not considered to be a valid match if this option is - set. If there are alternatives in the pattern, they are tried. If all - the alternatives match the empty string, the entire match fails. For + set. If there are alternatives in the pattern, they are tried. If all + the alternatives match the empty string, the entire match fails. For example, if the pattern a?b? - is applied to a string not beginning with "a" or "b", it matches the - empty string at the start of the subject. With PCRE_NOTEMPTY set, this + is applied to a string not beginning with "a" or "b", it matches an + empty string at the start of the subject. With PCRE_NOTEMPTY set, this match is not valid, so PCRE searches further into the string for occur- rences of "a" or "b". - Perl has no direct equivalent of PCRE_NOTEMPTY, but it does make a spe- - cial case of a pattern match of the empty string within its split() - function, and when using the /g modifier. It is possible to emulate - Perl's behaviour after matching a null string by first trying the match - again at the same offset with PCRE_NOTEMPTY and PCRE_ANCHORED, and then - if that fails by advancing the starting offset (see below) and trying - an ordinary match again. There is some code that demonstrates how to do - this in the pcredemo.c sample program. + PCRE_NOTEMPTY_ATSTART + + This is like PCRE_NOTEMPTY, except that an empty string match that is + not at the start of the subject is permitted. If the pattern is + anchored, such a match can occur only if the pattern contains \K. + + Perl has no direct equivalent of PCRE_NOTEMPTY or + PCRE_NOTEMPTY_ATSTART, but it does make a special case of a pattern + match of the empty string within its split() function, and when using + the /g modifier. It is possible to emulate Perl's behaviour after + matching a null string by first trying the match again at the same off- + set with PCRE_NOTEMPTY_ATSTART and PCRE_ANCHORED, and then if that + fails, by advancing the starting offset (see below) and trying an ordi- + nary match again. There is some code that demonstrates how to do this + in the pcredemo sample program. PCRE_NO_START_OPTIMIZE @@ -2056,128 +2110,132 @@ MATCHING A PATTERN: THE TRADITIONAL FUNCTION value of startoffset that does not point to the start of a UTF-8 char- acter, is undefined. Your program may crash. - PCRE_PARTIAL - - This option turns on the partial matching feature. If the subject - string fails to match the pattern, but at some point during the match- - ing process the end of the subject was reached (that is, the subject - partially matches the pattern and the failure to match occurred only - because there were not enough subject characters), pcre_exec() returns - PCRE_ERROR_PARTIAL instead of PCRE_ERROR_NOMATCH. When PCRE_PARTIAL is - used, there are restrictions on what may appear in the pattern. These - are discussed in the pcrepartial documentation. + PCRE_PARTIAL_HARD + PCRE_PARTIAL_SOFT + + These options turn on the partial matching feature. For backwards com- + patibility, PCRE_PARTIAL is a synonym for PCRE_PARTIAL_SOFT. A partial + match occurs if the end of the subject string is reached successfully, + but there are not enough subject characters to complete the match. If + this happens when PCRE_PARTIAL_HARD is set, pcre_exec() immediately + returns PCRE_ERROR_PARTIAL. Otherwise, if PCRE_PARTIAL_SOFT is set, + matching continues by testing any other alternatives. Only if they all + fail is PCRE_ERROR_PARTIAL returned (instead of PCRE_ERROR_NOMATCH). + The portion of the string that was inspected when the partial match was + found is set as the first matching string. There is a more detailed + discussion in the pcrepartial documentation. The string to be matched by pcre_exec() - The subject string is passed to pcre_exec() as a pointer in subject, a + The subject string is passed to pcre_exec() as a pointer in subject, a length (in bytes) in length, and a starting byte offset in startoffset. In UTF-8 mode, the byte offset must point to the start of a UTF-8 char- - acter. Unlike the pattern string, the subject may contain binary zero - bytes. When the starting offset is zero, the search for a match starts - at the beginning of the subject, and this is by far the most common + acter. Unlike the pattern string, the subject may contain binary zero + bytes. When the starting offset is zero, the search for a match starts + at the beginning of the subject, and this is by far the most common case. - A non-zero starting offset is useful when searching for another match - in the same subject by calling pcre_exec() again after a previous suc- - cess. Setting startoffset differs from just passing over a shortened - string and setting PCRE_NOTBOL in the case of a pattern that begins + A non-zero starting offset is useful when searching for another match + in the same subject by calling pcre_exec() again after a previous suc- + cess. Setting startoffset differs from just passing over a shortened + string and setting PCRE_NOTBOL in the case of a pattern that begins with any kind of lookbehind. For example, consider the pattern \Biss\B - which finds occurrences of "iss" in the middle of words. (\B matches - only if the current position in the subject is not a word boundary.) - When applied to the string "Mississipi" the first call to pcre_exec() - finds the first occurrence. If pcre_exec() is called again with just - the remainder of the subject, namely "issipi", it does not match, + which finds occurrences of "iss" in the middle of words. (\B matches + only if the current position in the subject is not a word boundary.) + When applied to the string "Mississipi" the first call to pcre_exec() + finds the first occurrence. If pcre_exec() is called again with just + the remainder of the subject, namely "issipi", it does not match, because \B is always false at the start of the subject, which is deemed - to be a word boundary. However, if pcre_exec() is passed the entire + to be a word boundary. However, if pcre_exec() is passed the entire string again, but with startoffset set to 4, it finds the second occur- - rence of "iss" because it is able to look behind the starting point to + rence of "iss" because it is able to look behind the starting point to discover that it is preceded by a letter. - If a non-zero starting offset is passed when the pattern is anchored, + If a non-zero starting offset is passed when the pattern is anchored, one attempt to match at the given offset is made. This can only succeed - if the pattern does not require the match to be at the start of the + if the pattern does not require the match to be at the start of the subject. How pcre_exec() returns captured substrings - In general, a pattern matches a certain portion of the subject, and in - addition, further substrings from the subject may be picked out by - parts of the pattern. Following the usage in Jeffrey Friedl's book, - this is called "capturing" in what follows, and the phrase "capturing - subpattern" is used for a fragment of a pattern that picks out a sub- - string. PCRE supports several other kinds of parenthesized subpattern + In general, a pattern matches a certain portion of the subject, and in + addition, further substrings from the subject may be picked out by + parts of the pattern. Following the usage in Jeffrey Friedl's book, + this is called "capturing" in what follows, and the phrase "capturing + subpattern" is used for a fragment of a pattern that picks out a sub- + string. PCRE supports several other kinds of parenthesized subpattern that do not cause substrings to be captured. Captured substrings are returned to the caller via a vector of integers - whose address is passed in ovector. The number of elements in the vec- - tor is passed in ovecsize, which must be a non-negative number. Note: + whose address is passed in ovector. The number of elements in the vec- + tor is passed in ovecsize, which must be a non-negative number. Note: this argument is NOT the size of ovector in bytes. - The first two-thirds of the vector is used to pass back captured sub- - strings, each substring using a pair of integers. The remaining third - of the vector is used as workspace by pcre_exec() while matching cap- - turing subpatterns, and is not available for passing back information. - The number passed in ovecsize should always be a multiple of three. If + The first two-thirds of the vector is used to pass back captured sub- + strings, each substring using a pair of integers. The remaining third + of the vector is used as workspace by pcre_exec() while matching cap- + turing subpatterns, and is not available for passing back information. + The number passed in ovecsize should always be a multiple of three. If it is not, it is rounded down. - When a match is successful, information about captured substrings is - returned in pairs of integers, starting at the beginning of ovector, - and continuing up to two-thirds of its length at the most. The first - element of each pair is set to the byte offset of the first character - in a substring, and the second is set to the byte offset of the first - character after the end of a substring. Note: these values are always + When a match is successful, information about captured substrings is + returned in pairs of integers, starting at the beginning of ovector, + and continuing up to two-thirds of its length at the most. The first + element of each pair is set to the byte offset of the first character + in a substring, and the second is set to the byte offset of the first + character after the end of a substring. Note: these values are always byte offsets, even in UTF-8 mode. They are not character counts. - The first pair of integers, ovector[0] and ovector[1], identify the - portion of the subject string matched by the entire pattern. The next - pair is used for the first capturing subpattern, and so on. The value + The first pair of integers, ovector[0] and ovector[1], identify the + portion of the subject string matched by the entire pattern. The next + pair is used for the first capturing subpattern, and so on. The value returned by pcre_exec() is one more than the highest numbered pair that - has been set. For example, if two substrings have been captured, the - returned value is 3. If there are no capturing subpatterns, the return + has been set. For example, if two substrings have been captured, the + returned value is 3. If there are no capturing subpatterns, the return value from a successful match is 1, indicating that just the first pair of offsets has been set. If a capturing subpattern is matched repeatedly, it is the last portion of the string that it matched that is returned. - If the vector is too small to hold all the captured substring offsets, + If the vector is too small to hold all the captured substring offsets, it is used as far as possible (up to two-thirds of its length), and the - function returns a value of zero. If the substring offsets are not of - interest, pcre_exec() may be called with ovector passed as NULL and - ovecsize as zero. However, if the pattern contains back references and - the ovector is not big enough to remember the related substrings, PCRE - has to get additional memory for use during matching. Thus it is usu- + function returns a value of zero. If the substring offsets are not of + interest, pcre_exec() may be called with ovector passed as NULL and + ovecsize as zero. However, if the pattern contains back references and + the ovector is not big enough to remember the related substrings, PCRE + has to get additional memory for use during matching. Thus it is usu- ally advisable to supply an ovector. - The pcre_info() function can be used to find out how many capturing - subpatterns there are in a compiled pattern. The smallest size for - ovector that will allow for n captured substrings, in addition to the + The pcre_fullinfo() function can be used to find out how many capturing + subpatterns there are in a compiled pattern. The smallest size for + ovector that will allow for n captured substrings, in addition to the offsets of the substring matched by the whole pattern, is (n+1)*3. - It is possible for capturing subpattern number n+1 to match some part + It is possible for capturing subpattern number n+1 to match some part of the subject when subpattern n has not been used at all. For example, - if the string "abc" is matched against the pattern (a|(z))(bc) the + if the string "abc" is matched against the pattern (a|(z))(bc) the return from the function is 4, and subpatterns 1 and 3 are matched, but - 2 is not. When this happens, both values in the offset pairs corre- + 2 is not. When this happens, both values in the offset pairs corre- sponding to unused subpatterns are set to -1. - Offset values that correspond to unused subpatterns at the end of the - expression are also set to -1. For example, if the string "abc" is - matched against the pattern (abc)(x(yz)?)? subpatterns 2 and 3 are not - matched. The return from the function is 2, because the highest used + Offset values that correspond to unused subpatterns at the end of the + expression are also set to -1. For example, if the string "abc" is + matched against the pattern (abc)(x(yz)?)? subpatterns 2 and 3 are not + matched. The return from the function is 2, because the highest used capturing subpattern number is 1. However, you can refer to the offsets - for the second and third capturing subpatterns if you wish (assuming + for the second and third capturing subpatterns if you wish (assuming the vector is large enough, of course). - Some convenience functions are provided for extracting the captured + Some convenience functions are provided for extracting the captured substrings as separate strings. These are described below. Error return values from pcre_exec() - If pcre_exec() fails, it returns a negative number. The following are + If pcre_exec() fails, it returns a negative number. The following are defined in the header file: PCRE_ERROR_NOMATCH (-1) @@ -2186,7 +2244,7 @@ MATCHING A PATTERN: THE TRADITIONAL FUNCTION PCRE_ERROR_NULL (-2) - Either code or subject was passed as NULL, or ovector was NULL and + Either code or subject was passed as NULL, or ovector was NULL and ovecsize was not zero. PCRE_ERROR_BADOPTION (-3) @@ -2195,65 +2253,66 @@ MATCHING A PATTERN: THE TRADITIONAL FUNCTION PCRE_ERROR_BADMAGIC (-4) - PCRE stores a 4-byte "magic number" at the start of the compiled code, + PCRE stores a 4-byte "magic number" at the start of the compiled code, to catch the case when it is passed a junk pointer and to detect when a pattern that was compiled in an environment of one endianness is run in - an environment with the other endianness. This is the error that PCRE + an environment with the other endianness. This is the error that PCRE gives when the magic number is not present. PCRE_ERROR_UNKNOWN_OPCODE (-5) While running the pattern match, an unknown item was encountered in the - compiled pattern. This error could be caused by a bug in PCRE or by + compiled pattern. This error could be caused by a bug in PCRE or by overwriting of the compiled pattern. PCRE_ERROR_NOMEMORY (-6) - If a pattern contains back references, but the ovector that is passed + If a pattern contains back references, but the ovector that is passed to pcre_exec() is not big enough to remember the referenced substrings, - PCRE gets a block of memory at the start of matching to use for this - purpose. If the call via pcre_malloc() fails, this error is given. The + PCRE gets a block of memory at the start of matching to use for this + purpose. If the call via pcre_malloc() fails, this error is given. The memory is automatically freed at the end of matching. PCRE_ERROR_NOSUBSTRING (-7) - This error is used by the pcre_copy_substring(), pcre_get_substring(), + This error is used by the pcre_copy_substring(), pcre_get_substring(), and pcre_get_substring_list() functions (see below). It is never returned by pcre_exec(). PCRE_ERROR_MATCHLIMIT (-8) - The backtracking limit, as specified by the match_limit field in a - pcre_extra structure (or defaulted) was reached. See the description + The backtracking limit, as specified by the match_limit field in a + pcre_extra structure (or defaulted) was reached. See the description above. PCRE_ERROR_CALLOUT (-9) This error is never generated by pcre_exec() itself. It is provided for - use by callout functions that want to yield a distinctive error code. + use by callout functions that want to yield a distinctive error code. See the pcrecallout documentation for details. PCRE_ERROR_BADUTF8 (-10) - A string that contains an invalid UTF-8 byte sequence was passed as a + A string that contains an invalid UTF-8 byte sequence was passed as a subject. PCRE_ERROR_BADUTF8_OFFSET (-11) The UTF-8 byte sequence that was passed as a subject was valid, but the - value of startoffset did not point to the beginning of a UTF-8 charac- + value of startoffset did not point to the beginning of a UTF-8 charac- ter. PCRE_ERROR_PARTIAL (-12) - The subject string did not match, but it did match partially. See the + The subject string did not match, but it did match partially. See the pcrepartial documentation for details of partial matching. PCRE_ERROR_BADPARTIAL (-13) - The PCRE_PARTIAL option was used with a compiled pattern containing - items that are not supported for partial matching. See the pcrepartial - documentation for details of partial matching. + This code is no longer in use. It was formerly returned when the + PCRE_PARTIAL option was used with a compiled pattern containing items + that were not supported for partial matching. From release 8.00 + onwards, there are no restrictions on partial matching. PCRE_ERROR_INTERNAL (-14) @@ -2412,10 +2471,13 @@ EXTRACTING CAPTURED SUBSTRINGS BY NAME ate. NOTE: If PCRE_DUPNAMES is set and there are duplicate names, the behaviour may not be what you want (see the next section). - Warning: If the pattern uses the "(?|" feature to set up multiple sub- - patterns with the same number, you cannot use names to distinguish - them, because names are not included in the compiled code. The matching - process uses only numbers. + Warning: If the pattern uses the (?| feature to set up multiple subpat- + terns with the same number, as described in the section on duplicate + subpattern numbers in the pcrepattern page, you cannot use names to + distinguish the different subpatterns, because names are not included + in the compiled code. The matching process uses only numbers. For this + reason, the use of different names for subpatterns of the same number + causes an error at compile time. DUPLICATE SUBPATTERN NAMES @@ -2423,47 +2485,51 @@ DUPLICATE SUBPATTERN NAMES int pcre_get_stringtable_entries(const pcre *code, const char *name, char **first, char **last); - When a pattern is compiled with the PCRE_DUPNAMES option, names for - subpatterns are not required to be unique. Normally, patterns with - duplicate names are such that in any one match, only one of the named - subpatterns participates. An example is shown in the pcrepattern docu- - mentation. + When a pattern is compiled with the PCRE_DUPNAMES option, names for + subpatterns are not required to be unique. (Duplicate names are always + allowed for subpatterns with the same number, created by using the (?| + feature. Indeed, if such subpatterns are named, they are required to + use the same names.) + + Normally, patterns with duplicate names are such that in any one match, + only one of the named subpatterns participates. An example is shown in + the pcrepattern documentation. - When duplicates are present, pcre_copy_named_substring() and - pcre_get_named_substring() return the first substring corresponding to - the given name that is set. If none are set, PCRE_ERROR_NOSUBSTRING - (-7) is returned; no data is returned. The pcre_get_stringnumber() - function returns one of the numbers that are associated with the name, + When duplicates are present, pcre_copy_named_substring() and + pcre_get_named_substring() return the first substring corresponding to + the given name that is set. If none are set, PCRE_ERROR_NOSUBSTRING + (-7) is returned; no data is returned. The pcre_get_stringnumber() + function returns one of the numbers that are associated with the name, but it is not defined which it is. - If you want to get full details of all captured substrings for a given - name, you must use the pcre_get_stringtable_entries() function. The + If you want to get full details of all captured substrings for a given + name, you must use the pcre_get_stringtable_entries() function. The first argument is the compiled pattern, and the second is the name. The - third and fourth are pointers to variables which are updated by the + third and fourth are pointers to variables which are updated by the function. After it has run, they point to the first and last entries in - the name-to-number table for the given name. The function itself - returns the length of each entry, or PCRE_ERROR_NOSUBSTRING (-7) if - there are none. The format of the table is described above in the sec- - tion entitled Information about a pattern. Given all the relevant - entries for the name, you can extract each of their numbers, and hence + the name-to-number table for the given name. The function itself + returns the length of each entry, or PCRE_ERROR_NOSUBSTRING (-7) if + there are none. The format of the table is described above in the sec- + tion entitled Information about a pattern. Given all the relevant + entries for the name, you can extract each of their numbers, and hence the captured data, if any. FINDING ALL POSSIBLE MATCHES - The traditional matching function uses a similar algorithm to Perl, + The traditional matching function uses a similar algorithm to Perl, which stops when it finds the first match, starting at a given point in - the subject. If you want to find all possible matches, or the longest - possible match, consider using the alternative matching function (see - below) instead. If you cannot use the alternative function, but still - need to find all possible matches, you can kludge it up by making use + the subject. If you want to find all possible matches, or the longest + possible match, consider using the alternative matching function (see + below) instead. If you cannot use the alternative function, but still + need to find all possible matches, you can kludge it up by making use of the callout facility, which is described in the pcrecallout documen- tation. What you have to do is to insert a callout right at the end of the pat- - tern. When your callout function is called, extract and save the cur- - rent matched substring. Then return 1, which forces pcre_exec() to - backtrack and try other alternatives. Ultimately, when it runs out of + tern. When your callout function is called, extract and save the cur- + rent matched substring. Then return 1, which forces pcre_exec() to + backtrack and try other alternatives. Ultimately, when it runs out of matches, pcre_exec() will yield PCRE_ERROR_NOMATCH. @@ -2474,14 +2540,15 @@ MATCHING A PATTERN: THE ALTERNATIVE FUNCTION int options, int *ovector, int ovecsize, int *workspace, int wscount); - The function pcre_dfa_exec() is called to match a subject string - against a compiled pattern, using a matching algorithm that scans the - subject string just once, and does not backtrack. This has different - characteristics to the normal algorithm, and is not compatible with - Perl. Some of the features of PCRE patterns are not supported. Never- - theless, there are times when this kind of matching can be useful. For - a discussion of the two matching algorithms, see the pcrematching docu- - mentation. + The function pcre_dfa_exec() is called to match a subject string + against a compiled pattern, using a matching algorithm that scans the + subject string just once, and does not backtrack. This has different + characteristics to the normal algorithm, and is not compatible with + Perl. Some of the features of PCRE patterns are not supported. Never- + theless, there are times when this kind of matching can be useful. For + a discussion of the two matching algorithms, and a list of features + that pcre_dfa_exec() does not support, see the pcrematching documenta- + tion. The arguments for the pcre_dfa_exec() function are the same as for pcre_exec(), plus two extras. The ovector argument is used in a differ- @@ -2516,38 +2583,43 @@ MATCHING A PATTERN: THE ALTERNATIVE FUNCTION The unused bits of the options argument for pcre_dfa_exec() must be zero. The only bits that may be set are PCRE_ANCHORED, PCRE_NEW- - LINE_xxx, PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NO_UTF8_CHECK, - PCRE_PARTIAL, PCRE_DFA_SHORTEST, and PCRE_DFA_RESTART. All but the last - three of these are the same as for pcre_exec(), so their description is - not repeated here. - - PCRE_PARTIAL - - This has the same general effect as it does for pcre_exec(), but the - details are slightly different. When PCRE_PARTIAL is set for - pcre_dfa_exec(), the return code PCRE_ERROR_NOMATCH is converted into - PCRE_ERROR_PARTIAL if the end of the subject is reached, there have - been no complete matches, but there is still at least one matching pos- - sibility. The portion of the string that provided the partial match is - set as the first matching string. + LINE_xxx, PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, + PCRE_NOTEMPTY_ATSTART, PCRE_NO_UTF8_CHECK, PCRE_PARTIAL_HARD, PCRE_PAR- + TIAL_SOFT, PCRE_DFA_SHORTEST, and PCRE_DFA_RESTART. All but the last + four of these are exactly the same as for pcre_exec(), so their + description is not repeated here. + + PCRE_PARTIAL_HARD + PCRE_PARTIAL_SOFT + + These have the same general effect as they do for pcre_exec(), but the + details are slightly different. When PCRE_PARTIAL_HARD is set for + pcre_dfa_exec(), it returns PCRE_ERROR_PARTIAL if the end of the sub- + ject is reached and there is still at least one matching possibility + that requires additional characters. This happens even if some complete + matches have also been found. When PCRE_PARTIAL_SOFT is set, the return + code PCRE_ERROR_NOMATCH is converted into PCRE_ERROR_PARTIAL if the end + of the subject is reached, there have been no complete matches, but + there is still at least one matching possibility. The portion of the + string that was inspected when the longest partial match was found is + set as the first matching string in both cases. PCRE_DFA_SHORTEST - Setting the PCRE_DFA_SHORTEST option causes the matching algorithm to + Setting the PCRE_DFA_SHORTEST option causes the matching algorithm to stop as soon as it has found one match. Because of the way the alterna- - tive algorithm works, this is necessarily the shortest possible match + tive algorithm works, this is necessarily the shortest possible match at the first possible matching point in the subject string. PCRE_DFA_RESTART - When pcre_dfa_exec() is called with the PCRE_PARTIAL option, and - returns a partial match, it is possible to call it again, with addi- - tional subject characters, and have it continue with the same match. - The PCRE_DFA_RESTART option requests this action; when it is set, the - workspace and wscount options must reference the same vector as before - because data about the match so far is left in them after a partial - match. There is more discussion of this facility in the pcrepartial - documentation. + When pcre_dfa_exec() returns a partial match, it is possible to call it + again, with additional subject characters, and have it continue with + the same match. The PCRE_DFA_RESTART option requests this action; when + it is set, the workspace and wscount options must reference the same + vector as before because data about the match so far is left in them + after a partial match. There is more discussion of this facility in the + pcrepartial documentation. Successful returns from pcre_dfa_exec() @@ -2636,7 +2708,7 @@ AUTHOR REVISION - Last updated: 11 April 2009 + Last updated: 03 October 2009 Copyright (c) 1997-2009 University of Cambridge. ------------------------------------------------------------------------------ @@ -2666,10 +2738,10 @@ PCRE CALLOUTS (?C1)abc(?C2)def - If the PCRE_AUTO_CALLOUT option bit is set when pcre_compile() is - called, PCRE automatically inserts callouts, all with number 255, - before each item in the pattern. For example, if PCRE_AUTO_CALLOUT is - used with the pattern + If the PCRE_AUTO_CALLOUT option bit is set when pcre_compile() or + pcre_compile2() is called, PCRE automatically inserts callouts, all + with number 255, before each item in the pattern. For example, if + PCRE_AUTO_CALLOUT is used with the pattern A(\d{2}|--) @@ -2698,18 +2770,23 @@ MISSING CALLOUTS ever start, and the callout is never reached. However, with "abyd", though the result is still no match, the callout is obeyed. - You can disable these optimizations by passing the PCRE_NO_START_OPTI- - MIZE option to pcre_exec() or pcre_dfa_exec(). This slows down the - matching process, but does ensure that callouts such as the example + If the pattern is studied, PCRE knows the minimum length of a matching + string, and will immediately give a "no match" return without actually + running a match if the subject is not long enough, or, for unanchored + patterns, if it has been scanned far enough. + + You can disable these optimizations by passing the PCRE_NO_START_OPTI- + MIZE option to pcre_exec() or pcre_dfa_exec(). This slows down the + matching process, but does ensure that callouts such as the example above are obeyed. THE CALLOUT INTERFACE - During matching, when PCRE reaches a callout point, the external func- - tion defined by pcre_callout is called (if it is set). This applies to - both the pcre_exec() and the pcre_dfa_exec() matching functions. The - only argument to the callout function is a pointer to a pcre_callout + During matching, when PCRE reaches a callout point, the external func- + tion defined by pcre_callout is called (if it is set). This applies to + both the pcre_exec() and the pcre_dfa_exec() matching functions. The + only argument to the callout function is a pointer to a pcre_callout block. This structure contains the following fields: int version; @@ -2725,81 +2802,81 @@ THE CALLOUT INTERFACE int pattern_position; int next_item_length; - The version field is an integer containing the version number of the - block format. The initial version was 0; the current version is 1. The - version number will change again in future if additional fields are + The version field is an integer containing the version number of the + block format. The initial version was 0; the current version is 1. The + version number will change again in future if additional fields are added, but the intention is never to remove any of the existing fields. - The callout_number field contains the number of the callout, as com- - piled into the pattern (that is, the number after ?C for manual call- + The callout_number field contains the number of the callout, as com- + piled into the pattern (that is, the number after ?C for manual call- outs, and 255 for automatically generated callouts). - The offset_vector field is a pointer to the vector of offsets that was - passed by the caller to pcre_exec() or pcre_dfa_exec(). When - pcre_exec() is used, the contents can be inspected in order to extract - substrings that have been matched so far, in the same way as for - extracting substrings after a match has completed. For pcre_dfa_exec() + The offset_vector field is a pointer to the vector of offsets that was + passed by the caller to pcre_exec() or pcre_dfa_exec(). When + pcre_exec() is used, the contents can be inspected in order to extract + substrings that have been matched so far, in the same way as for + extracting substrings after a match has completed. For pcre_dfa_exec() this field is not useful. The subject and subject_length fields contain copies of the values that were passed to pcre_exec(). - The start_match field normally contains the offset within the subject - at which the current match attempt started. However, if the escape - sequence \K has been encountered, this value is changed to reflect the - modified starting point. If the pattern is not anchored, the callout + The start_match field normally contains the offset within the subject + at which the current match attempt started. However, if the escape + sequence \K has been encountered, this value is changed to reflect the + modified starting point. If the pattern is not anchored, the callout function may be called several times from the same point in the pattern for different starting points in the subject. - The current_position field contains the offset within the subject of + The current_position field contains the offset within the subject of the current match pointer. - When the pcre_exec() function is used, the capture_top field contains - one more than the number of the highest numbered captured substring so - far. If no substrings have been captured, the value of capture_top is - one. This is always the case when pcre_dfa_exec() is used, because it + When the pcre_exec() function is used, the capture_top field contains + one more than the number of the highest numbered captured substring so + far. If no substrings have been captured, the value of capture_top is + one. This is always the case when pcre_dfa_exec() is used, because it does not support captured substrings. - The capture_last field contains the number of the most recently cap- - tured substring. If no substrings have been captured, its value is -1. + The capture_last field contains the number of the most recently cap- + tured substring. If no substrings have been captured, its value is -1. This is always the case when pcre_dfa_exec() is used. - The callout_data field contains a value that is passed to pcre_exec() - or pcre_dfa_exec() specifically so that it can be passed back in call- - outs. It is passed in the pcre_callout field of the pcre_extra data - structure. If no such data was passed, the value of callout_data in a - pcre_callout block is NULL. There is a description of the pcre_extra + The callout_data field contains a value that is passed to pcre_exec() + or pcre_dfa_exec() specifically so that it can be passed back in call- + outs. It is passed in the pcre_callout field of the pcre_extra data + structure. If no such data was passed, the value of callout_data in a + pcre_callout block is NULL. There is a description of the pcre_extra structure in the pcreapi documentation. - The pattern_position field is present from version 1 of the pcre_call- + The pattern_position field is present from version 1 of the pcre_call- out structure. It contains the offset to the next item to be matched in the pattern string. - The next_item_length field is present from version 1 of the pcre_call- + The next_item_length field is present from version 1 of the pcre_call- out structure. It contains the length of the next item to be matched in - the pattern string. When the callout immediately precedes an alterna- - tion bar, a closing parenthesis, or the end of the pattern, the length - is zero. When the callout precedes an opening parenthesis, the length + the pattern string. When the callout immediately precedes an alterna- + tion bar, a closing parenthesis, or the end of the pattern, the length + is zero. When the callout precedes an opening parenthesis, the length is that of the entire subpattern. - The pattern_position and next_item_length fields are intended to help - in distinguishing between different automatic callouts, which all have + The pattern_position and next_item_length fields are intended to help + in distinguishing between different automatic callouts, which all have the same callout number. However, they are set for all callouts. RETURN VALUES - The external callout function returns an integer to PCRE. If the value - is zero, matching proceeds as normal. If the value is greater than - zero, matching fails at the current point, but the testing of other + The external callout function returns an integer to PCRE. If the value + is zero, matching proceeds as normal. If the value is greater than + zero, matching fails at the current point, but the testing of other matching possibilities goes ahead, just as if a lookahead assertion had - failed. If the value is less than zero, the match is abandoned, and - pcre_exec() (or pcre_dfa_exec()) returns the negative value. + failed. If the value is less than zero, the match is abandoned, and + pcre_exec() or pcre_dfa_exec() returns the negative value. - Negative values should normally be chosen from the set of + Negative values should normally be chosen from the set of PCRE_ERROR_xxx values. In particular, PCRE_ERROR_NOMATCH forces a stan- - dard "no match" failure. The error number PCRE_ERROR_CALLOUT is - reserved for use by callout functions; it will never be used by PCRE + dard "no match" failure. The error number PCRE_ERROR_CALLOUT is + reserved for use by callout functions; it will never be used by PCRE itself. @@ -2812,7 +2889,7 @@ AUTHOR REVISION - Last updated: 15 March 2009 + Last updated: 29 September 2009 Copyright (c) 1997-2009 University of Cambridge. ------------------------------------------------------------------------------ @@ -2827,46 +2904,49 @@ NAME DIFFERENCES BETWEEN PCRE AND PERL This document describes the differences in the ways that PCRE and Perl - handle regular expressions. The differences described here are mainly - with respect to Perl 5.8, though PCRE versions 7.0 and later contain - some features that are expected to be in the forthcoming Perl 5.10. + handle regular expressions. The differences described here are with + respect to Perl 5.10. - 1. PCRE has only a subset of Perl's UTF-8 and Unicode support. Details - of what it does have are given in the section on UTF-8 support in the + 1. PCRE has only a subset of Perl's UTF-8 and Unicode support. Details + of what it does have are given in the section on UTF-8 support in the main pcre page. 2. PCRE does not allow repeat quantifiers on lookahead assertions. Perl - permits them, but they do not mean what you might think. For example, + permits them, but they do not mean what you might think. For example, (?!a){3} does not assert that the next three characters are not "a". It just asserts that the next character is not "a" three times. - 3. Capturing subpatterns that occur inside negative lookahead asser- - tions are counted, but their entries in the offsets vector are never - set. Perl sets its numerical variables from any such patterns that are + 3. Capturing subpatterns that occur inside negative lookahead asser- + tions are counted, but their entries in the offsets vector are never + set. Perl sets its numerical variables from any such patterns that are matched before the assertion fails to match something (thereby succeed- - ing), but only if the negative lookahead assertion contains just one + ing), but only if the negative lookahead assertion contains just one branch. - 4. Though binary zero characters are supported in the subject string, + 4. Though binary zero characters are supported in the subject string, they are not allowed in a pattern string because it is passed as a nor- mal C string, terminated by zero. The escape sequence \0 can be used in the pattern to represent a binary zero. - 5. The following Perl escape sequences are not supported: \l, \u, \L, + 5. The following Perl escape sequences are not supported: \l, \u, \L, \U, and \N. In fact these are implemented by Perl's general string-han- - dling and are not part of its pattern matching engine. If any of these + dling and are not part of its pattern matching engine. If any of these are encountered by PCRE, an error is generated. - 6. The Perl escape sequences \p, \P, and \X are supported only if PCRE - is built with Unicode character property support. The properties that - can be tested with \p and \P are limited to the general category prop- - erties such as Lu and Nd, script names such as Greek or Han, and the - derived properties Any and L&. + 6. The Perl escape sequences \p, \P, and \X are supported only if PCRE + is built with Unicode character property support. The properties that + can be tested with \p and \P are limited to the general category prop- + erties such as Lu and Nd, script names such as Greek or Han, and the + derived properties Any and L&. PCRE does support the Cs (surrogate) + property, which Perl does not; the Perl documentation says "Because + Perl hides the need for the user to understand the internal representa- + tion of Unicode characters, there is no need to implement the somewhat + messy concept of surrogates." 7. PCRE does support the \Q...\E escape for quoting substrings. Charac- - ters 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 cause variable interpolation (but of course PCRE + ters 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 cause variable interpolation (but of course PCRE does not have variables). Note the following examples: Pattern PCRE matches Perl matches @@ -2876,55 +2956,68 @@ DIFFERENCES BETWEEN PCRE AND PERL \Qabc\$xyz\E abc\$xyz abc\$xyz \Qabc\E\$\Qxyz\E abc$xyz abc$xyz - The \Q...\E sequence is recognized both inside and outside character + The \Q...\E sequence is recognized both inside and outside character classes. 8. Fairly obviously, PCRE does not support the (?{code}) and (??{code}) - constructions. However, there is support for recursive patterns. This - is not available in Perl 5.8, but will be in Perl 5.10. Also, the PCRE - "callout" feature allows an external function to be called during pat- + constructions. However, there is support for recursive patterns. This + is not available in Perl 5.8, but it is in Perl 5.10. Also, the PCRE + "callout" feature allows an external function to be called during pat- tern matching. See the pcrecallout documentation for details. - 9. Subpatterns that are called recursively or as "subroutines" are - always treated as atomic groups in PCRE. This is like Python, but - unlike Perl. + 9. Subpatterns that are called recursively or as "subroutines" are + always treated as atomic groups in PCRE. This is like Python, but + unlike Perl. There is a discussion of an example that explains this in + more detail in the section on recursion differences from Perl in the + pcrepattern page. - 10. There are some differences that are concerned with the settings of - captured strings when part of a pattern is repeated. For example, - matching "aba" against the pattern /^(a(b)?)+$/ in Perl leaves $2 + 10. There are some differences that are concerned with the settings of + captured strings when part of a pattern is repeated. For example, + matching "aba" against the pattern /^(a(b)?)+$/ in Perl leaves $2 unset, but in PCRE it is set to "b". 11. PCRE does support Perl 5.10's backtracking verbs (*ACCEPT), - (*FAIL), (*F), (*COMMIT), (*PRUNE), (*SKIP), and (*THEN), but only in - the forms without an argument. PCRE does not support (*MARK). If - (*ACCEPT) is within capturing parentheses, PCRE does not set that cap- - ture group; this is different to Perl. - - 12. PCRE provides some extensions to the Perl regular expression facil- - ities. Perl 5.10 will include new features that are not in earlier - versions, some of which (such as named parentheses) have been in PCRE - for some time. This list is with respect to Perl 5.10: - - (a) Although lookbehind assertions must match fixed length strings, - each alternative branch of a lookbehind assertion can match a different - length of string. Perl requires them all to have the same length. + (*FAIL), (*F), (*COMMIT), (*PRUNE), (*SKIP), and (*THEN), but only in + the forms without an argument. PCRE does not support (*MARK). + + 12. PCRE's handling of duplicate subpattern numbers and duplicate sub- + pattern names is not as general as Perl's. This is a consequence of the + fact the PCRE works internally just with numbers, using an external ta- + ble to translate between numbers and names. In particular, a pattern + such as (?|(?A)|(?...) - or (?'name'...) as in Perl, or (?P...) as in Python. References + In PCRE, a subpattern can be named in one of three ways: (?...) + or (?'name'...) as in Perl, or (?P...) as in Python. References to capturing parentheses from other parts of the pattern, such as back- - references, recursion, and conditions, can be made by name as well as + references, recursion, and conditions, can be made by name as well as by number. - Names consist of up to 32 alphanumeric characters and underscores. - Named capturing parentheses are still allocated numbers as well as - names, exactly as if the names were not present. The PCRE API provides + Names consist of up to 32 alphanumeric characters and underscores. + Named capturing parentheses are still allocated numbers as well as + names, exactly as if the names were not present. The PCRE API provides function calls for extracting the name-to-number translation table from a compiled pattern. There is also a convenience function for extracting a captured substring by name. - By default, a name must be unique within a pattern, but it is possible + By default, a name must be unique within a pattern, but it is possible to relax this constraint by setting the PCRE_DUPNAMES option at compile - time. This can be useful for patterns where only one instance of the - named parentheses can match. Suppose you want to match the name of a - weekday, either as a 3-letter abbreviation or as the full name, and in + time. (Duplicate names are also always permitted for subpatterns with + the same number, set up as described in the previous section.) Dupli- + cate names can be useful for patterns where only one instance of the + named parentheses can match. Suppose you want to match the name of a + weekday, either as a 3-letter abbreviation or as the full name, and in both cases you want to extract the abbreviation. This pattern (ignoring the line breaks) does the job: @@ -3998,26 +4112,38 @@ NAMED SUBPATTERNS (?Thu)(?:rsday)?| (?Sat)(?:urday)? - There are five capturing substrings, but only one is ever set after a + There are five capturing substrings, but only one is ever set after a match. (An alternative way of solving this problem is to use a "branch reset" subpattern, as described in the previous section.) - The convenience function for extracting the data by name returns the - substring for the first (and in this example, the only) subpattern of - that name that matched. This saves searching to find which numbered - subpattern it was. If you make a reference to a non-unique named sub- - pattern from elsewhere in the pattern, the one that corresponds to the - lowest number is used. For further details of the interfaces for han- - dling named subpatterns, see the pcreapi documentation. + The convenience function for extracting the data by name returns the + substring for the first (and in this example, the only) subpattern of + that name that matched. This saves searching to find which numbered + subpattern it was. + + If you make a backreference to a non-unique named subpattern from else- + where in the pattern, the one that corresponds to the first occurrence + of the name is used. In the absence of duplicate numbers (see the pre- + vious section) this is the one with the lowest number. If you use a + named reference in a condition test (see the section about conditions + below), either to check whether a subpattern has matched, or to check + for recursion, all subpatterns with the same name are tested. If the + condition is true for any one of them, the overall condition is true. + This is the same behaviour as testing by number. For further details of + the interfaces for handling named subpatterns, see the pcreapi documen- + tation. Warning: You cannot use different names to distinguish between two sub- - patterns with the same number (see the previous section) because PCRE - uses only the numbers when matching. + patterns with the same number because PCRE uses only the numbers when + matching. For this reason, an error is given at compile time if differ- + ent names are given to subpatterns with the same number. However, you + can give the same name to subpatterns with the same number, even when + PCRE_DUPNAMES is not set. REPETITION - Repetition is specified by quantifiers, which can follow any of the + Repetition is specified by quantifiers, which can follow any of the following items: a literal data character @@ -4029,18 +4155,19 @@ REPETITION a character class a back reference (see next section) a parenthesized subpattern (unless it is an assertion) + a recursive or "subroutine" call to a subpattern - The general repetition quantifier specifies a minimum and maximum num- - ber of permitted matches, by giving the two numbers in curly brackets - (braces), separated by a comma. The numbers must be less than 65536, + The general repetition quantifier specifies a minimum and maximum num- + ber of permitted matches, by giving the two numbers in curly brackets + (braces), separated by a comma. The numbers must be less than 65536, and the first must be less than or equal to the second. For example: z{2,4} - matches "zz", "zzz", or "zzzz". A closing brace on its own is not a - special character. If the second number is omitted, but the comma is - present, there is no upper limit; if the second number and the comma - are both omitted, the quantifier specifies an exact number of required + matches "zz", "zzz", or "zzzz". A closing brace on its own is not a + special character. If the second number is omitted, but the comma is + present, there is no upper limit; if the second number and the comma + are both omitted, the quantifier specifies an exact number of required matches. Thus [aeiou]{3,} @@ -4049,49 +4176,49 @@ REPETITION \d{8} - matches exactly 8 digits. An opening curly bracket that appears in a - position where a quantifier is not allowed, or one that does not match - the syntax of a quantifier, is taken as a literal character. For exam- + matches exactly 8 digits. An opening curly bracket that appears in a + position where a quantifier is not allowed, or one that does not match + the syntax of a quantifier, is taken as a literal character. For exam- ple, {,6} is not a quantifier, but a literal string of four characters. - In UTF-8 mode, quantifiers apply to UTF-8 characters rather than to + In UTF-8 mode, quantifiers apply to UTF-8 characters rather than to individual bytes. Thus, for example, \x{100}{2} matches two UTF-8 char- acters, each of which is represented by a two-byte sequence. Similarly, when Unicode property support is available, \X{3} matches three Unicode - extended sequences, each of which may be several bytes long (and they + extended sequences, each of which may be several bytes long (and they may be of different lengths). The quantifier {0} is permitted, causing the expression to behave as if the previous item and the quantifier were not present. This may be use- - ful for subpatterns that are referenced as subroutines from elsewhere + ful for subpatterns that are referenced as subroutines from elsewhere in the pattern. Items other than subpatterns that have a {0} quantifier are omitted from the compiled pattern. - For convenience, the three most common quantifiers have single-charac- + For convenience, the three most common quantifiers have single-charac- ter abbreviations: * is equivalent to {0,} + is equivalent to {1,} ? is equivalent to {0,1} - It is possible to construct infinite loops by following a subpattern + It is possible to construct infinite loops by following a subpattern that can match no characters with a quantifier that has no upper limit, for example: (a?)* Earlier versions of Perl and PCRE used to give an error at compile time - for such patterns. However, because there are cases where this can be - useful, such patterns are now accepted, but if any repetition of the - subpattern does in fact match no characters, the loop is forcibly bro- + for such patterns. However, because there are cases where this can be + useful, such patterns are now accepted, but if any repetition of the + subpattern does in fact match no characters, the loop is forcibly bro- ken. - By default, the quantifiers are "greedy", that is, they match as much - as possible (up to the maximum number of permitted times), without - causing the rest of the pattern to fail. The classic example of where + By default, the quantifiers are "greedy", that is, they match as much + as possible (up to the maximum number of permitted times), without + causing the rest of the pattern to fail. The classic example of where this gives problems is in trying to match comments in C programs. These - appear between /* and */ and within the comment, individual * and / - characters may appear. An attempt to match C comments by applying the + appear between /* and */ and within the comment, individual * and / + characters may appear. An attempt to match C comments by applying the pattern /\*.*\*/ @@ -4100,19 +4227,19 @@ REPETITION /* first comment */ not comment /* second comment */ - fails, because it matches the entire string owing to the greediness of + fails, because it matches the entire string owing to the greediness of the .* item. - However, if a quantifier is followed by a question mark, it ceases to + However, if a quantifier is followed by a question mark, it ceases to be greedy, and instead matches the minimum number of times possible, so the pattern /\*.*?\*/ - does the right thing with the C comments. The meaning of the various - quantifiers is not otherwise changed, just the preferred number of - matches. Do not confuse this use of question mark with its use as a - quantifier in its own right. Because it has two uses, it can sometimes + does the right thing with the C comments. The meaning of the various + quantifiers is not otherwise changed, just the preferred number of + matches. Do not confuse this use of question mark with its use as a + quantifier in its own right. Because it has two uses, it can sometimes appear doubled, as in \d??\d @@ -4120,36 +4247,36 @@ REPETITION which matches one digit by preference, but can match two if that is the only way the rest of the pattern matches. - If the PCRE_UNGREEDY option is set (an option that is not available in - Perl), the quantifiers are not greedy by default, but individual ones - can be made greedy by following them with a question mark. In other + If the PCRE_UNGREEDY option is set (an option that is not available in + Perl), the quantifiers are not greedy by default, but individual ones + can be made greedy by following them with a question mark. In other words, it inverts the default behaviour. - When a parenthesized subpattern is quantified with a minimum repeat - count that is greater than 1 or with a limited maximum, more memory is - required for the compiled pattern, in proportion to the size of the + When a parenthesized subpattern is quantified with a minimum repeat + count that is greater than 1 or with a limited maximum, more memory is + required for the compiled pattern, in proportion to the size of the minimum or maximum. If a pattern starts with .* or .{0,} and the PCRE_DOTALL option (equiv- - alent to Perl's /s) is set, thus allowing the dot to match newlines, - the pattern is implicitly anchored, because whatever follows will be - tried against every character position in the subject string, so there - is no point in retrying the overall match at any position after the - first. PCRE normally treats such a pattern as though it were preceded + alent to Perl's /s) is set, thus allowing the dot to match newlines, + the pattern is implicitly anchored, because whatever follows will be + tried against every character position in the subject string, so there + is no point in retrying the overall match at any position after the + first. PCRE normally treats such a pattern as though it were preceded by \A. - In cases where it is known that the subject string contains no new- - lines, it is worth setting PCRE_DOTALL in order to obtain this opti- + In cases where it is known that the subject string contains no new- + lines, it is worth setting PCRE_DOTALL in order to obtain this opti- mization, or alternatively using ^ to indicate anchoring explicitly. - However, there is one situation where the optimization cannot be used. - When .* is inside capturing parentheses that are the subject of a - backreference elsewhere in the pattern, a match at the start may fail + However, there is one situation where the optimization cannot be used. + When .* is inside capturing parentheses that are the subject of a + backreference elsewhere in the pattern, a match at the start may fail where a later one succeeds. Consider, for example: (.*)abc\1 - If the subject is "xyz123abc123" the match point is the fourth charac- + If the subject is "xyz123abc123" the match point is the fourth charac- ter. For this reason, such a pattern is not implicitly anchored. When a capturing subpattern is repeated, the value captured is the sub- @@ -4158,8 +4285,8 @@ REPETITION (tweedle[dume]{3}\s*)+ has matched "tweedledum tweedledee" the value of the captured substring - is "tweedledee". However, if there are nested capturing subpatterns, - the corresponding captured values may have been set in previous itera- + is "tweedledee". However, if there are nested capturing subpatterns, + the corresponding captured values may have been set in previous itera- tions. For example, after /(a|(b))+/ @@ -4169,53 +4296,53 @@ REPETITION ATOMIC GROUPING AND POSSESSIVE QUANTIFIERS - With both maximizing ("greedy") and minimizing ("ungreedy" or "lazy") - repetition, failure of what follows normally causes the repeated item - to be re-evaluated to see if a different number of repeats allows the - rest of the pattern to match. Sometimes it is useful to prevent this, - either to change the nature of the match, or to cause it fail earlier - than it otherwise might, when the author of the pattern knows there is + With both maximizing ("greedy") and minimizing ("ungreedy" or "lazy") + repetition, failure of what follows normally causes the repeated item + to be re-evaluated to see if a different number of repeats allows the + rest of the pattern to match. Sometimes it is useful to prevent this, + either to change the nature of the match, or to cause it fail earlier + than it otherwise might, when the author of the pattern knows there is no point in carrying on. - Consider, for example, the pattern \d+foo when applied to the subject + Consider, for example, the pattern \d+foo when applied to the subject line 123456bar After matching all 6 digits and then failing to match "foo", the normal - action of the matcher is to try again with only 5 digits matching the - \d+ item, and then with 4, and so on, before ultimately failing. - "Atomic grouping" (a term taken from Jeffrey Friedl's book) provides - the means for specifying that once a subpattern has matched, it is not + action of the matcher is to try again with only 5 digits matching the + \d+ item, and then with 4, and so on, before ultimately failing. + "Atomic grouping" (a term taken from Jeffrey Friedl's book) provides + the means for specifying that once a subpattern has matched, it is not to be re-evaluated in this way. - If we use atomic grouping for the previous example, the matcher gives - up immediately on failing to match "foo" the first time. The notation + If we use atomic grouping for the previous example, the matcher gives + up immediately on failing to match "foo" the first time. The notation is a kind of special parenthesis, starting with (?> as in this example: (?>\d+)foo - This kind of parenthesis "locks up" the part of the pattern it con- - tains once it has matched, and a failure further into the pattern is - prevented from backtracking into it. Backtracking past it to previous + This kind of parenthesis "locks up" the part of the pattern it con- + tains once it has matched, and a failure further into the pattern is + prevented from backtracking into it. Backtracking past it to previous items, however, works as normal. - An alternative description is that a subpattern of this type matches - the string of characters that an identical standalone pattern would + An alternative description is that a subpattern of this type matches + the string of characters that an identical standalone pattern would match, if anchored at the current point in the subject string. Atomic grouping subpatterns are not capturing subpatterns. Simple cases such as the above example can be thought of as a maximizing repeat that - must swallow everything it can. So, while both \d+ and \d+? are pre- - pared to adjust the number of digits they match in order to make the + must swallow everything it can. So, while both \d+ and \d+? are pre- + pared to adjust the number of digits they match in order to make the rest of the pattern match, (?>\d+) can only match an entire sequence of digits. - Atomic groups in general can of course contain arbitrarily complicated - subpatterns, and can be nested. However, when the subpattern for an + Atomic groups in general can of course contain arbitrarily complicated + subpatterns, and can be nested. However, when the subpattern for an atomic group is just a single repeated item, as in the example above, a - simpler notation, called a "possessive quantifier" can be used. This - consists of an additional + character following a quantifier. Using + simpler notation, called a "possessive quantifier" can be used. This + consists of an additional + character following a quantifier. Using this notation, the previous example can be rewritten as \d++foo @@ -4225,45 +4352,45 @@ ATOMIC GROUPING AND POSSESSIVE QUANTIFIERS (abc|xyz){2,3}+ - Possessive quantifiers are always greedy; the setting of the + Possessive quantifiers are always greedy; the setting of the PCRE_UNGREEDY option is ignored. They are a convenient notation for the - simpler forms of atomic group. However, there is no difference in the - meaning of a possessive quantifier and the equivalent atomic group, - though there may be a performance difference; possessive quantifiers + simpler forms of atomic group. However, there is no difference in the + meaning of a possessive quantifier and the equivalent atomic group, + though there may be a performance difference; possessive quantifiers should be slightly faster. - The possessive quantifier syntax is an extension to the Perl 5.8 syn- - tax. Jeffrey Friedl originated the idea (and the name) in the first + The possessive quantifier syntax is an extension to the Perl 5.8 syn- + tax. Jeffrey Friedl originated the idea (and the name) in the first edition of his book. Mike McCloskey liked it, so implemented it when he - built Sun's Java package, and PCRE copied it from there. It ultimately + built Sun's Java package, and PCRE copied it from there. It ultimately found its way into Perl at release 5.10. PCRE has an optimization that automatically "possessifies" certain sim- - ple pattern constructs. For example, the sequence A+B is treated as - A++B because there is no point in backtracking into a sequence of A's + ple pattern constructs. For example, the sequence A+B is treated as + A++B because there is no point in backtracking into a sequence of A's when B must follow. - When a pattern contains an unlimited repeat inside a subpattern that - can itself be repeated an unlimited number of times, the use of an - atomic group is the only way to avoid some failing matches taking a + When a pattern contains an unlimited repeat inside a subpattern that + can itself be repeated an unlimited number of times, the use of an + atomic group is the only way to avoid some failing matches taking a very long time indeed. The pattern (\D+|<\d+>)*[!?] - matches an unlimited number of substrings that either consist of non- - digits, or digits enclosed in <>, followed by either ! or ?. When it + matches an unlimited number of substrings that either consist of non- + digits, or digits enclosed in <>, followed by either ! or ?. When it matches, it runs quickly. However, if it is applied to aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa - it takes a long time before reporting failure. This is because the - string can be divided between the internal \D+ repeat and the external - * repeat in a large number of ways, and all have to be tried. (The - example uses [!?] rather than a single character at the end, because - both PCRE and Perl have an optimization that allows for fast failure - when a single character is used. They remember the last single charac- - ter that is required for a match, and fail early if it is not present - in the string.) If the pattern is changed so that it uses an atomic + it takes a long time before reporting failure. This is because the + string can be divided between the internal \D+ repeat and the external + * repeat in a large number of ways, and all have to be tried. (The + example uses [!?] rather than a single character at the end, because + both PCRE and Perl have an optimization that allows for fast failure + when a single character is used. They remember the last single charac- + ter that is required for a match, and fail early if it is not present + in the string.) If the pattern is changed so that it uses an atomic group, like this: ((?>\D+)|<\d+>)*[!?] @@ -4275,37 +4402,37 @@ BACK REFERENCES Outside a character class, a backslash followed by a digit greater than 0 (and possibly further digits) is a back reference to a capturing sub- - pattern earlier (that is, to its left) in the pattern, provided there + pattern earlier (that is, to its left) in the pattern, provided there have been that many previous capturing left parentheses. However, if the decimal number following the backslash is less than 10, - it is always taken as a back reference, and causes an error only if - there are not that many capturing left parentheses in the entire pat- - tern. In other words, the parentheses that are referenced need not be - to the left of the reference for numbers less than 10. A "forward back - reference" of this type can make sense when a repetition is involved - and the subpattern to the right has participated in an earlier itera- + it is always taken as a back reference, and causes an error only if + there are not that many capturing left parentheses in the entire pat- + tern. In other words, the parentheses that are referenced need not be + to the left of the reference for numbers less than 10. A "forward back + reference" of this type can make sense when a repetition is involved + and the subpattern to the right has participated in an earlier itera- tion. - It is not possible to have a numerical "forward back reference" to a - subpattern whose number is 10 or more using this syntax because a - sequence such as \50 is interpreted as a character defined in octal. + It is not possible to have a numerical "forward back reference" to a + subpattern whose number is 10 or more using this syntax because a + sequence such as \50 is interpreted as a character defined in octal. See the subsection entitled "Non-printing characters" above for further - details of the handling of digits following a backslash. There is no - such problem when named parentheses are used. A back reference to any + details of the handling of digits following a backslash. There is no + such problem when named parentheses are used. A back reference to any subpattern is possible using named parentheses (see below). - Another way of avoiding the ambiguity inherent in the use of digits + Another way of avoiding the ambiguity inherent in the use of digits following a backslash is to use the \g escape sequence, which is a fea- - ture introduced in Perl 5.10. This escape must be followed by an - unsigned number or a negative number, optionally enclosed in braces. + ture introduced in Perl 5.10. This escape must be followed by an + unsigned number or a negative number, optionally enclosed in braces. These examples are all identical: (ring), \1 (ring), \g1 (ring), \g{1} - An unsigned number specifies an absolute reference without the ambigu- + An unsigned number specifies an absolute reference without the ambigu- ity that is present in the older syntax. It is also useful when literal digits follow the reference. A negative number is a relative reference. Consider this example: @@ -4313,33 +4440,33 @@ BACK REFERENCES (abc(def)ghi)\g{-1} The sequence \g{-1} is a reference to the most recently started captur- - ing subpattern before \g, that is, is it equivalent to \2. Similarly, + ing subpattern before \g, that is, is it equivalent to \2. Similarly, \g{-2} would be equivalent to \1. The use of relative references can be - helpful in long patterns, and also in patterns that are created by + helpful in long patterns, and also in patterns that are created by joining together fragments that contain references within themselves. - A back reference matches whatever actually matched the capturing sub- - pattern in the current subject string, rather than anything matching + A back reference matches whatever actually matched the capturing sub- + pattern in the current subject string, rather than anything matching the subpattern itself (see "Subpatterns as subroutines" below for a way of doing that). So the pattern (sens|respons)e and \1ibility - matches "sense and sensibility" and "response and responsibility", but - not "sense and responsibility". If caseful matching is in force at the - time of the back reference, the case of letters is relevant. For exam- + matches "sense and sensibility" and "response and responsibility", but + not "sense and responsibility". If caseful matching is in force at the + time of the back reference, the case of letters is relevant. For exam- ple, ((?i)rah)\s+\1 - matches "rah rah" and "RAH RAH", but not "RAH rah", even though the + matches "rah rah" and "RAH RAH", but not "RAH rah", even though the original capturing subpattern is matched caselessly. - There are several different ways of writing back references to named - subpatterns. The .NET syntax \k{name} and the Perl syntax \k or - \k'name' are supported, as is the Python syntax (?P=name). Perl 5.10's + There are several different ways of writing back references to named + subpatterns. The .NET syntax \k{name} and the Perl syntax \k or + \k'name' are supported, as is the Python syntax (?P=name). Perl 5.10's unified back reference syntax, in which \g can be used for both numeric - and named references, is also supported. We could rewrite the above + and named references, is also supported. We could rewrite the above example in any of the following ways: (?(?i)rah)\s+\k @@ -4347,22 +4474,25 @@ BACK REFERENCES (?P(?i)rah)\s+(?P=p1) (?(?i)rah)\s+\g{p1} - A subpattern that is referenced by name may appear in the pattern + A subpattern that is referenced by name may appear in the pattern before or after the reference. - There may be more than one back reference to the same subpattern. If a - subpattern has not actually been used in a particular match, any back - references to it always fail. For example, the pattern + There may be more than one back reference to the same subpattern. If a + subpattern has not actually been used in a particular match, any back + references to it always fail by default. For example, the pattern (a|(bc))\2 - always fails if it starts to match "a" rather than "bc". Because there - may be many capturing parentheses in a pattern, all digits following - the backslash are taken as part of a potential back reference number. - If the pattern continues with a digit character, some delimiter must be - used to terminate the back reference. If the PCRE_EXTENDED option is - set, this can be whitespace. Otherwise an empty comment (see "Com- - ments" below) can be used. + always fails if it starts to match "a" rather than "bc". However, if + the PCRE_JAVASCRIPT_COMPAT option is set at compile time, a back refer- + ence to an unset value matches an empty string. + + Because there may be many capturing parentheses in a pattern, all dig- + its following a backslash are taken as part of a potential back refer- + ence number. If the pattern continues with a digit character, some + delimiter must be used to terminate the back reference. If the + PCRE_EXTENDED option is set, this can be whitespace. Otherwise, the \g{ + syntax or an empty comment (see "Comments" below) can be used. A back reference that occurs inside the parentheses to which it refers fails when the subpattern is first used, so, for example, (a\1) never @@ -4425,19 +4555,20 @@ ASSERTIONS If you want to force a matching failure at some point in a pattern, the most convenient way to do it is with (?!) because an empty string always matches, so an assertion that requires there not to be an empty - string must always fail. + string must always fail. The Perl 5.10 backtracking control verb + (*FAIL) or (*F) is essentially a synonym for (?!). Lookbehind assertions - Lookbehind assertions start with (?<= for positive assertions and (?)...) or (?('name')...) to test for a - used subpattern by name. For compatibility with earlier versions of - PCRE, which had this facility before Perl, the syntax (?(name)...) is - also recognized. However, there is a possible ambiguity with this syn- - tax, because subpattern names may consist entirely of digits. PCRE - looks first for a named subpattern; if it cannot find one and the name - consists entirely of digits, PCRE looks for a subpattern of that num- - ber, which must be greater than zero. Using subpattern names that con- + Perl uses the syntax (?()...) or (?('name')...) to test for a + used subpattern by name. For compatibility with earlier versions of + PCRE, which had this facility before Perl, the syntax (?(name)...) is + also recognized. However, there is a possible ambiguity with this syn- + tax, because subpattern names may consist entirely of digits. PCRE + looks first for a named subpattern; if it cannot find one and the name + consists entirely of digits, PCRE looks for a subpattern of that num- + ber, which must be greater than zero. Using subpattern names that con- sist entirely of digits is not recommended. Rewriting the above example to use a named subpattern gives this: (? \( )? [^()]+ (?() \) ) + If the name used in a condition of this kind is a duplicate, the test + is applied to all subpatterns of the same name, and is true if any one + of them has matched. Checking for pattern recursion If the condition is the string (R), and there is no subpattern with the - name R, the condition is true if a recursive call to the whole pattern + name R, the condition is true if a recursive call to the whole pattern or any subpattern has been made. If digits or a name preceded by amper- sand follow the letter R, for example: (?(R3)...) or (?(R&name)...) - the condition is true if the most recent recursion is into the subpat- - tern whose number or name is given. This condition does not check the - entire recursion stack. + the condition is true if the most recent recursion is into a subpattern + whose number or name is given. This condition does not check the entire + recursion stack. If the name used in a condition of this kind is a + duplicate, the test is applied to all subpatterns of the same name, and + is true if any one of them is the most recent recursion. - At "top level", all these recursion test conditions are false. Recur- - sive patterns are described below. + At "top level", all these recursion test conditions are false. The + syntax for recursive patterns is described below. Defining subpatterns for use by reference only - If the condition is the string (DEFINE), and there is no subpattern - with the name DEFINE, the condition is always false. In this case, - there may be only one alternative in the subpattern. It is always - skipped if control reaches this point in the pattern; the idea of - DEFINE is that it can be used to define "subroutines" that can be ref- - erenced from elsewhere. (The use of "subroutines" is described below.) - For example, a pattern to match an IPv4 address could be written like + If the condition is the string (DEFINE), and there is no subpattern + with the name DEFINE, the condition is always false. In this case, + there may be only one alternative in the subpattern. It is always + skipped if control reaches this point in the pattern; the idea of + DEFINE is that it can be used to define "subroutines" that can be ref- + erenced from elsewhere. (The use of "subroutines" is described below.) + For example, a pattern to match an IPv4 address could be written like this (ignore whitespace and line breaks): (?(DEFINE) (? 2[0-4]\d | 25[0-5] | 1\d\d | [1-9]?\d) ) \b (?&byte) (\.(?&byte)){3} \b - The first part of the pattern is a DEFINE group inside which a another - group named "byte" is defined. This matches an individual component of - an IPv4 address (a number less than 256). When matching takes place, - this part of the pattern is skipped because DEFINE acts like a false - condition. - - The rest of the pattern uses references to the named group to match the - four dot-separated components of an IPv4 address, insisting on a word - boundary at each end. + The first part of the pattern is a DEFINE group inside which a another + group named "byte" is defined. This matches an individual component of + an IPv4 address (a number less than 256). When matching takes place, + this part of the pattern is skipped because DEFINE acts like a false + condition. The rest of the pattern uses references to the named group + to match the four dot-separated components of an IPv4 address, insist- + ing on a word boundary at each end. Assertion conditions - If the condition is not in any of the above formats, it must be an - assertion. This may be a positive or negative lookahead or lookbehind - assertion. Consider this pattern, again containing non-significant + If the condition is not in any of the above formats, it must be an + assertion. This may be a positive or negative lookahead or lookbehind + assertion. Consider this pattern, again containing non-significant white space, and with the two alternatives on the second line: (?(?=[^a-z]*[a-z]) \d{2}-[a-z]{3}-\d{2} | \d{2}-\d{2}-\d{2} ) - The condition is a positive lookahead assertion that matches an - optional sequence of non-letters followed by a letter. In other words, - it tests for the presence of at least one letter in the subject. If a - letter is found, the subject is matched against the first alternative; - otherwise it is matched against the second. This pattern matches - strings in one of the two forms dd-aaa-dd or dd-dd-dd, where aaa are + The condition is a positive lookahead assertion that matches an + optional sequence of non-letters followed by a letter. In other words, + it tests for the presence of at least one letter in the subject. If a + letter is found, the subject is matched against the first alternative; + otherwise it is matched against the second. This pattern matches + strings in one of the two forms dd-aaa-dd or dd-dd-dd, where aaa are letters and dd are digits. COMMENTS - The sequence (?# marks the start of a comment that continues up to the - next closing parenthesis. Nested parentheses are not permitted. The - characters that make up a comment play no part in the pattern matching + The sequence (?# marks the start of a comment that continues up to the + next closing parenthesis. Nested parentheses are not permitted. The + characters that make up a comment play no part in the pattern matching at all. - If the PCRE_EXTENDED option is set, an unescaped # character outside a - character class introduces a comment that continues to immediately + If the PCRE_EXTENDED option is set, an unescaped # character outside a + character class introduces a comment that continues to immediately after the next newline in the pattern. RECURSIVE PATTERNS - Consider the problem of matching a string in parentheses, allowing for - unlimited nested parentheses. Without the use of recursion, the best - that can be done is to use a pattern that matches up to some fixed - depth of nesting. It is not possible to handle an arbitrary nesting + Consider the problem of matching a string in parentheses, allowing for + unlimited nested parentheses. Without the use of recursion, the best + that can be done is to use a pattern that matches up to some fixed + depth of nesting. It is not possible to handle an arbitrary nesting depth. For some time, Perl has provided a facility that allows regular expres- - sions to recurse (amongst other things). It does this by interpolating - Perl code in the expression at run time, and the code can refer to the + sions to recurse (amongst other things). It does this by interpolating + Perl code in the expression at run time, and the code can refer to the expression itself. A Perl pattern using code interpolation to solve the parentheses problem can be created like this: @@ -4697,44 +4837,41 @@ RECURSIVE PATTERNS refers recursively to the pattern in which it appears. Obviously, PCRE cannot support the interpolation of Perl code. Instead, - it supports special syntax for recursion of the entire pattern, and - also for individual subpattern recursion. After its introduction in - PCRE and Python, this kind of recursion was introduced into Perl at - release 5.10. + it supports special syntax for recursion of the entire pattern, and + also for individual subpattern recursion. After its introduction in + PCRE and Python, this kind of recursion was subsequently introduced + into Perl at release 5.10. - A special item that consists of (? followed by a number greater than + A special item that consists of (? followed by a number greater than zero and a closing parenthesis is a recursive call of the subpattern of - the given number, provided that it occurs inside that subpattern. (If - not, it is a "subroutine" call, which is described in the next sec- - tion.) The special item (?R) or (?0) is a recursive call of the entire + the given number, provided that it occurs inside that subpattern. (If + not, it is a "subroutine" call, which is described in the next sec- + tion.) The special item (?R) or (?0) is a recursive call of the entire regular expression. - In PCRE (like Python, but unlike Perl), a recursive subpattern call is - always treated as an atomic group. That is, once it has matched some of - the subject string, it is never re-entered, even if it contains untried - alternatives and there is a subsequent matching failure. - This PCRE pattern solves the nested parentheses problem (assume the PCRE_EXTENDED option is set so that white space is ignored): - \( ( (?>[^()]+) | (?R) )* \) + \( ( [^()]++ | (?R) )* \) First it matches an opening parenthesis. Then it matches any number of substrings which can either be a sequence of non-parentheses, or a recursive match of the pattern itself (that is, a correctly parenthe- - sized substring). Finally there is a closing parenthesis. + sized substring). Finally there is a closing parenthesis. Note the use + of a possessive quantifier to avoid backtracking into sequences of non- + parentheses. If this were part of a larger pattern, you would not want to recurse the entire pattern, so instead you could use this: - ( \( ( (?>[^()]+) | (?1) )* \) ) + ( \( ( [^()]++ | (?1) )* \) ) We have put the pattern into parentheses, and caused the recursion to refer to them instead of the whole pattern. In a larger pattern, keeping track of parenthesis numbers can be - tricky. This is made easier by the use of relative references. (A Perl - 5.10 feature.) Instead of (?1) in the pattern above you can write + tricky. This is made easier by the use of relative references (a Perl + 5.10 feature). Instead of (?1) in the pattern above you can write (?-2) to refer to the second most recently opened parentheses preceding the recursion. In other words, a negative number counts capturing parentheses leftwards from the point at which it is encountered. @@ -4749,46 +4886,40 @@ RECURSIVE PATTERNS syntax for this is (?&name); PCRE's earlier syntax (?P>name) is also supported. We could rewrite the above example as follows: - (? \( ( (?>[^()]+) | (?&pn) )* \) ) + (? \( ( [^()]++ | (?&pn) )* \) ) If there is more than one subpattern with the same name, the earliest one is used. This particular example pattern that we have been looking at contains - nested unlimited repeats, and so the use of atomic grouping for match- - ing strings of non-parentheses is important when applying the pattern - to strings that do not match. For example, when this pattern is applied - to + nested unlimited repeats, and so the use of a possessive quantifier for + matching strings of non-parentheses is important when applying the pat- + tern to strings that do not match. For example, when this pattern is + applied to (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa() - it yields "no match" quickly. However, if atomic grouping is not used, - the match runs for a very long time indeed because there are so many - different ways the + and * repeats can carve up the subject, and all - have to be tested before failure can be reported. + it yields "no match" quickly. However, if a possessive quantifier is + not used, the match runs for a very long time indeed because there are + so many different ways the + and * repeats can carve up the subject, + and all have to be tested before failure can be reported. - At the end of a match, the values set for any capturing subpatterns are - those from the outermost level of the recursion at which the subpattern - value is set. If you want to obtain intermediate values, a callout - function can be used (see below and the pcrecallout documentation). If - the pattern above is matched against + At the end of a match, the values of capturing parentheses are those + from the outermost level. If you want to obtain intermediate values, a + callout function can be used (see below and the pcrecallout documenta- + tion). If the pattern above is matched against (ab(cd)ef) - the value for the capturing parentheses is "ef", which is the last - value taken on at the top level. If additional parentheses are added, - giving - - \( ( ( (?>[^()]+) | (?R) )* ) \) - ^ ^ - ^ ^ + the value for the inner capturing parentheses (numbered 2) is "ef", + which is the last value taken on at the top level. If a capturing sub- + pattern is not matched at the top level, its final value is unset, even + if it is (temporarily) set at a deeper level. - the string they capture is "ab(cd)ef", the contents of the top level - parentheses. If there are more than 15 capturing parentheses in a pat- - tern, PCRE has to obtain extra memory to store data during a recursion, - which it does by using pcre_malloc, freeing it via pcre_free after- - wards. If no memory can be obtained, the match fails with the - PCRE_ERROR_NOMEMORY error. + If there are more than 15 capturing parentheses in a pattern, PCRE has + to obtain extra memory to store data during a recursion, which it does + by using pcre_malloc, freeing it via pcre_free afterwards. If no memory + can be obtained, the match fails with the PCRE_ERROR_NOMEMORY error. Do not confuse the (?R) item with the condition (R), which tests for recursion. Consider this pattern, which matches text in angle brack- @@ -4802,6 +4933,80 @@ RECURSIVE PATTERNS two different alternatives for the recursive and non-recursive cases. The (?R) item is the actual recursive call. + Recursion difference from Perl + + In PCRE (like Python, but unlike Perl), a recursive subpattern call is + always treated as an atomic group. That is, once it has matched some of + the subject string, it is never re-entered, even if it contains untried + alternatives and there is a subsequent matching failure. This can be + illustrated by the following pattern, which purports to match a palin- + dromic string that contains an odd number of characters (for example, + "a", "aba", "abcba", "abcdcba"): + + ^(.|(.)(?1)\2)$ + + The idea is that it either matches a single character, or two identical + characters surrounding a sub-palindrome. In Perl, this pattern works; + in PCRE it does not if the pattern is longer than three characters. + Consider the subject string "abcba": + + At the top level, the first character is matched, but as it is not at + the end of the string, the first alternative fails; the second alterna- + tive is taken and the recursion kicks in. The recursive call to subpat- + tern 1 successfully matches the next character ("b"). (Note that the + beginning and end of line tests are not part of the recursion). + + Back at the top level, the next character ("c") is compared with what + subpattern 2 matched, which was "a". This fails. Because the recursion + is treated as an atomic group, there are now no backtracking points, + and so the entire match fails. (Perl is able, at this point, to re- + enter the recursion and try the second alternative.) However, if the + pattern is written with the alternatives in the other order, things are + different: + + ^((.)(?1)\2|.)$ + + This time, the recursing alternative is tried first, and continues to + recurse until it runs out of characters, at which point the recursion + fails. But this time we do have another alternative to try at the + higher level. That is the big difference: in the previous case the + remaining alternative is at a deeper recursion level, which PCRE cannot + use. + + To change the pattern so that matches all palindromic strings, not just + those with an odd number of characters, it is tempting to change the + pattern to this: + + ^((.)(?1)\2|.?)$ + + Again, this works in Perl, but not in PCRE, and for the same reason. + When a deeper recursion has matched a single character, it cannot be + entered again in order to match an empty string. The solution is to + separate the two cases, and write out the odd and even cases as alter- + natives at the higher level: + + ^(?:((.)(?1)\2|)|((.)(?3)\4|.)) + + If you want to match typical palindromic phrases, the pattern has to + ignore all non-word characters, which can be done like this: + + ^\W*+(?:((.)\W*+(?1)\W*+\2|)|((.)\W*+(?3)\W*+\4|\W*+.\W*+))\W*+$ + + If run with the PCRE_CASELESS option, this pattern matches phrases such + as "A man, a plan, a canal: Panama!" and it works well in both PCRE and + Perl. Note the use of the possessive quantifier *+ to avoid backtrack- + ing into sequences of non-word characters. Without this, PCRE takes a + great deal longer (ten times or more) to match typical phrases, and + Perl takes so long that you think it has gone into a loop. + + WARNING: The palindrome-matching patterns above work only if the sub- + ject string does not start with a palindrome that is shorter than the + entire string. For example, although "abcba" is correctly matched, if + the subject is "ababa", PCRE finds the palindrome "aba" at the start, + then fails at top level because the end of the string does not follow. + Once again, it cannot jump back into the recursion to try other alter- + natives, so the entire match fails. + SUBPATTERNS AS SUBROUTINES @@ -4828,10 +5033,12 @@ SUBPATTERNS AS SUBROUTINES two strings. Another example is given in the discussion of DEFINE above. - Like recursive subpatterns, a "subroutine" call is always treated as an + Like recursive subpatterns, a subroutine call is always treated as an atomic group. That is, once it has matched some of the subject string, it is never re-entered, even if it contains untried alternatives and - there is a subsequent matching failure. + there is a subsequent matching failure. Any capturing parentheses that + are set during the subroutine call revert to their previous values + afterwards. When a subpattern is used as a subroutine, processing options such as case-independence are fixed when the subpattern is defined. They cannot @@ -4914,6 +5121,12 @@ BACKTRACKING CONTROL (*FAIL), which behaves like a failing negative assertion, they cause an error if encountered by pcre_dfa_exec(). + If any of these verbs are used in an assertion or subroutine subpattern + (including recursive subpatterns), their effect is confined to that + subpattern; it does not extend to the surrounding pattern. Note that + such subpatterns are processed as anchored at the point where they are + tested. + The new verbs make use of what was previously invalid syntax: an open- ing parenthesis followed by an asterisk. In Perl, they are generally of the form (*VERB:ARG) but PCRE does not support the use of arguments, so @@ -4928,14 +5141,14 @@ BACKTRACKING CONTROL This verb causes the match to end successfully, skipping the remainder of the pattern. When inside a recursion, only the innermost pattern is - ended immediately. PCRE differs from Perl in what happens if the - (*ACCEPT) is inside capturing parentheses. In Perl, the data so far is - captured: in PCRE no data is captured. For example: + ended immediately. If (*ACCEPT) is inside capturing parentheses, the + data so far is captured. (This feature was added to PCRE at release + 8.00.) For example: - A(A|B(*ACCEPT)|C)D + A((?:A|B(*ACCEPT)|C)D) - This matches "AB", "AAD", or "ACD", but when it matches "AB", no data - is captured. + This matches "AB", "AAD", or "ACD"; when it matches "AB", "B" is cap- + tured by the outer parentheses. (*FAIL) or (*F) @@ -4962,9 +5175,9 @@ BACKTRACKING CONTROL This verb causes the whole match to fail outright if the rest of the pattern does not match. Even if the pattern is unanchored, no further - attempts to find a match by advancing the start point take place. Once - (*COMMIT) has been passed, pcre_exec() is committed to finding a match - at the current starting point, or not at all. For example: + attempts to find a match by advancing the starting point take place. + Once (*COMMIT) has been passed, pcre_exec() is committed to finding a + match at the current starting point, or not at all. For example: a+(*COMMIT)b @@ -4996,7 +5209,7 @@ BACKTRACKING CONTROL If the subject is "aaaac...", after the first match attempt fails (starting at the first character in the string), the starting point skips on to start the next attempt at "c". Note that a possessive quan- - tifer does not have the same effect in this example; although it would + tifer does not have the same effect as this example; although it would suppress backtracking during the first match attempt, the second attempt would start at the second character instead of skipping on to "c". @@ -5019,7 +5232,7 @@ BACKTRACKING CONTROL SEE ALSO - pcreapi(3), pcrecallout(3), pcrematching(3), pcre(3). + pcreapi(3), pcrecallout(3), pcrematching(3), pcresyntax(3), pcre(3). AUTHOR @@ -5031,7 +5244,7 @@ AUTHOR REVISION - Last updated: 11 April 2009 + Last updated: 18 October 2009 Copyright (c) 1997-2009 University of Cambridge. ------------------------------------------------------------------------------ @@ -5412,77 +5625,182 @@ PARTIAL MATCHING IN PCRE If the application sees the user's keystrokes one by one, and can check that what has been typed so far is potentially valid, it is able to - raise an error as soon as a mistake is made, possibly beeping and not - reflecting the character that has been typed. This immediate feedback - is likely to be a better user interface than a check that is delayed - until the entire string has been entered. - - PCRE supports the concept of partial matching by means of the PCRE_PAR- - TIAL option, which can be set when calling pcre_exec() or - pcre_dfa_exec(). When this flag is set for pcre_exec(), the return code - PCRE_ERROR_NOMATCH is converted into PCRE_ERROR_PARTIAL if at any time - during the matching process the last part of the subject string matched - part of the pattern. Unfortunately, for non-anchored matching, it is - not possible to obtain the position of the start of the partial match. - No captured data is set when PCRE_ERROR_PARTIAL is returned. + raise an error as soon as a mistake is made, by beeping and not + reflecting the character that has been typed, for example. This immedi- + ate feedback is likely to be a better user interface than a check that + is delayed until the entire string has been entered. Partial matching + can also sometimes be useful when the subject string is very long and + is not all available at once. + + PCRE supports partial matching by means of the PCRE_PARTIAL_SOFT and + PCRE_PARTIAL_HARD options, which can be set when calling pcre_exec() or + pcre_dfa_exec(). For backwards compatibility, PCRE_PARTIAL is a synonym + for PCRE_PARTIAL_SOFT. The essential difference between the two options + is whether or not a partial match is preferred to an alternative com- + plete match, though the details differ between the two matching func- + tions. If both options are set, PCRE_PARTIAL_HARD takes precedence. + + Setting a partial matching option disables two of PCRE's optimizations. + PCRE remembers the last literal byte in a pattern, and abandons match- + ing immediately if such a byte is not present in the subject string. + This optimization cannot be used for a subject string that might match + only partially. If the pattern was studied, PCRE knows the minimum + length of a matching string, and does not bother to run the matching + function on shorter strings. This optimization is also disabled for + partial matching. + + +PARTIAL MATCHING USING pcre_exec() + + A partial match occurs during a call to pcre_exec() whenever the end of + the subject string is reached successfully, but matching cannot con- + tinue because more characters are needed. However, at least one charac- + ter must have been matched. (In other words, a partial match can never + be an empty string.) + + If PCRE_PARTIAL_SOFT is set, the partial match is remembered, but + matching continues as normal, and other alternatives in the pattern are + tried. If no complete match can be found, pcre_exec() returns + PCRE_ERROR_PARTIAL instead of PCRE_ERROR_NOMATCH. If there are at least + two slots in the offsets vector, the first of them is set to the offset + of the earliest character that was inspected when the partial match was + found. For convenience, the second offset points to the end of the + string so that a substring can easily be identified. + + For the majority of patterns, the first offset identifies the start of + the partially matched string. However, for patterns that contain look- + behind assertions, or \K, or begin with \b or \B, earlier characters + have been inspected while carrying out the match. For example: + + /(?<=abc)123/ + + This pattern matches "123", but only if it is preceded by "abc". If the + subject string is "xyzabc12", the offsets after a partial match are for + the substring "abc12", because all these characters are needed if + another match is tried with extra characters added. + + If there is more than one partial match, the first one that was found + provides the data that is returned. Consider this pattern: + + /123\w+X|dogY/ + + If this is matched against the subject string "abc123dog", both alter- + natives fail to match, but the end of the subject is reached during + matching, so PCRE_ERROR_PARTIAL is returned instead of + PCRE_ERROR_NOMATCH. The offsets are set to 3 and 9, identifying + "123dog" as the first partial match that was found. (In this example, + there are two partial matches, because "dog" on its own partially + matches the second alternative.) + + If PCRE_PARTIAL_HARD is set for pcre_exec(), it returns PCRE_ERROR_PAR- + TIAL as soon as a partial match is found, without continuing to search + for possible complete matches. The difference between the two options + can be illustrated by a pattern such as: + + /dog(sbody)?/ + + This matches either "dog" or "dogsbody", greedily (that is, it prefers + the longer string if possible). If it is matched against the string + "dog" with PCRE_PARTIAL_SOFT, it yields a complete match for "dog". + However, if PCRE_PARTIAL_HARD is set, the result is PCRE_ERROR_PARTIAL. + On the other hand, if the pattern is made ungreedy the result is dif- + ferent: + + /dog(sbody)??/ + + In this case the result is always a complete match because pcre_exec() + finds that first, and it never continues after finding a match. It + might be easier to follow this explanation by thinking of the two pat- + terns like this: + + /dog(sbody)?/ is the same as /dogsbody|dog/ + /dog(sbody)??/ is the same as /dog|dogsbody/ + + The second pattern will never match "dogsbody" when pcre_exec() is + used, because it will always find the shorter match first. + + +PARTIAL MATCHING USING pcre_dfa_exec() + + The pcre_dfa_exec() function moves along the subject string character + by character, without backtracking, searching for all possible matches + simultaneously. If the end of the subject is reached before the end of + the pattern, there is the possibility of a partial match, again pro- + vided that at least one character has matched. + + When PCRE_PARTIAL_SOFT is set, PCRE_ERROR_PARTIAL is returned only if + there have been no complete matches. Otherwise, the complete matches + are returned. However, if PCRE_PARTIAL_HARD is set, a partial match + takes precedence over any complete matches. The portion of the string + that was inspected when the longest partial match was found is set as + the first matching string, provided there are at least two slots in the + offsets vector. + + Because pcre_dfa_exec() always searches for all possible matches, and + there is no difference between greedy and ungreedy repetition, its be- + haviour is different from pcre_exec when PCRE_PARTIAL_HARD is set. Con- + sider the string "dog" matched against the ungreedy pattern shown + above: - When PCRE_PARTIAL is set for pcre_dfa_exec(), the return code - PCRE_ERROR_NOMATCH is converted into PCRE_ERROR_PARTIAL if the end of - the subject is reached, there have been no complete matches, but there - is still at least one matching possibility. The portion of the string - that provided the partial match is set as the first matching string. + /dog(sbody)??/ - Using PCRE_PARTIAL disables one of PCRE's optimizations. PCRE remembers - the last literal byte in a pattern, and abandons matching immediately - if such a byte is not present in the subject string. This optimization - cannot be used for a subject string that might match only partially. + Whereas pcre_exec() stops as soon as it finds the complete match for + "dog", pcre_dfa_exec() also finds the partial match for "dogsbody", and + so returns that when PCRE_PARTIAL_HARD is set. -RESTRICTED PATTERNS FOR PCRE_PARTIAL +PARTIAL MATCHING AND WORD BOUNDARIES - Because of the way certain internal optimizations are implemented in - the pcre_exec() function, the PCRE_PARTIAL option cannot be used with - all patterns. These restrictions do not apply when pcre_dfa_exec() is - used. For pcre_exec(), repeated single characters such as + If a pattern ends with one of sequences \b or \B, which test for word + boundaries, partial matching with PCRE_PARTIAL_SOFT can give counter- + intuitive results. Consider this pattern: - a{2,4} + /\bcat\b/ - and repeated single metasequences such as + This matches "cat", provided there is a word boundary at either end. If + the subject string is "the cat", the comparison of the final "t" with a + following character cannot take place, so a partial match is found. + However, pcre_exec() carries on with normal matching, which matches \b + at the end of the subject when the last character is a letter, thus + finding a complete match. The result, therefore, is not PCRE_ERROR_PAR- + TIAL. The same thing happens with pcre_dfa_exec(), because it also + finds the complete match. - \d+ + Using PCRE_PARTIAL_HARD in this case does yield PCRE_ERROR_PARTIAL, + because then the partial match takes precedence. - are not permitted if the maximum number of occurrences is greater than - one. Optional items such as \d? (where the maximum is one) are permit- - ted. Quantifiers with any values are permitted after parentheses, so - the invalid examples above can be coded thus: - (a){2,4} - (\d)+ +FORMERLY RESTRICTED PATTERNS - These constructions run more slowly, but for the kinds of application - that are envisaged for this facility, this is not felt to be a major - restriction. + For releases of PCRE prior to 8.00, because of the way certain internal + optimizations were implemented in the pcre_exec() function, the + PCRE_PARTIAL option (predecessor of PCRE_PARTIAL_SOFT) could not be + used with all patterns. From release 8.00 onwards, the restrictions no + longer apply, and partial matching with pcre_exec() can be requested + for any pattern. - If PCRE_PARTIAL is set for a pattern that does not conform to the - restrictions, pcre_exec() returns the error code PCRE_ERROR_BADPARTIAL - (-13). You can use the PCRE_INFO_OKPARTIAL call to pcre_fullinfo() to - find out if a compiled pattern can be used for partial matching. + Items that were formerly restricted were repeated single characters and + repeated metasequences. If PCRE_PARTIAL was set for a pattern that did + not conform to the restrictions, pcre_exec() returned the error code + PCRE_ERROR_BADPARTIAL (-13). This error code is no longer in use. The + PCRE_INFO_OKPARTIAL call to pcre_fullinfo() to find out if a compiled + pattern can be used for partial matching now always returns 1. EXAMPLE OF PARTIAL MATCHING USING PCRETEST If the escape sequence \P is present in a pcretest data line, the - PCRE_PARTIAL flag is used for the match. Here is a run of pcretest that - uses the date example quoted above: + PCRE_PARTIAL_SOFT option is used for the match. Here is a run of + pcretest that uses the date example quoted above: re> /^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$/ data> 25jun04\P 0: 25jun04 1: jun data> 25dec3\P - Partial match + Partial match: 23dec3 data> 3ju\P - Partial match + Partial match: 3ju data> 3juj\P No match data> j\P @@ -5490,36 +5808,23 @@ EXAMPLE OF PARTIAL MATCHING USING PCRETEST The first data string is matched completely, so pcretest shows the matched substrings. The remaining four strings do not match the com- - plete pattern, but the first two are partial matches. The same test, - using pcre_dfa_exec() matching (by means of the \D escape sequence), - produces the following output: + plete pattern, but the first two are partial matches. Similar output is + obtained when pcre_dfa_exec() is used. - re> /^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$/ - data> 25jun04\P\D - 0: 25jun04 - data> 23dec3\P\D - Partial match: 23dec3 - data> 3ju\P\D - Partial match: 3ju - data> 3juj\P\D - No match - data> j\P\D - No match - - Notice that in this case the portion of the string that was matched is - made available. + If the escape sequence \P is present more than once in a pcretest data + line, the PCRE_PARTIAL_HARD option is set for the match. MULTI-SEGMENT MATCHING WITH pcre_dfa_exec() When a partial match has been found using pcre_dfa_exec(), it is possi- - ble to continue the match by providing additional subject data and - calling pcre_dfa_exec() again with the same compiled regular expres- - sion, this time setting the PCRE_DFA_RESTART option. You must also pass - the same working space as before, because this is where details of the - previous partial match are stored. Here is an example using pcretest, - using the \R escape sequence to set the PCRE_DFA_RESTART option (\P and - \D are as above): + ble to continue the match by providing additional subject data and + calling pcre_dfa_exec() again with the same compiled regular expres- + sion, this time setting the PCRE_DFA_RESTART option. You must pass the + same working space as before, because this is where details of the pre- + vious partial match are stored. Here is an example using pcretest, + using the \R escape sequence to set the PCRE_DFA_RESTART option (\D + specifies the use of pcre_dfa_exec()): re> /^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$/ data> 23ja\P\D @@ -5527,38 +5832,77 @@ MULTI-SEGMENT MATCHING WITH pcre_dfa_exec() data> n05\R\D 0: n05 - The first call has "23ja" as the subject, and requests partial match- - ing; the second call has "n05" as the subject for the continued - (restarted) match. Notice that when the match is complete, only the - last part is shown; PCRE does not retain the previously partially- - matched string. It is up to the calling program to do that if it needs + The first call has "23ja" as the subject, and requests partial match- + ing; the second call has "n05" as the subject for the continued + (restarted) match. Notice that when the match is complete, only the + last part is shown; PCRE does not retain the previously partially- + matched string. It is up to the calling program to do that if it needs to. - You can set PCRE_PARTIAL with PCRE_DFA_RESTART to continue partial - matching over multiple segments. This facility can be used to pass very - long subject strings to pcre_dfa_exec(). However, some care is needed - for certain types of pattern. + You can set the PCRE_PARTIAL_SOFT or PCRE_PARTIAL_HARD options with + PCRE_DFA_RESTART to continue partial matching over multiple segments. + This facility can be used to pass very long subject strings to + pcre_dfa_exec(). - 1. If the pattern contains tests for the beginning or end of a line, - you need to pass the PCRE_NOTBOL or PCRE_NOTEOL options, as appropri- - ate, when the subject string for any call does not contain the begin- - ning or end of a line. - 2. If the pattern contains backward assertions (including \b or \B), - you need to arrange for some overlap in the subject strings to allow - for this. For example, you could pass the subject in chunks that are - 500 bytes long, but in a buffer of 700 bytes, with the starting offset - set to 200 and the previous 200 bytes at the start of the buffer. +MULTI-SEGMENT MATCHING WITH pcre_exec() + + From release 8.00, pcre_exec() can also be used to do multi-segment + matching. Unlike pcre_dfa_exec(), it is not possible to restart the + previous match with a new segment of data. Instead, new data must be + added to the previous subject string, and the entire match re-run, + starting from the point where the partial match occurred. Earlier data + can be discarded. Consider an unanchored pattern that matches dates: + + re> /\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d/ + data> The date is 23ja\P + Partial match: 23ja + + At this stage, an application could discard the text preceding "23ja", + add on text from the next segment, and call pcre_exec() again. Unlike + pcre_dfa_exec(), the entire matching string must always be available, + and the complete matching process occurs for each call, so more memory + and more processing time is needed. - 3. Matching a subject string that is split into multiple segments does - not always produce exactly the same result as matching over one single - long string. The difference arises when there are multiple matching - possibilities, because a partial match result is given only when there - are no completed matches in a call to pcre_dfa_exec(). This means that - as soon as the shortest match has been found, continuation to a new - subject segment is no longer possible. Consider this pcretest example: + Note: If the pattern contains lookbehind assertions, or \K, or starts + with \b or \B, the string that is returned for a partial match will + include characters that precede the partially matched string itself, + because these must be retained when adding on more characters for a + subsequent matching attempt. + + +ISSUES WITH MULTI-SEGMENT MATCHING + + Certain types of pattern may give problems with multi-segment matching, + whichever matching function is used. + + 1. If the pattern contains tests for the beginning or end of a line, + you need to pass the PCRE_NOTBOL or PCRE_NOTEOL options, as appropri- + ate, when the subject string for any call does not contain the begin- + ning or end of a line. + + 2. Lookbehind assertions at the start of a pattern are catered for in + the offsets that are returned for a partial match. However, in theory, + a lookbehind assertion later in the pattern could require even earlier + characters to be inspected, and it might not have been reached when a + partial match occurs. This is probably an extremely unlikely case; you + could guard against it to a certain extent by always including extra + characters at the start. + + 3. Matching a subject string that is split into multiple segments may + not always produce exactly the same result as matching over one single + long string, especially when PCRE_PARTIAL_SOFT is used. The section + "Partial Matching and Word Boundaries" above describes an issue that + arises if the pattern ends with \b or \B. Another kind of difference + may occur when there are multiple matching possibilities, because a + partial match result is given only when there are no completed matches. + This means that as soon as the shortest match has been found, continua- + tion to a new subject segment is no longer possible. Consider again + this pcretest example: re> /dog(sbody)?/ + data> dogsb\P + 0: dog data> do\P\D Partial match: do data> gsb\R\P\D @@ -5567,33 +5911,63 @@ MULTI-SEGMENT MATCHING WITH pcre_dfa_exec() 0: dogsbody 1: dog - The pattern matches the words "dog" or "dogsbody". When the subject is - presented in several parts ("do" and "gsb" being the first two) the - match stops when "dog" has been found, and it is not possible to con- - tinue. On the other hand, if "dogsbody" is presented as a single - string, both matches are found. + The first data line passes the string "dogsb" to pcre_exec(), setting + the PCRE_PARTIAL_SOFT option. Although the string is a partial match + for "dogsbody", the result is not PCRE_ERROR_PARTIAL, because the + shorter string "dog" is a complete match. Similarly, when the subject + is presented to pcre_dfa_exec() in several parts ("do" and "gsb" being + the first two) the match stops when "dog" has been found, and it is not + possible to continue. On the other hand, if "dogsbody" is presented as + a single string, pcre_dfa_exec() finds both matches. + + Because of these problems, it is probably best to use PCRE_PARTIAL_HARD + when matching multi-segment data. The example above then behaves dif- + ferently: + + re> /dog(sbody)?/ + data> dogsb\P\P + Partial match: dogsb + data> do\P\D + Partial match: do + data> gsb\R\P\P\D + Partial match: gsb - Because of this phenomenon, it does not usually make sense to end a - pattern that is going to be matched in this way with a variable repeat. 4. Patterns that contain alternatives at the top level which do not all - start with the same pattern item may not work as expected. For example, - consider this pattern: + start with the same pattern item may not work as expected when + PCRE_DFA_RESTART is used with pcre_dfa_exec(). For example, consider + this pattern: 1234|3789 - If the first part of the subject is "ABC123", a partial match of the - first alternative is found at offset 3. There is no partial match for + If the first part of the subject is "ABC123", a partial match of the + first alternative is found at offset 3. There is no partial match for the second alternative, because such a match does not start at the same - point in the subject string. Attempting to continue with the string - "789" does not yield a match because only those alternatives that match - at one point in the subject are remembered. The problem arises because - the start of the second alternative matches within the first alterna- - tive. There is no problem with anchored patterns or patterns such as: + point in the subject string. Attempting to continue with the string + "7890" does not yield a match because only those alternatives that + match at one point in the subject are remembered. The problem arises + because the start of the second alternative matches within the first + alternative. There is no problem with anchored patterns or patterns + such as: 1234|ABCD - where no string can be a partial match for both alternatives. + where no string can be a partial match for both alternatives. This is + not a problem if pcre_exec() is used, because the entire match has to + be rerun each time: + + re> /1234|3789/ + data> ABC123\P + Partial match: 123 + data> 1237890 + 0: 3789 + + Of course, instead of using PCRE_DFA_PARTIAL, the same technique of re- + running the entire match can also be used with pcre_dfa_exec(). Another + possibility is to work with two buffers. If a partial match at offset n + in the first buffer is followed by "no match" when PCRE_DFA_RESTART is + used on the second buffer, you can then try a new match starting at + offset n+1 in the first buffer. AUTHOR @@ -5605,8 +5979,8 @@ AUTHOR REVISION - Last updated: 04 June 2007 - Copyright (c) 1997-2007 University of Cambridge. + Last updated: 19 October 2009 + Copyright (c) 1997-2009 University of Cambridge. ------------------------------------------------------------------------------ @@ -5927,6 +6301,10 @@ DESCRIPTION easier to slot in PCRE as a replacement library. Other POSIX options are not even defined. + There are also some other options that are not defined by POSIX. These + have been added at the request of users who want to make use of certain + PCRE-specific features via the POSIX calling interface. + When PCRE is called via these functions, it is only the API that is POSIX-like in style. The syntax and semantics of the regular expres- sions themselves are still those of Perl, subject to the setting of @@ -5981,6 +6359,12 @@ COMPILING A PATTERN ing, the nmatch and pmatch arguments are ignored, and no captured strings are returned. + REG_UNGREEDY + + The PCRE_UNGREEDY option is set when the regular expression is passed + for compilation to the native function. Note that REG_UNGREEDY is not + part of the POSIX standard. + REG_UTF8 The PCRE_UTF8 option is set when the regular expression is passed for @@ -5993,7 +6377,7 @@ COMPILING A PATTERN semantics. In particular, the way it handles newline characters in the subject string is the Perl way, not the POSIX way. Note that setting PCRE_MULTILINE has only some of the effects specified for REG_NEWLINE. - It does not affect the way newlines are matched by . (they aren't) or + It does not affect the way newlines are matched by . (they are not) or by a negative class such as [^a] (they are). The yield of regcomp() is zero on success, and non-zero otherwise. The @@ -6001,6 +6385,10 @@ COMPILING A PATTERN is public: re_nsub contains the number of capturing subpatterns in the regular expression. Various error codes are defined in the header file. + NOTE: If the yield of regcomp() is non-zero, you must not attempt to + use the contents of the preg structure. If, for example, you pass it to + regexec(), the result is undefined and your program is likely to crash. + MATCHING NEWLINE CHARACTERS @@ -6076,36 +6464,39 @@ MATCHING A PATTERN matched strings is returned. The nmatch and pmatch arguments of regexec() are ignored. + If the value of nmatch is zero, or if the value pmatch is NULL, no data + about any matched strings is returned. + Otherwise,the portion of the string that was matched, and also any cap- tured substrings, are returned via the pmatch argument, which points to - an array of nmatch structures of type regmatch_t, containing the mem- - bers rm_so and rm_eo. These contain the offset to the first character - of each substring and the offset to the first character after the end - of each substring, respectively. The 0th element of the vector relates - to the entire portion of string that was matched; subsequent elements - relate to the capturing subpatterns of the regular expression. Unused + an array of nmatch structures of type regmatch_t, containing the mem- + bers rm_so and rm_eo. These contain the offset to the first character + of each substring and the offset to the first character after the end + of each substring, respectively. The 0th element of the vector relates + to the entire portion of string that was matched; subsequent elements + relate to the capturing subpatterns of the regular expression. Unused entries in the array have both structure members set to -1. - A successful match yields a zero return; various error codes are - defined in the header file, of which REG_NOMATCH is the "expected" + A successful match yields a zero return; various error codes are + defined in the header file, of which REG_NOMATCH is the "expected" failure code. ERROR MESSAGES The regerror() function maps a non-zero errorcode from either regcomp() - or regexec() to a printable message. If preg is not NULL, the error + or regexec() to a printable message. If preg is not NULL, the error should have arisen from the use of that structure. A message terminated - by a binary zero is placed in errbuf. The length of the message, - including the zero, is limited to errbuf_size. The yield of the func- + by a binary zero is placed in errbuf. The length of the message, + including the zero, is limited to errbuf_size. The yield of the func- tion is the size of buffer needed to hold the whole message. MEMORY USAGE - Compiling a regular expression causes memory to be allocated and asso- - ciated with the preg structure. The function regfree() frees all such - memory, after which preg may no longer be used as a compiled expres- + Compiling a regular expression causes memory to be allocated and asso- + ciated with the preg structure. The function regfree() frees all such + memory, after which preg may no longer be used as a compiled expres- sion. @@ -6118,7 +6509,7 @@ AUTHOR REVISION - Last updated: 11 March 2009 + Last updated: 02 September 2009 Copyright (c) 1997-2009 University of Cambridge. ------------------------------------------------------------------------------ @@ -6474,53 +6865,56 @@ NAME PCRE SAMPLE PROGRAM A simple, complete demonstration program, to get you started with using - PCRE, is supplied in the file pcredemo.c in the PCRE distribution. + PCRE, is supplied in the file pcredemo.c in the PCRE distribution. A + listing of this program is given in the pcredemo documentation. If you + do not have a copy of the PCRE distribution, you can save this listing + to re-create pcredemo.c. The program compiles the regular expression that is its first argument, - and matches it against the subject string in its second argument. No - PCRE options are set, and default character tables are used. If match- - ing succeeds, the program outputs the portion of the subject that + and matches it against the subject string in its second argument. No + PCRE options are set, and default character tables are used. If match- + ing succeeds, the program outputs the portion of the subject that matched, together with the contents of any captured substrings. If the -g option is given on the command line, the program then goes on to check for further matches of the same regular expression in the same - subject string. The logic is a little bit tricky because of the possi- - bility of matching an empty string. Comments in the code explain what + subject string. The logic is a little bit tricky because of the possi- + bility of matching an empty string. Comments in the code explain what is going on. - If PCRE is installed in the standard include and library directories - for your system, you should be able to compile the demonstration pro- - gram using this command: + If PCRE is installed in the standard include and library directories + for your operating system, you should be able to compile the demonstra- + tion program using this command: gcc -o pcredemo pcredemo.c -lpcre - If PCRE is installed elsewhere, you may need to add additional options - to the command line. For example, on a Unix-like system that has PCRE - installed in /usr/local, you can compile the demonstration program + If PCRE is installed elsewhere, you may need to add additional options + to the command line. For example, on a Unix-like system that has PCRE + installed in /usr/local, you can compile the demonstration program using a command like this: gcc -o pcredemo -I/usr/local/include pcredemo.c \ -L/usr/local/lib -lpcre - Once you have compiled the demonstration program, you can run simple + Once you have compiled the demonstration program, you can run simple tests like this: ./pcredemo 'cat|dog' 'the cat sat on the mat' ./pcredemo -g 'cat|dog' 'the dog sat on the cat' - Note that there is a much more comprehensive test program, called - pcretest, which supports many more facilities for testing regular + Note that there is a much more comprehensive test program, called + pcretest, which supports many more facilities for testing regular expressions and the PCRE library. The pcredemo program is provided as a simple coding example. - On some operating systems (e.g. Solaris), when PCRE is not installed in - the standard library directory, you may get an error like this when you - try to run pcredemo: + When you try to run pcredemo when PCRE is not installed in the standard + library directory, you may get an error like this on some operating + systems (e.g. Solaris): - ld.so.1: a.out: fatal: libpcre.so.0: open failed: No such file or + ld.so.1: a.out: fatal: libpcre.so.0: open failed: No such file or directory - This is caused by the way shared library support works on those sys- + This is caused by the way shared library support works on those sys- tems. You need to add -R/usr/local/lib @@ -6537,8 +6931,8 @@ AUTHOR REVISION - Last updated: 23 January 2008 - Copyright (c) 1997-2008 University of Cambridge. + Last updated: 30 September 2009 + Copyright (c) 1997-2009 University of Cambridge. ------------------------------------------------------------------------------ PCRESTACK(3) PCRESTACK(3) diff --git a/ext/pcre/pcrelib/pcre.h b/ext/pcre/pcrelib/pcre.h index c5fc4c13e..93dff102a 100644 --- a/ext/pcre/pcrelib/pcre.h +++ b/ext/pcre/pcrelib/pcre.h @@ -41,10 +41,10 @@ POSSIBILITY OF SUCH DAMAGE. /* The current PCRE version information. */ -#define PCRE_MAJOR 7 -#define PCRE_MINOR 9 +#define PCRE_MAJOR 8 +#define PCRE_MINOR 00 #define PCRE_PRERELEASE -#define PCRE_DATE 2009-04-11 +#define PCRE_DATE 2009-10-19 /* When an application links to a PCRE DLL in Windows, the symbols that are imported have to be identified as such. When building PCRE, the appropriate @@ -113,7 +113,8 @@ both, so we keep them all distinct. */ #define PCRE_NO_AUTO_CAPTURE 0x00001000 #define PCRE_NO_UTF8_CHECK 0x00002000 #define PCRE_AUTO_CALLOUT 0x00004000 -#define PCRE_PARTIAL 0x00008000 +#define PCRE_PARTIAL_SOFT 0x00008000 +#define PCRE_PARTIAL 0x00008000 /* Backwards compatible synonym */ #define PCRE_DFA_SHORTEST 0x00010000 #define PCRE_DFA_RESTART 0x00020000 #define PCRE_FIRSTLINE 0x00040000 @@ -128,6 +129,8 @@ both, so we keep them all distinct. */ #define PCRE_JAVASCRIPT_COMPAT 0x02000000 #define PCRE_NO_START_OPTIMIZE 0x04000000 #define PCRE_NO_START_OPTIMISE 0x04000000 +#define PCRE_PARTIAL_HARD 0x08000000 +#define PCRE_NOTEMPTY_ATSTART 0x10000000 /* Exec-time and get/set-time error codes */ @@ -174,6 +177,7 @@ both, so we keep them all distinct. */ #define PCRE_INFO_OKPARTIAL 12 #define PCRE_INFO_JCHANGED 13 #define PCRE_INFO_HASCRORLF 14 +#define PCRE_INFO_MINLENGTH 15 /* Request types for pcre_config(). Do not re-arrange, in order to remain compatible. */ diff --git a/ext/pcre/pcrelib/pcre_compile.c b/ext/pcre/pcrelib/pcre_compile.c index 1e0672c5c..b197c1b54 100644 --- a/ext/pcre/pcrelib/pcre_compile.c +++ b/ext/pcre/pcrelib/pcre_compile.c @@ -339,7 +339,9 @@ static const char error_texts[] = "number is too big\0" "subpattern name expected\0" "digit expected after (?+\0" - "] is an invalid data character in JavaScript compatibility mode"; + "] is an invalid data character in JavaScript compatibility mode\0" + /* 65 */ + "different names for subpatterns of the same number are not allowed"; /* Table to identify digits and hex digits. This is used when compiling @@ -1098,6 +1100,7 @@ if (ptr[0] == CHAR_LEFT_PARENTHESIS) if (name != NULL && lorn == ptr - thisname && strncmp((const char *)name, (const char *)thisname, lorn) == 0) return *count; + term++; } } } @@ -1132,19 +1135,21 @@ for (; *ptr != 0; ptr++) BOOL negate_class = FALSE; for (;;) { - int c = *(++ptr); - if (c == CHAR_BACKSLASH) + if (ptr[1] == CHAR_BACKSLASH) { - if (ptr[1] == CHAR_E) - ptr++; - else if (strncmp((const char *)ptr+1, + if (ptr[2] == CHAR_E) + ptr+= 2; + else if (strncmp((const char *)ptr+2, STR_Q STR_BACKSLASH STR_E, 3) == 0) - ptr += 3; + ptr += 4; else break; } - else if (!negate_class && c == CHAR_CIRCUMFLEX_ACCENT) + else if (!negate_class && ptr[1] == CHAR_CIRCUMFLEX_ACCENT) + { negate_class = TRUE; + ptr++; + } else break; } @@ -1310,7 +1315,9 @@ for (;;) case OP_CALLOUT: case OP_CREF: + case OP_NCREF: case OP_RREF: + case OP_NRREF: case OP_DEF: code += _pcre_OP_lengths[*code]; break; @@ -1326,23 +1333,34 @@ for (;;) /************************************************* -* Find the fixed length of a pattern * +* Find the fixed length of a branch * *************************************************/ -/* Scan a pattern and compute the fixed length of subject that will match it, +/* Scan a branch 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. +In UTF8 mode, the result is in characters rather than bytes. The branch is +temporarily terminated with OP_END when this function is called. + +This function is called when a backward assertion is encountered, so that if it +fails, the error message can point to the correct place in the pattern. +However, we cannot do this when the assertion contains subroutine calls, +because they can be forward references. We solve this by remembering this case +and doing the check at the end; a flag specifies which mode we are running in. Arguments: code points to the start of the pattern (the bracket) options the compiling options + atend TRUE if called when the pattern is complete + cd the "compile data" structure -Returns: the fixed length, or -1 if there is no fixed length, +Returns: the fixed length, + or -1 if there is no fixed length, or -2 if \C was encountered + or -3 if an OP_RECURSE item was encountered and atend is FALSE */ static int -find_fixedlength(uschar *code, int options) +find_fixedlength(uschar *code, int options, BOOL atend, compile_data *cd) { int length = -1; @@ -1355,6 +1373,7 @@ branch, check the length against that of the other branches. */ for (;;) { int d; + uschar *ce, *cs; register int op = *cc; switch (op) { @@ -1362,7 +1381,7 @@ for (;;) case OP_BRA: case OP_ONCE: case OP_COND: - d = find_fixedlength(cc + ((op == OP_CBRA)? 2:0), options); + d = find_fixedlength(cc + ((op == OP_CBRA)? 2:0), options, atend, cd); if (d < 0) return d; branchlength += d; do cc += GET(cc, 1); while (*cc == OP_ALT); @@ -1385,6 +1404,21 @@ for (;;) branchlength = 0; break; + /* A true recursion implies not fixed length, but a subroutine call may + be OK. If the subroutine is a forward reference, we can't deal with + it until the end of the pattern, so return -3. */ + + case OP_RECURSE: + if (!atend) return -3; + cs = ce = (uschar *)cd->start_code + GET(cc, 1); /* Start subpattern */ + do ce += GET(ce, 1); while (*ce == OP_ALT); /* End subpattern */ + if (cc > cs && cc < ce) return -1; /* Recursion */ + d = find_fixedlength(cs + 2, options, atend, cd); + if (d < 0) return d; + branchlength += d; + cc += 1 + LINK_SIZE; + break; + /* Skip over assertive subpatterns */ case OP_ASSERT: @@ -1398,7 +1432,9 @@ for (;;) case OP_REVERSE: case OP_CREF: + case OP_NCREF: case OP_RREF: + case OP_NRREF: case OP_DEF: case OP_OPT: case OP_CALLOUT: @@ -1421,10 +1457,8 @@ for (;;) branchlength++; cc += 2; #ifdef SUPPORT_UTF8 - if ((options & PCRE_UTF8) != 0) - { - while ((*cc & 0xc0) == 0x80) cc++; - } + if ((options & PCRE_UTF8) != 0 && cc[-1] >= 0xc0) + cc += _pcre_utf8_table4[cc[-1] & 0x3f]; #endif break; @@ -1435,10 +1469,8 @@ for (;;) branchlength += GET2(cc,1); cc += 4; #ifdef SUPPORT_UTF8 - if ((options & PCRE_UTF8) != 0) - { - while((*cc & 0x80) == 0x80) cc++; - } + if ((options & PCRE_UTF8) != 0 && cc[-1] >= 0xc0) + cc += _pcre_utf8_table4[cc[-1] & 0x3f]; #endif break; @@ -1517,22 +1549,25 @@ for (;;) /************************************************* -* Scan compiled regex for numbered bracket * +* Scan compiled regex for specific bracket * *************************************************/ /* This little function scans through a compiled pattern until it finds a -capturing bracket with the given number. +capturing bracket with the given number, or, if the number is negative, an +instance of OP_REVERSE for a lookbehind. The function is global in the C sense +so that it can be called from pcre_study() when finding the minimum matching +length. Arguments: code points to start of expression utf8 TRUE in UTF-8 mode - number the required bracket number + number the required bracket number or negative to find a lookbehind 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) +const uschar * +_pcre_find_bracket(const uschar *code, BOOL utf8, int number) { for (;;) { @@ -1545,6 +1580,14 @@ for (;;) if (c == OP_XCLASS) code += GET(code, 1); + /* Handle recursion */ + + else if (c == OP_REVERSE) + { + if (number < 0) return (uschar *)code; + code += _pcre_OP_lengths[c]; + } + /* Handle capturing bracket */ else if (c == OP_CBRA) @@ -1910,10 +1953,13 @@ for (code = first_significant_code(code + _pcre_OP_lengths[*code], NULL, 0, TRUE case OP_QUERY: case OP_MINQUERY: case OP_POSQUERY: + if (utf8 && code[1] >= 0xc0) code += _pcre_utf8_table4[code[1] & 0x3f]; + break; + case OP_UPTO: case OP_MINUPTO: case OP_POSUPTO: - if (utf8) while ((code[2] & 0xc0) == 0x80) code++; + if (utf8 && code[3] >= 0xc0) code += _pcre_utf8_table4[code[3] & 0x3f]; break; #endif } @@ -3867,10 +3913,15 @@ we set the flag only if there is a literal "\r" or "\n" in the class. */ if (repeat_max == 0) goto END_REPEAT; + /*--------------------------------------------------------------------*/ + /* This code is obsolete from release 8.00; the restriction was finally + removed: */ + /* 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->external_flags |= PCRE_NOPARTIAL; + /* if (repeat_max != 1) cd->external_flags |= PCRE_NOPARTIAL; */ + /*--------------------------------------------------------------------*/ /* Combine the op_type with the repeat_type */ @@ -4017,10 +4068,15 @@ we set the flag only if there is a literal "\r" or "\n" in the class. */ goto END_REPEAT; } + /*--------------------------------------------------------------------*/ + /* This code is obsolete from release 8.00; the restriction was finally + removed: */ + /* 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->external_flags |= PCRE_NOPARTIAL; + /* if (repeat_max != 1) cd->external_flags |= PCRE_NOPARTIAL; */ + /*--------------------------------------------------------------------*/ if (repeat_min == 0 && repeat_max == -1) *code++ = OP_CRSTAR + repeat_type; @@ -4335,11 +4391,20 @@ we set the flag only if there is a literal "\r" or "\n" in the class. */ if (possessive_quantifier) { int len; - if (*tempcode == OP_EXACT || *tempcode == OP_TYPEEXACT || - *tempcode == OP_NOTEXACT) + + if (*tempcode == OP_TYPEEXACT) tempcode += _pcre_OP_lengths[*tempcode] + - ((*tempcode == OP_TYPEEXACT && - (tempcode[3] == OP_PROP || tempcode[3] == OP_NOTPROP))? 2:0); + ((tempcode[3] == OP_PROP || tempcode[3] == OP_NOTPROP)? 2 : 0); + + else if (*tempcode == OP_EXACT || *tempcode == OP_NOTEXACT) + { + tempcode += _pcre_OP_lengths[*tempcode]; +#ifdef SUPPORT_UTF8 + if (utf8 && tempcode[-1] >= 0xc0) + tempcode += _pcre_utf8_table4[tempcode[-1] & 0x3f]; +#endif + } + len = code - tempcode; if (len > 0) switch (*tempcode) { @@ -4417,8 +4482,19 @@ we set the flag only if there is a literal "\r" or "\n" in the class. */ if (namelen == verbs[i].len && strncmp((char *)name, vn, namelen) == 0) { - *code = verbs[i].op; - if (*code++ == OP_ACCEPT) cd->had_accept = TRUE; + /* Check for open captures before ACCEPT */ + + if (verbs[i].op == OP_ACCEPT) + { + open_capitem *oc; + cd->had_accept = TRUE; + for (oc = cd->open_caps; oc != NULL; oc = oc->next) + { + *code++ = OP_CLOSE; + PUT2INC(code, 0, oc->number); + } + } + *code++ = verbs[i].op; break; } vn += verbs[i].len + 1; @@ -4580,7 +4656,10 @@ we set the flag only if there is a literal "\r" or "\n" in the class. */ } /* Otherwise (did not start with "+" or "-"), start by looking for the - name. */ + name. If we find a name, add one to the opcode to change OP_CREF or + OP_RREF into OP_NCREF or OP_NRREF. These behave exactly the same, + except they record that the reference was originally to a name. The + information is used to check duplicate names. */ slot = cd->name_table; for (i = 0; i < cd->names_found; i++) @@ -4595,6 +4674,7 @@ we set the flag only if there is a literal "\r" or "\n" in the class. */ { recno = GET2(slot, 0); PUT2(code, 2+LINK_SIZE, recno); + code[1+LINK_SIZE]++; } /* Search the pattern for a forward reference */ @@ -4603,6 +4683,7 @@ we set the flag only if there is a literal "\r" or "\n" in the class. */ (options & PCRE_EXTENDED) != 0)) > 0) { PUT2(code, 2+LINK_SIZE, i); + code[1+LINK_SIZE]++; } /* If terminator == 0 it means that the name followed directly after @@ -4795,11 +4876,24 @@ we set the flag only if there is a literal "\r" or "\n" in the class. */ } } - /* In the real compile, create the entry in the table */ + /* In the real compile, create the entry in the table, maintaining + alphabetical order. Duplicate names for different numbers are + permitted only if PCRE_DUPNAMES is set. Duplicate names for the same + number are always OK. (An existing number can be re-used if (?| + appears in the pattern.) In either event, a duplicate name results in + a duplicate entry in the table, even if the number is the same. This + is because the number of names, and hence the table size, is computed + in the pre-compile, and it affects various numbers and pointers which + would all have to be modified, and the compiled code moved down, if + duplicates with the same number were omitted from the table. This + doesn't seem worth the hassle. However, *different* names for the + same number are not permitted. */ else { + BOOL dupname = FALSE; slot = cd->name_table; + for (i = 0; i < cd->names_found; i++) { int crc = memcmp(name, slot+2, namelen); @@ -4807,33 +4901,66 @@ we set the flag only if there is a literal "\r" or "\n" in the class. */ { if (slot[2+namelen] == 0) { - if ((options & PCRE_DUPNAMES) == 0) + if (GET2(slot, 0) != cd->bracount + 1 && + (options & PCRE_DUPNAMES) == 0) { *errorcodeptr = ERR43; goto FAILED; } + else dupname = TRUE; } - else crc = -1; /* Current name is substring */ + else crc = -1; /* Current name is a substring */ } + + /* Make space in the table and break the loop for an earlier + name. For a duplicate or later name, carry on. We do this for + duplicates so that in the simple case (when ?(| is not used) they + are in order of their numbers. */ + if (crc < 0) { memmove(slot + cd->name_entry_size, slot, (cd->names_found - i) * cd->name_entry_size); break; } + + /* Continue the loop for a later or duplicate name */ + slot += cd->name_entry_size; } + /* For non-duplicate names, check for a duplicate number before + adding the new name. */ + + if (!dupname) + { + uschar *cslot = cd->name_table; + for (i = 0; i < cd->names_found; i++) + { + if (cslot != slot) + { + if (GET2(cslot, 0) == cd->bracount + 1) + { + *errorcodeptr = ERR65; + goto FAILED; + } + } + else i--; + cslot += cd->name_entry_size; + } + } + PUT2(slot, 0, cd->bracount + 1); memcpy(slot + 2, name, namelen); slot[2+namelen] = 0; } } - /* In both cases, count the number of names we've encountered. */ + /* In both pre-compile and compile, count the number of names we've + encountered. */ - ptr++; /* Move past > or ' */ cd->names_found++; + ptr++; /* Move past > or ' */ goto NUMBERED_GROUP; @@ -5002,7 +5129,8 @@ we set the flag only if there is a literal "\r" or "\n" in the class. */ if (lengthptr == NULL) { *code = OP_END; - if (recno != 0) called = find_bracket(cd->start_code, utf8, recno); + if (recno != 0) + called = _pcre_find_bracket(cd->start_code, utf8, recno); /* Forward reference */ @@ -5646,6 +5774,8 @@ uschar *code = *codeptr; uschar *last_branch = code; uschar *start_bracket = code; uschar *reverse_count = NULL; +open_capitem capitem; +int capnumber = 0; int firstbyte, reqbyte; int branchfirstbyte, branchreqbyte; int length; @@ -5672,6 +5802,17 @@ the code that abstracts option settings at the start of the pattern and makes them global. It tests the value of length for (2 + 2*LINK_SIZE) in the pre-compile phase to find out whether anything has yet been compiled or not. */ +/* If this is a capturing subpattern, add to the chain of open capturing items +so that we can detect them if (*ACCEPT) is encountered. */ + +if (*code == OP_CBRA) + { + capnumber = GET2(code, 1 + LINK_SIZE); + capitem.number = capnumber; + capitem.next = cd->open_caps; + cd->open_caps = &capitem; + } + /* Offset is set zero to mark that this bracket is still open */ PUT(code, 1, 0); @@ -5766,21 +5907,29 @@ for (;;) /* 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. */ + branch with OP_END. If the branch contains OP_RECURSE, the result is -3 + because there may be forward references that we can't check here. Set a + flag to cause another lookbehind check at the end. Why not do it all at the + end? Because common, erroneous checks are picked up here and the offset of + the problem can be shown. */ if (lookbehind) { int fixed_length; *code = OP_END; - fixed_length = find_fixedlength(last_branch, options); + fixed_length = find_fixedlength(last_branch, options, FALSE, cd); DPRINTF(("fixed length = %d\n", fixed_length)); - if (fixed_length < 0) + if (fixed_length == -3) + { + cd->check_lookbehind = TRUE; + } + else if (fixed_length < 0) { *errorcodeptr = (fixed_length == -2)? ERR36 : ERR25; *ptrptr = ptr; return FALSE; } - PUT(reverse_count, 0, fixed_length); + else { PUT(reverse_count, 0, fixed_length); } } } @@ -5808,6 +5957,10 @@ for (;;) while (branch_length > 0); } + /* If it was a capturing subpattern, remove it from the chain. */ + + if (capnumber > 0) cd->open_caps = cd->open_caps->next; + /* Fill in the ket */ *code = OP_KET; @@ -6010,7 +6163,9 @@ do { switch (*scode) { case OP_CREF: + case OP_NCREF: case OP_RREF: + case OP_NRREF: case OP_DEF: return FALSE; @@ -6179,9 +6334,7 @@ int length = 1; /* For final END opcode */ int firstbyte, reqbyte, newline; int errorcode = 0; int skipatstart = 0; -#ifdef SUPPORT_UTF8 -BOOL utf8; -#endif +BOOL utf8 = (options & PCRE_UTF8) != 0; size_t size; uschar *code; const uschar *codestart; @@ -6278,7 +6431,6 @@ while (ptr[skipatstart] == CHAR_LEFT_PARENTHESIS && /* 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 = _pcre_valid_utf8((uschar *)pattern, -1)) >= 0) { @@ -6286,7 +6438,7 @@ if (utf8 && (options & PCRE_NO_UTF8_CHECK) == 0 && goto PCRE_EARLY_ERROR_RETURN2; } #else -if ((options & PCRE_UTF8) != 0) +if (utf8) { errorcode = ERR32; goto PCRE_EARLY_ERROR_RETURN; @@ -6375,6 +6527,7 @@ cd->end_pattern = (const uschar *)(pattern + strlen(pattern)); cd->req_varyopt = 0; cd->external_options = options; cd->external_flags = 0; +cd->open_caps = NULL; /* Now do the pre-compile. On error, errorcode will be set non-zero, so we don't need to look at the result of the function here. The initial options have @@ -6449,6 +6602,8 @@ cd->start_code = codestart; cd->hwm = cworkspace; cd->req_varyopt = 0; cd->had_accept = FALSE; +cd->check_lookbehind = FALSE; +cd->open_caps = NULL; /* Set up a starting, non-extracting bracket, then compile the expression. On error, errorcode will be set non-zero, so we don't need to look at the result @@ -6487,7 +6642,7 @@ while (errorcode == 0 && cd->hwm > cworkspace) cd->hwm -= LINK_SIZE; offset = GET(cd->hwm, 0); recno = GET(codestart, offset); - groupptr = find_bracket(codestart, (re->options & PCRE_UTF8) != 0, recno); + groupptr = _pcre_find_bracket(codestart, utf8, recno); if (groupptr == NULL) errorcode = ERR53; else PUT(((uschar *)codestart), offset, groupptr - codestart); } @@ -6497,6 +6652,47 @@ subpattern. */ if (errorcode == 0 && re->top_backref > re->top_bracket) errorcode = ERR15; +/* If there were any lookbehind assertions that contained OP_RECURSE +(recursions or subroutine calls), a flag is set for them to be checked here, +because they may contain forward references. Actual recursions can't be fixed +length, but subroutine calls can. It is done like this so that those without +OP_RECURSE that are not fixed length get a diagnosic with a useful offset. The +exceptional ones forgo this. We scan the pattern to check that they are fixed +length, and set their lengths. */ + +if (cd->check_lookbehind) + { + uschar *cc = (uschar *)codestart; + + /* Loop, searching for OP_REVERSE items, and process those that do not have + their length set. (Actually, it will also re-process any that have a length + of zero, but that is a pathological case, and it does no harm.) When we find + one, we temporarily terminate the branch it is in while we scan it. */ + + for (cc = (uschar *)_pcre_find_bracket(codestart, utf8, -1); + cc != NULL; + cc = (uschar *)_pcre_find_bracket(cc, utf8, -1)) + { + if (GET(cc, 1) == 0) + { + int fixed_length; + uschar *be = cc - 1 - LINK_SIZE + GET(cc, -LINK_SIZE); + int end_op = *be; + *be = OP_END; + fixed_length = find_fixedlength(cc, re->options, TRUE, cd); + *be = end_op; + DPRINTF(("fixed length = %d\n", fixed_length)); + if (fixed_length < 0) + { + errorcode = (fixed_length == -2)? ERR36 : ERR25; + break; + } + PUT(cc, 1, fixed_length); + } + cc += 1 + LINK_SIZE; + } + } + /* Failed to compile, or error while post-processing */ if (errorcode != 0) diff --git a/ext/pcre/pcrelib/pcre_exec.c b/ext/pcre/pcrelib/pcre_exec.c index 073cf2410..ca3079b0a 100644 --- a/ext/pcre/pcrelib/pcre_exec.c +++ b/ext/pcre/pcrelib/pcre_exec.c @@ -396,10 +396,32 @@ typedef struct heapframe { /* This function is called recursively in many circumstances. Whenever it returns a negative (error) response, the outer incarnation must also return the -same response. +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 +/* These macros pack up tests that are used for partial matching, and which +appears several times in the code. We set the "hit end" flag if the pointer is +at the end of the subject and also past the start of the subject (i.e. +something has been matched). For hard partial matching, we then return +immediately. The second one is used when we already know we are past the end of +the subject. */ + +#define CHECK_PARTIAL()\ + if (md->partial != 0 && eptr >= md->end_subject && eptr > mstart)\ + {\ + md->hitend = TRUE;\ + if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL);\ + } + +#define SCHECK_PARTIAL()\ + if (md->partial != 0 && eptr > mstart)\ + {\ + md->hitend = TRUE;\ + if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL);\ + } + + +/* 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. @@ -640,14 +662,6 @@ for (;;) minimize = possessive = FALSE; op = *ecode; - /* 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 > mstart) - md->hitend = TRUE; - switch(op) { case OP_FAIL: @@ -823,18 +837,139 @@ for (;;) /* Now see what the actual condition is */ - if (condcode == OP_RREF) /* Recursion test */ + if (condcode == OP_RREF || condcode == OP_NRREF) /* Recursion test */ { - offset = GET2(ecode, LINK_SIZE + 2); /* Recursion group number*/ - condition = md->recursive != NULL && - (offset == RREF_ANY || offset == md->recursive->group_num); - ecode += condition? 3 : GET(ecode, 1); + if (md->recursive == NULL) /* Not recursing => FALSE */ + { + condition = FALSE; + ecode += GET(ecode, 1); + } + else + { + int recno = GET2(ecode, LINK_SIZE + 2); /* Recursion group number*/ + condition = (recno == RREF_ANY || recno == md->recursive->group_num); + + /* If the test is for recursion into a specific subpattern, and it is + false, but the test was set up by name, scan the table to see if the + name refers to any other numbers, and test them. The condition is true + if any one is set. */ + + if (!condition && condcode == OP_NRREF && recno != RREF_ANY) + { + uschar *slotA = md->name_table; + for (i = 0; i < md->name_count; i++) + { + if (GET2(slotA, 0) == recno) break; + slotA += md->name_entry_size; + } + + /* Found a name for the number - there can be only one; duplicate + names for different numbers are allowed, but not vice versa. First + scan down for duplicates. */ + + if (i < md->name_count) + { + uschar *slotB = slotA; + while (slotB > md->name_table) + { + slotB -= md->name_entry_size; + if (strcmp((char *)slotA + 2, (char *)slotB + 2) == 0) + { + condition = GET2(slotB, 0) == md->recursive->group_num; + if (condition) break; + } + else break; + } + + /* Scan up for duplicates */ + + if (!condition) + { + slotB = slotA; + for (i++; i < md->name_count; i++) + { + slotB += md->name_entry_size; + if (strcmp((char *)slotA + 2, (char *)slotB + 2) == 0) + { + condition = GET2(slotB, 0) == md->recursive->group_num; + if (condition) break; + } + else break; + } + } + } + } + + /* Chose branch according to the condition */ + + ecode += condition? 3 : GET(ecode, 1); + } } - else if (condcode == OP_CREF) /* Group used test */ + else if (condcode == OP_CREF || condcode == OP_NCREF) /* Group used test */ { offset = GET2(ecode, LINK_SIZE+2) << 1; /* Doubled ref number */ condition = offset < offset_top && md->offset_vector[offset] >= 0; + + /* If the numbered capture is unset, but the reference was by name, + scan the table to see if the name refers to any other numbers, and test + them. The condition is true if any one is set. This is tediously similar + to the code above, but not close enough to try to amalgamate. */ + + if (!condition && condcode == OP_NCREF) + { + int refno = offset >> 1; + uschar *slotA = md->name_table; + + for (i = 0; i < md->name_count; i++) + { + if (GET2(slotA, 0) == refno) break; + slotA += md->name_entry_size; + } + + /* Found a name for the number - there can be only one; duplicate names + for different numbers are allowed, but not vice versa. First scan down + for duplicates. */ + + if (i < md->name_count) + { + uschar *slotB = slotA; + while (slotB > md->name_table) + { + slotB -= md->name_entry_size; + if (strcmp((char *)slotA + 2, (char *)slotB + 2) == 0) + { + offset = GET2(slotB, 0) << 1; + condition = offset < offset_top && + md->offset_vector[offset] >= 0; + if (condition) break; + } + else break; + } + + /* Scan up for duplicates */ + + if (!condition) + { + slotB = slotA; + for (i++; i < md->name_count; i++) + { + slotB += md->name_entry_size; + if (strcmp((char *)slotA + 2, (char *)slotB + 2) == 0) + { + offset = GET2(slotB, 0) << 1; + condition = offset < offset_top && + md->offset_vector[offset] >= 0; + if (condition) break; + } + else break; + } + } + } + } + + /* Chose branch according to the condition */ + ecode += condition? 3 : GET(ecode, 1); } @@ -895,6 +1030,30 @@ for (;;) break; + /* Before OP_ACCEPT there may be any number of OP_CLOSE opcodes, + to close any currently open capturing brackets. */ + + case OP_CLOSE: + number = GET2(ecode, 1); + offset = number << 1; + +#ifdef DEBUG + printf("end bracket %d at *ACCEPT", number); + printf("\n"); +#endif + + 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; + } + ecode += 3; + break; + + /* End of the pattern, either real or forced. If we are in a top-level recursion, we should restore the offsets appropriately and continue from after the call. */ @@ -908,16 +1067,26 @@ for (;;) md->recursive = rec->prevrec; memmove(md->offset_vector, rec->offset_save, rec->saved_max * sizeof(int)); + offset_top = rec->save_offset_top; mstart = 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. */ + /* Otherwise, if we have matched an empty string, fail if PCRE_NOTEMPTY is + set, or if PCRE_NOTEMPTY_ATSTART is set and we have matched at the start of + the subject. In both cases, backtracking will then try other alternatives, + if any. */ + + if (eptr == mstart && + (md->notempty || + (md->notempty_atstart && + mstart == md->start_subject + md->start_offset))) + RRETURN(MATCH_NOMATCH); + + /* Otherwise, we have a match. */ - if (md->notempty && eptr == mstart) RRETURN(MATCH_NOMATCH); md->end_match_ptr = eptr; /* Record where we ended */ md->end_offset_top = offset_top; /* and how many extracts were taken */ md->start_match_ptr = mstart; /* and the start (\K can modify) */ @@ -1008,8 +1177,9 @@ for (;;) if (eptr < md->start_subject) RRETURN(MATCH_NOMATCH); } - /* Skip to next op code */ + /* Save the earliest consulted character, then skip to next op code */ + if (eptr < md->start_used_ptr) md->start_used_ptr = eptr; ecode += 1 + LINK_SIZE; break; @@ -1089,6 +1259,7 @@ for (;;) memcpy(new_recursive.offset_save, md->offset_vector, new_recursive.saved_max * sizeof(int)); new_recursive.save_start = mstart; + new_recursive.save_offset_top = offset_top; mstart = eptr; /* OK, now we can do the recursion. For each top-level alternative we @@ -1313,6 +1484,7 @@ for (;;) mstart = rec->save_start; memcpy(md->offset_vector, rec->offset_save, rec->saved_max * sizeof(int)); + offset_top = rec->save_offset_top; ecode = rec->after_call; ims = original_ims; break; @@ -1452,7 +1624,8 @@ for (;;) /* 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. */ + be "non-word" characters. Remember the earliest consulted character for + partial matching. */ #ifdef SUPPORT_UTF8 if (utf8) @@ -1461,10 +1634,16 @@ for (;;) { USPTR lastptr = eptr - 1; while((*lastptr & 0xc0) == 0x80) lastptr--; + if (lastptr < md->start_used_ptr) md->start_used_ptr = 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 + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + cur_is_word = FALSE; + } + else { GETCHAR(c, eptr); cur_is_word = c < 256 && (md->ctypes[c] & ctype_word) != 0; @@ -1473,13 +1652,20 @@ for (;;) else #endif - /* More streamlined when not in UTF-8 mode */ + /* 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); + if (eptr == md->start_subject) prev_is_word = FALSE; else + { + if (eptr <= md->start_used_ptr) md->start_used_ptr = eptr - 1; + prev_is_word = ((md->ctypes[eptr[-1]] & ctype_word) != 0); + } + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + cur_is_word = FALSE; + } + else cur_is_word = ((md->ctypes[*eptr] & ctype_word) != 0); } /* Now see if the situation is what we want */ @@ -1497,7 +1683,11 @@ for (;;) /* Fall through */ case OP_ALLANY: - if (eptr++ >= md->end_subject) RRETURN(MATCH_NOMATCH); + if (eptr++ >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } if (utf8) while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++; ecode++; break; @@ -1506,12 +1696,20 @@ for (;;) any byte, even newline, independent of the setting of PCRE_DOTALL. */ case OP_ANYBYTE: - if (eptr++ >= md->end_subject) RRETURN(MATCH_NOMATCH); + if (eptr++ >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } ecode++; break; case OP_NOT_DIGIT: - if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } GETCHARINCTEST(c, eptr); if ( #ifdef SUPPORT_UTF8 @@ -1524,7 +1722,11 @@ for (;;) break; case OP_DIGIT: - if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } GETCHARINCTEST(c, eptr); if ( #ifdef SUPPORT_UTF8 @@ -1537,7 +1739,11 @@ for (;;) break; case OP_NOT_WHITESPACE: - if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } GETCHARINCTEST(c, eptr); if ( #ifdef SUPPORT_UTF8 @@ -1550,7 +1756,11 @@ for (;;) break; case OP_WHITESPACE: - if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } GETCHARINCTEST(c, eptr); if ( #ifdef SUPPORT_UTF8 @@ -1563,7 +1773,11 @@ for (;;) break; case OP_NOT_WORDCHAR: - if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } GETCHARINCTEST(c, eptr); if ( #ifdef SUPPORT_UTF8 @@ -1576,7 +1790,11 @@ for (;;) break; case OP_WORDCHAR: - if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } GETCHARINCTEST(c, eptr); if ( #ifdef SUPPORT_UTF8 @@ -1589,7 +1807,11 @@ for (;;) break; case OP_ANYNL: - if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } GETCHARINCTEST(c, eptr); switch(c) { @@ -1613,7 +1835,11 @@ for (;;) break; case OP_NOT_HSPACE: - if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } GETCHARINCTEST(c, eptr); switch(c) { @@ -1643,7 +1869,11 @@ for (;;) break; case OP_HSPACE: - if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } GETCHARINCTEST(c, eptr); switch(c) { @@ -1673,7 +1903,11 @@ for (;;) break; case OP_NOT_VSPACE: - if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } GETCHARINCTEST(c, eptr); switch(c) { @@ -1691,7 +1925,11 @@ for (;;) break; case OP_VSPACE: - if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } GETCHARINCTEST(c, eptr); switch(c) { @@ -1714,7 +1952,11 @@ for (;;) case OP_PROP: case OP_NOTPROP: - if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } GETCHARINCTEST(c, eptr); { const ucd_record *prop = GET_UCD(c); @@ -1759,7 +2001,11 @@ for (;;) is in the binary; otherwise a compile-time error occurs. */ case OP_EXTUNI: - if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } GETCHARINCTEST(c, eptr); { int category = UCD_CATEGORY(c); @@ -1839,7 +2085,11 @@ for (;;) break; default: /* No repeat follows */ - if (!match_ref(offset, eptr, length, md, ims)) RRETURN(MATCH_NOMATCH); + if (!match_ref(offset, eptr, length, md, ims)) + { + CHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } eptr += length; continue; /* With the main loop */ } @@ -1855,7 +2105,11 @@ for (;;) for (i = 1; i <= min; i++) { - if (!match_ref(offset, eptr, length, md, ims)) RRETURN(MATCH_NOMATCH); + if (!match_ref(offset, eptr, length, md, ims)) + { + CHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } eptr += length; } @@ -1872,8 +2126,12 @@ for (;;) { RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM14); if (rrc != MATCH_NOMATCH) RRETURN(rrc); - if (fi >= max || !match_ref(offset, eptr, length, md, ims)) + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (!match_ref(offset, eptr, length, md, ims)) + { + CHECK_PARTIAL(); RRETURN(MATCH_NOMATCH); + } eptr += length; } /* Control never gets here */ @@ -1886,7 +2144,11 @@ for (;;) pp = eptr; for (i = min; i < max; i++) { - if (!match_ref(offset, eptr, length, md, ims)) break; + if (!match_ref(offset, eptr, length, md, ims)) + { + CHECK_PARTIAL(); + break; + } eptr += length; } while (eptr >= pp) @@ -1900,8 +2162,6 @@ for (;;) } /* 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 @@ -1956,7 +2216,11 @@ for (;;) { for (i = 1; i <= min; i++) { - if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } GETCHARINC(c, eptr); if (c > 255) { @@ -1974,7 +2238,11 @@ for (;;) { for (i = 1; i <= min; i++) { - if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } c = *eptr++; if ((data[c/8] & (1 << (c&7))) == 0) RRETURN(MATCH_NOMATCH); } @@ -1998,7 +2266,12 @@ for (;;) { RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM16); if (rrc != MATCH_NOMATCH) RRETURN(rrc); - if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } GETCHARINC(c, eptr); if (c > 255) { @@ -2018,7 +2291,12 @@ for (;;) { RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM17); if (rrc != MATCH_NOMATCH) RRETURN(rrc); - if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } c = *eptr++; if ((data[c/8] & (1 << (c&7))) == 0) RRETURN(MATCH_NOMATCH); } @@ -2039,7 +2317,11 @@ for (;;) for (i = min; i < max; i++) { int len = 1; - if (eptr >= md->end_subject) break; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } GETCHARLEN(c, eptr, len); if (c > 255) { @@ -2065,7 +2347,11 @@ for (;;) { for (i = min; i < max; i++) { - if (eptr >= md->end_subject) break; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } c = *eptr; if ((data[c/8] & (1 << (c&7))) == 0) break; eptr++; @@ -2127,7 +2413,11 @@ for (;;) for (i = 1; i <= min; i++) { - if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } GETCHARINCTEST(c, eptr); if (!_pcre_xclass(c, data)) RRETURN(MATCH_NOMATCH); } @@ -2146,7 +2436,12 @@ for (;;) { RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM20); if (rrc != MATCH_NOMATCH) RRETURN(rrc); - if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } GETCHARINCTEST(c, eptr); if (!_pcre_xclass(c, data)) RRETURN(MATCH_NOMATCH); } @@ -2161,7 +2456,11 @@ for (;;) for (i = min; i < max; i++) { int len = 1; - if (eptr >= md->end_subject) break; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } GETCHARLENTEST(c, eptr, len); if (!_pcre_xclass(c, data)) break; eptr += len; @@ -2189,7 +2488,11 @@ for (;;) length = 1; ecode++; GETCHARLEN(fc, ecode, length); - if (length > md->end_subject - eptr) RRETURN(MATCH_NOMATCH); + if (length > md->end_subject - eptr) + { + CHECK_PARTIAL(); /* Not SCHECK_PARTIAL() */ + RRETURN(MATCH_NOMATCH); + } while (length-- > 0) if (*ecode++ != *eptr++) RRETURN(MATCH_NOMATCH); } else @@ -2197,7 +2500,11 @@ for (;;) /* Non-UTF-8 mode */ { - if (md->end_subject - eptr < 1) RRETURN(MATCH_NOMATCH); + if (md->end_subject - eptr < 1) + { + SCHECK_PARTIAL(); /* This one can use SCHECK_PARTIAL() */ + RRETURN(MATCH_NOMATCH); + } if (ecode[1] != *eptr++) RRETURN(MATCH_NOMATCH); ecode += 2; } @@ -2213,7 +2520,11 @@ for (;;) ecode++; GETCHARLEN(fc, ecode, length); - if (length > md->end_subject - eptr) RRETURN(MATCH_NOMATCH); + if (length > md->end_subject - eptr) + { + CHECK_PARTIAL(); /* Not SCHECK_PARTIAL() */ + RRETURN(MATCH_NOMATCH); + } /* If the pattern character's value is < 128, we have only one byte, and can use the fast lookup table. */ @@ -2248,7 +2559,11 @@ for (;;) /* Non-UTF-8 mode */ { - if (md->end_subject - eptr < 1) RRETURN(MATCH_NOMATCH); + if (md->end_subject - eptr < 1) + { + SCHECK_PARTIAL(); /* This one can use SCHECK_PARTIAL() */ + RRETURN(MATCH_NOMATCH); + } if (md->lcc[ecode[1]] != md->lcc[*eptr++]) RRETURN(MATCH_NOMATCH); ecode += 2; } @@ -2302,13 +2617,12 @@ for (;;) 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. */ + /* Common code for all repeated single-character matches. */ REPEATCHAR: #ifdef SUPPORT_UTF8 @@ -2317,7 +2631,6 @@ for (;;) 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 @@ -2335,18 +2648,18 @@ for (;;) for (i = 1; i <= min; i++) { - if (memcmp(eptr, charptr, length) == 0) eptr += length; + if (eptr <= md->end_subject - length && + memcmp(eptr, charptr, length) == 0) eptr += length; #ifdef SUPPORT_UCP - /* Need braces because of following else */ - else if (oclength == 0) { RRETURN(MATCH_NOMATCH); } + else if (oclength > 0 && + eptr <= md->end_subject - oclength && + memcmp(eptr, occhars, oclength) == 0) eptr += oclength; +#endif /* SUPPORT_UCP */ else { - if (memcmp(eptr, occhars, oclength) != 0) RRETURN(MATCH_NOMATCH); - eptr += oclength; + CHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); } -#else /* without SUPPORT_UCP */ - else { RRETURN(MATCH_NOMATCH); } -#endif /* SUPPORT_UCP */ } if (min == max) continue; @@ -2357,19 +2670,19 @@ for (;;) { RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM22); if (rrc != MATCH_NOMATCH) RRETURN(rrc); - if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); - if (memcmp(eptr, charptr, length) == 0) eptr += length; + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr <= md->end_subject - length && + memcmp(eptr, charptr, length) == 0) eptr += length; #ifdef SUPPORT_UCP - /* Need braces because of following else */ - else if (oclength == 0) { RRETURN(MATCH_NOMATCH); } + else if (oclength > 0 && + eptr <= md->end_subject - oclength && + memcmp(eptr, occhars, oclength) == 0) eptr += oclength; +#endif /* SUPPORT_UCP */ else { - if (memcmp(eptr, occhars, oclength) != 0) RRETURN(MATCH_NOMATCH); - eptr += oclength; + CHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); } -#else /* without SUPPORT_UCP */ - else { RRETURN (MATCH_NOMATCH); } -#endif /* SUPPORT_UCP */ } /* Control never gets here */ } @@ -2379,33 +2692,34 @@ for (;;) pp = eptr; for (i = min; i < max; i++) { - if (eptr > md->end_subject - length) break; - if (memcmp(eptr, charptr, length) == 0) eptr += length; + if (eptr <= md->end_subject - length && + memcmp(eptr, charptr, length) == 0) eptr += length; #ifdef SUPPORT_UCP - else if (oclength == 0) break; + else if (oclength > 0 && + eptr <= md->end_subject - oclength && + memcmp(eptr, occhars, oclength) == 0) eptr += oclength; +#endif /* SUPPORT_UCP */ else { - if (memcmp(eptr, occhars, oclength) != 0) break; - eptr += oclength; + CHECK_PARTIAL(); + break; } -#else /* without SUPPORT_UCP */ - else break; -#endif /* SUPPORT_UCP */ } if (possessive) continue; + for(;;) - { - RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM23); - if (rrc != MATCH_NOMATCH) RRETURN(rrc); - if (eptr == pp) RRETURN(MATCH_NOMATCH); + { + RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM23); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (eptr == pp) { RRETURN(MATCH_NOMATCH); } #ifdef SUPPORT_UCP - eptr--; - BACKCHAR(eptr); + eptr--; + BACKCHAR(eptr); #else /* without SUPPORT_UCP */ - eptr -= length; + eptr -= length; #endif /* SUPPORT_UCP */ - } + } } /* Control never gets here */ } @@ -2418,10 +2732,8 @@ for (;;) #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++; - } + + 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 @@ -2439,7 +2751,14 @@ for (;;) { fc = md->lcc[fc]; for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } if (fc != md->lcc[*eptr++]) RRETURN(MATCH_NOMATCH); + } if (min == max) continue; if (minimize) { @@ -2447,9 +2766,13 @@ for (;;) { RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM24); if (rrc != MATCH_NOMATCH) RRETURN(rrc); - if (fi >= max || eptr >= md->end_subject || - fc != md->lcc[*eptr++]) + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); RRETURN(MATCH_NOMATCH); + } + if (fc != md->lcc[*eptr++]) RRETURN(MATCH_NOMATCH); } /* Control never gets here */ } @@ -2458,10 +2781,17 @@ for (;;) pp = eptr; for (i = min; i < max; i++) { - if (eptr >= md->end_subject || fc != md->lcc[*eptr]) break; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + if (fc != md->lcc[*eptr]) break; eptr++; } + if (possessive) continue; + while (eptr >= pp) { RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM25); @@ -2477,16 +2807,31 @@ for (;;) else { - for (i = 1; i <= min; i++) if (fc != *eptr++) RRETURN(MATCH_NOMATCH); + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + if (fc != *eptr++) RRETURN(MATCH_NOMATCH); + } + if (min == max) continue; + if (minimize) { for (fi = min;; fi++) { RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM26); if (rrc != MATCH_NOMATCH) RRETURN(rrc); - if (fi >= max || eptr >= md->end_subject || fc != *eptr++) + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); RRETURN(MATCH_NOMATCH); + } + if (fc != *eptr++) RRETURN(MATCH_NOMATCH); } /* Control never gets here */ } @@ -2495,10 +2840,16 @@ for (;;) pp = eptr; for (i = min; i < max; i++) { - if (eptr >= md->end_subject || fc != *eptr) break; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + if (fc != *eptr) break; eptr++; } if (possessive) continue; + while (eptr >= pp) { RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM27); @@ -2514,7 +2865,11 @@ for (;;) checking can be multibyte. */ case OP_NOT: - if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } ecode++; GETCHARINCTEST(c, eptr); if ((ims & PCRE_CASELESS) != 0) @@ -2591,12 +2946,9 @@ for (;;) 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. */ + /* Common code for all repeated single-byte matches. */ REPEATNOTCHAR: - if (min > md->end_subject - eptr) RRETURN(MATCH_NOMATCH); fc = *ecode++; /* The code is duplicated for the caseless and caseful cases, for speed, @@ -2621,6 +2973,11 @@ for (;;) register unsigned int d; for (i = 1; i <= min; i++) { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } GETCHARINC(d, eptr); if (d < 256) d = md->lcc[d]; if (fc == d) RRETURN(MATCH_NOMATCH); @@ -2632,7 +2989,14 @@ for (;;) /* Not UTF-8 mode */ { for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } if (fc == md->lcc[*eptr++]) RRETURN(MATCH_NOMATCH); + } } if (min == max) continue; @@ -2648,11 +3012,15 @@ for (;;) { RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM28); if (rrc != MATCH_NOMATCH) RRETURN(rrc); - if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } GETCHARINC(d, eptr); if (d < 256) d = md->lcc[d]; if (fc == d) RRETURN(MATCH_NOMATCH); - } } else @@ -2663,8 +3031,13 @@ for (;;) { RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM29); if (rrc != MATCH_NOMATCH) RRETURN(rrc); - if (fi >= max || eptr >= md->end_subject || fc == md->lcc[*eptr++]) + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); RRETURN(MATCH_NOMATCH); + } + if (fc == md->lcc[*eptr++]) RRETURN(MATCH_NOMATCH); } } /* Control never gets here */ @@ -2684,7 +3057,11 @@ for (;;) for (i = min; i < max; i++) { int len = 1; - if (eptr >= md->end_subject) break; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } GETCHARLEN(d, eptr, len); if (d < 256) d = md->lcc[d]; if (fc == d) break; @@ -2705,7 +3082,12 @@ for (;;) { for (i = min; i < max; i++) { - if (eptr >= md->end_subject || fc == md->lcc[*eptr]) break; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + if (fc == md->lcc[*eptr]) break; eptr++; } if (possessive) continue; @@ -2733,8 +3115,13 @@ for (;;) register unsigned int d; for (i = 1; i <= min; i++) { - GETCHARINC(d, eptr); - if (fc == d) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINC(d, eptr); + if (fc == d) RRETURN(MATCH_NOMATCH); } } else @@ -2742,7 +3129,14 @@ for (;;) /* Not UTF-8 mode */ { for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } if (fc == *eptr++) RRETURN(MATCH_NOMATCH); + } } if (min == max) continue; @@ -2758,7 +3152,12 @@ for (;;) { RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM32); if (rrc != MATCH_NOMATCH) RRETURN(rrc); - if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } GETCHARINC(d, eptr); if (fc == d) RRETURN(MATCH_NOMATCH); } @@ -2771,8 +3170,13 @@ for (;;) { RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM33); if (rrc != MATCH_NOMATCH) RRETURN(rrc); - if (fi >= max || eptr >= md->end_subject || fc == *eptr++) + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); RRETURN(MATCH_NOMATCH); + } + if (fc == *eptr++) RRETURN(MATCH_NOMATCH); } } /* Control never gets here */ @@ -2792,7 +3196,11 @@ for (;;) for (i = min; i < max; i++) { int len = 1; - if (eptr >= md->end_subject) break; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } GETCHARLEN(d, eptr, len); if (fc == d) break; eptr += len; @@ -2812,7 +3220,12 @@ for (;;) { for (i = min; i < max; i++) { - if (eptr >= md->end_subject || fc == *eptr) break; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + if (fc == *eptr) break; eptr++; } if (possessive) continue; @@ -2906,13 +3319,10 @@ for (;;) /* 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 + (i.e. keep it out of the loop). 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 @@ -2924,7 +3334,11 @@ for (;;) if (prop_fail_result) RRETURN(MATCH_NOMATCH); for (i = 1; i <= min; i++) { - if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } GETCHARINCTEST(c, eptr); } break; @@ -2932,7 +3346,11 @@ for (;;) case PT_LAMP: for (i = 1; i <= min; i++) { - if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } GETCHARINCTEST(c, eptr); prop_chartype = UCD_CHARTYPE(c); if ((prop_chartype == ucp_Lu || @@ -2945,7 +3363,11 @@ for (;;) case PT_GC: for (i = 1; i <= min; i++) { - if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } GETCHARINCTEST(c, eptr); prop_category = UCD_CATEGORY(c); if ((prop_category == prop_value) == prop_fail_result) @@ -2956,7 +3378,11 @@ for (;;) case PT_PC: for (i = 1; i <= min; i++) { - if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } GETCHARINCTEST(c, eptr); prop_chartype = UCD_CHARTYPE(c); if ((prop_chartype == prop_value) == prop_fail_result) @@ -2967,7 +3393,11 @@ for (;;) case PT_SC: for (i = 1; i <= min; i++) { - if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } GETCHARINCTEST(c, eptr); prop_script = UCD_SCRIPT(c); if ((prop_script == prop_value) == prop_fail_result) @@ -2987,16 +3417,19 @@ for (;;) { for (i = 1; i <= min; i++) { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } GETCHARINCTEST(c, eptr); prop_category = UCD_CATEGORY(c); if (prop_category == ucp_M) RRETURN(MATCH_NOMATCH); while (eptr < md->end_subject) { int len = 1; - if (!utf8) c = *eptr; else - { - GETCHARLEN(c, eptr, len); - } + if (!utf8) c = *eptr; + else { GETCHARLEN(c, eptr, len); } prop_category = UCD_CATEGORY(c); if (prop_category != ucp_M) break; eptr += len; @@ -3015,8 +3448,12 @@ for (;;) case OP_ANY: for (i = 1; i <= min; i++) { - if (eptr >= md->end_subject || IS_NEWLINE(eptr)) + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); RRETURN(MATCH_NOMATCH); + } + if (IS_NEWLINE(eptr)) RRETURN(MATCH_NOMATCH); eptr++; while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++; } @@ -3025,20 +3462,29 @@ for (;;) case OP_ALLANY: for (i = 1; i <= min; i++) { - if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } eptr++; while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++; } break; case OP_ANYBYTE: + if (eptr > md->end_subject - min) RRETURN(MATCH_NOMATCH); eptr += min; break; case OP_ANYNL: for (i = 1; i <= min; i++) { - if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } GETCHARINC(c, eptr); switch(c) { @@ -3064,7 +3510,11 @@ for (;;) case OP_NOT_HSPACE: for (i = 1; i <= min; i++) { - if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } GETCHARINC(c, eptr); switch(c) { @@ -3096,7 +3546,11 @@ for (;;) case OP_HSPACE: for (i = 1; i <= min; i++) { - if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } GETCHARINC(c, eptr); switch(c) { @@ -3128,7 +3582,11 @@ for (;;) case OP_NOT_VSPACE: for (i = 1; i <= min; i++) { - if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } GETCHARINC(c, eptr); switch(c) { @@ -3148,7 +3606,11 @@ for (;;) case OP_VSPACE: for (i = 1; i <= min; i++) { - if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } GETCHARINC(c, eptr); switch(c) { @@ -3168,7 +3630,11 @@ for (;;) case OP_NOT_DIGIT: for (i = 1; i <= min; i++) { - if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } GETCHARINC(c, eptr); if (c < 128 && (md->ctypes[c] & ctype_digit) != 0) RRETURN(MATCH_NOMATCH); @@ -3178,8 +3644,12 @@ for (;;) case OP_DIGIT: for (i = 1; i <= min; i++) { - if (eptr >= md->end_subject || - *eptr >= 128 || (md->ctypes[*eptr++] & ctype_digit) == 0) + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + if (*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 */ } @@ -3188,8 +3658,12 @@ for (;;) case OP_NOT_WHITESPACE: for (i = 1; i <= min; i++) { - if (eptr >= md->end_subject || - (*eptr < 128 && (md->ctypes[*eptr] & ctype_space) != 0)) + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + if (*eptr < 128 && (md->ctypes[*eptr] & ctype_space) != 0) RRETURN(MATCH_NOMATCH); while (++eptr < md->end_subject && (*eptr & 0xc0) == 0x80); } @@ -3198,8 +3672,12 @@ for (;;) case OP_WHITESPACE: for (i = 1; i <= min; i++) { - if (eptr >= md->end_subject || - *eptr >= 128 || (md->ctypes[*eptr++] & ctype_space) == 0) + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + if (*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 */ } @@ -3218,8 +3696,12 @@ for (;;) case OP_WORDCHAR: for (i = 1; i <= min; i++) { - if (eptr >= md->end_subject || - *eptr >= 128 || (md->ctypes[*eptr++] & ctype_word) == 0) + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + if (*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 */ } @@ -3233,34 +3715,49 @@ for (;;) #endif /* SUPPORT_UTF8 */ /* Code for the non-UTF-8 case for minimum matching of operators other - than OP_PROP and OP_NOTPROP. We can assume that there are the minimum - number of bytes present, as this was tested above. */ + than OP_PROP and OP_NOTPROP. */ switch(ctype) { case OP_ANY: for (i = 1; i <= min; i++) { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } if (IS_NEWLINE(eptr)) RRETURN(MATCH_NOMATCH); eptr++; } break; case OP_ALLANY: + if (eptr > md->end_subject - min) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } eptr += min; break; case OP_ANYBYTE: + if (eptr > md->end_subject - min) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } eptr += min; break; - /* Because of the CRLF case, we can't assume the minimum number of - bytes are present in this case. */ - case OP_ANYNL: for (i = 1; i <= min; i++) { - if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } switch(*eptr++) { default: RRETURN(MATCH_NOMATCH); @@ -3282,7 +3779,11 @@ for (;;) case OP_NOT_HSPACE: for (i = 1; i <= min; i++) { - if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } switch(*eptr++) { default: break; @@ -3297,7 +3798,11 @@ for (;;) case OP_HSPACE: for (i = 1; i <= min; i++) { - if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } switch(*eptr++) { default: RRETURN(MATCH_NOMATCH); @@ -3312,7 +3817,11 @@ for (;;) case OP_NOT_VSPACE: for (i = 1; i <= min; i++) { - if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } switch(*eptr++) { default: break; @@ -3329,7 +3838,11 @@ for (;;) case OP_VSPACE: for (i = 1; i <= min; i++) { - if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } switch(*eptr++) { default: RRETURN(MATCH_NOMATCH); @@ -3345,34 +3858,76 @@ for (;;) case OP_NOT_DIGIT: for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } if ((md->ctypes[*eptr++] & ctype_digit) != 0) RRETURN(MATCH_NOMATCH); + } break; case OP_DIGIT: for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } if ((md->ctypes[*eptr++] & ctype_digit) == 0) RRETURN(MATCH_NOMATCH); + } break; case OP_NOT_WHITESPACE: for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } if ((md->ctypes[*eptr++] & ctype_space) != 0) RRETURN(MATCH_NOMATCH); + } break; case OP_WHITESPACE: for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } if ((md->ctypes[*eptr++] & ctype_space) == 0) RRETURN(MATCH_NOMATCH); + } break; case OP_NOT_WORDCHAR: for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } if ((md->ctypes[*eptr++] & ctype_word) != 0) RRETURN(MATCH_NOMATCH); + } break; case OP_WORDCHAR: for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } if ((md->ctypes[*eptr++] & ctype_word) == 0) RRETURN(MATCH_NOMATCH); + } break; default: @@ -3400,7 +3955,12 @@ for (;;) { RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM36); if (rrc != MATCH_NOMATCH) RRETURN(rrc); - if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } GETCHARINC(c, eptr); if (prop_fail_result) RRETURN(MATCH_NOMATCH); } @@ -3411,7 +3971,12 @@ for (;;) { RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM37); if (rrc != MATCH_NOMATCH) RRETURN(rrc); - if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } GETCHARINC(c, eptr); prop_chartype = UCD_CHARTYPE(c); if ((prop_chartype == ucp_Lu || @@ -3426,7 +3991,12 @@ for (;;) { RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM38); if (rrc != MATCH_NOMATCH) RRETURN(rrc); - if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } GETCHARINC(c, eptr); prop_category = UCD_CATEGORY(c); if ((prop_category == prop_value) == prop_fail_result) @@ -3439,7 +4009,12 @@ for (;;) { RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM39); if (rrc != MATCH_NOMATCH) RRETURN(rrc); - if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } GETCHARINC(c, eptr); prop_chartype = UCD_CHARTYPE(c); if ((prop_chartype == prop_value) == prop_fail_result) @@ -3452,7 +4027,12 @@ for (;;) { RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM40); if (rrc != MATCH_NOMATCH) RRETURN(rrc); - if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } GETCHARINC(c, eptr); prop_script = UCD_SCRIPT(c); if ((prop_script == prop_value) == prop_fail_result) @@ -3474,17 +4054,20 @@ for (;;) { RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM41); if (rrc != MATCH_NOMATCH) RRETURN(rrc); - if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } GETCHARINCTEST(c, eptr); prop_category = UCD_CATEGORY(c); if (prop_category == ucp_M) RRETURN(MATCH_NOMATCH); while (eptr < md->end_subject) { int len = 1; - if (!utf8) c = *eptr; else - { - GETCHARLEN(c, eptr, len); - } + if (!utf8) c = *eptr; + else { GETCHARLEN(c, eptr, len); } prop_category = UCD_CATEGORY(c); if (prop_category != ucp_M) break; eptr += len; @@ -3503,10 +4086,14 @@ for (;;) { RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM42); if (rrc != MATCH_NOMATCH) RRETURN(rrc); - if (fi >= max || eptr >= md->end_subject || - (ctype == OP_ANY && IS_NEWLINE(eptr))) + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + if (ctype == OP_ANY && IS_NEWLINE(eptr)) RRETURN(MATCH_NOMATCH); - GETCHARINC(c, eptr); switch(ctype) { @@ -3662,10 +4249,14 @@ for (;;) { RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM43); if (rrc != MATCH_NOMATCH) RRETURN(rrc); - if (fi >= max || eptr >= md->end_subject || - (ctype == OP_ANY && IS_NEWLINE(eptr))) + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + if (ctype == OP_ANY && IS_NEWLINE(eptr)) RRETURN(MATCH_NOMATCH); - c = *eptr++; switch(ctype) { @@ -3790,7 +4381,11 @@ for (;;) for (i = min; i < max; i++) { int len = 1; - if (eptr >= md->end_subject) break; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } GETCHARLEN(c, eptr, len); if (prop_fail_result) break; eptr+= len; @@ -3801,7 +4396,11 @@ for (;;) for (i = min; i < max; i++) { int len = 1; - if (eptr >= md->end_subject) break; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } GETCHARLEN(c, eptr, len); prop_chartype = UCD_CHARTYPE(c); if ((prop_chartype == ucp_Lu || @@ -3816,7 +4415,11 @@ for (;;) for (i = min; i < max; i++) { int len = 1; - if (eptr >= md->end_subject) break; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } GETCHARLEN(c, eptr, len); prop_category = UCD_CATEGORY(c); if ((prop_category == prop_value) == prop_fail_result) @@ -3829,7 +4432,11 @@ for (;;) for (i = min; i < max; i++) { int len = 1; - if (eptr >= md->end_subject) break; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } GETCHARLEN(c, eptr, len); prop_chartype = UCD_CHARTYPE(c); if ((prop_chartype == prop_value) == prop_fail_result) @@ -3842,7 +4449,11 @@ for (;;) for (i = min; i < max; i++) { int len = 1; - if (eptr >= md->end_subject) break; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } GETCHARLEN(c, eptr, len); prop_script = UCD_SCRIPT(c); if ((prop_script == prop_value) == prop_fail_result) @@ -3871,7 +4482,11 @@ for (;;) { for (i = min; i < max; i++) { - if (eptr >= md->end_subject) break; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } GETCHARINCTEST(c, eptr); prop_category = UCD_CATEGORY(c); if (prop_category == ucp_M) break; @@ -3891,6 +4506,7 @@ for (;;) /* eptr is now past the end of the maximum run */ if (possessive) continue; + for(;;) { RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM45); @@ -3926,7 +4542,12 @@ for (;;) { for (i = min; i < max; i++) { - if (eptr >= md->end_subject || IS_NEWLINE(eptr)) break; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + if (IS_NEWLINE(eptr)) break; eptr++; while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++; } @@ -3938,7 +4559,12 @@ for (;;) { for (i = min; i < max; i++) { - if (eptr >= md->end_subject || IS_NEWLINE(eptr)) break; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + if (IS_NEWLINE(eptr)) break; eptr++; while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++; } @@ -3950,7 +4576,11 @@ for (;;) { for (i = min; i < max; i++) { - if (eptr >= md->end_subject) break; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } eptr++; while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++; } @@ -3963,15 +4593,22 @@ for (;;) case OP_ANYBYTE: c = max - min; if (c > (unsigned int)(md->end_subject - eptr)) - c = md->end_subject - eptr; - eptr += c; + { + eptr = md->end_subject; + SCHECK_PARTIAL(); + } + else eptr += c; break; case OP_ANYNL: for (i = min; i < max; i++) { int len = 1; - if (eptr >= md->end_subject) break; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } GETCHARLEN(c, eptr, len); if (c == 0x000d) { @@ -3996,7 +4633,11 @@ for (;;) { BOOL gotspace; int len = 1; - if (eptr >= md->end_subject) break; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } GETCHARLEN(c, eptr, len); switch(c) { @@ -4034,7 +4675,11 @@ for (;;) { BOOL gotspace; int len = 1; - if (eptr >= md->end_subject) break; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } GETCHARLEN(c, eptr, len); switch(c) { @@ -4058,7 +4703,11 @@ for (;;) for (i = min; i < max; i++) { int len = 1; - if (eptr >= md->end_subject) break; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } GETCHARLEN(c, eptr, len); if (c < 256 && (md->ctypes[c] & ctype_digit) != 0) break; eptr+= len; @@ -4069,7 +4718,11 @@ for (;;) for (i = min; i < max; i++) { int len = 1; - if (eptr >= md->end_subject) break; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } GETCHARLEN(c, eptr, len); if (c >= 256 ||(md->ctypes[c] & ctype_digit) == 0) break; eptr+= len; @@ -4080,7 +4733,11 @@ for (;;) for (i = min; i < max; i++) { int len = 1; - if (eptr >= md->end_subject) break; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } GETCHARLEN(c, eptr, len); if (c < 256 && (md->ctypes[c] & ctype_space) != 0) break; eptr+= len; @@ -4091,7 +4748,11 @@ for (;;) for (i = min; i < max; i++) { int len = 1; - if (eptr >= md->end_subject) break; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } GETCHARLEN(c, eptr, len); if (c >= 256 ||(md->ctypes[c] & ctype_space) == 0) break; eptr+= len; @@ -4102,7 +4763,11 @@ for (;;) for (i = min; i < max; i++) { int len = 1; - if (eptr >= md->end_subject) break; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } GETCHARLEN(c, eptr, len); if (c < 256 && (md->ctypes[c] & ctype_word) != 0) break; eptr+= len; @@ -4113,7 +4778,11 @@ for (;;) for (i = min; i < max; i++) { int len = 1; - if (eptr >= md->end_subject) break; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } GETCHARLEN(c, eptr, len); if (c >= 256 || (md->ctypes[c] & ctype_word) == 0) break; eptr+= len; @@ -4145,7 +4814,12 @@ for (;;) case OP_ANY: for (i = min; i < max; i++) { - if (eptr >= md->end_subject || IS_NEWLINE(eptr)) break; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + if (IS_NEWLINE(eptr)) break; eptr++; } break; @@ -4154,14 +4828,21 @@ for (;;) case OP_ANYBYTE: c = max - min; if (c > (unsigned int)(md->end_subject - eptr)) - c = md->end_subject - eptr; - eptr += c; + { + eptr = md->end_subject; + SCHECK_PARTIAL(); + } + else eptr += c; break; case OP_ANYNL: for (i = min; i < max; i++) { - if (eptr >= md->end_subject) break; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } c = *eptr; if (c == 0x000d) { @@ -4182,7 +4863,11 @@ for (;;) case OP_NOT_HSPACE: for (i = min; i < max; i++) { - if (eptr >= md->end_subject) break; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } c = *eptr; if (c == 0x09 || c == 0x20 || c == 0xa0) break; eptr++; @@ -4192,7 +4877,11 @@ for (;;) case OP_HSPACE: for (i = min; i < max; i++) { - if (eptr >= md->end_subject) break; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } c = *eptr; if (c != 0x09 && c != 0x20 && c != 0xa0) break; eptr++; @@ -4202,7 +4891,11 @@ for (;;) case OP_NOT_VSPACE: for (i = min; i < max; i++) { - if (eptr >= md->end_subject) break; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } c = *eptr; if (c == 0x0a || c == 0x0b || c == 0x0c || c == 0x0d || c == 0x85) break; @@ -4213,7 +4906,11 @@ for (;;) case OP_VSPACE: for (i = min; i < max; i++) { - if (eptr >= md->end_subject) break; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } c = *eptr; if (c != 0x0a && c != 0x0b && c != 0x0c && c != 0x0d && c != 0x85) break; @@ -4224,8 +4921,12 @@ for (;;) case OP_NOT_DIGIT: for (i = min; i < max; i++) { - if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_digit) != 0) + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); break; + } + if ((md->ctypes[*eptr] & ctype_digit) != 0) break; eptr++; } break; @@ -4233,8 +4934,12 @@ for (;;) case OP_DIGIT: for (i = min; i < max; i++) { - if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_digit) == 0) + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); break; + } + if ((md->ctypes[*eptr] & ctype_digit) == 0) break; eptr++; } break; @@ -4242,8 +4947,12 @@ for (;;) case OP_NOT_WHITESPACE: for (i = min; i < max; i++) { - if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_space) != 0) + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); break; + } + if ((md->ctypes[*eptr] & ctype_space) != 0) break; eptr++; } break; @@ -4251,8 +4960,12 @@ for (;;) case OP_WHITESPACE: for (i = min; i < max; i++) { - if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_space) == 0) + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); break; + } + if ((md->ctypes[*eptr] & ctype_space) == 0) break; eptr++; } break; @@ -4260,8 +4973,12 @@ for (;;) case OP_NOT_WORDCHAR: for (i = min; i < max; i++) { - if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_word) != 0) + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); break; + } + if ((md->ctypes[*eptr] & ctype_word) != 0) break; eptr++; } break; @@ -4269,8 +4986,12 @@ for (;;) case OP_WORDCHAR: for (i = min; i < max; i++) { - if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_word) == 0) + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); break; + } + if ((md->ctypes[*eptr] & ctype_word) == 0) break; eptr++; } break; @@ -4448,6 +5169,7 @@ const uschar *tables; const uschar *start_bits = NULL; USPTR start_match = (USPTR)subject + start_offset; USPTR end_subject; +USPTR start_partial = NULL; USPTR req_byte_ptr = start_match - 1; pcre_study_data internal_study; @@ -4464,6 +5186,13 @@ if (re == NULL || subject == NULL || (offsets == NULL && offsetcount > 0)) return PCRE_ERROR_NULL; if (offsetcount < 0) return PCRE_ERROR_BADCOUNT; +/* This information is for finding all the numbers associated with a given +name, for condition testing. */ + +md->name_table = (uschar *)re + re->name_table_offset; +md->name_count = re->name_count; +md->name_entry_size = re->name_entry_size; + /* Fish out the optional data from the extra_data structure, first setting the default values. */ @@ -4531,7 +5260,9 @@ md->jscript_compat = (re->options & PCRE_JAVASCRIPT_COMPAT) != 0; md->notbol = (options & PCRE_NOTBOL) != 0; md->noteol = (options & PCRE_NOTEOL) != 0; md->notempty = (options & PCRE_NOTEMPTY) != 0; -md->partial = (options & PCRE_PARTIAL) != 0; +md->notempty_atstart = (options & PCRE_NOTEMPTY_ATSTART) != 0; +md->partial = ((options & PCRE_PARTIAL_HARD) != 0)? 2 : + ((options & PCRE_PARTIAL_SOFT) != 0)? 1 : 0; md->hitend = FALSE; md->recursive = NULL; /* No recursion at top level */ @@ -4605,8 +5336,9 @@ else } } -/* Partial matching is supported only for a restricted set of regexes at the -moment. */ +/* Partial matching was originally supported only for a restricted set of +regexes; from release 8.00 there are no restrictions, but the bits are still +defined (though never set). So there's no harm in leaving this code. */ if (md->partial && (re->flags & PCRE_NOPARTIAL) != 0) return PCRE_ERROR_BADPARTIAL; @@ -4693,7 +5425,7 @@ if (!anchored) } else if (!startline && study != NULL && - (study->options & PCRE_STUDY_MAPPED) != 0) + (study->flags & PCRE_STUDY_MAPPED) != 0) start_bits = study->start_bits; } @@ -4820,79 +5552,94 @@ for(;;) end_subject = save_end_subject; -#ifdef DEBUG /* Sigh. Some compilers never learn. */ - printf(">>>> Match against: "); - pchars(start_match, end_subject - start_match, TRUE, md); - 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 something like /^\d+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, or if + /* The following two optimizations are disabled for partial matching or if disabling is explicitly requested. */ - if ((options & PCRE_NO_START_OPTIMIZE) == 0 && - req_byte >= 0 && - end_subject - start_match < REQ_BYTE_MAX && - !md->partial) + if ((options & PCRE_NO_START_OPTIMIZE) == 0 && !md->partial) { - register USPTR p = start_match + ((first_byte >= 0)? 1 : 0); + /* If the pattern was studied, a minimum subject length may be set. This is + a lower bound; no actual string of that length may actually match the + pattern. Although the value is, strictly, in characters, we treat it as + bytes to avoid spending too much time in this optimization. */ - /* We don't need to repeat the search if we haven't yet reached the - place we found it at last time. */ + if (study != NULL && (study->flags & PCRE_STUDY_MINLEN) != 0 && + end_subject - start_match < study->minlength) + { + rc = MATCH_NOMATCH; + break; + } - if (p > req_byte_ptr) + /* 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 something like /^\d+C/ on a + 32-megabyte string... so we don't do this when the string is sufficiently + long. */ + + if (req_byte >= 0 && end_subject - start_match < REQ_BYTE_MAX) { - if (req_byte_caseless) + register USPTR 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) { - while (p < end_subject) + if (req_byte_caseless) { - register int pp = *p++; - if (pp == req_byte || pp == req_byte2) { p--; break; } + while (p < end_subject) + { + register int pp = *p++; + if (pp == req_byte || pp == req_byte2) { p--; break; } + } } - } - else - { - while (p < end_subject) + else { - if (*p++ == req_byte) { p--; break; } + while (p < end_subject) + { + if (*p++ == req_byte) { p--; break; } + } } - } - /* If we can't find the required character, break the matching loop, - forcing a match failure. */ + /* If we can't find the required character, break the matching loop, + forcing a match failure. */ - if (p >= end_subject) - { - rc = MATCH_NOMATCH; - break; - } + if (p >= end_subject) + { + rc = MATCH_NOMATCH; + 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. */ + /* 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; + req_byte_ptr = p; + } } } - /* OK, we can now run the match. */ +#ifdef DEBUG /* Sigh. Some compilers never learn. */ + printf(">>>> Match against: "); + pchars(start_match, end_subject - start_match, TRUE, md); + printf("\n"); +#endif + + /* OK, we can now run the match. If "hitend" is set afterwards, remember the + first starting point for which a partial match was found. */ md->start_match_ptr = start_match; + md->start_used_ptr = start_match; md->match_call_count = 0; rc = match(start_match, md->start_code, start_match, 2, md, ims, NULL, 0, 0); + if (md->hitend && start_partial == NULL) start_partial = md->start_used_ptr; switch(rc) { @@ -4922,7 +5669,7 @@ for(;;) rc = MATCH_NOMATCH; goto ENDLOOP; - /* Any other return is some kind of error. */ + /* Any other return is either a match, or some kind of error. */ default: goto ENDLOOP; @@ -5028,14 +5775,19 @@ if (using_temporary_offsets) (pcre_free)(md->offset_vector); } -if (rc != MATCH_NOMATCH) +if (rc != MATCH_NOMATCH && rc != PCRE_ERROR_PARTIAL) { DPRINTF((">>>> error: returning %d\n", rc)); return rc; } -else if (md->partial && md->hitend) +else if (start_partial != NULL) { DPRINTF((">>>> returning PCRE_ERROR_PARTIAL\n")); + if (offsetcount > 1) + { + offsets[0] = start_partial - (USPTR)subject; + offsets[1] = end_subject - (USPTR)subject; + } return PCRE_ERROR_PARTIAL; } else diff --git a/ext/pcre/pcrelib/pcre_fullinfo.c b/ext/pcre/pcrelib/pcre_fullinfo.c index 44fa91bbc..6725ad7ba 100644 --- a/ext/pcre/pcrelib/pcre_fullinfo.c +++ b/ext/pcre/pcrelib/pcre_fullinfo.c @@ -117,10 +117,16 @@ switch (what) case PCRE_INFO_FIRSTTABLE: *((const uschar **)where) = - (study != NULL && (study->options & PCRE_STUDY_MAPPED) != 0)? + (study != NULL && (study->flags & PCRE_STUDY_MAPPED) != 0)? ((const pcre_study_data *)extra_data->study_data)->start_bits : NULL; break; + case PCRE_INFO_MINLENGTH: + *((int *)where) = + (study != NULL && (study->flags & PCRE_STUDY_MINLEN) != 0)? + study->minlength : -1; + break; + case PCRE_INFO_LASTLITERAL: *((int *)where) = ((re->flags & PCRE_REQCHSET) != 0)? re->req_byte : -1; @@ -142,6 +148,9 @@ switch (what) *((const uschar **)where) = (const uschar *)(_pcre_default_tables); break; + /* From release 8.00 this will always return TRUE because NOPARTIAL is + no longer ever set (the restrictions have been removed). */ + case PCRE_INFO_OKPARTIAL: *((int *)where) = (re->flags & PCRE_NOPARTIAL) == 0; break; diff --git a/ext/pcre/pcrelib/pcre_internal.h b/ext/pcre/pcrelib/pcre_internal.h index e168f3909..de0961435 100644 --- a/ext/pcre/pcrelib/pcre_internal.h +++ b/ext/pcre/pcrelib/pcre_internal.h @@ -535,7 +535,9 @@ Standard C system should have one. */ /* Private flags containing information about the compiled regex. They used to live at the top end of the options word, but that got almost full, so now they -are in a 16-bit flags word. */ +are in a 16-bit flags word. From release 8.00, PCRE_NOPARTIAL is unused, as +the restrictions on partial matching have been lifted. It remains for backwards +compatibility. */ #define PCRE_NOPARTIAL 0x0001 /* can't use partial with this regex */ #define PCRE_FIRSTSET 0x0002 /* first_byte is set */ @@ -547,6 +549,7 @@ are in a 16-bit flags word. */ /* Options for the "extra" block produced by pcre_study(). */ #define PCRE_STUDY_MAPPED 0x01 /* a map of starting chars exists */ +#define PCRE_STUDY_MINLEN 0x02 /* a minimum length field exists */ /* Masks for identifying the public options that are permitted at compile time, run time, or study time, respectively. */ @@ -562,14 +565,15 @@ time, run time, or study time, respectively. */ PCRE_JAVASCRIPT_COMPAT) #define PUBLIC_EXEC_OPTIONS \ - (PCRE_ANCHORED|PCRE_NOTBOL|PCRE_NOTEOL|PCRE_NOTEMPTY|PCRE_NO_UTF8_CHECK| \ - PCRE_PARTIAL|PCRE_NEWLINE_BITS|PCRE_BSR_ANYCRLF|PCRE_BSR_UNICODE| \ - PCRE_NO_START_OPTIMIZE) + (PCRE_ANCHORED|PCRE_NOTBOL|PCRE_NOTEOL|PCRE_NOTEMPTY|PCRE_NOTEMPTY_ATSTART| \ + PCRE_NO_UTF8_CHECK|PCRE_PARTIAL_HARD|PCRE_PARTIAL_SOFT|PCRE_NEWLINE_BITS| \ + PCRE_BSR_ANYCRLF|PCRE_BSR_UNICODE|PCRE_NO_START_OPTIMIZE) #define PUBLIC_DFA_EXEC_OPTIONS \ - (PCRE_ANCHORED|PCRE_NOTBOL|PCRE_NOTEOL|PCRE_NOTEMPTY|PCRE_NO_UTF8_CHECK| \ - PCRE_PARTIAL|PCRE_DFA_SHORTEST|PCRE_DFA_RESTART|PCRE_NEWLINE_BITS| \ - PCRE_BSR_ANYCRLF|PCRE_BSR_UNICODE|PCRE_NO_START_OPTIMIZE) + (PCRE_ANCHORED|PCRE_NOTBOL|PCRE_NOTEOL|PCRE_NOTEMPTY|PCRE_NOTEMPTY_ATSTART| \ + PCRE_NO_UTF8_CHECK|PCRE_PARTIAL_HARD|PCRE_PARTIAL_SOFT|PCRE_DFA_SHORTEST| \ + PCRE_DFA_RESTART|PCRE_NEWLINE_BITS|PCRE_BSR_ANYCRLF|PCRE_BSR_UNICODE| \ + PCRE_NO_START_OPTIMIZE) #define PUBLIC_STUDY_OPTIONS 0 /* None defined */ @@ -1206,8 +1210,8 @@ enum { ESC_A = 1, ESC_G, ESC_K, ESC_B, ESC_b, ESC_D, ESC_d, ESC_S, ESC_s, OP_EOD must correspond in order to the list of escapes immediately above. *** NOTE NOTE NOTE *** Whenever this list is updated, the two macro definitions -that follow must also be updated to match. There is also a table called -"coptable" in pcre_dfa_exec.c that must be updated. */ +that follow must also be updated to match. There are also tables called +"coptable" and "poptable" in pcre_dfa_exec.c that must be updated. */ enum { OP_END, /* 0 End of pattern */ @@ -1343,30 +1347,39 @@ enum { OP_SCBRA, /* 98 Start of capturing bracket, check empty */ OP_SCOND, /* 99 Conditional group, check empty */ + /* The next two pairs must (respectively) be kept together. */ + OP_CREF, /* 100 Used to hold a capture number as condition */ - OP_RREF, /* 101 Used to hold a recursion number as condition */ - OP_DEF, /* 102 The DEFINE condition */ + OP_NCREF, /* 101 Same, but generaged by a name reference*/ + OP_RREF, /* 102 Used to hold a recursion number as condition */ + OP_NRREF, /* 103 Same, but generaged by a name reference*/ + OP_DEF, /* 104 The DEFINE condition */ - OP_BRAZERO, /* 103 These two must remain together and in this */ - OP_BRAMINZERO, /* 104 order. */ + OP_BRAZERO, /* 105 These two must remain together and in this */ + OP_BRAMINZERO, /* 106 order. */ /* These are backtracking control verbs */ - OP_PRUNE, /* 105 */ - OP_SKIP, /* 106 */ - OP_THEN, /* 107 */ - OP_COMMIT, /* 108 */ + OP_PRUNE, /* 107 */ + OP_SKIP, /* 108 */ + OP_THEN, /* 109 */ + OP_COMMIT, /* 110 */ /* These are forced failure and success verbs */ - OP_FAIL, /* 109 */ - OP_ACCEPT, /* 110 */ + OP_FAIL, /* 111 */ + OP_ACCEPT, /* 112 */ + OP_CLOSE, /* 113 Used before OP_ACCEPT to close open captures */ /* This is used to skip a subpattern with a {0} quantifier */ - OP_SKIPZERO /* 111 */ + OP_SKIPZERO /* 114 */ }; +/* *** NOTE NOTE NOTE *** Whenever the list above is updated, the two macro +definitions that follow must also be updated to match. There are also tables +called "coptable" cna "poptable" in pcre_dfa_exec.c that must be updated. */ + /* This macro defines textual names for all the opcodes. These are used only for debugging. The macro is referenced only in pcre_printint.c. */ @@ -1388,9 +1401,10 @@ for debugging. The macro is referenced only in pcre_printint.c. */ "Alt", "Ket", "KetRmax", "KetRmin", "Assert", "Assert not", \ "AssertB", "AssertB not", "Reverse", \ "Once", "Bra", "CBra", "Cond", "SBra", "SCBra", "SCond", \ - "Cond ref", "Cond rec", "Cond def", "Brazero", "Braminzero", \ + "Cond ref", "Cond nref", "Cond rec", "Cond nrec", "Cond def", \ + "Brazero", "Braminzero", \ "*PRUNE", "*SKIP", "*THEN", "*COMMIT", "*FAIL", "*ACCEPT", \ - "Skip zero" + "Close", "Skip zero" /* This macro defines the length of fixed length operations in the compiled @@ -1450,15 +1464,16 @@ in UTF-8 mode. The code that uses this table must know about such things. */ 1+LINK_SIZE, /* SBRA */ \ 3+LINK_SIZE, /* SCBRA */ \ 1+LINK_SIZE, /* SCOND */ \ - 3, /* CREF */ \ - 3, /* RREF */ \ + 3, 3, /* CREF, NCREF */ \ + 3, 3, /* RREF, NRREF */ \ 1, /* DEF */ \ 1, 1, /* BRAZERO, BRAMINZERO */ \ 1, 1, 1, 1, /* PRUNE, SKIP, THEN, COMMIT, */ \ - 1, 1, 1 /* FAIL, ACCEPT, SKIPZERO */ + 1, 1, 3, 1 /* FAIL, ACCEPT, CLOSE, SKIPZERO */ -/* A magic value for OP_RREF to indicate the "any recursion" condition. */ +/* A magic value for OP_RREF and OP_NRREF to indicate the "any recursion" +condition. */ #define RREF_ANY 0xffff @@ -1471,7 +1486,7 @@ enum { ERR0, ERR1, ERR2, ERR3, ERR4, ERR5, ERR6, ERR7, ERR8, ERR9, ERR30, ERR31, ERR32, ERR33, ERR34, ERR35, ERR36, ERR37, ERR38, ERR39, ERR40, ERR41, ERR42, ERR43, ERR44, ERR45, ERR46, ERR47, ERR48, ERR49, ERR50, ERR51, ERR52, ERR53, ERR54, ERR55, ERR56, ERR57, ERR58, ERR59, - ERR60, ERR61, ERR62, ERR63, ERR64 }; + ERR60, ERR61, ERR62, ERR63, ERR64, ERR65 }; /* 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 @@ -1487,7 +1502,7 @@ 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: +NOTE NOTE NOTE */ typedef struct real_pcre { @@ -1514,10 +1529,20 @@ 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_uint32 flags; /* Private flags */ + uschar start_bits[32]; /* Starting char bits */ + pcre_uint32 minlength; /* Minimum subject length */ } pcre_study_data; +/* Structure for building a chain of open capturing subpatterns during +compiling, so that instructions to close them can be compiled when (*ACCEPT) is +encountered. */ + +typedef struct open_capitem { + struct open_capitem *next; /* Chain link */ + pcre_uint16 number; /* Capture number */ +} open_capitem; + /* Structure for passing "static" information around between the functions doing the compiling, so that they are thread-safe. */ @@ -1530,6 +1555,7 @@ typedef struct compile_data { const uschar *start_code; /* The start of the compiled code */ const uschar *start_pattern; /* The start of the pattern */ const uschar *end_pattern; /* The end of the pattern */ + open_capitem *open_caps; /* Chain of open capture items */ uschar *hwm; /* High watermark of workspace */ uschar *name_table; /* The name/number table */ int names_found; /* Number of entries so far */ @@ -1542,6 +1568,7 @@ typedef struct compile_data { int external_flags; /* External flag bits to be set */ int req_varyopt; /* "After variable item" flag for reqbyte */ BOOL had_accept; /* (*ACCEPT) encountered */ + BOOL check_lookbehind; /* Lookbehinds need later checking */ int nltype; /* Newline type */ int nllen; /* Newline string length */ uschar nl[4]; /* Newline string when fixed length */ @@ -1565,6 +1592,7 @@ typedef struct recursion_info { USPTR save_start; /* Old value of mstart */ int *offset_save; /* Pointer to start of saved offsets */ int saved_max; /* Number of saved offsets */ + int save_offset_top; /* Current value of offset_top */ } recursion_info; /* Structure for building a chain of data for holding the values of the subject @@ -1589,6 +1617,9 @@ typedef struct match_data { int offset_max; /* The maximum usable for return data */ int nltype; /* Newline type */ int nllen; /* Newline string length */ + int name_count; /* Number of names in name table */ + int name_entry_size; /* Size of entry in names table */ + uschar *name_table; /* Table of names */ uschar nl[4]; /* Newline string when fixed */ const uschar *lcc; /* Points to lower casing table */ const uschar *ctypes; /* Points to table of type maps */ @@ -1599,7 +1630,7 @@ typedef struct match_data { BOOL jscript_compat; /* JAVASCRIPT_COMPAT flag */ BOOL endonly; /* Dollar not before final \n */ BOOL notempty; /* Empty string match not wanted */ - BOOL partial; /* PARTIAL flag */ + BOOL notempty_atstart; /* Empty string match at start not wanted */ BOOL hitend; /* Hit the end of the subject at some point */ BOOL bsr_anycrlf; /* \R is just any CRLF, not full Unicode */ const uschar *start_code; /* For use when recursing */ @@ -1607,6 +1638,8 @@ typedef struct match_data { USPTR end_subject; /* End of the subject string */ USPTR start_match_ptr; /* Start of matched string */ USPTR end_match_ptr; /* Subject position at end match */ + USPTR start_used_ptr; /* Earliest consulted character */ + int partial; /* PARTIAL options */ int end_offset_top; /* Highwater mark at end of match */ int capture_last; /* Most recent capture number */ int start_offset; /* The start offset value */ @@ -1623,7 +1656,9 @@ typedef struct dfa_match_data { const uschar *start_code; /* Start of the compiled pattern */ const uschar *start_subject; /* Start of the subject string */ const uschar *end_subject; /* End of subject string */ + const uschar *start_used_ptr; /* Earliest consulted character */ const uschar *tables; /* Character tables */ + int start_offset; /* The start offset value */ int moptions; /* Match options */ int poptions; /* Pattern options */ int nltype; /* Newline type */ @@ -1702,15 +1737,16 @@ extern const uschar _pcre_OP_lengths[]; one of the exported public functions. They have to be "external" in the C sense, but are not part of the PCRE public API. */ -extern BOOL _pcre_is_newline(const uschar *, int, const uschar *, - int *, BOOL); -extern int _pcre_ord2utf8(int, uschar *); -extern real_pcre *_pcre_try_flipped(const real_pcre *, real_pcre *, - const pcre_study_data *, pcre_study_data *); -extern int _pcre_valid_utf8(const uschar *, int); -extern BOOL _pcre_was_newline(const uschar *, int, const uschar *, - int *, BOOL); -extern BOOL _pcre_xclass(int, const uschar *); +extern const uschar *_pcre_find_bracket(const uschar *, BOOL, int); +extern BOOL _pcre_is_newline(const uschar *, int, const uschar *, + int *, BOOL); +extern int _pcre_ord2utf8(int, uschar *); +extern real_pcre *_pcre_try_flipped(const real_pcre *, real_pcre *, + const pcre_study_data *, pcre_study_data *); +extern int _pcre_valid_utf8(const uschar *, int); +extern BOOL _pcre_was_newline(const uschar *, int, const uschar *, + int *, BOOL); +extern BOOL _pcre_xclass(int, const uschar *); /* Unicode character database (UCD) */ diff --git a/ext/pcre/pcrelib/pcre_printint.src b/ext/pcre/pcrelib/pcre_printint.src index 5f45fc198..acfc4ca68 100644 --- a/ext/pcre/pcrelib/pcre_printint.src +++ b/ext/pcre/pcrelib/pcre_printint.src @@ -246,7 +246,12 @@ for(;;) fprintf(f, "%s", OP_names[*code]); break; + case OP_CLOSE: + fprintf(f, " %s %d", OP_names[*code], GET2(code, 1)); + break; + case OP_CREF: + case OP_NCREF: fprintf(f, "%3d %s", GET2(code,1), OP_names[*code]); break; @@ -258,6 +263,14 @@ for(;;) fprintf(f, " Cond recurse %d", c); break; + case OP_NRREF: + c = GET2(code, 1); + if (c == RREF_ANY) + fprintf(f, " Cond nrecurse any"); + else + fprintf(f, " Cond nrecurse %d", c); + break; + case OP_DEF: fprintf(f, " Cond def"); break; diff --git a/ext/pcre/pcrelib/pcre_study.c b/ext/pcre/pcrelib/pcre_study.c index 226cc6594..a2e9f44fa 100644 --- a/ext/pcre/pcrelib/pcre_study.c +++ b/ext/pcre/pcrelib/pcre_study.c @@ -6,7 +6,7 @@ and semantics are as close as possible to those of the Perl 5 language. Written by Philip Hazel - Copyright (c) 1997-2008 University of Cambridge + Copyright (c) 1997-2009 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without @@ -52,6 +52,364 @@ supporting functions. */ enum { SSB_FAIL, SSB_DONE, SSB_CONTINUE }; + +/************************************************* +* Find the minimum subject length for a group * +*************************************************/ + +/* Scan a parenthesized group and compute the minimum length of subject that +is needed to match it. This is a lower bound; it does not mean there is a +string of that length that matches. In UTF8 mode, the result is in characters +rather than bytes. + +Arguments: + code pointer to start of group (the bracket) + startcode pointer to start of the whole pattern + options the compiling options + +Returns: the minimum length + -1 if \C was encountered + -2 internal error (missing capturing bracket) +*/ + +static int +find_minlength(const uschar *code, const uschar *startcode, int options) +{ +int length = -1; +BOOL utf8 = (options & PCRE_UTF8) != 0; +BOOL had_recurse = FALSE; +register int branchlength = 0; +register uschar *cc = (uschar *)code + 1 + LINK_SIZE; + +if (*code == OP_CBRA || *code == OP_SCBRA) cc += 2; + +/* 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, min; + uschar *cs, *ce; + register int op = *cc; + + switch (op) + { + case OP_CBRA: + case OP_SCBRA: + case OP_BRA: + case OP_SBRA: + case OP_ONCE: + case OP_COND: + case OP_SCOND: + d = find_minlength(cc, startcode, 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 || (!had_recurse && branchlength < length)) + length = branchlength; + if (*cc != OP_ALT) return length; + cc += 1 + LINK_SIZE; + branchlength = 0; + had_recurse = FALSE; + 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_CREF: + case OP_NCREF: + case OP_RREF: + case OP_NRREF: + case OP_DEF: + 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 += _pcre_OP_lengths[*cc]; + break; + + /* Skip over a subpattern that has a {0} or {0,x} quantifier */ + + case OP_BRAZERO: + case OP_BRAMINZERO: + case OP_SKIPZERO: + cc += _pcre_OP_lengths[*cc]; + do cc += GET(cc, 1); while (*cc == OP_ALT); + cc += 1 + LINK_SIZE; + break; + + /* Handle literal characters and + repetitions */ + + case OP_CHAR: + case OP_CHARNC: + case OP_NOT: + case OP_PLUS: + case OP_MINPLUS: + case OP_POSPLUS: + case OP_NOTPLUS: + case OP_NOTMINPLUS: + case OP_NOTPOSPLUS: + branchlength++; + cc += 2; +#ifdef SUPPORT_UTF8 + if (utf8 && cc[-1] >= 0xc0) cc += _pcre_utf8_table4[cc[-1] & 0x3f]; +#endif + break; + + case OP_TYPEPLUS: + case OP_TYPEMINPLUS: + case OP_TYPEPOSPLUS: + branchlength++; + cc += (cc[1] == OP_PROP || cc[1] == OP_NOTPROP)? 4 : 2; + 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: + case OP_NOTEXACT: + branchlength += GET2(cc,1); + cc += 4; +#ifdef SUPPORT_UTF8 + if (utf8 && cc[-1] >= 0xc0) cc += _pcre_utf8_table4[cc[-1] & 0x3f]; +#endif + break; + + case OP_TYPEEXACT: + branchlength += GET2(cc,1); + cc += (cc[3] == OP_PROP || cc[3] == OP_NOTPROP)? 6 : 4; + break; + + /* Handle single-char non-literal matchers */ + + case OP_PROP: + case OP_NOTPROP: + cc += 2; + /* 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: + case OP_ALLANY: + case OP_EXTUNI: + case OP_HSPACE: + case OP_NOT_HSPACE: + case OP_VSPACE: + case OP_NOT_VSPACE: + branchlength++; + cc++; + break; + + /* "Any newline" might match two characters */ + + case OP_ANYNL: + branchlength += 2; + cc++; + break; + + /* The single-byte matcher means we can't proceed in UTF-8 mode */ + + case OP_ANYBYTE: +#ifdef SUPPORT_UTF8 + if (utf8) return -1; +#endif + branchlength++; + cc++; + break; + + /* For repeated character types, we have to test for \p and \P, which have + an extra two bytes of parameters. */ + + case OP_TYPESTAR: + case OP_TYPEMINSTAR: + case OP_TYPEQUERY: + case OP_TYPEMINQUERY: + case OP_TYPEPOSSTAR: + case OP_TYPEPOSQUERY: + if (cc[1] == OP_PROP || cc[1] == OP_NOTPROP) cc += 2; + cc += _pcre_OP_lengths[op]; + break; + + case OP_TYPEUPTO: + case OP_TYPEMINUPTO: + case OP_TYPEPOSUPTO: + if (cc[3] == OP_PROP || cc[3] == OP_NOTPROP) cc += 2; + cc += _pcre_OP_lengths[op]; + break; + + /* 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_CRPLUS: + case OP_CRMINPLUS: + branchlength++; + /* Fall through */ + + case OP_CRSTAR: + case OP_CRMINSTAR: + case OP_CRQUERY: + case OP_CRMINQUERY: + cc++; + break; + + case OP_CRRANGE: + case OP_CRMINRANGE: + branchlength += GET2(cc,1); + cc += 5; + break; + + default: + branchlength++; + break; + } + break; + + /* Backreferences and subroutine calls are treated in the same way: we find + the minimum length for the subpattern. A recursion, however, causes an + a flag to be set that causes the length of this branch to be ignored. The + logic is that a recursion can only make sense if there is another + alternation that stops the recursing. That will provide the minimum length + (when no recursion happens). A backreference within the group that it is + referencing behaves in the same way. + + If PCRE_JAVASCRIPT_COMPAT is set, a backreference to an unset bracket + matches an empty string (by default it causes a matching failure), so in + that case we must set the minimum length to zero. */ + + case OP_REF: + if ((options & PCRE_JAVASCRIPT_COMPAT) == 0) + { + ce = cs = (uschar *)_pcre_find_bracket(startcode, utf8, GET2(cc, 1)); + if (cs == NULL) return -2; + do ce += GET(ce, 1); while (*ce == OP_ALT); + if (cc > cs && cc < ce) + { + d = 0; + had_recurse = TRUE; + } + else d = find_minlength(cs, startcode, options); + } + else d = 0; + cc += 3; + + /* Handle repeated back references */ + + switch (*cc) + { + case OP_CRSTAR: + case OP_CRMINSTAR: + case OP_CRQUERY: + case OP_CRMINQUERY: + min = 0; + cc++; + break; + + case OP_CRRANGE: + case OP_CRMINRANGE: + min = GET2(cc, 1); + cc += 5; + break; + + default: + min = 1; + break; + } + + branchlength += min * d; + break; + + case OP_RECURSE: + cs = ce = (uschar *)startcode + GET(cc, 1); + if (cs == NULL) return -2; + do ce += GET(ce, 1); while (*ce == OP_ALT); + if (cc > cs && cc < ce) + had_recurse = TRUE; + else + branchlength += find_minlength(cs, startcode, options); + cc += 1 + LINK_SIZE; + break; + + /* Anything else does not or need not match a character. We can get the + item's length from the table, but for those that can match zero occurrences + of a character, we must take special action for UTF-8 characters. */ + + case OP_UPTO: + case OP_NOTUPTO: + case OP_MINUPTO: + case OP_NOTMINUPTO: + case OP_POSUPTO: + case OP_STAR: + case OP_MINSTAR: + case OP_NOTMINSTAR: + case OP_POSSTAR: + case OP_NOTPOSSTAR: + case OP_QUERY: + case OP_MINQUERY: + case OP_NOTMINQUERY: + case OP_POSQUERY: + case OP_NOTPOSQUERY: + cc += _pcre_OP_lengths[op]; +#ifdef SUPPORT_UTF8 + if (utf8 && cc[-1] >= 0xc0) cc += _pcre_utf8_table4[cc[-1] & 0x3f]; +#endif + break; + + /* For the record, these are the opcodes that are matched by "default": + OP_ACCEPT, OP_CLOSE, OP_COMMIT, OP_FAIL, OP_PRUNE, OP_SET_SOM, OP_SKIP, + OP_THEN. */ + + default: + cc += _pcre_OP_lengths[op]; + break; + } + } +/* Control never gets here */ +} + + + /************************************************* * Set a bit and maybe its alternate case * *************************************************/ @@ -498,13 +856,15 @@ Arguments: set NULL unless error Returns: pointer to a pcre_extra block, with study_data filled in and the - appropriate flag set; + appropriate flags set; NULL on error or if no optimization possible */ PCRE_EXP_DEFN pcre_extra * PCRE_CALL_CONVENTION pcre_study(const pcre *external_re, int options, const char **errorptr) { +int min; +BOOL bits_set = FALSE; uschar start_bits[32]; pcre_extra *extra; pcre_study_data *study; @@ -531,30 +891,39 @@ code = (uschar *)re + re->name_table_offset + (re->name_count * re->name_entry_size); /* 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. */ +a multiline pattern that matches only at "line starts", there is no point in +seeking a list of starting bytes. */ -if ((re->options & PCRE_ANCHORED) != 0 || - (re->flags & (PCRE_FIRSTSET|PCRE_STARTLINE)) != 0) - return NULL; +if ((re->options & PCRE_ANCHORED) == 0 && + (re->flags & (PCRE_FIRSTSET|PCRE_STARTLINE)) == 0) + { + /* Set the character tables in the block that is passed around */ -/* 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)); -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; -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)); + bits_set = set_start_bits(code, start_bits, + (re->options & PCRE_CASELESS) != 0, (re->options & PCRE_UTF8) != 0, + &compile_block) == SSB_DONE; + } -/* See if we can find a fixed set of initial characters for the pattern. */ +/* Find the minimum length of subject string. */ -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) != SSB_DONE) return NULL; +min = find_minlength(code, code, re->options); + +/* Return NULL if no optimization is possible. */ + +if (!bits_set && min < 0) 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 @@ -577,8 +946,19 @@ 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)); +study->flags = 0; + +if (bits_set) + { + study->flags |= PCRE_STUDY_MAPPED; + memcpy(study->start_bits, start_bits, sizeof(start_bits)); + } + +if (min >= 0) + { + study->flags |= PCRE_STUDY_MINLEN; + study->minlength = min; + } return extra; } diff --git a/ext/pcre/pcrelib/pcre_try_flipped.c b/ext/pcre/pcrelib/pcre_try_flipped.c index 5e67943cc..91ec76aae 100644 --- a/ext/pcre/pcrelib/pcre_try_flipped.c +++ b/ext/pcre/pcrelib/pcre_try_flipped.c @@ -6,7 +6,7 @@ and semantics are as close as possible to those of the Perl 5 language. Written by Philip Hazel - Copyright (c) 1997-2008 University of Cambridge + Copyright (c) 1997-2009 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without @@ -126,7 +126,9 @@ if (study != NULL) { *internal_study = *study; /* To copy other fields */ internal_study->size = byteflip(study->size, sizeof(study->size)); - internal_study->options = byteflip(study->options, sizeof(study->options)); + internal_study->flags = byteflip(study->flags, sizeof(study->flags)); + internal_study->minlength = byteflip(study->minlength, + sizeof(study->minlength)); } return internal_re; diff --git a/ext/pcre/pcrelib/pcre_ucd.c b/ext/pcre/pcrelib/pcre_ucd.c index 33394a039..0e4a42237 100644 --- a/ext/pcre/pcrelib/pcre_ucd.c +++ b/ext/pcre/pcrelib/pcre_ucd.c @@ -1,9 +1,26 @@ #include "config.h" + #include "pcre_internal.h" /* Unicode character database. */ /* This file was autogenerated by the MultiStage2.py script. */ /* Total size: 52808 bytes, block size: 128. */ + +/* The tables herein are needed only when UCP support is built */ +/* into PCRE. This module should not be referenced otherwise, so */ +/* it should not matter whether it is compiled or not. However */ +/* a comment was received about space saving - maybe the guy linked */ +/* all the modules rather than using a library - so we include a */ +/* condition to cut out the tables when not needed. But don't leave */ +/* a totally empty module because some compilers barf at that. */ +/* Instead, just supply small dummy tables. */ + +#ifndef SUPPORT_UCP +const ucd_record _pcre_ucd_records[] = {{0,0,0 }}; +const uschar _pcre_ucd_stage1[] = {0}; +const pcre_uint16 _pcre_ucd_stage2[] = {0}; +#else + /* When recompiling tables with a new Unicode version, please check types in the structure definition from pcre_internal.h: typedef struct { @@ -2606,3 +2623,4 @@ const pcre_uint16 _pcre_ucd_stage2[] = { /* 40448 bytes, block = 128 */ #if UCD_BLOCK_SIZE != 128 #error Please correct UCD_BLOCK_SIZE in pcre_internal.h #endif +#endif /* SUPPORT_UCP */ diff --git a/ext/pcre/pcrelib/pcredemo.c b/ext/pcre/pcrelib/pcredemo.c index 364756876..c6ba56ed5 100644 --- a/ext/pcre/pcrelib/pcredemo.c +++ b/ext/pcre/pcrelib/pcredemo.c @@ -223,12 +223,12 @@ if (namecount <= 0) printf("No named substrings\n"); else * * * 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. * +* is made with the PCRE_NOTEMPTY_ATSTART and PCRE_ANCHORED flags set. * +* The first of these tells PCRE that an empty string at the start of the * +* subject 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) @@ -251,7 +251,7 @@ for (;;) if (ovector[0] == ovector[1]) { if (ovector[0] == subject_length) break; - options = PCRE_NOTEMPTY | PCRE_ANCHORED; + options = PCRE_NOTEMPTY_ATSTART | PCRE_ANCHORED; } /* Run the next matching operation */ diff --git a/ext/pcre/pcrelib/pcreposix.c b/ext/pcre/pcrelib/pcreposix.c index 645e060ac..1cc063d3e 100644 --- a/ext/pcre/pcrelib/pcreposix.c +++ b/ext/pcre/pcrelib/pcreposix.c @@ -68,64 +68,80 @@ static const int eint[] = { REG_EESCAPE, /* \c at end of pattern */ REG_EESCAPE, /* unrecognized character follows \ */ REG_BADBR, /* numbers out of order in {} quantifier */ + /* 5 */ 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 */ + /* 10 */ 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 ) */ + /* 15 */ 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 */ + /* 20 */ REG_ESIZE, /* regular expression too large */ REG_ESPACE, /* failed to get memory */ - REG_EPAREN, /* unmatched brackets */ + REG_EPAREN, /* unmatched parentheses */ REG_ASSERT, /* internal error: code overflow */ REG_BADPAT, /* unrecognized character after (?< */ + /* 25 */ REG_BADPAT, /* lookbehind assertion is not fixed length */ REG_BADPAT, /* malformed number or name after (?( */ REG_BADPAT, /* conditional group contains more than two branches */ REG_BADPAT, /* assertion expected after (?( */ REG_BADPAT, /* (?R or (?[+-]digits must be followed by ) */ + /* 30 */ 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 */ + /* 35 */ 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 */ + /* 40 */ REG_BADPAT, /* recursive call could loop indefinitely */ REG_BADPAT, /* unrecognized character after (?P */ REG_BADPAT, /* syntax error in subpattern name (missing terminator) */ REG_BADPAT, /* two named subpatterns have the same name */ REG_BADPAT, /* invalid UTF-8 string */ + /* 45 */ 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 */ REG_BADPAT, /* subpattern name is too long (maximum 32 characters) */ REG_BADPAT, /* too many named subpatterns (maximum 10,000) */ + /* 50 */ REG_BADPAT, /* repeated subpattern is too long */ REG_BADPAT, /* octal value is greater than \377 (not in UTF-8 mode) */ REG_BADPAT, /* internal error: overran compiling workspace */ REG_BADPAT, /* internal error: previously-checked referenced subpattern not found */ REG_BADPAT, /* DEFINE group contains more than one branch */ + /* 55 */ REG_BADPAT, /* repeating a DEFINE group is not allowed */ REG_INVARG, /* inconsistent NEWLINE options */ REG_BADPAT, /* \g is not followed followed by an (optionally braced) non-zero number */ - REG_BADPAT, /* (?+ or (?- must be followed by a non-zero number */ + REG_BADPAT, /* a numbered reference must not be zero */ + REG_BADPAT, /* (*VERB) with an argument is not supported */ + /* 60 */ + REG_BADPAT, /* (*VERB) not recognized */ REG_BADPAT, /* number is too big */ REG_BADPAT, /* subpattern name expected */ REG_BADPAT, /* digit expected after (?+ */ - REG_BADPAT /* ] is an invalid data character in JavaScript compatibility mode */ + REG_BADPAT, /* ] is an invalid data character in JavaScript compatibility mode */ + /* 65 */ + REG_BADPAT /* different names for subpatterns of the same number are not allowed */ }; /* Table of texts corresponding to POSIX error codes */ @@ -224,17 +240,25 @@ int erroffset; int errorcode; int options = 0; -if ((cflags & REG_ICASE) != 0) options |= PCRE_CASELESS; -if ((cflags & REG_NEWLINE) != 0) options |= PCRE_MULTILINE; -if ((cflags & REG_DOTALL) != 0) options |= PCRE_DOTALL; -if ((cflags & REG_NOSUB) != 0) options |= PCRE_NO_AUTO_CAPTURE; -if ((cflags & REG_UTF8) != 0) options |= PCRE_UTF8; +if ((cflags & REG_ICASE) != 0) options |= PCRE_CASELESS; +if ((cflags & REG_NEWLINE) != 0) options |= PCRE_MULTILINE; +if ((cflags & REG_DOTALL) != 0) options |= PCRE_DOTALL; +if ((cflags & REG_NOSUB) != 0) options |= PCRE_NO_AUTO_CAPTURE; +if ((cflags & REG_UTF8) != 0) options |= PCRE_UTF8; +if ((cflags & REG_UNGREEDY) != 0) options |= PCRE_UNGREEDY; preg->re_pcre = pcre_compile2(pattern, options, &errorcode, &errorptr, &erroffset, NULL); preg->re_erroffset = erroffset; -if (preg->re_pcre == NULL) return eint[errorcode]; +/* Safety: if the error code is too big for the translation vector (which +should not happen, but we all make mistakes), return REG_BADPAT. */ + +if (preg->re_pcre == NULL) + { + return (errorcode < sizeof(eint)/sizeof(const int))? + eint[errorcode] : REG_BADPAT; + } preg->re_nsub = pcre_info((const pcre *)preg->re_pcre, NULL, NULL); return 0; @@ -276,10 +300,11 @@ if ((eflags & REG_NOTEMPTY) != 0) options |= PCRE_NOTEMPTY; ((regex_t *)preg)->re_erroffset = (size_t)(-1); /* Only has meaning after compile */ -/* When no string data is being returned, ensure that nmatch is zero. -Otherwise, ensure the vector for holding the return data is large enough. */ +/* When no string data is being returned, or no vector has been passed in which +to put it, ensure that nmatch is zero. Otherwise, ensure the vector for holding +the return data is large enough. */ -if (nosub) nmatch = 0; +if (nosub || pmatch == NULL) nmatch = 0; else if (nmatch > 0) { diff --git a/ext/pcre/pcrelib/pcreposix.h b/ext/pcre/pcrelib/pcreposix.h index 7c5af7243..8ad58f593 100644 --- a/ext/pcre/pcrelib/pcreposix.h +++ b/ext/pcre/pcrelib/pcreposix.h @@ -50,17 +50,18 @@ POSSIBILITY OF SUCH DAMAGE. extern "C" { #endif -/* Options, mostly defined by POSIX, but with a couple of extras. */ - -#define REG_ICASE 0x0001 -#define REG_NEWLINE 0x0002 -#define REG_NOTBOL 0x0004 -#define REG_NOTEOL 0x0008 -#define REG_DOTALL 0x0010 /* NOT defined by POSIX. */ -#define REG_NOSUB 0x0020 -#define REG_UTF8 0x0040 /* NOT defined by POSIX. */ +/* Options, mostly defined by POSIX, but with some extras. */ + +#define REG_ICASE 0x0001 /* Maps to PCRE_CASELESS */ +#define REG_NEWLINE 0x0002 /* Maps to PCRE_MULTILINE */ +#define REG_NOTBOL 0x0004 /* Maps to PCRE_NOTBOL */ +#define REG_NOTEOL 0x0008 /* Maps to PCRE_NOTEOL */ +#define REG_DOTALL 0x0010 /* NOT defined by POSIX; maps to PCRE_DOTALL */ +#define REG_NOSUB 0x0020 /* Maps to PCRE_NO_AUTO_CAPTURE */ +#define REG_UTF8 0x0040 /* NOT defined by POSIX; maps to PCRE_UTF8 */ #define REG_STARTEND 0x0080 /* BSD feature: pass subject string by so,eo */ -#define REG_NOTEMPTY 0x0100 /* NOT defined by POSIX. */ +#define REG_NOTEMPTY 0x0100 /* NOT defined by POSIX; maps to PCRE_NOTEMPTY */ +#define REG_UNGREEDY 0x0200 /* NOT defined by POSIX; maps to PCRE_UNGREEDY */ /* This is not used by PCRE, but by defining it we make it easier to slot PCRE into existing programs that make POSIX calls. */ diff --git a/ext/pcre/pcrelib/testdata/grepoutput b/ext/pcre/pcrelib/testdata/grepoutput index 882344e11..da7a37027 100644 --- a/ext/pcre/pcrelib/testdata/grepoutput +++ b/ext/pcre/pcrelib/testdata/grepoutput @@ -423,3 +423,27 @@ This time it jumps and jumps and jumps. Here is the pattern again. That time it was on a line by itself. This line contains pattern not on a line by itself. +---------------------------- Test 55 ----------------------------- +./testdata/grepinput:456 +./testdata/grepinput8:0 +./testdata/grepinputv:1 +./testdata/grepinputx:0 +---------------------------- Test 56 ----------------------------- +./testdata/grepinput:456 +./testdata/grepinputv:1 +---------------------------- Test 57 ----------------------------- +PATTERN at the start of a line. +In the middle of a line, PATTERN appears. +Check up on PATTERN near the end. +---------------------------- Test 58 ----------------------------- +PATTERN at the start of a line. +In the middle of a line, PATTERN appears. +Check up on PATTERN near the end. +---------------------------- Test 59 ----------------------------- +PATTERN at the start of a line. +In the middle of a line, PATTERN appears. +Check up on PATTERN near the end. +---------------------------- Test 60 ----------------------------- +PATTERN at the start of a line. +In the middle of a line, PATTERN appears. +Check up on PATTERN near the end. diff --git a/ext/pcre/pcrelib/testdata/testinput1 b/ext/pcre/pcrelib/testdata/testinput1 index 8b0caa4cc..6cacbb512 100644 --- a/ext/pcre/pcrelib/testdata/testinput1 +++ b/ext/pcre/pcrelib/testdata/testinput1 @@ -1,3 +1,6 @@ +/-- This set of tests is for features that are compatible with all versions of + Perl 5, in non-UTF-8 mode. --/ + /the quick brown fox/ the quick brown fox The quick brown FOX @@ -4064,4 +4067,4 @@ /^%((?(?=[a])[^%])|b)*%$/ %ab% -/ End of testinput1 / +/-- End of testinput1 --/ diff --git a/ext/pcre/pcrelib/testdata/testinput10 b/ext/pcre/pcrelib/testdata/testinput10 index 726a3890a..420c27432 100644 --- a/ext/pcre/pcrelib/testdata/testinput10 +++ b/ext/pcre/pcrelib/testdata/testinput10 @@ -121,4 +121,4 @@ are all themselves checked in other tests. --/ /[^\xaa]/8BM -/ End of testinput10 / +/-- End of testinput10 --/ diff --git a/ext/pcre/pcrelib/testdata/testinput2 b/ext/pcre/pcrelib/testdata/testinput2 index beca157c6..3319bb732 100644 --- a/ext/pcre/pcrelib/testdata/testinput2 +++ b/ext/pcre/pcrelib/testdata/testinput2 @@ -1,3 +1,14 @@ +/-- This set of tests is not Perl-compatible. It checks on special features + of PCRE's API, error diagnostics, and the compiled code of some patterns. + It also checks the non-Perl syntax the PCRE supports (Python, .NET, + Oniguruma). Finally, there are some tests where PCRE and Perl differ, + either because PCRE can't be compatible, or there is potential Perl + bug. --/ + +/-- Originally, the Perl 5.10 things were in here too, but now I have separated + many (most?) of them out into test 11. However, there may still be some + that were overlooked. --/ + /(a)b|/I /abc/I @@ -123,38 +134,38 @@ defabc \Zdefabc -/abc/IP +/abc/P abc *** Failers -/^abc|def/IP +/^abc|def/P abcdef abcdef\B -/.*((abc)$|(def))/IP +/.*((abc)$|(def))/P defabc \Zdefabc -/the quick brown fox/IP +/the quick brown fox/P the quick brown fox *** Failers The Quick Brown Fox -/the quick brown fox/IPi +/the quick brown fox/Pi the quick brown fox The Quick Brown Fox -/abc.def/IP +/abc.def/P *** Failers abc\ndef -/abc$/IP +/abc$/P abc abc\n -/(abc)\2/IP +/(abc)\2/P -/(abc\1)/IP +/(abc\1)/P abc /)/ @@ -593,7 +604,7 @@ *** Failers \Nabc -/a*(b+)(z)(z)/IP +/a*(b+)(z)(z)/P aaaabbbbzzzz aaaabbbbzzzz\O0 aaaabbbbzzzz\O1 @@ -1122,14 +1133,6 @@ /(a(?1)+b)/DZ -/^\W*(?:((.)\W*(?1)\W*\2|)|((.)\W*(?3)\W*\4|\W*.\W*))\W*$/Ii - 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))$/I 12 (((2+2)*-3)-7) @@ -1419,13 +1422,13 @@ ** Failers line one\nthis is a line\nbreak in the second line -/ab.cd/IP +/ab.cd/P ab-cd ab=cd ** Failers ab\ncd -/ab.cd/IPs +/ab.cd/Ps ab-cd ab=cd ab\ncd @@ -1480,10 +1483,10 @@ (this) ((this)) -/a(b)c/IPN +/a(b)c/PN abc -/a(?Pb)c/IPN +/a(?Pb)c/PN abc /\x{100}/I @@ -1915,13 +1918,6 @@ a random value. /Ix /(?=(?'abc'\w+))\k:/I abcd: -/(?'abc'\w+):\k{2}/ - a:aaxyz - ab:ababxyz - ** Failers - a:axyz - ab:abxyz - /(?'abc'a|b)(?d|e)\k{2}/J adaa ** Failers @@ -1934,10 +1930,6 @@ a random value. /Ix ** Failers bddd -/^(?a)? (?()b|c) (?('ab')d|e)/x - abd - ce - /(?( (?'B' abc (?(R) (?(R&1)1) (?(R&B)2) X | (?1) (?2) (?R) ))) /x abcabc1Xabc2XabcXabcabc -/^(?(DEFINE) (? a) (? b) ) (?&A) (?&B) /x - abcd - -/(?(?&NAME_PAT))\s+(?(?&ADDRESS_PAT)) - (?(DEFINE) - (?[a-z]+) - (?\d+) - )/x - metcalfe 33 - /^(?(DEFINE) abc | xyz ) /x /(?(DEFINE) abc) xyz/xI @@ -2053,22 +2035,6 @@ a random value. /Ix /(?1)X(?P)/I abcPXP123 -/(?(DEFINE)(?2[0-4]\d|25[0-5]|1\d\d|[1-9]?\d))\b(?&byte)(\.(?&byte)){3}/ - 1.2.3.4 - 131.111.10.206 - 10.0.0.0 - ** Failers - 10.6 - 455.3.4.5 - -/\b(?&byte)(\.(?&byte)){3}(?(DEFINE)(?2[0-4]\d|25[0-5]|1\d\d|[1-9]?\d))/ - 1.2.3.4 - 131.111.10.206 - 10.0.0.0 - ** Failers - 10.6 - 455.3.4.5 - /(?:a(?&abc)b)*(?x)/ 123axbaxbaxbx456 123axbaxbaxb456 @@ -2090,9 +2056,6 @@ a random value. /Ix defabcabcxyz DEFabcABCXYZ -/^(a(b))\1\g1\g{1}\g-1\g{-1}\g{-02}Z/ - ababababbbabZXXXX - /^(a)\g-2/ /^(a)\g/ @@ -2191,26 +2154,12 @@ a random value. /Ix /^(?(+1)X|Y)(.)/BZ Y! -/(foo)\Kbar/ - foobar - -/(foo)(\Kbar|baz)/ - foobar - foobaz - -/(foo\Kbar)baz/ - foobarbaz - /(?tom|bon)-\k{A}/ tom-tom bon-bon ** Failers tom-bon -/(?tom|bon)-\g{A}/ - tom-tom - bon-bon - /\g{A/ /(?|(abc)|(xyz))/BZ @@ -2225,50 +2174,6 @@ a random value. /Ix xabcpqrx xxyzx -/(?|(abc)|(xyz))\1/ - abcabc - xyzxyz - ** Failers - abcxyz - xyzabc - -/(?|(abc)|(xyz))(?1)/ - abcabc - xyzabc - ** Failers - xyzxyz - -/\H\h\V\v/ - X X\x0a - X\x09X\x0b - ** Failers - \xa0 X\x0a - -/\H*\h+\V?\v{3,4}/ - \x09\x20\xa0X\x0a\x0b\x0c\x0d\x0a - \x09\x20\xa0\x0a\x0b\x0c\x0d\x0a - \x09\x20\xa0\x0a\x0b\x0c - ** Failers - \x09\x20\xa0\x0a\x0b - -/\H{3,4}/ - XY ABCDE - XY PQR ST - -/.\h{3,4}./ - XY AB PQRS - -/\h*X\h?\H+Y\H?Z/ - >XNNNYZ - > X NYQZ - ** Failers - >XYZ - > X NY Z - -/\v*X\v?Y\v+Z\V*\x0a\V+\x0b\V{2,3}\x0c/ - >XY\x0aZ\x0aA\x0bNN\x0c - >\x0a\x0dX\x0aY\x0a\x0bZZZ\x0aAAA\x0bNNN\x0c - /[\h]/BZ >\x09< @@ -2341,49 +2246,6 @@ a random value. /Ix /A(*PRUNE)B(*SKIP)C(*THEN)D(*COMMIT)E(*F)F(*FAIL)G(?!)H(*ACCEPT)I/BZ -/^a+(*FAIL)/ - aaaaaa - -/a+b?c+(*FAIL)/ - aaabccc - -/a+b?(*PRUNE)c+(*FAIL)/ - aaabccc - -/a+b?(*COMMIT)c+(*FAIL)/ - aaabccc - -/a+b?(*SKIP)c+(*FAIL)/ - aaabcccaaabccc - -/^(?:aaa(*THEN)\w{6}|bbb(*THEN)\w{5}|ccc(*THEN)\w{4}|\w{3})/ - aaaxxxxxx - aaa++++++ - bbbxxxxx - bbb+++++ - cccxxxx - ccc++++ - dddddddd - -/^(aaa(*THEN)\w{6}|bbb(*THEN)\w{5}|ccc(*THEN)\w{4}|\w{3})/ - aaaxxxxxx - aaa++++++ - bbbxxxxx - bbb+++++ - cccxxxx - ccc++++ - dddddddd - -/a+b?(*THEN)c+(*FAIL)/ - aaabccc - -/(A (A|B(*ACCEPT)|C) D)(E)/x - ABX - AADE - ACDE - ** Failers - AD - /^a+(*FAIL)/C aaaaaa @@ -2589,66 +2451,8 @@ a random value. /Ix /[[:a\dz:]]/ -/^(?a|b\gc)/ - aaaa - bacxxx - bbaccxxx - bbbacccxx - -/^(?a|b\g'name'c)/ - aaaa - bacxxx - bbaccxxx - bbbacccxx - -/^(a|b\g<1>c)/ - aaaa - bacxxx - bbaccxxx - bbbacccxx - -/^(a|b\g'1'c)/ - aaaa - bacxxx - bbaccxxx - bbbacccxx - -/^(a|b\g'-1'c)/ - aaaa - bacxxx - bbaccxxx - bbbacccxx - -/(^(a|b\g<-1>c))/ - aaaa - bacxxx - bbaccxxx - bbbacccxx - /(^(a|b\g<-1'c))/ -/(^(a|b\g{-1}))/ - bacxxx - -/(?-i:\g)(?i:(?a))/ - XaaX - XAAX - -/(?i:\g)(?-i:(?a))/ - XaaX - ** Failers - XAAX - -/(?-i:\g<+1>)(?i:(a))/ - XaaX - XAAX - -/(?=(?(?#simplesyntax)\$(?[a-zA-Z_\x{7f}-\x{ff}][a-zA-Z0-9_\x{7f}-\x{ff}]*)(?:\[(?[a-zA-Z0-9_\x{7f}-\x{ff}]+|\$\g)\]|->\g(\(.*?\))?)?|(?#simple syntax withbraces)\$\{(?:\g(?\[(?:\g|'(?:\\.|[^'\\])*'|"(?:\g|\\.|[^"\\])*")\])?|\g|\$\{\g\})\}|(?#complexsyntax)\{(?\$(?\g(\g*|\(.*?\))?)(?:->\g)*|\$\g|\$\{\g\})\}))\{/ - -/(?a|b|c)\g*/ - abc - accccbbb - /^(?+1)(?x|y){0}z/ xzxx yzyy @@ -2755,22 +2559,614 @@ a random value. /Ix /^"((?(?=[a])[^"])|b)*"$/ "ab" -/^X(?5)(a)(?|(b)|(q))(c)(d)(Y)/ - XYabcdY - /^X(?5)(a)(?|(b)|(q))(c)(d)Y/ XYabcdY /^X(?&N)(a)(?|(b)|(q))(c)(d)(?Y)/ XYabcdY +/Xa{2,4}b/ + X\P + Xa\P + Xaa\P + Xaaa\P + Xaaaa\P + +/Xa{2,4}?b/ + X\P + Xa\P + Xaa\P + Xaaa\P + Xaaaa\P + +/Xa{2,4}+b/ + X\P + Xa\P + Xaa\P + Xaaa\P + Xaaaa\P + +/X\d{2,4}b/ + X\P + X3\P + X33\P + X333\P + X3333\P + +/X\d{2,4}?b/ + X\P + X3\P + X33\P + X333\P + X3333\P + +/X\d{2,4}+b/ + X\P + X3\P + X33\P + X333\P + X3333\P + +/X\D{2,4}b/ + X\P + Xa\P + Xaa\P + Xaaa\P + Xaaaa\P + +/X\D{2,4}?b/ + X\P + Xa\P + Xaa\P + Xaaa\P + Xaaaa\P + +/X\D{2,4}+b/ + X\P + Xa\P + Xaa\P + Xaaa\P + Xaaaa\P + +/X[abc]{2,4}b/ + X\P + Xa\P + Xaa\P + Xaaa\P + Xaaaa\P + +/X[abc]{2,4}?b/ + X\P + Xa\P + Xaa\P + Xaaa\P + Xaaaa\P + +/X[abc]{2,4}+b/ + X\P + Xa\P + Xaa\P + Xaaa\P + Xaaaa\P + +/X[^a]{2,4}b/ + X\P + Xz\P + Xzz\P + Xzzz\P + Xzzzz\P + +/X[^a]{2,4}?b/ + X\P + Xz\P + Xzz\P + Xzzz\P + Xzzzz\P + +/X[^a]{2,4}+b/ + X\P + Xz\P + Xzz\P + Xzzz\P + Xzzzz\P + +/(Y)X\1{2,4}b/ + YX\P + YXY\P + YXYY\P + YXYYY\P + YXYYYY\P + +/(Y)X\1{2,4}?b/ + YX\P + YXY\P + YXYY\P + YXYYY\P + YXYYYY\P + +/(Y)X\1{2,4}+b/ + YX\P + YXY\P + YXYY\P + YXYYY\P + YXYYYY\P + +/\++\KZ|\d+X|9+Y/ + ++++123999\P + ++++123999Y\P + ++++Z1234\P + +/Z(*F)/ + Z\P + ZA\P + +/Z(?!)/ + Z\P + ZA\P + +/dog(sbody)?/ + dogs\P + dogs\P\P + +/dog(sbody)??/ + dogs\P + dogs\P\P + +/dog|dogsbody/ + dogs\P + dogs\P\P + +/dogsbody|dog/ + dogs\P + dogs\P\P + +/\bthe cat\b/ + the cat\P + the cat\P\P + +/abc/ + abc\P + abc\P\P + +/\w+A/P + CDAAAAB + +/\w+A/PU + CDAAAAB + +/abc\K123/ + xyzabc123pqr + xyzabc12\P + xyzabc12\P\P + +/(?<=abc)123/ + xyzabc123pqr + xyzabc12\P + xyzabc12\P\P + +/\babc\b/ + +++abc+++ + +++ab\P + +++ab\P\P + +/(?&word)(?&element)(?(DEFINE)(?<[^m][^>]>[^<])(?\w*+))/BZ + +/(?&word)(?&element)(?(DEFINE)(?<[^\d][^>]>[^<])(?\w*+))/BZ + +/(ab)(x(y)z(cd(*ACCEPT)))pq/BZ + +/abc\K/+ + abcdef + abcdef\N\N + xyzabcdef\N\N + ** Failers + abcdef\N + xyzabcdef\N + +/^(?:(?=abc)|abc\K)/+ + abcdef + abcdef\N\N + ** Failers + abcdef\N + +/a?b?/+ + xyz + xyzabc + xyzabc\N + xyzabc\N\N + xyz\N\N + ** Failers + xyz\N + +/^a?b?/+ + xyz + xyzabc + ** Failers + xyzabc\N + xyzabc\N\N + xyz\N\N + xyz\N + +/^(?a|b\gc)/ + aaaa + bacxxx + bbaccxxx + bbbacccxx + +/^(?a|b\g'name'c)/ + aaaa + bacxxx + bbaccxxx + bbbacccxx + +/^(a|b\g<1>c)/ + aaaa + bacxxx + bbaccxxx + bbbacccxx + +/^(a|b\g'1'c)/ + aaaa + bacxxx + bbaccxxx + bbbacccxx + +/^(a|b\g'-1'c)/ + aaaa + bacxxx + bbaccxxx + bbbacccxx + +/(^(a|b\g<-1>c))/ + aaaa + bacxxx + bbaccxxx + bbbacccxx + +/(?-i:\g)(?i:(?a))/ + XaaX + XAAX + +/(?i:\g)(?-i:(?a))/ + XaaX + ** Failers + XAAX + +/(?-i:\g<+1>)(?i:(a))/ + XaaX + XAAX + +/(?=(?(?#simplesyntax)\$(?[a-zA-Z_\x{7f}-\x{ff}][a-zA-Z0-9_\x{7f}-\x{ff}]*)(?:\[(?[a-zA-Z0-9_\x{7f}-\x{ff}]+|\$\g)\]|->\g(\(.*?\))?)?|(?#simple syntax withbraces)\$\{(?:\g(?\[(?:\g|'(?:\\.|[^'\\])*'|"(?:\g|\\.|[^"\\])*")\])?|\g|\$\{\g\})\}|(?#complexsyntax)\{(?\$(?\g(\g*|\(.*?\))?)(?:->\g)*|\$\g|\$\{\g\})\}))\{/ + +/(?a|b|c)\g*/ + abc + accccbbb + /^X(?7)(a)(?|(b)|(q)(r)(s))(c)(d)(Y)/ XYabcdY -/^X(?7)(a)(?|(b|(r)(s))|(q))(c)(d)(Y)/ - XYabcdY +/(?<=b(?1)|zzz)(a)/ + xbaax + xzzzax + +/(a)(?<=b\1)/ + +/(a)(?<=b+(?1))/ + +/(a+)(?<=b(?1))/ + +/(a(?<=b(?1)))/ + +/(?<=b(?1))xyz/ + +/(?<=b(?1))xyz(b+)pqrstuvew/ + +/(a|bc)\1/SI + +/(a|bc)\1{2,3}/SI + +/(a|bc)(?1)/SI + +/(a|b\1)(a|b\1)/SI + +/(a|b\1){2}/SI + +/(a|bbbb\1)(a|bbbb\1)/SI + +/(a|bbbb\1){2}/SI + +/^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]/SI + +/ (?: [\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 +/xSI + +/]{0,})>]{0,})>([\d]{0,}\.)(.*)((
([\w\W\s\d][^<>]{0,})|[\s]{0,}))<\/a><\/TD>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD><\/TR>/isIS + +"(?>.*/)foo"SI + +/(?(?=[^a-z]+[a-z]) \d{2}-[a-z]{3}-\d{2} | \d{2}-\d{2}-\d{2} ) /xSI + +/(?:(?:(?:(?:(?:(?:(?:(?:(?:(a|b|c))))))))))/iSI + +/(?:c|d)(?:)(?:aaaaaaaa(?:)(?:bbbbbbbb)(?:bbbbbbbb(?:))(?:bbbbbbbb(?:)(?:bbbbbbbb)))/SI + +/A)|(?
B))/I + AB\Ca + BA\Ca + +/(?|(?A)|(?B))/ + +/(?:a(? (?')|(?")) | + b(? (?')|(?")) ) + (?('quote')[a-z]+|[0-9]+)/JIx + a"aaaaa + b"aaaaa + ** Failers + b"11111 + a"11111 + +/^(?|(a)(b)(c)(?d)|(?e)) (?('D')X|Y)/JDZx + abcdX + eX + ** Failers + abcdY + ey + +/(?a) (b)(c) (?d (?(R&A)$ | (?4)) )/JDZx + abcdd + ** Failers + abcdde + +/abcd*/ + xxxxabcd\P + xxxxabcd\P\P + +/abcd*/i + xxxxabcd\P + xxxxabcd\P\P + XXXXABCD\P + XXXXABCD\P\P + +/abc\d*/ + xxxxabc1\P + xxxxabc1\P\P + +/(a)bc\1*/ + xxxxabca\P + xxxxabca\P\P + +/abc[de]*/ + xxxxabcde\P + xxxxabcde\P\P + +/-- This is not in the Perl 5.10 test because Perl seems currently to be broken + and not behaving as specified in that it *does* bumpalong after hitting + (*COMMIT). --/ + +/(?1)(A(*COMMIT)|B)D/ + ABD + XABD + BAD + ABXABD + ** Failers + ABX + BAXBAD -/^X(?7)(a)(?|(b|(?|(r)|(t))(s))|(q))(c)(d)(Y)/ - XYabcdY +/(\3)(\1)(a)/ + cat + +/(\3)(\1)(a)/SI + cat + +/(\3)(\1)(a)/SI + cat -/ End of testinput2 / +/-- End of testinput2 --/ diff --git a/ext/pcre/pcrelib/testdata/testinput3 b/ext/pcre/pcrelib/testdata/testinput3 index 1376c213b..6fea2f5b3 100644 --- a/ext/pcre/pcrelib/testdata/testinput3 +++ b/ext/pcre/pcrelib/testdata/testinput3 @@ -1,3 +1,7 @@ +/-- This set of tests checks local-specific features, using the fr_FR locale. + It is not Perl-compatible. There is different version called wintestinput3 + f or use on Windows, where the locale is called "french". --/ + /^[\w]+/ *** Failers cole @@ -88,4 +92,4 @@ /[[:alpha:]][[:lower:]][[:upper:]]/DZLfr_FR -/ End of testinput3 / +/-- End of testinput3 --/ diff --git a/ext/pcre/pcrelib/testdata/testinput4 b/ext/pcre/pcrelib/testdata/testinput4 index e5f61946e..12f4c7e3b 100644 --- a/ext/pcre/pcrelib/testdata/testinput4 +++ b/ext/pcre/pcrelib/testdata/testinput4 @@ -1,7 +1,6 @@ -/-- 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. --/ - +/-- This set of tests if for UTF-8 support, excluding Unicode properties. It is + compatible with all versions of Perl 5. --/ + /a.b/8 acb a\x7fb @@ -623,4 +622,22 @@ /(?i)[\xc3\xa9\xc3\xbd]|[\xc3\xa9\xc3\xbdA]/8 -/ End of testinput4 / +/^[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/ + +/-- End of testinput4 --/ diff --git a/ext/pcre/pcrelib/testdata/testinput5 b/ext/pcre/pcrelib/testdata/testinput5 index 38e22b8c0..82818d7dc 100644 --- a/ext/pcre/pcrelib/testdata/testinput5 +++ b/ext/pcre/pcrelib/testdata/testinput5 @@ -1,3 +1,6 @@ +/-- This set of tests checks the API, internals, and non-Perl stuff for UTF-8 + support, excluding Unicode properties. --/ + /\x{100}/8DZ /\x{1000}/8DZ @@ -53,30 +56,6 @@ /.{3,5}?/DZ8 \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 @@ -485,4 +464,282 @@ can't tell the difference.) --/ /(*CRLF)(*UTF8)(*BSR_UNICODE)a\Rb/I -/ End of testinput5 / +/Xa{2,4}b/8 + X\P + Xa\P + Xaa\P + Xaaa\P + Xaaaa\P + +/Xa{2,4}?b/8 + X\P + Xa\P + Xaa\P + Xaaa\P + Xaaaa\P + +/Xa{2,4}+b/8 + X\P + Xa\P + Xaa\P + Xaaa\P + Xaaaa\P + +/X\x{123}{2,4}b/8 + X\P + X\x{123}\P + X\x{123}\x{123}\P + X\x{123}\x{123}\x{123}\P + X\x{123}\x{123}\x{123}\x{123}\P + +/X\x{123}{2,4}?b/8 + X\P + X\x{123}\P + X\x{123}\x{123}\P + X\x{123}\x{123}\x{123}\P + X\x{123}\x{123}\x{123}\x{123}\P + +/X\x{123}{2,4}+b/8 + X\P + X\x{123}\P + X\x{123}\x{123}\P + X\x{123}\x{123}\x{123}\P + X\x{123}\x{123}\x{123}\x{123}\P + +/X\x{123}{2,4}b/8 + Xx\P + X\x{123}x\P + X\x{123}\x{123}x\P + X\x{123}\x{123}\x{123}x\P + X\x{123}\x{123}\x{123}\x{123}x\P + +/X\x{123}{2,4}?b/8 + Xx\P + X\x{123}x\P + X\x{123}\x{123}x\P + X\x{123}\x{123}\x{123}x\P + X\x{123}\x{123}\x{123}\x{123}x\P + +/X\x{123}{2,4}+b/8 + Xx\P + X\x{123}x\P + X\x{123}\x{123}x\P + X\x{123}\x{123}\x{123}x\P + X\x{123}\x{123}\x{123}\x{123}x\P + +/X\d{2,4}b/8 + X\P + X3\P + X33\P + X333\P + X3333\P + +/X\d{2,4}?b/8 + X\P + X3\P + X33\P + X333\P + X3333\P + +/X\d{2,4}+b/8 + X\P + X3\P + X33\P + X333\P + X3333\P + +/X\D{2,4}b/8 + X\P + Xa\P + Xaa\P + Xaaa\P + Xaaaa\P + +/X\D{2,4}?b/8 + X\P + Xa\P + Xaa\P + Xaaa\P + Xaaaa\P + +/X\D{2,4}+b/8 + X\P + Xa\P + Xaa\P + Xaaa\P + Xaaaa\P + +/X\D{2,4}b/8 + X\P + X\x{123}\P + X\x{123}\x{123}\P + X\x{123}\x{123}\x{123}\P + X\x{123}\x{123}\x{123}\x{123}\P + +/X\D{2,4}?b/8 + X\P + X\x{123}\P + X\x{123}\x{123}\P + X\x{123}\x{123}\x{123}\P + X\x{123}\x{123}\x{123}\x{123}\P + +/X\D{2,4}+b/8 + X\P + X\x{123}\P + X\x{123}\x{123}\P + X\x{123}\x{123}\x{123}\P + X\x{123}\x{123}\x{123}\x{123}\P + +/X[abc]{2,4}b/8 + X\P + Xa\P + Xaa\P + Xaaa\P + Xaaaa\P + +/X[abc]{2,4}?b/8 + X\P + Xa\P + Xaa\P + Xaaa\P + Xaaaa\P + +/X[abc]{2,4}+b/8 + X\P + Xa\P + Xaa\P + Xaaa\P + Xaaaa\P + +/X[abc\x{123}]{2,4}b/8 + X\P + X\x{123}\P + X\x{123}\x{123}\P + X\x{123}\x{123}\x{123}\P + X\x{123}\x{123}\x{123}\x{123}\P + +/X[abc\x{123}]{2,4}?b/8 + X\P + X\x{123}\P + X\x{123}\x{123}\P + X\x{123}\x{123}\x{123}\P + X\x{123}\x{123}\x{123}\x{123}\P + +/X[abc\x{123}]{2,4}+b/8 + X\P + X\x{123}\P + X\x{123}\x{123}\P + X\x{123}\x{123}\x{123}\P + X\x{123}\x{123}\x{123}\x{123}\P + +/X[^a]{2,4}b/8 + X\P + Xz\P + Xzz\P + Xzzz\P + Xzzzz\P + +/X[^a]{2,4}?b/8 + X\P + Xz\P + Xzz\P + Xzzz\P + Xzzzz\P + +/X[^a]{2,4}+b/8 + X\P + Xz\P + Xzz\P + Xzzz\P + Xzzzz\P + +/X[^a]{2,4}b/8 + X\P + X\x{123}\P + X\x{123}\x{123}\P + X\x{123}\x{123}\x{123}\P + X\x{123}\x{123}\x{123}\x{123}\P + +/X[^a]{2,4}?b/8 + X\P + X\x{123}\P + X\x{123}\x{123}\P + X\x{123}\x{123}\x{123}\P + X\x{123}\x{123}\x{123}\x{123}\P + +/X[^a]{2,4}+b/8 + X\P + X\x{123}\P + X\x{123}\x{123}\P + X\x{123}\x{123}\x{123}\P + X\x{123}\x{123}\x{123}\x{123}\P + +/(Y)X\1{2,4}b/8 + YX\P + YXY\P + YXYY\P + YXYYY\P + YXYYYY\P + +/(Y)X\1{2,4}?b/8 + YX\P + YXY\P + YXYY\P + YXYYY\P + YXYYYY\P + +/(Y)X\1{2,4}+b/8 + YX\P + YXY\P + YXYY\P + YXYYY\P + YXYYYY\P + +/(\x{123})X\1{2,4}b/8 + \x{123}X\P + \x{123}X\x{123}\P + \x{123}X\x{123}\x{123}\P + \x{123}X\x{123}\x{123}\x{123}\P + \x{123}X\x{123}\x{123}\x{123}\x{123}\P + +/(\x{123})X\1{2,4}?b/8 + \x{123}X\P + \x{123}X\x{123}\P + \x{123}X\x{123}\x{123}\P + \x{123}X\x{123}\x{123}\x{123}\P + \x{123}X\x{123}\x{123}\x{123}\x{123}\P + +/(\x{123})X\1{2,4}+b/8 + \x{123}X\P + \x{123}X\x{123}\P + \x{123}X\x{123}\x{123}\P + \x{123}X\x{123}\x{123}\x{123}\P + \x{123}X\x{123}\x{123}\x{123}\x{123}\P + +/\bthe cat\b/8 + the cat\P + the cat\P\P + +/abcd*/8 + xxxxabcd\P + xxxxabcd\P\P + +/abcd*/i8 + xxxxabcd\P + xxxxabcd\P\P + XXXXABCD\P + XXXXABCD\P\P + +/abc\d*/8 + xxxxabc1\P + xxxxabc1\P\P + +/(a)bc\1*/8 + xxxxabca\P + xxxxabca\P\P + +/abc[de]*/8 + xxxxabcde\P + xxxxabcde\P\P + +/-- End of testinput5 --/ diff --git a/ext/pcre/pcrelib/testdata/testinput6 b/ext/pcre/pcrelib/testdata/testinput6 index 628646d7d..f4249da81 100644 --- a/ext/pcre/pcrelib/testdata/testinput6 +++ b/ext/pcre/pcrelib/testdata/testinput6 @@ -1,3 +1,7 @@ +/-- This set of tests is for Unicode property support. It is compatible with + Perl 5.10, but not 5.8 because it tests some extra properties that are + not in the earlier release. --/ + /^\pC\pL\pM\pN\pP\pS\pZ A\x{1ec5}ABCXYZ -/ End of testinput 8 / +/abcd*/8 + xxxxabcd\P + xxxxabcd\P\P + +/abcd*/i8 + xxxxabcd\P + xxxxabcd\P\P + XXXXABCD\P + XXXXABCD\P\P + +/abc\d*/8 + xxxxabc1\P + xxxxabc1\P\P + +/abc[de]*/8 + xxxxabcde\P + xxxxabcde\P\P + +/-- End of testinput8 --/ diff --git a/ext/pcre/pcrelib/testdata/testinput9 b/ext/pcre/pcrelib/testdata/testinput9 index ab044558d..590420c8e 100644 --- a/ext/pcre/pcrelib/testdata/testinput9 +++ b/ext/pcre/pcrelib/testdata/testinput9 @@ -1,3 +1,7 @@ +/-- This set of tests check Unicode property support with the DFA matching + functionality of pcre_dfa_exec(). The -dfa flag must be used with pcretest + when running it. --/ + /\pL\P{Nd}/8 AB *** Failers @@ -843,4 +847,4 @@ ** Failers \x{1d79}\x{a77d} -/ End / +/-- End of testinput9 --/ diff --git a/ext/pcre/pcrelib/testdata/testoutput1 b/ext/pcre/pcrelib/testdata/testoutput1 index 81b0cb868..a2a6dd4e2 100644 --- a/ext/pcre/pcrelib/testdata/testoutput1 +++ b/ext/pcre/pcrelib/testdata/testoutput1 @@ -1,3 +1,6 @@ +/-- This set of tests is for features that are compatible with all versions of + Perl 5, in non-UTF-8 mode. --/ + /the quick brown fox/ the quick brown fox 0: the quick brown fox @@ -6646,4 +6649,4 @@ No match 0: %ab% 1: -/ End of testinput1 / +/-- End of testinput1 --/ diff --git a/ext/pcre/pcrelib/testdata/testoutput10 b/ext/pcre/pcrelib/testdata/testoutput10 index 4eaaa3918..a0db64035 100644 --- a/ext/pcre/pcrelib/testdata/testoutput10 +++ b/ext/pcre/pcrelib/testdata/testoutput10 @@ -666,4 +666,4 @@ Memory allocation (code space): 40 39 End ------------------------------------------------------------------ -/ End of testinput10 / +/-- End of testinput10 --/ diff --git a/ext/pcre/pcrelib/testdata/testoutput2 b/ext/pcre/pcrelib/testdata/testoutput2 index 420e75dc4..30ea63b9c 100644 --- a/ext/pcre/pcrelib/testdata/testoutput2 +++ b/ext/pcre/pcrelib/testdata/testoutput2 @@ -1,3 +1,14 @@ +/-- This set of tests is not Perl-compatible. It checks on special features + of PCRE's API, error diagnostics, and the compiled code of some patterns. + It also checks the non-Perl syntax the PCRE supports (Python, .NET, + Oniguruma). Finally, there are some tests where PCRE and Perl differ, + either because PCRE can't be compatible, or there is potential Perl + bug. --/ + +/-- Originally, the Perl 5.10 things were in here too, but now I have separated + many (most?) of them out into test 11. However, there may still be some + that were overlooked. --/ + /(a)b|/I Capturing subpattern count = 1 No options @@ -40,28 +51,24 @@ No match /a+bc/I Capturing subpattern count = 0 -Partial matching not supported No options First char = 'a' Need char = 'c' /a*bc/I Capturing subpattern count = 0 -Partial matching not supported No options No first char Need char = 'c' /a{3}bc/I Capturing subpattern count = 0 -Partial matching not supported No options First char = 'a' Need char = 'c' /(abc|a+z)/I Capturing subpattern count = 1 -Partial matching not supported No options First char = 'a' No need char @@ -113,14 +120,12 @@ Failed: unrecognized character after (? or (?- at offset 2 /.*b/I Capturing subpattern count = 0 -Partial matching not supported No options First char at start or follows newline Need char = 'b' /.*?b/I Capturing subpattern count = 0 -Partial matching not supported No options First char at start or follows newline Need char = 'b' @@ -140,6 +145,7 @@ Capturing subpattern count = 0 No options No first char No need char +Subject length lower bound = 3 Starting byte set: c d e this sentence eventually mentions a cat 0: cat @@ -151,6 +157,7 @@ Capturing subpattern count = 0 Options: caseless No first char No need char +Subject length lower bound = 3 Starting byte set: C D E c d e this sentence eventually mentions a CAT cat 0: CAT @@ -162,6 +169,7 @@ Capturing subpattern count = 0 No options No first char No need char +Subject length lower bound = 1 Starting byte set: a b c d /(a|[^\dZ])/IS @@ -169,6 +177,7 @@ Capturing subpattern count = 1 No options No first char No need char +Subject length lower bound = 1 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 ! " # $ % & ' ( ) * + , - . / : ; < = > @@ -189,6 +198,7 @@ Capturing subpattern count = 1 No options No first char No need char +Subject length lower bound = 1 Starting byte set: \x09 \x0a \x0c \x0d \x20 a b /(ab\2)/ @@ -324,7 +334,6 @@ No need char /.*((abc)$|(def))/I Capturing subpattern count = 3 -Partial matching not supported No options First char at start or follows newline No need char @@ -338,19 +347,19 @@ No need char 2: 3: def -/abc/IP +/abc/P abc 0: abc *** Failers No match: POSIX code 17: match failed -/^abc|def/IP +/^abc|def/P abcdef 0: abc abcdef\B 0: def -/.*((abc)$|(def))/IP +/.*((abc)$|(def))/P defabc 0: defabc 1: abc @@ -360,7 +369,7 @@ No match: POSIX code 17: match failed 1: def 3: def -/the quick brown fox/IP +/the quick brown fox/P the quick brown fox 0: the quick brown fox *** Failers @@ -368,28 +377,28 @@ No match: POSIX code 17: match failed The Quick Brown Fox No match: POSIX code 17: match failed -/the quick brown fox/IPi +/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/IP +/abc.def/P *** Failers No match: POSIX code 17: match failed abc\ndef No match: POSIX code 17: match failed -/abc$/IP +/abc$/P abc 0: abc abc\n 0: abc -/(abc)\2/IP +/(abc)\2/P Failed: POSIX code 15: bad back reference at offset 7 -/(abc\1)/IP +/(abc\1)/P abc No match: POSIX code 17: match failed @@ -401,7 +410,6 @@ Failed: missing terminating ] for character class at offset 4 /[^aeiou ]{3,}/I Capturing subpattern count = 0 -Partial matching not supported No options No first char No need char @@ -410,7 +418,6 @@ No need char /<.*>/I Capturing subpattern count = 0 -Partial matching not supported No options First char = '<' Need char = '>' @@ -419,7 +426,6 @@ Need char = '>' /<.*?>/I Capturing subpattern count = 0 -Partial matching not supported No options First char = '<' Need char = '>' @@ -428,7 +434,6 @@ Need char = '>' /<.*>/IU Capturing subpattern count = 0 -Partial matching not supported Options: ungreedy First char = '<' Need char = '>' @@ -437,7 +442,6 @@ Need char = '>' /(?U)<.*>/I Capturing subpattern count = 0 -Partial matching not supported Options: ungreedy First char = '<' Need char = '>' @@ -446,7 +450,6 @@ Need char = '>' /<.*?>/IU Capturing subpattern count = 0 -Partial matching not supported Options: ungreedy First char = '<' Need char = '>' @@ -455,7 +458,6 @@ Need char = '>' /={3,}/IU Capturing subpattern count = 0 -Partial matching not supported Options: ungreedy First char = '=' Need char = '=' @@ -464,7 +466,6 @@ Need char = '=' /(?U)={3,}?/I Capturing subpattern count = 0 -Partial matching not supported Options: ungreedy First char = '=' Need char = '=' @@ -522,7 +523,6 @@ No need char /(?s).*/I Capturing subpattern count = 0 -Partial matching not supported Options: anchored dotall No first char No need char @@ -532,6 +532,7 @@ Capturing subpattern count = 0 No options No first char No need char +Subject length lower bound = 1 Starting byte set: a b c d /(?i)[abcd]/IS @@ -539,6 +540,7 @@ Capturing subpattern count = 0 Options: caseless No first char No need char +Subject length lower bound = 1 Starting byte set: A B C D a b c d /(?m)[xy]|(b|c)/IS @@ -546,6 +548,7 @@ Capturing subpattern count = 1 Options: multiline No first char No need char +Subject length lower bound = 1 Starting byte set: b c x y /(^a|^b)/Im @@ -584,7 +587,6 @@ Failed: syntax error in subpattern name (missing terminator) at offset 7 /((?s)blah)\s+\1/I Capturing subpattern count = 1 Max back reference = 1 -Partial matching not supported No options First char = 'b' Need char = 'h' @@ -592,7 +594,6 @@ Need char = 'h' /((?i)blah)\s+\1/I Capturing subpattern count = 1 Max back reference = 1 -Partial matching not supported No options First char = 'b' (caseless) Need char = 'h' (caseless) @@ -612,14 +613,15 @@ Capturing subpattern count = 1 No options First char = 'b' (caseless) No need char -Study returned NULL +Subject length lower bound = 1 +No set of starting bytes /(a*b|(?i:c*(?-i)d))/IS Capturing subpattern count = 1 -Partial matching not supported No options No first char No need char +Subject length lower bound = 1 Starting byte set: C a b c d /a$/I @@ -668,7 +670,6 @@ Need char = 'c' /^((a+)(?U)([ab]+)(?-U)([bc]+)(\w*))/I Capturing subpattern count = 5 -Partial matching not supported Options: anchored No first char No need char @@ -685,6 +686,7 @@ Capturing subpattern count = 0 No options No first char No need char +Subject length lower bound = 1 Starting byte set: a b /(?.*)(?<=(abcd)|(xyz))/I Capturing subpattern count = 2 -Partial matching not supported No options First char at start or follows newline No need char @@ -1003,7 +1006,6 @@ copy substring 5 failed -7 /(.{20})/I Capturing subpattern count = 1 -Partial matching not supported No options No first char No need char @@ -1021,7 +1023,6 @@ No need char /(.{15})/I Capturing subpattern count = 1 -Partial matching not supported No options No first char No need char @@ -1036,7 +1037,6 @@ No need char /(.{16})/I Capturing subpattern count = 1 -Partial matching not supported No options No first char No need char @@ -1103,7 +1103,6 @@ No need char )((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+ )?)?)?)?)?)?)?)?)?otherword/I Capturing subpattern count = 8 -Partial matching not supported Contains explicit CR or LF match No options First char = 'w' @@ -1118,7 +1117,6 @@ Need char = 'd' End ------------------------------------------------------------------ Capturing subpattern count = 0 -Partial matching not supported No options First char at start or follows newline Need char = 'X' @@ -1132,7 +1130,6 @@ Need char = 'X' End ------------------------------------------------------------------ Capturing subpattern count = 0 -Partial matching not supported Options: anchored dotall No first char Need char = 'X' @@ -1151,7 +1148,6 @@ Need char = 'X' End ------------------------------------------------------------------ Capturing subpattern count = 1 -Partial matching not supported No options First char at start or follows newline No need char @@ -1170,7 +1166,6 @@ No need char End ------------------------------------------------------------------ Capturing subpattern count = 1 -Partial matching not supported Options: anchored dotall No first char No need char @@ -1189,7 +1184,6 @@ No need char End ------------------------------------------------------------------ Capturing subpattern count = 1 -Partial matching not supported Options: anchored dotall No first char No need char @@ -1211,7 +1205,6 @@ No need char End ------------------------------------------------------------------ Capturing subpattern count = 0 -Partial matching not supported Options: anchored No first char No need char @@ -1296,7 +1289,6 @@ No need char /.*iss/Ig+ Capturing subpattern count = 0 -Partial matching not supported No options First char at start or follows newline Need char = 's' @@ -1399,42 +1391,36 @@ Need char = 'c' /a*/I Capturing subpattern count = 0 -Partial matching not supported No options No first char No need char /a+/I Capturing subpattern count = 0 -Partial matching not supported No options First char = 'a' No need char /(baa|a+)/I Capturing subpattern count = 1 -Partial matching not supported No options No first char Need char = 'a' /a{0,3}/I Capturing subpattern count = 0 -Partial matching not supported No options No first char No need char /baa{3,}/I Capturing subpattern count = 0 -Partial matching not supported No options First char = 'b' Need char = 'a' /"([^\\"]+|\\.)*"/I Capturing subpattern count = 1 -Partial matching not supported No options First char = '"' Need char = '"' @@ -1489,70 +1475,60 @@ Need char = 'b' /abc*/I Capturing subpattern count = 0 -Partial matching not supported No options First char = 'a' Need char = 'b' /ab.c*/I Capturing subpattern count = 0 -Partial matching not supported No options First char = 'a' Need char = 'b' /a.c*/I Capturing subpattern count = 0 -Partial matching not supported No options First char = 'a' No need char /.c*/I Capturing subpattern count = 0 -Partial matching not supported No options No first char No need char /ac*/I Capturing subpattern count = 0 -Partial matching not supported No options First char = 'a' No need char /(a.c*|b.c*)/I Capturing subpattern count = 1 -Partial matching not supported No options No first char No need char /a.c*|aba/I Capturing subpattern count = 0 -Partial matching not supported No options First char = 'a' No need char /.+a/I Capturing subpattern count = 0 -Partial matching not supported No options No first char Need char = 'a' /(?=abcda)a.*/I Capturing subpattern count = 0 -Partial matching not supported No options First char = 'a' Need char = 'a' /(?=a)a.*/I Capturing subpattern count = 0 -Partial matching not supported No options First char = 'a' No need char @@ -1565,14 +1541,12 @@ No need char /a\d*/I Capturing subpattern count = 0 -Partial matching not supported No options First char = 'a' No need char /ab\d*/I Capturing subpattern count = 0 -Partial matching not supported No options First char = 'a' Need char = 'b' @@ -1591,7 +1565,6 @@ Need char = 'd' /ab\d+/I Capturing subpattern count = 0 -Partial matching not supported No options First char = 'a' Need char = 'b' @@ -1666,7 +1639,7 @@ No need char \Nabc No match -/a*(b+)(z)(z)/IP +/a*(b+)(z)(z)/P aaaabbbbzzzz 0: aaaabbbbzz 1: bbbb @@ -1698,7 +1671,8 @@ Capturing subpattern count = 0 Options: anchored No first char Need char = 'd' -Study returned NULL +Subject length lower bound = 4 +No set of starting bytes /\( # ( at start (?: # Non-capturing bracket @@ -1709,7 +1683,6 @@ Study returned NULL \) # Closing ) /Ix Capturing subpattern count = 0 -Partial matching not supported Options: extended First char = '(' Need char = ')' @@ -1738,7 +1711,6 @@ No match /\( ( (?>[^()]+) | (?R) )* \) /Ixg Capturing subpattern count = 1 -Partial matching not supported Options: extended First char = '(' Need char = ')' @@ -1753,7 +1725,6 @@ Need char = ')' /\( (?: (?>[^()]+) | (?R) ) \) /Ix Capturing subpattern count = 0 -Partial matching not supported Options: extended First char = '(' Need char = ')' @@ -1772,7 +1743,6 @@ No match /\( (?: (?>[^()]+) | (?R) )? \) /Ix Capturing subpattern count = 0 -Partial matching not supported Options: extended First char = '(' Need char = ')' @@ -1783,7 +1753,6 @@ Need char = ')' /\( ( (?>[^()]+) | (?R) )* \) /Ix Capturing subpattern count = 1 -Partial matching not supported Options: extended First char = '(' Need char = ')' @@ -1793,7 +1762,6 @@ Need char = ')' /\( ( ( (?>[^()]+) | (?R) )* ) \) /Ix Capturing subpattern count = 2 -Partial matching not supported Options: extended First char = '(' Need char = ')' @@ -1804,7 +1772,6 @@ Need char = ')' /\( (123)? ( ( (?>[^()]+) | (?R) )* ) \) /Ix Capturing subpattern count = 3 -Partial matching not supported Options: extended First char = '(' Need char = ')' @@ -1821,7 +1788,6 @@ Need char = ')' /\( ( (123)? ( (?>[^()]+) | (?R) )* ) \) /Ix Capturing subpattern count = 3 -Partial matching not supported Options: extended First char = '(' Need char = ')' @@ -1838,7 +1804,6 @@ Need char = ')' /\( (((((((((( ( (?>[^()]+) | (?R) )* )))))))))) \) /Ix Capturing subpattern count = 11 -Partial matching not supported Options: extended First char = '(' Need char = ')' @@ -1858,7 +1823,6 @@ Need char = ')' /\( ( ( (?>[^()<>]+) | ((?>[^()]+)) | (?R) )* ) \) /Ix Capturing subpattern count = 3 -Partial matching not supported Options: extended First char = '(' Need char = ')' @@ -1866,11 +1830,9 @@ Need char = ')' 0: (abcd(xyz

qrs)123) 1: abcd(xyz

qrs)123 2: 123 - 3: /\( ( ( (?>[^()]+) | ((?R)) )* ) \) /Ix Capturing subpattern count = 3 -Partial matching not supported Options: extended First char = '(' Need char = ')' @@ -1942,6 +1904,7 @@ Capturing subpattern count = 0 No options No first char No need char +Subject length lower bound = 1 Starting byte set: 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 @@ -2003,6 +1966,7 @@ Contains explicit CR or LF match No options No first char No need char +Subject length lower bound = 1 Starting byte set: \x09 \x0a \x0b \x0c \x0d \x20 /^[[:cntrl:]]/DZ @@ -2249,7 +2213,6 @@ 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)/I Capturing subpattern count = 271 Max back reference = 270 -Partial matching not supported No options No first char No need char @@ -2930,7 +2893,6 @@ Need char = 'c' End ------------------------------------------------------------------ Capturing subpattern count = 0 -Partial matching not supported No options No first char No need char @@ -2959,7 +2921,6 @@ No need char End ------------------------------------------------------------------ Capturing subpattern count = 0 -Partial matching not supported No options First char = 'x' No need char @@ -2975,7 +2936,6 @@ No need char End ------------------------------------------------------------------ Capturing subpattern count = 0 -Partial matching not supported No options First char = 'x' No need char @@ -2999,7 +2959,6 @@ No need char /^(\w++|\s++)*$/I Capturing subpattern count = 1 -Partial matching not supported Options: anchored No first char No need char @@ -3013,7 +2972,6 @@ No match /(\d++)(\w)/I Capturing subpattern count = 2 -Partial matching not supported No options No first char No need char @@ -3028,7 +2986,6 @@ No match /a++b/I Capturing subpattern count = 0 -Partial matching not supported No options First char = 'a' Need char = 'b' @@ -3037,7 +2994,6 @@ Need char = 'b' /(a++b)/I Capturing subpattern count = 1 -Partial matching not supported No options First char = 'a' Need char = 'b' @@ -3047,7 +3003,6 @@ Need char = 'b' /(a++)b/I Capturing subpattern count = 1 -Partial matching not supported No options First char = 'a' Need char = 'b' @@ -3057,7 +3012,6 @@ Need char = 'b' /([^()]++|\([^()]*\))+/I Capturing subpattern count = 1 -Partial matching not supported No options No first char No need char @@ -3067,7 +3021,6 @@ No need char /\(([^()]++|\([^()]+\))+\)/I Capturing subpattern count = 1 -Partial matching not supported No options First char = '(' Need char = ')' @@ -3130,7 +3083,6 @@ Failed: nothing to repeat at offset 7 End ------------------------------------------------------------------ Capturing subpattern count = 0 -Partial matching not supported No options First char = 'x' Need char = 'b' @@ -3147,7 +3099,6 @@ Need char = 'b' End ------------------------------------------------------------------ Capturing subpattern count = 0 -Partial matching not supported Options: ungreedy First char = 'x' Need char = 'b' @@ -3176,7 +3127,6 @@ Need char = 'b' End ------------------------------------------------------------------ Capturing subpattern count = 5 -Partial matching not supported Options: anchored No first char No need char @@ -3192,7 +3142,6 @@ No need char End ------------------------------------------------------------------ Capturing subpattern count = 0 -Partial matching not supported Options: anchored No first char Need char = 'b' @@ -3210,7 +3159,6 @@ Need char = 'b' End ------------------------------------------------------------------ Capturing subpattern count = 1 -Partial matching not supported Options: anchored No first char Need char = 'b' @@ -3286,7 +3234,6 @@ No need char /< (?: (?(R) \d++ | [^<>]*+) | (?R)) * >/Ix Capturing subpattern count = 0 -Partial matching not supported Options: extended First char = '<' Need char = '>' @@ -3336,14 +3283,12 @@ 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 newline No need char @@ -3351,14 +3296,12 @@ 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 @@ -3366,7 +3309,6 @@ 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 newline Need char = 'z' @@ -3374,7 +3316,6 @@ 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 @@ -3391,7 +3332,6 @@ Need char = 'b' /(?=a).*/I Capturing subpattern count = 0 -Partial matching not supported No options First char = 'a' No need char @@ -3497,6 +3437,7 @@ Capturing subpattern count = 0 No options No first char No need char +Subject length lower bound = 1 Starting byte set: a b /[^a]/I @@ -3516,6 +3457,7 @@ Capturing subpattern count = 0 No options No first char Need char = '6' +Subject length lower bound = 4 Starting byte set: 0 1 2 3 4 5 6 7 8 9 /a^b/I @@ -3549,6 +3491,7 @@ Capturing subpattern count = 0 Options: caseless No first char No need char +Subject length lower bound = 1 Starting byte set: A B a b /[ab](?i)cd/IS @@ -3556,6 +3499,7 @@ Capturing subpattern count = 0 No options No first char Need char = 'd' (caseless) +Subject length lower bound = 3 Starting byte set: a b /abc(?C)def/I @@ -3713,7 +3657,6 @@ No need char /(\d{3}(?C))*/I Capturing subpattern count = 1 -Partial matching not supported No options No first char No need char @@ -3842,7 +3785,6 @@ Callout 0: last capture = 1 /a(b+)(c*)(?C1)/I Capturing subpattern count = 2 -Partial matching not supported No options First char = 'a' Need char = 'b' @@ -3868,7 +3810,6 @@ No match /a(b+?)(c*?)(?C1)/I Capturing subpattern count = 2 -Partial matching not supported No options First char = 'a' Need char = 'b' @@ -3909,6 +3850,7 @@ Capturing subpattern count = 0 No options No first char No need char +Subject length lower bound = 1 Starting byte set: a b /(?R)/I @@ -4028,43 +3970,8 @@ No options First char = 'a' Need char = 'b' -/^\W*(?:((.)\W*(?1)\W*\2|)|((.)\W*(?3)\W*\4|\W*.\W*))\W*$/Ii -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: - 2: - 3: Satan, oscillate my metallic sonatas - 4: S - A man, a plan, a canal: Panama! - 0: A man, a plan, a canal: Panama! - 1: - 2: - 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: - 2: - 3: Able was I ere I saw Elba - 4: A - *** Failers -No match - The quick brown fox -No match - /^(\d+|\((?1)([+*-])(?1)\)|-(?1))$/I Capturing subpattern count = 2 -Partial matching not supported Options: anchored No first char No need char @@ -4105,7 +4012,6 @@ No match /((< (?: (?(R) \d++ | [^<>]*+) | (?2)) * >))/Ix Capturing subpattern count = 2 -Partial matching not supported Options: extended First char = '<' Need char = '>' @@ -4279,7 +4185,6 @@ Named capturing subpatterns: one 1 three 3 two 2 -Partial matching not supported Options: anchored caseless No first char No need char @@ -4325,7 +4230,6 @@ No need char /(.*)a/Is Capturing subpattern count = 1 -Partial matching not supported Options: anchored dotall No first char Need char = 'a' @@ -4333,7 +4237,6 @@ Need char = 'a' /(.*)a\1/Is Capturing subpattern count = 1 Max back reference = 1 -Partial matching not supported Options: dotall No first char Need char = 'a' @@ -4341,14 +4244,12 @@ Need char = 'a' /(.*)a(b)\2/Is Capturing subpattern count = 2 Max back reference = 2 -Partial matching not supported Options: anchored dotall No first char Need char = 'b' /((.*)a|(.*)b)z/Is Capturing subpattern count = 3 -Partial matching not supported Options: anchored dotall No first char Need char = 'z' @@ -4356,7 +4257,6 @@ Need char = 'z' /((.*)a|(.*)b)z\1/Is Capturing subpattern count = 3 Max back reference = 1 -Partial matching not supported Options: dotall No first char Need char = 'z' @@ -4364,7 +4264,6 @@ Need char = 'z' /((.*)a|(.*)b)z\2/Is Capturing subpattern count = 3 Max back reference = 2 -Partial matching not supported Options: dotall No first char Need char = 'z' @@ -4372,7 +4271,6 @@ Need char = 'z' /((.*)a|(.*)b)z\3/Is Capturing subpattern count = 3 Max back reference = 3 -Partial matching not supported Options: dotall No first char Need char = 'z' @@ -4380,14 +4278,12 @@ Need char = 'z' /((.*)a|^(.*)b)z\3/Is Capturing subpattern count = 3 Max back reference = 3 -Partial matching not supported Options: anchored dotall No first char Need char = 'z' /(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)a/Is Capturing subpattern count = 31 -Partial matching not supported Options: anchored dotall No first char No need char @@ -4395,7 +4291,6 @@ No need char /(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)a\31/Is Capturing subpattern count = 31 Max back reference = 31 -Partial matching not supported Options: dotall No first char No need char @@ -4403,7 +4298,6 @@ No need char /(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)a\32/Is Capturing subpattern count = 32 Max back reference = 32 -Partial matching not supported Options: dotall No first char No need char @@ -4470,7 +4364,6 @@ Need char = 'c' /(a+)*zz/I Capturing subpattern count = 1 -Partial matching not supported No options No first char Need char = 'z' @@ -4607,7 +4500,6 @@ Failed: two named subpatterns have the same name at offset 30 Capturing subpattern count = 3 Named capturing subpatterns: elem 2 -Partial matching not supported No options First char = '[' Need char = ']' @@ -4625,7 +4517,6 @@ No match Capturing subpattern count = 3 Named capturing subpatterns: elem 2 -Partial matching not supported No options First char = '[' Need char = ']' @@ -4732,7 +4623,6 @@ No need char /((w\/|-|with)*(free|immediate)*.*?shipping\s*[!.-]*)/Ii Capturing subpattern count = 3 -Partial matching not supported Options: caseless No first char Need char = 'g' (caseless) @@ -4742,11 +4632,11 @@ Need char = 'g' (caseless) /((w\/|-|with)*(free|immediate)*.*?shipping\s*[!.-]*)/IiS Capturing subpattern count = 3 -Partial matching not supported Options: caseless No first char Need char = 'g' (caseless) -Study returned NULL +Subject length lower bound = 8 +No set of starting bytes Baby Bjorn Active Carrier - With free SHIPPING!! 0: Baby Bjorn Active Carrier - With free SHIPPING!! 1: Baby Bjorn Active Carrier - With free SHIPPING!! @@ -4761,11 +4651,11 @@ Study returned NULL End ------------------------------------------------------------------ Capturing subpattern count = 0 -Partial matching not supported No options No first char Need char = 'b' -Study returned NULL +Subject length lower bound = 1 +No set of starting bytes /(a|b)*.?c/ISDZ ------------------------------------------------------------------ @@ -4785,7 +4675,8 @@ Capturing subpattern count = 1 No options No first char Need char = 'c' -Study returned NULL +Subject length lower bound = 1 +No set of starting bytes /abc(?C255)de(?C)f/DZ ------------------------------------------------------------------ @@ -4854,7 +4745,6 @@ No match End ------------------------------------------------------------------ Capturing subpattern count = 0 -Partial matching not supported Options: No first char Need char = 'b' @@ -4899,7 +4789,6 @@ Need char = 'b' End ------------------------------------------------------------------ Capturing subpattern count = 0 -Partial matching not supported Options: First char = 'a' Need char = 'b' @@ -5337,7 +5226,6 @@ No match End ------------------------------------------------------------------ Capturing subpattern count = 1 -Partial matching not supported Options: No first char Need char = '3' @@ -5369,7 +5257,6 @@ Need char = '3' /\b.*/I Capturing subpattern count = 0 -Partial matching not supported No options No first char No need char @@ -5378,7 +5265,6 @@ No need char /\b.*/Is Capturing subpattern count = 0 -Partial matching not supported Options: dotall No first char No need char @@ -5387,7 +5273,6 @@ No need char /(?!.bcd).*/I Capturing subpattern count = 0 -Partial matching not supported No options No first char No need char @@ -5400,15 +5285,15 @@ No options First char = 'a' Need char = 'e' ab\P -Partial match +Partial match: ab abc\P -Partial match +Partial match: abc abcd\P -Partial match +Partial match: abcd abcde\P 0: abcde the quick brown abc\P -Partial match +Partial match: abc ** Failers\P No match the quick brown abxyz fox\P @@ -5433,23 +5318,23 @@ Need char = '/' 1: 02 2: 05 1\P -Partial match +Partial match: 1 1/2\P -Partial match +Partial match: 1/2 1/2/0\P -Partial match +Partial match: 1/2/0 1/2/04\P 0: 1/2/04 1: 1 2: 2 0\P -Partial match +Partial match: 0 02/\P -Partial match +Partial match: 02/ 02/0\P -Partial match +Partial match: 02/0 02/1\P -Partial match +Partial match: 02/1 ** Failers\P No match \P @@ -5471,28 +5356,24 @@ 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' @@ -5505,13 +5386,13 @@ Need char = '3' 123\P 0: 123 a\P -Partial match +Partial match: a b\P -Partial match +Partial match: b c\P -Partial match +Partial match: c c12\P -Partial match +Partial match: c12 c123\P 0: c123 @@ -5521,17 +5402,17 @@ Options: anchored No first char Need char = 'X' 1\P -Partial match +Partial match: 1 123\P -Partial match +Partial match: 123 123X 0: 123X 1234\P -Partial match +Partial match: 1234 1234X 0: 1234X 12345\P -Partial match +Partial match: 12345 12345X 0: 12345X *** Failers @@ -5578,6 +5459,7 @@ Capturing subpattern count = 1 No options No first char No need char +Subject length lower bound = 1 Starting byte set: a b Compiled regex written to testsavedregex Study data written to testsavedregex @@ -5598,6 +5480,7 @@ Capturing subpattern count = 1 No options No first char No need char +Subject length lower bound = 1 Starting byte set: a b Compiled regex written to testsavedregex Study data written to testsavedregex @@ -5616,7 +5499,6 @@ No match ~<(\w+)/?>(.)*~smgI Capturing subpattern count = 3 Max back reference = 1 -Partial matching not supported Options: multiline dotall First char = '<' Need char = '>' @@ -5669,7 +5551,7 @@ No match line one\nthis is a line\nbreak in the second line No match -/ab.cd/IP +/ab.cd/P ab-cd 0: ab-cd ab=cd @@ -5679,7 +5561,7 @@ No match: POSIX code 17: match failed ab\ncd No match: POSIX code 17: match failed -/ab.cd/IPs +/ab.cd/Ps ab-cd 0: ab-cd ab=cd @@ -5923,7 +5805,6 @@ Matched, but too many substrings /[^()]*(?:\((?R)\)[^()]*)*/I Capturing subpattern count = 0 -Partial matching not supported No options No first char No need char @@ -5936,7 +5817,6 @@ No need char /[^()]*(?:\((?>(?R))\)[^()]*)*/I Capturing subpattern count = 0 -Partial matching not supported No options No first char No need char @@ -5947,7 +5827,6 @@ No need char /[^()]*(?:\((?R)\))*[^()]*/I Capturing subpattern count = 0 -Partial matching not supported No options No first char No need char @@ -5958,7 +5837,6 @@ No need char /(?:\((?R)\))*[^()]*/I Capturing subpattern count = 0 -Partial matching not supported No options No first char No need char @@ -5971,7 +5849,6 @@ No need char /(?:\((?R)\))|[^()]*/I Capturing subpattern count = 0 -Partial matching not supported No options No first char No need char @@ -5984,11 +5861,11 @@ No need char ((this)) 0: ((this)) -/a(b)c/IPN +/a(b)c/PN abc Matched with REG_NOSUB -/a(?Pb)c/IPN +/a(?Pb)c/PN abc Matched with REG_NOSUB @@ -6313,10 +6190,10 @@ Failed: octal value is greater than \377 (not in UTF-8 mode) at offset 3 /\s*,\s*/IS Capturing subpattern count = 0 -Partial matching not supported No options No first char Need char = ',' +Subject length lower bound = 1 Starting byte set: \x09 \x0a \x0c \x0d \x20 , \x0b,\x0b 0: , @@ -6443,7 +6320,6 @@ Unknown newline type at: /.*/I Capturing subpattern count = 0 -Partial matching not supported Options: Forced newline sequence: LF First char at start or follows newline @@ -6469,7 +6345,6 @@ No need char /\w+(.)(.)?def/Is Capturing subpattern count = 2 -Partial matching not supported Options: dotall No first char Need char = 'f' @@ -6486,7 +6361,6 @@ Need char = 'f' +((?:\s|//.*\\n|/[*](?:\\n|.)*?[*]/)*)+I Capturing subpattern count = 1 -Partial matching not supported No options No first char No need char @@ -6621,10 +6495,10 @@ No need char /(a*b|(?i:c*(?-i)d))/IS Capturing subpattern count = 1 -Partial matching not supported No options No first char No need char +Subject length lower bound = 1 Starting byte set: C a b c d /()[ab]xyz/IS @@ -6632,6 +6506,7 @@ Capturing subpattern count = 1 No options No first char Need char = 'z' +Subject length lower bound = 4 Starting byte set: a b /(|)[ab]xyz/IS @@ -6639,6 +6514,7 @@ Capturing subpattern count = 1 No options No first char Need char = 'z' +Subject length lower bound = 4 Starting byte set: a b /(|c)[ab]xyz/IS @@ -6646,6 +6522,7 @@ Capturing subpattern count = 1 No options No first char Need char = 'z' +Subject length lower bound = 4 Starting byte set: a b c /(|c?)[ab]xyz/IS @@ -6653,6 +6530,7 @@ Capturing subpattern count = 1 No options No first char Need char = 'z' +Subject length lower bound = 4 Starting byte set: a b c /(d?|c?)[ab]xyz/IS @@ -6660,6 +6538,7 @@ Capturing subpattern count = 1 No options No first char Need char = 'z' +Subject length lower bound = 4 Starting byte set: a b c d /(d?|c)[ab]xyz/IS @@ -6667,6 +6546,7 @@ Capturing subpattern count = 1 No options No first char Need char = 'z' +Subject length lower bound = 4 Starting byte set: a b c d /^a*b\d/DZ @@ -6680,7 +6560,6 @@ Starting byte set: a b c d End ------------------------------------------------------------------ Capturing subpattern count = 0 -Partial matching not supported Options: anchored No first char Need char = 'b' @@ -6696,7 +6575,6 @@ Need char = 'b' End ------------------------------------------------------------------ Capturing subpattern count = 0 -Partial matching not supported Options: anchored No first char Need char = 'b' @@ -6712,7 +6590,6 @@ Need char = 'b' End ------------------------------------------------------------------ Capturing subpattern count = 0 -Partial matching not supported Options: anchored No first char Need char = 'b' @@ -6728,7 +6605,6 @@ Need char = 'b' End ------------------------------------------------------------------ Capturing subpattern count = 0 -Partial matching not supported Options: anchored No first char Need char = 'A' @@ -6750,7 +6626,6 @@ No match End ------------------------------------------------------------------ Capturing subpattern count = 0 -Partial matching not supported Options: anchored caseless No first char Need char = 'A' (caseless) @@ -6761,34 +6636,34 @@ Need char = 'A' (caseless) /(a*|b*)[cd]/IS Capturing subpattern count = 1 -Partial matching not supported No options No first char No need char +Subject length lower bound = 1 Starting byte set: a b c d /(a+|b*)[cd]/IS Capturing subpattern count = 1 -Partial matching not supported No options No first char No need char +Subject length lower bound = 1 Starting byte set: a b c d /(a*|b+)[cd]/IS Capturing subpattern count = 1 -Partial matching not supported No options No first char No need char +Subject length lower bound = 1 Starting byte set: a b c d /(a+|b+)[cd]/IS Capturing subpattern count = 1 -Partial matching not supported No options No first char No need char +Subject length lower bound = 2 Starting byte set: a b /(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( @@ -7594,7 +7469,7 @@ No match ^ CBra 1 Cond - 2 Cond ref + 2 Cond nref y Ket [()] @@ -7660,7 +7535,6 @@ Named capturing subpatterns: one 1 three 3 two 2 -Partial matching not supported Options: anchored caseless No first char No need char @@ -7694,7 +7568,6 @@ No match /(?=(\w+))\1:/I Capturing subpattern count = 1 Max back reference = 1 -Partial matching not supported No options No first char Need char = ':' @@ -7707,7 +7580,6 @@ Capturing subpattern count = 1 Max back reference = 1 Named capturing subpatterns: abc 1 -Partial matching not supported No options No first char Need char = ':' @@ -7715,20 +7587,6 @@ Need char = ':' 0: abcd: 1: abcd -/(?'abc'\w+):\k{2}/ - a:aaxyz - 0: a:aa - 1: a - ab:ababxyz - 0: ab:abab - 1: ab - ** Failers -No match - a:axyz -No match - ab:abxyz -No match - /(?'abc'a|b)(?d|e)\k{2}/J adaa 0: adaa @@ -7755,13 +7613,6 @@ No match bddd No match -/^(?a)? (?()b|c) (?('ab')d|e)/x - abd - 0: abd - 1: a - ce - 0: ce - /(?( a) (? b) ) (?&A) (?&B) /x - abcd - 0: ab - 1: - 2: - -/(?(?&NAME_PAT))\s+(?(?&ADDRESS_PAT)) - (?(DEFINE) - (?[a-z]+) - (?\d+) - )/x - metcalfe 33 - 0: metcalfe 33 - 1: metcalfe - 2: 33 - 3: - 4: - /^(?(DEFINE) abc | xyz ) /x Failed: DEFINE group contains more than one branch at offset 22 @@ -7987,46 +7820,6 @@ Need char = 'P' 0: PXP 1: P -/(?(DEFINE)(?2[0-4]\d|25[0-5]|1\d\d|[1-9]?\d))\b(?&byte)(\.(?&byte)){3}/ - 1.2.3.4 - 0: 1.2.3.4 - 1: - 2: .4 - 131.111.10.206 - 0: 131.111.10.206 - 1: - 2: .206 - 10.0.0.0 - 0: 10.0.0.0 - 1: - 2: .0 - ** Failers -No match - 10.6 -No match - 455.3.4.5 -No match - -/\b(?&byte)(\.(?&byte)){3}(?(DEFINE)(?2[0-4]\d|25[0-5]|1\d\d|[1-9]?\d))/ - 1.2.3.4 - 0: 1.2.3.4 - 1: .4 - 2: - 131.111.10.206 - 0: 131.111.10.206 - 1: .206 - 2: - 10.0.0.0 - 0: 10.0.0.0 - 1: .0 - 2: - ** Failers -No match - 10.6 -No match - 455.3.4.5 -No match - /(?:a(?&abc)b)*(?x)/ 123axbaxbaxbx456 0: axbaxbaxbx @@ -8064,12 +7857,6 @@ No match DEFabcABCXYZ No match -/^(a(b))\1\g1\g{1}\g-1\g{-1}\g{-02}Z/ - ababababbbabZXXXX - 0: ababababbbabZ - 1: ab - 2: b - /^(a)\g-2/ Failed: reference to non-existent subpattern at offset 7 @@ -8325,26 +8112,6 @@ Failed: reference to non-existent subpattern at offset 7 0: Y! 1: ! -/(foo)\Kbar/ - foobar - 0: bar - 1: foo - -/(foo)(\Kbar|baz)/ - foobar - 0: bar - 1: foo - 2: bar - foobaz - 0: foobaz - 1: foo - 2: baz - -/(foo\Kbar)baz/ - foobarbaz - 0: barbaz - 1: foobar - /(?tom|bon)-\k{A}/ tom-tom 0: tom-tom @@ -8357,14 +8124,6 @@ No match tom-bon No match -/(?tom|bon)-\g{A}/ - tom-tom - 0: tom-tom - 1: tom - bon-bon - 0: bon-bon - 1: bon - /\g{A/ Failed: syntax error in subpattern name (missing terminator) at offset 4 @@ -8459,82 +8218,6 @@ Failed: syntax error in subpattern name (missing terminator) at offset 4 3: 4: x -/(?|(abc)|(xyz))\1/ - abcabc - 0: abcabc - 1: abc - xyzxyz - 0: xyzxyz - 1: xyz - ** Failers -No match - abcxyz -No match - xyzabc -No match - -/(?|(abc)|(xyz))(?1)/ - abcabc - 0: abcabc - 1: abc - xyzabc - 0: xyzabc - 1: xyz - ** Failers -No match - xyzxyz -No match - -/\H\h\V\v/ - X X\x0a - 0: X X\x0a - X\x09X\x0b - 0: X\x09X\x0b - ** Failers -No match - \xa0 X\x0a -No match - -/\H*\h+\V?\v{3,4}/ - \x09\x20\xa0X\x0a\x0b\x0c\x0d\x0a - 0: \x09 \xa0X\x0a\x0b\x0c\x0d - \x09\x20\xa0\x0a\x0b\x0c\x0d\x0a - 0: \x09 \xa0\x0a\x0b\x0c\x0d - \x09\x20\xa0\x0a\x0b\x0c - 0: \x09 \xa0\x0a\x0b\x0c - ** Failers -No match - \x09\x20\xa0\x0a\x0b -No match - -/\H{3,4}/ - XY ABCDE - 0: ABCD - XY PQR ST - 0: PQR - -/.\h{3,4}./ - XY AB PQRS - 0: B P - -/\h*X\h?\H+Y\H?Z/ - >XNNNYZ - 0: XNNNYZ - > X NYQZ - 0: X NYQZ - ** Failers -No match - >XYZ -No match - > X NY Z -No match - -/\v*X\v?Y\v+Z\V*\x0a\V+\x0b\V{2,3}\x0c/ - >XY\x0aZ\x0aA\x0bNN\x0c - 0: XY\x0aZ\x0aA\x0bNN\x0c - >\x0a\x0dX\x0aY\x0a\x0bZZZ\x0aAAA\x0bNNN\x0c - 0: \x0a\x0dX\x0aY\x0a\x0bZZZ\x0aAAA\x0bNNN\x0c - /[\h]/BZ ------------------------------------------------------------------ Bra @@ -8831,87 +8514,6 @@ Failed: missing terminating ] for character class at offset 10 End ------------------------------------------------------------------ -/^a+(*FAIL)/ - aaaaaa -No match - -/a+b?c+(*FAIL)/ - aaabccc -No match - -/a+b?(*PRUNE)c+(*FAIL)/ - aaabccc -No match - -/a+b?(*COMMIT)c+(*FAIL)/ - aaabccc -No match - -/a+b?(*SKIP)c+(*FAIL)/ - aaabcccaaabccc -No match - -/^(?:aaa(*THEN)\w{6}|bbb(*THEN)\w{5}|ccc(*THEN)\w{4}|\w{3})/ - aaaxxxxxx - 0: aaaxxxxxx - aaa++++++ - 0: aaa - bbbxxxxx - 0: bbbxxxxx - bbb+++++ - 0: bbb - cccxxxx - 0: cccxxxx - ccc++++ - 0: ccc - dddddddd - 0: ddd - -/^(aaa(*THEN)\w{6}|bbb(*THEN)\w{5}|ccc(*THEN)\w{4}|\w{3})/ - aaaxxxxxx - 0: aaaxxxxxx - 1: aaaxxxxxx - aaa++++++ - 0: aaa - 1: aaa - bbbxxxxx - 0: bbbxxxxx - 1: bbbxxxxx - bbb+++++ - 0: bbb - 1: bbb - cccxxxx - 0: cccxxxx - 1: cccxxxx - ccc++++ - 0: ccc - 1: ccc - dddddddd - 0: ddd - 1: ddd - -/a+b?(*THEN)c+(*FAIL)/ - aaabccc -No match - -/(A (A|B(*ACCEPT)|C) D)(E)/x - ABX - 0: AB - AADE - 0: AADE - 1: AAD - 2: A - 3: E - ACDE - 0: ACDE - 1: ACD - 2: C - 3: E - ** Failers -No match - AD -No match - /^a+(*FAIL)/C aaaaaa --->aaaaaa @@ -9216,7 +8818,6 @@ No match /a\R{2,4}b/I Capturing subpattern count = 0 -Partial matching not supported Options: bsr_anycrlf First char = 'a' Need char = 'b' @@ -9235,7 +8836,6 @@ No match /a\R{2,4}b/I Capturing subpattern count = 0 -Partial matching not supported Options: bsr_unicode First char = 'a' Need char = 'b' @@ -9385,171 +8985,42 @@ Failed: unknown POSIX class name at offset 6 /[[:a\dz:]]/ Failed: unknown POSIX class name at offset 3 -/^(?a|b\gc)/ - aaaa - 0: a - 1: a - bacxxx - 0: bac - 1: bac - bbaccxxx - 0: bbacc - 1: bbacc - bbbacccxx - 0: bbbaccc - 1: bbbaccc - -/^(?a|b\g'name'c)/ - aaaa - 0: a - 1: a - bacxxx - 0: bac - 1: bac - bbaccxxx - 0: bbacc - 1: bbacc - bbbacccxx - 0: bbbaccc - 1: bbbaccc +/(^(a|b\g<-1'c))/ +Failed: \g is not followed by a braced, angle-bracketed, or quoted name/number or by a plain number at offset 15 -/^(a|b\g<1>c)/ - aaaa - 0: a - 1: a - bacxxx - 0: bac - 1: bac - bbaccxxx - 0: bbacc - 1: bbacc - bbbacccxx - 0: bbbaccc - 1: bbbaccc +/^(?+1)(?x|y){0}z/ + xzxx + 0: xz + yzyy + 0: yz + ** Failers +No match + xxz +No match -/^(a|b\g'1'c)/ - aaaa - 0: a - 1: a - bacxxx - 0: bac - 1: bac - bbaccxxx - 0: bbacc - 1: bbacc - bbbacccxx - 0: bbbaccc - 1: bbbaccc +/(\3)(\1)(a)/ + cat +No match -/^(a|b\g'-1'c)/ - aaaa +/(\3)(\1)(a)/ + cat 0: a - 1: a - bacxxx - 0: bac - 1: bac - bbaccxxx - 0: bbacc - 1: bbacc - bbbacccxx - 0: bbbaccc - 1: bbbaccc + 1: + 2: + 3: a + +/TA]/ + The ACTA] comes + 0: TA] -/(^(a|b\g<-1>c))/ - aaaa - 0: a - 1: a - 2: a - bacxxx - 0: bac - 1: bac - 2: bac - bbaccxxx - 0: bbacc - 1: bbacc - 2: bbacc - bbbacccxx - 0: bbbaccc - 1: bbbaccc - 2: bbbaccc +/TA]/ +Failed: ] is an invalid data character in JavaScript compatibility mode at offset 2 -/(^(a|b\g<-1'c))/ -Failed: \g is not followed by a braced, angle-bracketed, or quoted name/number or by a plain number at offset 15 +/(?2)[]a()b](abc)/ +Failed: reference to non-existent subpattern at offset 3 -/(^(a|b\g{-1}))/ - bacxxx -No match - -/(?-i:\g)(?i:(?a))/ - XaaX - 0: aa - 1: a - XAAX - 0: AA - 1: A - -/(?i:\g)(?-i:(?a))/ - XaaX - 0: aa - 1: a - ** Failers -No match - XAAX -No match - -/(?-i:\g<+1>)(?i:(a))/ - XaaX - 0: aa - 1: a - XAAX - 0: AA - 1: A - -/(?=(?(?#simplesyntax)\$(?[a-zA-Z_\x{7f}-\x{ff}][a-zA-Z0-9_\x{7f}-\x{ff}]*)(?:\[(?[a-zA-Z0-9_\x{7f}-\x{ff}]+|\$\g)\]|->\g(\(.*?\))?)?|(?#simple syntax withbraces)\$\{(?:\g(?\[(?:\g|'(?:\\.|[^'\\])*'|"(?:\g|\\.|[^"\\])*")\])?|\g|\$\{\g\})\}|(?#complexsyntax)\{(?\$(?\g(\g*|\(.*?\))?)(?:->\g)*|\$\g|\$\{\g\})\}))\{/ - -/(?a|b|c)\g*/ - abc - 0: abc - 1: a - accccbbb - 0: accccbbb - 1: a - -/^(?+1)(?x|y){0}z/ - xzxx - 0: xz - 1: - yzyy - 0: yz - 1: - ** Failers -No match - xxz -No match - -/(\3)(\1)(a)/ - cat -No match - -/(\3)(\1)(a)/ - cat - 0: a - 1: - 2: - 3: a - -/TA]/ - The ACTA] comes - 0: TA] - -/TA]/ -Failed: ] is an invalid data character in JavaScript compatibility mode at offset 2 - -/(?2)[]a()b](abc)/ -Failed: reference to non-existent subpattern at offset 3 - -/(?2)[^]a()b](abc)/ -Failed: reference to non-existent subpattern at offset 3 +/(?2)[^]a()b](abc)/ +Failed: reference to non-existent subpattern at offset 3 /(?1)[]a()b](abc)/ abcbabc @@ -9636,11 +9107,11 @@ Capturing subpattern count = 1 No options No first char No need char +Subject length lower bound = 1 Starting byte set: x y z /(?(?=.*b)b|^)/CI Capturing subpattern count = 0 -Partial matching not supported Options: No first char No need char @@ -9680,14 +9151,12 @@ No need char /(?(?=b).*b|^d)/I Capturing subpattern count = 0 -Partial matching not supported No options No first char No need char /(?(?=.*b).*b|^d)/I Capturing subpattern count = 0 -Partial matching not supported No options First char at start or follows newline No need char @@ -9786,15 +9255,6 @@ No match 0: "ab" 1: -/^X(?5)(a)(?|(b)|(q))(c)(d)(Y)/ - XYabcdY - 0: XYabcdY - 1: a - 2: b - 3: c - 4: d - 5: Y - /^X(?5)(a)(?|(b)|(q))(c)(d)Y/ Failed: reference to non-existent subpattern at offset 5 @@ -9807,37 +9267,1200 @@ Failed: reference to non-existent subpattern at offset 5 4: d 5: Y -/^X(?7)(a)(?|(b)|(q)(r)(s))(c)(d)(Y)/ - XYabcdY - 0: XYabcdY +/Xa{2,4}b/ + X\P +Partial match: X + Xa\P +Partial match: Xa + Xaa\P +Partial match: Xaa + Xaaa\P +Partial match: Xaaa + Xaaaa\P +Partial match: Xaaaa + +/Xa{2,4}?b/ + X\P +Partial match: X + Xa\P +Partial match: Xa + Xaa\P +Partial match: Xaa + Xaaa\P +Partial match: Xaaa + Xaaaa\P +Partial match: Xaaaa + +/Xa{2,4}+b/ + X\P +Partial match: X + Xa\P +Partial match: Xa + Xaa\P +Partial match: Xaa + Xaaa\P +Partial match: Xaaa + Xaaaa\P +Partial match: Xaaaa + +/X\d{2,4}b/ + X\P +Partial match: X + X3\P +Partial match: X3 + X33\P +Partial match: X33 + X333\P +Partial match: X333 + X3333\P +Partial match: X3333 + +/X\d{2,4}?b/ + X\P +Partial match: X + X3\P +Partial match: X3 + X33\P +Partial match: X33 + X333\P +Partial match: X333 + X3333\P +Partial match: X3333 + +/X\d{2,4}+b/ + X\P +Partial match: X + X3\P +Partial match: X3 + X33\P +Partial match: X33 + X333\P +Partial match: X333 + X3333\P +Partial match: X3333 + +/X\D{2,4}b/ + X\P +Partial match: X + Xa\P +Partial match: Xa + Xaa\P +Partial match: Xaa + Xaaa\P +Partial match: Xaaa + Xaaaa\P +Partial match: Xaaaa + +/X\D{2,4}?b/ + X\P +Partial match: X + Xa\P +Partial match: Xa + Xaa\P +Partial match: Xaa + Xaaa\P +Partial match: Xaaa + Xaaaa\P +Partial match: Xaaaa + +/X\D{2,4}+b/ + X\P +Partial match: X + Xa\P +Partial match: Xa + Xaa\P +Partial match: Xaa + Xaaa\P +Partial match: Xaaa + Xaaaa\P +Partial match: Xaaaa + +/X[abc]{2,4}b/ + X\P +Partial match: X + Xa\P +Partial match: Xa + Xaa\P +Partial match: Xaa + Xaaa\P +Partial match: Xaaa + Xaaaa\P +Partial match: Xaaaa + +/X[abc]{2,4}?b/ + X\P +Partial match: X + Xa\P +Partial match: Xa + Xaa\P +Partial match: Xaa + Xaaa\P +Partial match: Xaaa + Xaaaa\P +Partial match: Xaaaa + +/X[abc]{2,4}+b/ + X\P +Partial match: X + Xa\P +Partial match: Xa + Xaa\P +Partial match: Xaa + Xaaa\P +Partial match: Xaaa + Xaaaa\P +Partial match: Xaaaa + +/X[^a]{2,4}b/ + X\P +Partial match: X + Xz\P +Partial match: Xz + Xzz\P +Partial match: Xzz + Xzzz\P +Partial match: Xzzz + Xzzzz\P +Partial match: Xzzzz + +/X[^a]{2,4}?b/ + X\P +Partial match: X + Xz\P +Partial match: Xz + Xzz\P +Partial match: Xzz + Xzzz\P +Partial match: Xzzz + Xzzzz\P +Partial match: Xzzzz + +/X[^a]{2,4}+b/ + X\P +Partial match: X + Xz\P +Partial match: Xz + Xzz\P +Partial match: Xzz + Xzzz\P +Partial match: Xzzz + Xzzzz\P +Partial match: Xzzzz + +/(Y)X\1{2,4}b/ + YX\P +Partial match: YX + YXY\P +Partial match: YXY + YXYY\P +Partial match: YXYY + YXYYY\P +Partial match: YXYYY + YXYYYY\P +Partial match: YXYYYY + +/(Y)X\1{2,4}?b/ + YX\P +Partial match: YX + YXY\P +Partial match: YXY + YXYY\P +Partial match: YXYY + YXYYY\P +Partial match: YXYYY + YXYYYY\P +Partial match: YXYYYY + +/(Y)X\1{2,4}+b/ + YX\P +Partial match: YX + YXY\P +Partial match: YXY + YXYY\P +Partial match: YXYY + YXYYY\P +Partial match: YXYYY + YXYYYY\P +Partial match: YXYYYY + +/\++\KZ|\d+X|9+Y/ + ++++123999\P +Partial match: 123999 + ++++123999Y\P + 0: 999Y + ++++Z1234\P + 0: Z + +/Z(*F)/ + Z\P +No match + ZA\P +No match + +/Z(?!)/ + Z\P +No match + ZA\P +No match + +/dog(sbody)?/ + dogs\P + 0: dog + dogs\P\P +Partial match: dogs + +/dog(sbody)??/ + dogs\P + 0: dog + dogs\P\P + 0: dog + +/dog|dogsbody/ + dogs\P + 0: dog + dogs\P\P + 0: dog + +/dogsbody|dog/ + dogs\P + 0: dog + dogs\P\P +Partial match: dogs + +/\bthe cat\b/ + the cat\P + 0: the cat + the cat\P\P +Partial match: the cat + +/abc/ + abc\P + 0: abc + abc\P\P + 0: abc + +/\w+A/P + CDAAAAB + 0: CDAAAA + +/\w+A/PU + CDAAAAB + 0: CDA + +/abc\K123/ + xyzabc123pqr + 0: 123 + xyzabc12\P +Partial match: abc12 + xyzabc12\P\P +Partial match: abc12 + +/(?<=abc)123/ + xyzabc123pqr + 0: 123 + xyzabc12\P +Partial match: abc12 + xyzabc12\P\P +Partial match: abc12 + +/\babc\b/ + +++abc+++ + 0: abc + +++ab\P +Partial match: +ab + +++ab\P\P +Partial match: +ab + +/(?&word)(?&element)(?(DEFINE)(?<[^m][^>]>[^<])(?\w*+))/BZ +------------------------------------------------------------------ + Bra + Once + Recurse + Ket + Once + Recurse + Ket + Cond + Cond def + CBra 1 + < + [^m] + [^>] + > + [^<] + Ket + CBra 2 + \w*+ + Ket + Ket + Ket + End +------------------------------------------------------------------ + +/(?&word)(?&element)(?(DEFINE)(?<[^\d][^>]>[^<])(?\w*+))/BZ +------------------------------------------------------------------ + Bra + Once + Recurse + Ket + Once + Recurse + Ket + Cond + Cond def + CBra 1 + < + [\x00-/:-\xff] (neg) + [^>] + > + [^<] + Ket + CBra 2 + \w*+ + Ket + Ket + Ket + End +------------------------------------------------------------------ + +/(ab)(x(y)z(cd(*ACCEPT)))pq/BZ +------------------------------------------------------------------ + Bra + CBra 1 + ab + Ket + CBra 2 + x + CBra 3 + y + Ket + z + CBra 4 + cd + Close 4 + Close 2 + *ACCEPT + Ket + Ket + pq + Ket + End +------------------------------------------------------------------ + +/abc\K/+ + abcdef + 0: + 0+ def + abcdef\N\N + 0: + 0+ def + xyzabcdef\N\N + 0: + 0+ def + ** Failers +No match + abcdef\N +No match + xyzabcdef\N +No match + +/^(?:(?=abc)|abc\K)/+ + abcdef + 0: + 0+ abcdef + abcdef\N\N + 0: + 0+ def + ** Failers +No match + abcdef\N +No match + +/a?b?/+ + xyz + 0: + 0+ xyz + xyzabc + 0: + 0+ xyzabc + xyzabc\N + 0: ab + 0+ c + xyzabc\N\N + 0: + 0+ yzabc + xyz\N\N + 0: + 0+ yz + ** Failers + 0: + 0+ ** Failers + xyz\N +No match + +/^a?b?/+ + xyz + 0: + 0+ xyz + xyzabc + 0: + 0+ xyzabc + ** Failers + 0: + 0+ ** Failers + xyzabc\N +No match + xyzabc\N\N +No match + xyz\N\N +No match + xyz\N +No match + +/^(?a|b\gc)/ + aaaa + 0: a 1: a - 2: b - 3: - 4: - 5: c - 6: d - 7: Y + bacxxx + 0: bac + 1: bac + bbaccxxx + 0: bbacc + 1: bbacc + bbbacccxx + 0: bbbaccc + 1: bbbaccc -/^X(?7)(a)(?|(b|(r)(s))|(q))(c)(d)(Y)/ - XYabcdY - 0: XYabcdY +/^(?a|b\g'name'c)/ + aaaa + 0: a 1: a - 2: b - 3: - 4: - 5: c - 6: d - 7: Y + bacxxx + 0: bac + 1: bac + bbaccxxx + 0: bbacc + 1: bbacc + bbbacccxx + 0: bbbaccc + 1: bbbaccc -/^X(?7)(a)(?|(b|(?|(r)|(t))(s))|(q))(c)(d)(Y)/ - XYabcdY - 0: XYabcdY +/^(a|b\g<1>c)/ + aaaa + 0: a 1: a - 2: b + bacxxx + 0: bac + 1: bac + bbaccxxx + 0: bbacc + 1: bbacc + bbbacccxx + 0: bbbaccc + 1: bbbaccc + +/^(a|b\g'1'c)/ + aaaa + 0: a + 1: a + bacxxx + 0: bac + 1: bac + bbaccxxx + 0: bbacc + 1: bbacc + bbbacccxx + 0: bbbaccc + 1: bbbaccc + +/^(a|b\g'-1'c)/ + aaaa + 0: a + 1: a + bacxxx + 0: bac + 1: bac + bbaccxxx + 0: bbacc + 1: bbacc + bbbacccxx + 0: bbbaccc + 1: bbbaccc + +/(^(a|b\g<-1>c))/ + aaaa + 0: a + 1: a + 2: a + bacxxx + 0: bac + 1: bac + 2: bac + bbaccxxx + 0: bbacc + 1: bbacc + 2: bbacc + bbbacccxx + 0: bbbaccc + 1: bbbaccc + 2: bbbaccc + +/(?-i:\g)(?i:(?a))/ + XaaX + 0: aa + 1: a + XAAX + 0: AA + 1: A + +/(?i:\g)(?-i:(?a))/ + XaaX + 0: aa + 1: a + ** Failers +No match + XAAX +No match + +/(?-i:\g<+1>)(?i:(a))/ + XaaX + 0: aa + 1: a + XAAX + 0: AA + 1: A + +/(?=(?(?#simplesyntax)\$(?[a-zA-Z_\x{7f}-\x{ff}][a-zA-Z0-9_\x{7f}-\x{ff}]*)(?:\[(?[a-zA-Z0-9_\x{7f}-\x{ff}]+|\$\g)\]|->\g(\(.*?\))?)?|(?#simple syntax withbraces)\$\{(?:\g(?\[(?:\g|'(?:\\.|[^'\\])*'|"(?:\g|\\.|[^"\\])*")\])?|\g|\$\{\g\})\}|(?#complexsyntax)\{(?\$(?\g(\g*|\(.*?\))?)(?:->\g)*|\$\g|\$\{\g\})\}))\{/ + +/(?a|b|c)\g*/ + abc + 0: abc + 1: a + accccbbb + 0: accccbbb + 1: a + +/^X(?7)(a)(?|(b)|(q)(r)(s))(c)(d)(Y)/ + XYabcdY + 0: XYabcdY + 1: a + 2: b 3: 4: 5: c 6: d 7: Y -/ End of testinput2 / +/(?<=b(?1)|zzz)(a)/ + xbaax + 0: a + 1: a + xzzzax + 0: a + 1: a + +/(a)(?<=b\1)/ +Failed: lookbehind assertion is not fixed length at offset 10 + +/(a)(?<=b+(?1))/ +Failed: lookbehind assertion is not fixed length at offset 13 + +/(a+)(?<=b(?1))/ +Failed: lookbehind assertion is not fixed length at offset 14 + +/(a(?<=b(?1)))/ +Failed: lookbehind assertion is not fixed length at offset 13 + +/(?<=b(?1))xyz/ +Failed: reference to non-existent subpattern at offset 8 + +/(?<=b(?1))xyz(b+)pqrstuvew/ +Failed: lookbehind assertion is not fixed length at offset 26 + +/(a|bc)\1/SI +Capturing subpattern count = 1 +Max back reference = 1 +No options +No first char +No need char +Subject length lower bound = 2 +Starting byte set: a b + +/(a|bc)\1{2,3}/SI +Capturing subpattern count = 1 +Max back reference = 1 +No options +No first char +No need char +Subject length lower bound = 3 +Starting byte set: a b + +/(a|bc)(?1)/SI +Capturing subpattern count = 1 +No options +No first char +No need char +Subject length lower bound = 2 +Starting byte set: a b + +/(a|b\1)(a|b\1)/SI +Capturing subpattern count = 2 +Max back reference = 1 +No options +No first char +No need char +Subject length lower bound = 2 +Starting byte set: a b + +/(a|b\1){2}/SI +Capturing subpattern count = 1 +Max back reference = 1 +No options +No first char +No need char +Subject length lower bound = 2 +Starting byte set: a b + +/(a|bbbb\1)(a|bbbb\1)/SI +Capturing subpattern count = 2 +Max back reference = 1 +No options +No first char +No need char +Subject length lower bound = 2 +Starting byte set: a b + +/(a|bbbb\1){2}/SI +Capturing subpattern count = 1 +Max back reference = 1 +No options +No first char +No need char +Subject length lower bound = 2 +Starting byte set: a b + +/^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]/SI +Capturing subpattern count = 1 +Options: anchored +No first char +Need char = ':' +Subject length lower bound = 22 +No set of starting bytes + +/ (?: [\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 +/xSI +Capturing subpattern count = 0 +Contains explicit CR or LF match +Options: extended +No first char +No need char +Subject length lower bound = 3 +Starting byte set: \x09 \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 ^ _ ` 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 + +/]{0,})>]{0,})>([\d]{0,}\.)(.*)((
([\w\W\s\d][^<>]{0,})|[\s]{0,}))<\/a><\/TD>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD><\/TR>/isIS +Capturing subpattern count = 11 +Options: caseless dotall +First char = '<' +Need char = '>' +Subject length lower bound = 47 +No set of starting bytes + +"(?>.*/)foo"SI +Capturing subpattern count = 0 +No options +First char at start or follows newline +Need char = 'o' +Subject length lower bound = 4 +No set of starting bytes + +/(?(?=[^a-z]+[a-z]) \d{2}-[a-z]{3}-\d{2} | \d{2}-\d{2}-\d{2} ) /xSI +Capturing subpattern count = 0 +Options: extended +No first char +Need char = '-' +Subject length lower bound = 8 +No set of starting bytes + +/(?:(?:(?:(?:(?:(?:(?:(?:(?:(a|b|c))))))))))/iSI +Capturing subpattern count = 1 +Options: caseless +No first char +No need char +Subject length lower bound = 1 +Starting byte set: A B C a b c + +/(?:c|d)(?:)(?:aaaaaaaa(?:)(?:bbbbbbbb)(?:bbbbbbbb(?:))(?:bbbbbbbb(?:)(?:bbbbbbbb)))/SI +Capturing subpattern count = 0 +No options +No first char +Need char = 'b' +Subject length lower bound = 41 +Starting byte set: c d + +/A)|(?
B))/I +Capturing subpattern count = 1 +Named capturing subpatterns: + a 1 + a 1 +No options +No first char +No need char + AB\Ca + 0: A + 1: A + C A (1) a + BA\Ca + 0: B + 1: B + C B (1) a + +/(?|(?A)|(?B))/ +Failed: different names for subpatterns of the same number are not allowed at offset 15 + +/(?:a(? (?')|(?")) | + b(? (?')|(?")) ) + (?('quote')[a-z]+|[0-9]+)/JIx +Capturing subpattern count = 6 +Named capturing subpatterns: + apostrophe 2 + apostrophe 5 + quote 1 + quote 4 + realquote 3 + realquote 6 +Options: extended dupnames +No first char +No need char + a"aaaaa + 0: a"aaaaa + 1: " + 2: + 3: " + b"aaaaa + 0: b"aaaaa + 1: + 2: + 3: + 4: " + 5: + 6: " + ** Failers +No match + b"11111 +No match + a"11111 +No match + +/^(?|(a)(b)(c)(?d)|(?e)) (?('D')X|Y)/JDZx +------------------------------------------------------------------ + Bra + ^ + Bra + CBra 1 + a + Ket + CBra 2 + b + Ket + CBra 3 + c + Ket + CBra 4 + d + Ket + Alt + CBra 1 + e + Ket + Ket + Cond + 4 Cond nref + X + Alt + Y + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 4 +Named capturing subpatterns: + D 4 + D 1 +Options: anchored extended dupnames +No first char +No need char + abcdX + 0: abcdX + 1: a + 2: b + 3: c + 4: d + eX + 0: eX + 1: e + ** Failers +No match + abcdY +No match + ey +No match + +/(?a) (b)(c) (?d (?(R&A)$ | (?4)) )/JDZx +------------------------------------------------------------------ + Bra + CBra 1 + a + Ket + CBra 2 + b + Ket + CBra 3 + c + Ket + CBra 4 + d + Cond + Cond nrecurse 1 + $ + Alt + Once + Recurse + Ket + Ket + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 4 +Named capturing subpatterns: + A 1 + A 4 +Options: extended dupnames +First char = 'a' +Need char = 'd' + abcdd + 0: abcdd + 1: a + 2: b + 3: c + 4: dd + ** Failers +No match + abcdde +No match + +/abcd*/ + xxxxabcd\P + 0: abcd + xxxxabcd\P\P +Partial match: abcd + +/abcd*/i + xxxxabcd\P + 0: abcd + xxxxabcd\P\P +Partial match: abcd + XXXXABCD\P + 0: ABCD + XXXXABCD\P\P +Partial match: ABCD + +/abc\d*/ + xxxxabc1\P + 0: abc1 + xxxxabc1\P\P +Partial match: abc1 + +/(a)bc\1*/ + xxxxabca\P + 0: abca + 1: a + xxxxabca\P\P +Partial match: abca + +/abc[de]*/ + xxxxabcde\P + 0: abcde + xxxxabcde\P\P +Partial match: abcde + +/-- This is not in the Perl 5.10 test because Perl seems currently to be broken + and not behaving as specified in that it *does* bumpalong after hitting + (*COMMIT). --/ + +/(?1)(A(*COMMIT)|B)D/ + ABD + 0: ABD + 1: B + XABD + 0: ABD + 1: B + BAD + 0: BAD + 1: A + ABXABD + 0: ABD + 1: B + ** Failers +No match + ABX +No match + BAXBAD +No match + +/(\3)(\1)(a)/ + cat + 0: a + 1: + 2: + 3: a + +/(\3)(\1)(a)/SI +Capturing subpattern count = 3 +Max back reference = 3 +Options: +No first char +Need char = 'a' +Subject length lower bound = 1 +No set of starting bytes + cat + 0: a + 1: + 2: + 3: a + +/(\3)(\1)(a)/SI +Capturing subpattern count = 3 +Max back reference = 3 +No options +No first char +Need char = 'a' +Subject length lower bound = 3 +No set of starting bytes + cat +No match + +/-- End of testinput2 --/ diff --git a/ext/pcre/pcrelib/testdata/testoutput3 b/ext/pcre/pcrelib/testdata/testoutput3 index 28b1c3aaa..7b0a3e926 100644 --- a/ext/pcre/pcrelib/testdata/testoutput3 +++ b/ext/pcre/pcrelib/testdata/testoutput3 @@ -1,3 +1,7 @@ +/-- This set of tests checks local-specific features, using the fr_FR locale. + It is not Perl-compatible. There is different version called wintestinput3 + f or use on Windows, where the locale is called "french". --/ + /^[\w]+/ *** Failers No match @@ -83,6 +87,7 @@ Capturing subpattern count = 0 No options No first char No need char +Subject length lower bound = 1 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 @@ -91,6 +96,7 @@ Capturing subpattern count = 0 No options No first char No need char +Subject length lower bound = 1 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 @@ -160,4 +166,4 @@ No options No first char No need char -/ End of testinput3 / +/-- End of testinput3 --/ diff --git a/ext/pcre/pcrelib/testdata/testoutput4 b/ext/pcre/pcrelib/testdata/testoutput4 index e67a95895..128afe438 100644 --- a/ext/pcre/pcrelib/testdata/testoutput4 +++ b/ext/pcre/pcrelib/testdata/testoutput4 @@ -1,9 +1,6 @@ -/-- 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 - +/-- This set of tests if for UTF-8 support, excluding Unicode properties. It is + compatible with all versions of Perl 5. --/ + /a.b/8 acb 0: acb @@ -1089,4 +1086,37 @@ No match /(?i)[\xc3\xa9\xc3\xbd]|[\xc3\xa9\xc3\xbdA]/8 -/ End of testinput4 / +/^[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} + +/-- End of testinput4 --/ diff --git a/ext/pcre/pcrelib/testdata/testoutput5 b/ext/pcre/pcrelib/testdata/testoutput5 index 75630b450..f5de747ba 100644 --- a/ext/pcre/pcrelib/testdata/testoutput5 +++ b/ext/pcre/pcrelib/testdata/testoutput5 @@ -1,3 +1,6 @@ +/-- This set of tests checks the API, internals, and non-Perl stuff for UTF-8 + support, excluding Unicode properties. --/ + /\x{100}/8DZ ------------------------------------------------------------------ Bra @@ -252,7 +255,6 @@ Need char = 171 End ------------------------------------------------------------------ Capturing subpattern count = 0 -Partial matching not supported Options: utf8 No first char Need char = 'X' @@ -269,52 +271,12 @@ Need char = 'X' 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 value is < 255. -It grumbles about invalid UTF-8 strings. --/ - -/^[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 @@ -389,6 +351,7 @@ Capturing subpattern count = 0 Options: utf8 No first char No need char +Subject length lower bound = 1 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 @@ -423,11 +386,11 @@ No match End ------------------------------------------------------------------ Capturing subpattern count = 0 -Partial matching not supported Options: utf8 First char = 196 Need char = 128 -Study returned NULL +Subject length lower bound = 3 +No set of starting bytes \x{100}\x{100}\x{100}\x{100\x{100} 0: \x{100}\x{100}\x{100} @@ -443,10 +406,10 @@ Study returned NULL End ------------------------------------------------------------------ Capturing subpattern count = 1 -Partial matching not supported Options: utf8 No first char No need char +Subject length lower bound = 1 Starting byte set: x \xc4 /(\x{100}*a|x)/8SDZ @@ -462,10 +425,10 @@ Starting byte set: x \xc4 End ------------------------------------------------------------------ Capturing subpattern count = 1 -Partial matching not supported Options: utf8 No first char No need char +Subject length lower bound = 1 Starting byte set: a x \xc4 /(\x{100}{0,2}a|x)/8SDZ @@ -481,10 +444,10 @@ Starting byte set: a x \xc4 End ------------------------------------------------------------------ Capturing subpattern count = 1 -Partial matching not supported Options: utf8 No first char No need char +Subject length lower bound = 1 Starting byte set: a x \xc4 /(\x{100}{1,2}a|x)/8SDZ @@ -501,10 +464,10 @@ Starting byte set: a x \xc4 End ------------------------------------------------------------------ Capturing subpattern count = 1 -Partial matching not supported Options: utf8 No first char No need char +Subject length lower bound = 1 Starting byte set: x \xc4 /\x{100}*(\d+|"(?1)")/8 @@ -551,7 +514,6 @@ Need char = 128 End ------------------------------------------------------------------ Capturing subpattern count = 0 -Partial matching not supported Options: utf8 No first char No need char @@ -565,7 +527,6 @@ No need char End ------------------------------------------------------------------ Capturing subpattern count = 0 -Partial matching not supported Options: utf8 First char = 'a' No need char @@ -579,7 +540,6 @@ No need char End ------------------------------------------------------------------ Capturing subpattern count = 0 -Partial matching not supported Options: utf8 First char = 'a' Need char = 'b' @@ -593,7 +553,6 @@ Need char = 'b' End ------------------------------------------------------------------ Capturing subpattern count = 0 -Partial matching not supported Options: utf8 First char = 'a' Need char = 128 @@ -607,7 +566,6 @@ Need char = 128 End ------------------------------------------------------------------ Capturing subpattern count = 0 -Partial matching not supported Options: utf8 First char = 'a' Need char = 129 @@ -621,7 +579,6 @@ Need char = 129 End ------------------------------------------------------------------ Capturing subpattern count = 0 -Partial matching not supported Options: utf8 No first char Need char = 'A' @@ -640,7 +597,6 @@ Need char = 'A' End ------------------------------------------------------------------ Capturing subpattern count = 0 -Partial matching not supported Options: utf8 No first char No need char @@ -1122,7 +1078,6 @@ Need char = 191 End ------------------------------------------------------------------ Capturing subpattern count = 0 -Partial matching not supported Options: utf8 No first char No need char @@ -1136,7 +1091,6 @@ No need char End ------------------------------------------------------------------ Capturing subpattern count = 0 -Partial matching not supported Options: utf8 No first char No need char @@ -1150,7 +1104,6 @@ No need char End ------------------------------------------------------------------ Capturing subpattern count = 0 -Partial matching not supported Options: utf8 No first char No need char @@ -1164,7 +1117,6 @@ No need char End ------------------------------------------------------------------ Capturing subpattern count = 0 -Partial matching not supported Options: utf8 No first char No need char @@ -1178,7 +1130,6 @@ No need char End ------------------------------------------------------------------ Capturing subpattern count = 0 -Partial matching not supported Options: utf8 No first char No need char @@ -1192,7 +1143,6 @@ No need char End ------------------------------------------------------------------ Capturing subpattern count = 0 -Partial matching not supported Options: utf8 No first char No need char @@ -1206,7 +1156,6 @@ No need char End ------------------------------------------------------------------ Capturing subpattern count = 0 -Partial matching not supported Options: utf8 First char = 196 Need char = 128 @@ -1220,7 +1169,6 @@ Need char = 128 End ------------------------------------------------------------------ Capturing subpattern count = 0 -Partial matching not supported Options: utf8 First char = 196 Need char = 'X' @@ -1234,7 +1182,6 @@ Need char = 'X' End ------------------------------------------------------------------ Capturing subpattern count = 0 -Partial matching not supported Options: utf8 First char = 'X' Need char = 128 @@ -1652,4 +1599,477 @@ Forced newline sequence: CRLF First char = 'a' Need char = 'b' -/ End of testinput5 / +/Xa{2,4}b/8 + X\P +Partial match: X + Xa\P +Partial match: Xa + Xaa\P +Partial match: Xaa + Xaaa\P +Partial match: Xaaa + Xaaaa\P +Partial match: Xaaaa + +/Xa{2,4}?b/8 + X\P +Partial match: X + Xa\P +Partial match: Xa + Xaa\P +Partial match: Xaa + Xaaa\P +Partial match: Xaaa + Xaaaa\P +Partial match: Xaaaa + +/Xa{2,4}+b/8 + X\P +Partial match: X + Xa\P +Partial match: Xa + Xaa\P +Partial match: Xaa + Xaaa\P +Partial match: Xaaa + Xaaaa\P +Partial match: Xaaaa + +/X\x{123}{2,4}b/8 + X\P +Partial match: X + X\x{123}\P +Partial match: X\x{123} + X\x{123}\x{123}\P +Partial match: X\x{123}\x{123} + X\x{123}\x{123}\x{123}\P +Partial match: X\x{123}\x{123}\x{123} + X\x{123}\x{123}\x{123}\x{123}\P +Partial match: X\x{123}\x{123}\x{123}\x{123} + +/X\x{123}{2,4}?b/8 + X\P +Partial match: X + X\x{123}\P +Partial match: X\x{123} + X\x{123}\x{123}\P +Partial match: X\x{123}\x{123} + X\x{123}\x{123}\x{123}\P +Partial match: X\x{123}\x{123}\x{123} + X\x{123}\x{123}\x{123}\x{123}\P +Partial match: X\x{123}\x{123}\x{123}\x{123} + +/X\x{123}{2,4}+b/8 + X\P +Partial match: X + X\x{123}\P +Partial match: X\x{123} + X\x{123}\x{123}\P +Partial match: X\x{123}\x{123} + X\x{123}\x{123}\x{123}\P +Partial match: X\x{123}\x{123}\x{123} + X\x{123}\x{123}\x{123}\x{123}\P +Partial match: X\x{123}\x{123}\x{123}\x{123} + +/X\x{123}{2,4}b/8 + Xx\P +No match + X\x{123}x\P +No match + X\x{123}\x{123}x\P +No match + X\x{123}\x{123}\x{123}x\P +No match + X\x{123}\x{123}\x{123}\x{123}x\P +No match + +/X\x{123}{2,4}?b/8 + Xx\P +No match + X\x{123}x\P +No match + X\x{123}\x{123}x\P +No match + X\x{123}\x{123}\x{123}x\P +No match + X\x{123}\x{123}\x{123}\x{123}x\P +No match + +/X\x{123}{2,4}+b/8 + Xx\P +No match + X\x{123}x\P +No match + X\x{123}\x{123}x\P +No match + X\x{123}\x{123}\x{123}x\P +No match + X\x{123}\x{123}\x{123}\x{123}x\P +No match + +/X\d{2,4}b/8 + X\P +Partial match: X + X3\P +Partial match: X3 + X33\P +Partial match: X33 + X333\P +Partial match: X333 + X3333\P +Partial match: X3333 + +/X\d{2,4}?b/8 + X\P +Partial match: X + X3\P +Partial match: X3 + X33\P +Partial match: X33 + X333\P +Partial match: X333 + X3333\P +Partial match: X3333 + +/X\d{2,4}+b/8 + X\P +Partial match: X + X3\P +Partial match: X3 + X33\P +Partial match: X33 + X333\P +Partial match: X333 + X3333\P +Partial match: X3333 + +/X\D{2,4}b/8 + X\P +Partial match: X + Xa\P +Partial match: Xa + Xaa\P +Partial match: Xaa + Xaaa\P +Partial match: Xaaa + Xaaaa\P +Partial match: Xaaaa + +/X\D{2,4}?b/8 + X\P +Partial match: X + Xa\P +Partial match: Xa + Xaa\P +Partial match: Xaa + Xaaa\P +Partial match: Xaaa + Xaaaa\P +Partial match: Xaaaa + +/X\D{2,4}+b/8 + X\P +Partial match: X + Xa\P +Partial match: Xa + Xaa\P +Partial match: Xaa + Xaaa\P +Partial match: Xaaa + Xaaaa\P +Partial match: Xaaaa + +/X\D{2,4}b/8 + X\P +Partial match: X + X\x{123}\P +Partial match: X\x{123} + X\x{123}\x{123}\P +Partial match: X\x{123}\x{123} + X\x{123}\x{123}\x{123}\P +Partial match: X\x{123}\x{123}\x{123} + X\x{123}\x{123}\x{123}\x{123}\P +Partial match: X\x{123}\x{123}\x{123}\x{123} + +/X\D{2,4}?b/8 + X\P +Partial match: X + X\x{123}\P +Partial match: X\x{123} + X\x{123}\x{123}\P +Partial match: X\x{123}\x{123} + X\x{123}\x{123}\x{123}\P +Partial match: X\x{123}\x{123}\x{123} + X\x{123}\x{123}\x{123}\x{123}\P +Partial match: X\x{123}\x{123}\x{123}\x{123} + +/X\D{2,4}+b/8 + X\P +Partial match: X + X\x{123}\P +Partial match: X\x{123} + X\x{123}\x{123}\P +Partial match: X\x{123}\x{123} + X\x{123}\x{123}\x{123}\P +Partial match: X\x{123}\x{123}\x{123} + X\x{123}\x{123}\x{123}\x{123}\P +Partial match: X\x{123}\x{123}\x{123}\x{123} + +/X[abc]{2,4}b/8 + X\P +Partial match: X + Xa\P +Partial match: Xa + Xaa\P +Partial match: Xaa + Xaaa\P +Partial match: Xaaa + Xaaaa\P +Partial match: Xaaaa + +/X[abc]{2,4}?b/8 + X\P +Partial match: X + Xa\P +Partial match: Xa + Xaa\P +Partial match: Xaa + Xaaa\P +Partial match: Xaaa + Xaaaa\P +Partial match: Xaaaa + +/X[abc]{2,4}+b/8 + X\P +Partial match: X + Xa\P +Partial match: Xa + Xaa\P +Partial match: Xaa + Xaaa\P +Partial match: Xaaa + Xaaaa\P +Partial match: Xaaaa + +/X[abc\x{123}]{2,4}b/8 + X\P +Partial match: X + X\x{123}\P +Partial match: X\x{123} + X\x{123}\x{123}\P +Partial match: X\x{123}\x{123} + X\x{123}\x{123}\x{123}\P +Partial match: X\x{123}\x{123}\x{123} + X\x{123}\x{123}\x{123}\x{123}\P +Partial match: X\x{123}\x{123}\x{123}\x{123} + +/X[abc\x{123}]{2,4}?b/8 + X\P +Partial match: X + X\x{123}\P +Partial match: X\x{123} + X\x{123}\x{123}\P +Partial match: X\x{123}\x{123} + X\x{123}\x{123}\x{123}\P +Partial match: X\x{123}\x{123}\x{123} + X\x{123}\x{123}\x{123}\x{123}\P +Partial match: X\x{123}\x{123}\x{123}\x{123} + +/X[abc\x{123}]{2,4}+b/8 + X\P +Partial match: X + X\x{123}\P +Partial match: X\x{123} + X\x{123}\x{123}\P +Partial match: X\x{123}\x{123} + X\x{123}\x{123}\x{123}\P +Partial match: X\x{123}\x{123}\x{123} + X\x{123}\x{123}\x{123}\x{123}\P +Partial match: X\x{123}\x{123}\x{123}\x{123} + +/X[^a]{2,4}b/8 + X\P +Partial match: X + Xz\P +Partial match: Xz + Xzz\P +Partial match: Xzz + Xzzz\P +Partial match: Xzzz + Xzzzz\P +Partial match: Xzzzz + +/X[^a]{2,4}?b/8 + X\P +Partial match: X + Xz\P +Partial match: Xz + Xzz\P +Partial match: Xzz + Xzzz\P +Partial match: Xzzz + Xzzzz\P +Partial match: Xzzzz + +/X[^a]{2,4}+b/8 + X\P +Partial match: X + Xz\P +Partial match: Xz + Xzz\P +Partial match: Xzz + Xzzz\P +Partial match: Xzzz + Xzzzz\P +Partial match: Xzzzz + +/X[^a]{2,4}b/8 + X\P +Partial match: X + X\x{123}\P +Partial match: X\x{123} + X\x{123}\x{123}\P +Partial match: X\x{123}\x{123} + X\x{123}\x{123}\x{123}\P +Partial match: X\x{123}\x{123}\x{123} + X\x{123}\x{123}\x{123}\x{123}\P +Partial match: X\x{123}\x{123}\x{123}\x{123} + +/X[^a]{2,4}?b/8 + X\P +Partial match: X + X\x{123}\P +Partial match: X\x{123} + X\x{123}\x{123}\P +Partial match: X\x{123}\x{123} + X\x{123}\x{123}\x{123}\P +Partial match: X\x{123}\x{123}\x{123} + X\x{123}\x{123}\x{123}\x{123}\P +Partial match: X\x{123}\x{123}\x{123}\x{123} + +/X[^a]{2,4}+b/8 + X\P +Partial match: X + X\x{123}\P +Partial match: X\x{123} + X\x{123}\x{123}\P +Partial match: X\x{123}\x{123} + X\x{123}\x{123}\x{123}\P +Partial match: X\x{123}\x{123}\x{123} + X\x{123}\x{123}\x{123}\x{123}\P +Partial match: X\x{123}\x{123}\x{123}\x{123} + +/(Y)X\1{2,4}b/8 + YX\P +Partial match: YX + YXY\P +Partial match: YXY + YXYY\P +Partial match: YXYY + YXYYY\P +Partial match: YXYYY + YXYYYY\P +Partial match: YXYYYY + +/(Y)X\1{2,4}?b/8 + YX\P +Partial match: YX + YXY\P +Partial match: YXY + YXYY\P +Partial match: YXYY + YXYYY\P +Partial match: YXYYY + YXYYYY\P +Partial match: YXYYYY + +/(Y)X\1{2,4}+b/8 + YX\P +Partial match: YX + YXY\P +Partial match: YXY + YXYY\P +Partial match: YXYY + YXYYY\P +Partial match: YXYYY + YXYYYY\P +Partial match: YXYYYY + +/(\x{123})X\1{2,4}b/8 + \x{123}X\P +Partial match: \x{123}X + \x{123}X\x{123}\P +Partial match: \x{123}X\x{123} + \x{123}X\x{123}\x{123}\P +Partial match: \x{123}X\x{123}\x{123} + \x{123}X\x{123}\x{123}\x{123}\P +Partial match: \x{123}X\x{123}\x{123}\x{123} + \x{123}X\x{123}\x{123}\x{123}\x{123}\P +Partial match: \x{123}X\x{123}\x{123}\x{123}\x{123} + +/(\x{123})X\1{2,4}?b/8 + \x{123}X\P +Partial match: \x{123}X + \x{123}X\x{123}\P +Partial match: \x{123}X\x{123} + \x{123}X\x{123}\x{123}\P +Partial match: \x{123}X\x{123}\x{123} + \x{123}X\x{123}\x{123}\x{123}\P +Partial match: \x{123}X\x{123}\x{123}\x{123} + \x{123}X\x{123}\x{123}\x{123}\x{123}\P +Partial match: \x{123}X\x{123}\x{123}\x{123}\x{123} + +/(\x{123})X\1{2,4}+b/8 + \x{123}X\P +Partial match: \x{123}X + \x{123}X\x{123}\P +Partial match: \x{123}X\x{123} + \x{123}X\x{123}\x{123}\P +Partial match: \x{123}X\x{123}\x{123} + \x{123}X\x{123}\x{123}\x{123}\P +Partial match: \x{123}X\x{123}\x{123}\x{123} + \x{123}X\x{123}\x{123}\x{123}\x{123}\P +Partial match: \x{123}X\x{123}\x{123}\x{123}\x{123} + +/\bthe cat\b/8 + the cat\P + 0: the cat + the cat\P\P +Partial match: the cat + +/abcd*/8 + xxxxabcd\P + 0: abcd + xxxxabcd\P\P +Partial match: abcd + +/abcd*/i8 + xxxxabcd\P + 0: abcd + xxxxabcd\P\P +Partial match: abcd + XXXXABCD\P + 0: ABCD + XXXXABCD\P\P +Partial match: ABCD + +/abc\d*/8 + xxxxabc1\P + 0: abc1 + xxxxabc1\P\P +Partial match: abc1 + +/(a)bc\1*/8 + xxxxabca\P + 0: abca + 1: a + xxxxabca\P\P +Partial match: abca + +/abc[de]*/8 + xxxxabcde\P + 0: abcde + xxxxabcde\P\P +Partial match: abcde + +/-- End of testinput5 --/ diff --git a/ext/pcre/pcrelib/testdata/testoutput6 b/ext/pcre/pcrelib/testdata/testoutput6 index cb6f7d55c..4245d6a37 100644 --- a/ext/pcre/pcrelib/testdata/testoutput6 +++ b/ext/pcre/pcrelib/testdata/testoutput6 @@ -1,3 +1,7 @@ +/-- This set of tests is for Unicode property support. It is compatible with + Perl 5.10, but not 5.8 because it tests some extra properties that are + not in the earlier release. --/ + /^\pC\pL\pM\pN\pP\pS\pZ2 -Partial match: b +Partial match: foob foobar...\R\P\>4 0: ar xyzfo\P @@ -7168,7 +7171,6 @@ No match /a\R{2,4}b/I Capturing subpattern count = 0 -Partial matching not supported Options: bsr_anycrlf First char = 'a' Need char = 'b' @@ -7187,7 +7189,6 @@ No match /a\R{2,4}b/I Capturing subpattern count = 0 -Partial matching not supported Options: bsr_unicode First char = 'a' Need char = 'b' @@ -7370,4 +7371,217 @@ No match \C-"ab" 0: "ab" -/ End of testinput7 / +/\d+X|9+Y/ + ++++123999\P +Partial match: 123999 + ++++123999Y\P + 0: 999Y + +/Z(*F)/ + Z\P +No match + ZA\P +No match + +/Z(?!)/ + Z\P +No match + ZA\P +No match + +/dog(sbody)?/ + dogs\P + 0: dog + dogs\P\P +Partial match: dogs + +/dog(sbody)??/ + dogs\P + 0: dog + dogs\P\P +Partial match: dogs + +/dog|dogsbody/ + dogs\P + 0: dog + dogs\P\P +Partial match: dogs + +/dogsbody|dog/ + dogs\P + 0: dog + dogs\P\P +Partial match: dogs + +/Z(*F)Q|ZXY/ + Z\P +Partial match: Z + ZA\P +No match + X\P +No match + +/\bthe cat\b/ + the cat\P + 0: the cat + the cat\P\P +Partial match: the cat + +/dog(sbody)?/ + dogs\D\P + 0: dog + body\D\R + 0: body + +/dog(sbody)?/ + dogs\D\P\P +Partial match: dogs + body\D\R + 0: body + +/abc/ + abc\P + 0: abc + abc\P\P + 0: abc + +/abc\K123/ + xyzabc123pqr +Error -16 + +/(?<=abc)123/ + xyzabc123pqr + 0: 123 + xyzabc12\P +Partial match: abc12 + xyzabc12\P\P +Partial match: abc12 + +/\babc\b/ + +++abc+++ + 0: abc + +++ab\P +Partial match: +ab + +++ab\P\P +Partial match: +ab + +/(?=C)/g+ + ABCDECBA + 0: + 0+ CDECBA + 0: + 0+ CBA + +/(abc|def|xyz)/I +Capturing subpattern count = 1 +No options +No first char +No need char + terhjk;abcdaadsfe + 0: abc + the quick xyz brown fox + 0: xyz + \Yterhjk;abcdaadsfe + 0: abc + \Ythe quick xyz brown fox + 0: xyz + ** Failers +No match + thejk;adlfj aenjl;fda asdfasd ehj;kjxyasiupd +No match + \Ythejk;adlfj aenjl;fda asdfasd ehj;kjxyasiupd +No match + +/(abc|def|xyz)/SI +Capturing subpattern count = 1 +No options +No first char +No need char +Subject length lower bound = 3 +Starting byte set: a d x + terhjk;abcdaadsfe + 0: abc + the quick xyz brown fox + 0: xyz + \Yterhjk;abcdaadsfe + 0: abc + \Ythe quick xyz brown fox + 0: xyz + ** Failers +No match + thejk;adlfj aenjl;fda asdfasd ehj;kjxyasiupd +No match + \Ythejk;adlfj aenjl;fda asdfasd ehj;kjxyasiupd +No match + +/abcd*/+ + xxxxabcd\P + 0: abcd + 0+ + 1: abc + xxxxabcd\P\P +Partial match: abcd + dddxxx\R + 0: ddd + 0+ xxx + 1: dd + 2: d + 3: + xxxxabcd\P\P +Partial match: abcd + xxx\R + 0: + 0+ xxx + +/abcd*/i + xxxxabcd\P + 0: abcd + 1: abc + xxxxabcd\P\P +Partial match: abcd + XXXXABCD\P + 0: ABCD + 1: ABC + XXXXABCD\P\P +Partial match: ABCD + +/abc\d*/ + xxxxabc1\P + 0: abc1 + 1: abc + xxxxabc1\P\P +Partial match: abc1 + +/abc[de]*/ + xxxxabcde\P + 0: abcde + 1: abcd + 2: abc + xxxxabcde\P\P +Partial match: abcde + +/(?:(?1)|B)(A(*F)|C)/ + ABCD + 0: BC + CCD + 0: CC + ** Failers +No match + CAD +No match + +/^(?:(?1)|B)(A(*F)|C)/ + CCD + 0: CC + BCD + 0: BC + ** Failers +No match + ABCD +No match + CAD +No match + BAD +No match + +/-- End of testinput7 --/ diff --git a/ext/pcre/pcrelib/testdata/testoutput8 b/ext/pcre/pcrelib/testdata/testoutput8 index af10c4ae7..0cc87d79d 100644 --- a/ext/pcre/pcrelib/testdata/testoutput8 +++ b/ext/pcre/pcrelib/testdata/testoutput8 @@ -1,8 +1,6 @@ -/-- 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 +/-- This set of tests checks UTF-8 support with the DFA matching functionality + of pcre_dfa_exec(). The -dfa flag must be used with pcretest when running + it. --/ /\x{100}ab/8 \x{100}ab @@ -1288,4 +1286,38 @@ No match A\x{1ec5}ABCXYZ 0: X -/ End of testinput 8 / +/abcd*/8 + xxxxabcd\P + 0: abcd + 1: abc + xxxxabcd\P\P +Partial match: abcd + +/abcd*/i8 + xxxxabcd\P + 0: abcd + 1: abc + xxxxabcd\P\P +Partial match: abcd + XXXXABCD\P + 0: ABCD + 1: ABC + XXXXABCD\P\P +Partial match: ABCD + +/abc\d*/8 + xxxxabc1\P + 0: abc1 + 1: abc + xxxxabc1\P\P +Partial match: abc1 + +/abc[de]*/8 + xxxxabcde\P + 0: abcde + 1: abcd + 2: abc + xxxxabcde\P\P +Partial match: abcde + +/-- End of testinput8 --/ diff --git a/ext/pcre/pcrelib/testdata/testoutput9 b/ext/pcre/pcrelib/testdata/testoutput9 index 04e3873bb..851e3f020 100644 --- a/ext/pcre/pcrelib/testdata/testoutput9 +++ b/ext/pcre/pcrelib/testdata/testoutput9 @@ -1,3 +1,7 @@ +/-- This set of tests check Unicode property support with the DFA matching + functionality of pcre_dfa_exec(). The -dfa flag must be used with pcretest + when running it. --/ + /\pL\P{Nd}/8 AB 0: AB @@ -1670,4 +1674,4 @@ No match \x{1d79}\x{a77d} No match -/ End / +/-- End of testinput9 --/ diff --git a/ext/pcre/php_pcre.c b/ext/pcre/php_pcre.c index d89e3537b..bacb74f26 100644 --- a/ext/pcre/php_pcre.c +++ b/ext/pcre/php_pcre.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_pcre.c 289418 2009-10-09 14:25:51Z pajoye $ */ +/* $Id: php_pcre.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php.h" #include "php_ini.h" @@ -1314,9 +1314,7 @@ static void preg_replace_impl(INTERNAL_FUNCTION_PARAMETERS, int is_callable_repl if (!zend_is_callable(*replace, 0, &callback_name TSRMLS_CC)) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Requires argument 2, '%s', to be a valid callback", callback_name); efree(callback_name); - *return_value = **subject; - zval_copy_ctor(return_value); - INIT_PZVAL(return_value); + MAKE_COPY_ZVAL(subject, return_value); return; } efree(callback_name); diff --git a/ext/pcre/php_pcre.h b/ext/pcre/php_pcre.h index 841773bb8..5b173eae8 100644 --- a/ext/pcre/php_pcre.h +++ b/ext/pcre/php_pcre.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_pcre.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_pcre.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_PCRE_H #define PHP_PCRE_H diff --git a/ext/pcre/tests/bug33200.phpt b/ext/pcre/tests/bug33200.phpt index c75a6d4f5..67a4d86a7 100644 --- a/ext/pcre/tests/bug33200.phpt +++ b/ext/pcre/tests/bug33200.phpt @@ -9,5 +9,5 @@ $str = preg_replace("/(some.*text)/e", "strtoupper('\\1')", $str); echo $str . "\r\n"; ?> --EXPECT-- -PHP Warning: Directive 'magic_quotes_sybase' is deprecated in PHP 5.3 and greater in Unknown on line 0 +Warning: Directive 'magic_quotes_sybase' is deprecated in PHP 5.3 and greater in Unknown on line 0 SOME '$SAMPLE' TEXT diff --git a/ext/pcre/upgrade-pcre.php b/ext/pcre/upgrade-pcre.php index 8c2061d44..338b2079f 100644 --- a/ext/pcre/upgrade-pcre.php +++ b/ext/pcre/upgrade-pcre.php @@ -84,7 +84,12 @@ recurse('pcrelib'); $dirorig = scandir('pcrelib/testdata'); $k = array_search('CVS', $dirorig); -unset($dirorig[$k]); +if ($k !== false) + unset($dirorig[$k]); + +$k = array_search('.svn', $dirorig); +if ($k !== false) + unset($dirorig[$k]); $dirnew = scandir("$newpcre/testdata"); $diff = array_diff($dirorig, $dirnew); diff --git a/ext/pdo/pdo.c b/ext/pdo/pdo.c index 8b3734099..7c8ee32f6 100755 --- a/ext/pdo/pdo.c +++ b/ext/pdo/pdo.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: pdo.c 284394 2009-07-19 22:46:03Z felipe $ */ +/* $Id: pdo.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -222,6 +222,7 @@ PDO_API int php_pdo_parse_data_source(const char *data_source, int optstart = 0; int nlen; int n_matches = 0; + int n_semicolumns = 0; i = 0; while (i < data_source_len) { @@ -240,14 +241,21 @@ PDO_API int php_pdo_parse_data_source(const char *data_source, /* now we're looking for VALUE; or just VALUE */ semi = -1; + n_semicolumns = 0; while (i < data_source_len) { if (data_source[i] == '\0') { semi = i++; break; } if (data_source[i] == ';') { - semi = i++; - break; + if ((i + 1 >= data_source_len) || data_source[i+1] != ';') { + semi = i++; + break; + } else { + n_semicolumns++; + i += 2; + continue; + } } ++i; } @@ -264,7 +272,31 @@ PDO_API int php_pdo_parse_data_source(const char *data_source, if (parsed[j].freeme) { efree(parsed[j].optval); } - parsed[j].optval = estrndup(data_source + valstart, semi - valstart); + + if (n_semicolumns == 0) { + parsed[j].optval = estrndup(data_source + valstart, semi - valstart - n_semicolumns); + } else { + int vlen = semi - valstart; + char *orig_val = data_source + valstart; + char *new_val = (char *) emalloc(vlen - n_semicolumns + 1); + + parsed[j].optval = new_val; + + while (vlen && *orig_val) { + *new_val = *orig_val; + new_val++; + + if (*orig_val == ';') { + orig_val+=2; + vlen-=2; + } else { + orig_val++; + vlen--; + } + } + *new_val = '\0'; + } + parsed[j].freeme = 1; ++n_matches; break; diff --git a/ext/pdo/pdo_dbh.c b/ext/pdo/pdo_dbh.c index c85a59308..bb1f5bcfe 100755 --- a/ext/pdo/pdo_dbh.c +++ b/ext/pdo/pdo_dbh.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: pdo_dbh.c 289775 2009-10-19 21:43:34Z johannes $ */ +/* $Id: pdo_dbh.c 293036 2010-01-03 09:23:27Z sebastian $ */ /* The PDO Database Handle Class */ @@ -44,7 +44,7 @@ void pdo_raise_impl_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, const char *sqlstate char *message = NULL; const char *msg; - if (dbh->error_mode == PDO_ERRMODE_SILENT) { + if (dbh && dbh->error_mode == PDO_ERRMODE_SILENT) { #if 0 /* BUG: if user is running in silent mode and hits an error at the driver level * when they use the PDO methods to call up the error information, they may @@ -71,7 +71,7 @@ void pdo_raise_impl_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, const char *sqlstate spprintf(&message, 0, "SQLSTATE[%s]: %s", *pdo_err, msg); } - if (dbh->error_mode != PDO_ERRMODE_EXCEPTION) { + if (dbh && dbh->error_mode != PDO_ERRMODE_EXCEPTION) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", message); } else { zval *ex, *info; @@ -1144,8 +1144,7 @@ static PHP_METHOD(PDO, quote) char *qstr; int qlen; - if (FAILURE == zend_parse_parameters(1 TSRMLS_CC, "s|l", &str, &str_len, - ¶mtype)) { + if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &str, &str_len, ¶mtype)) { RETURN_FALSE; } diff --git a/ext/pdo/pdo_sql_parser.c b/ext/pdo/pdo_sql_parser.c index 072d9e69b..aef93f680 100644 --- a/ext/pdo/pdo_sql_parser.c +++ b/ext/pdo/pdo_sql_parser.c @@ -3,7 +3,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: pdo_sql_parser.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: pdo_sql_parser.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php.h" #include "php_pdo_driver.h" diff --git a/ext/pdo/pdo_sql_parser.c.orig b/ext/pdo/pdo_sql_parser.c.orig index 1d3eaa6fc..933215133 100644 --- a/ext/pdo/pdo_sql_parser.c.orig +++ b/ext/pdo/pdo_sql_parser.c.orig @@ -4,7 +4,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: pdo_sql_parser.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: pdo_sql_parser.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php.h" #include "php_pdo_driver.h" diff --git a/ext/pdo/pdo_sql_parser.re b/ext/pdo/pdo_sql_parser.re index 4b92183c1..6021865a7 100644 --- a/ext/pdo/pdo_sql_parser.re +++ b/ext/pdo/pdo_sql_parser.re @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: pdo_sql_parser.re 272369 2008-12-31 11:13:54Z sebastian $ */ +/* $Id: pdo_sql_parser.re 293035 2010-01-03 08:22:14Z sebastian $ */ #include "php.h" #include "php_pdo_driver.h" diff --git a/ext/pdo/pdo_sqlstate.c b/ext/pdo/pdo_sqlstate.c index de44331d1..fe6e41f31 100644 --- a/ext/pdo/pdo_sqlstate.c +++ b/ext/pdo/pdo_sqlstate.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: pdo_sqlstate.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: pdo_sqlstate.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/pdo/pdo_stmt.c b/ext/pdo/pdo_stmt.c index 18a3bd84b..5e0e9cb78 100755 --- a/ext/pdo/pdo_stmt.c +++ b/ext/pdo/pdo_stmt.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: pdo_stmt.c 289775 2009-10-19 21:43:34Z johannes $ */ +/* $Id: pdo_stmt.c 294942 2010-02-12 00:19:10Z johannes $ */ /* The PDO Statement Handle Class */ @@ -469,9 +469,7 @@ static PHP_METHOD(PDOStatement, execute) param.param_type = PDO_PARAM_STR; MAKE_STD_ZVAL(param.parameter); - *param.parameter = **tmp; - zval_copy_ctor(param.parameter); - INIT_PZVAL(param.parameter); + MAKE_COPY_ZVAL(tmp, param.parameter); if (!really_register_bound_param(¶m, stmt, 1 TSRMLS_CC)) { if (param.parameter) { @@ -497,6 +495,7 @@ static PHP_METHOD(PDOStatement, execute) /* no changes were made */ stmt->active_query_string = stmt->query_string; stmt->active_query_stringlen = stmt->query_stringlen; + ret = 1; } else if (ret == -1) { /* something broke */ PDO_HANDLE_STMT_ERR(); @@ -785,95 +784,24 @@ static int do_fetch_class_prepare(pdo_stmt_t *stmt TSRMLS_DC) /* {{{ */ static int make_callable_ex(pdo_stmt_t *stmt, zval *callable, zend_fcall_info * fci, zend_fcall_info_cache * fcc, int num_args TSRMLS_DC) /* {{{ */ { - zval *object = NULL, **method = NULL; - char *fname = NULL, *cname; - zend_class_entry * ce = NULL, **pce; - zend_function *function_handler; - - if (Z_TYPE_P(callable) == IS_ARRAY) { - if (Z_ARRVAL_P(callable)->nNumOfElements < 2) { - pdo_raise_impl_error(stmt->dbh, stmt, "HY000", "user-supplied function must be a valid callback" TSRMLS_CC); - return 0; - } - object = *(zval**)Z_ARRVAL_P(callable)->pListHead->pData; - method = (zval**)Z_ARRVAL_P(callable)->pListHead->pListNext->pData; + char *is_callable_error = NULL; - if (Z_TYPE_P(object) == IS_STRING) { /* static call */ - if (zend_lookup_class(Z_STRVAL_P(object), Z_STRLEN_P(object), &pce TSRMLS_CC) == FAILURE) { - pdo_raise_impl_error(stmt->dbh, stmt, "HY000", "user-supplied class does not exist" TSRMLS_CC); - return 0; - } else { - ce = *pce; - } - object = NULL; - } else if (Z_TYPE_P(object) == IS_OBJECT) { /* object call */ - ce = Z_OBJCE_P(object); + if (zend_fcall_info_init(callable, 0, fci, fcc, NULL, &is_callable_error TSRMLS_CC) == FAILURE) { + if (is_callable_error) { + pdo_raise_impl_error(stmt->dbh, stmt, "HY000", is_callable_error TSRMLS_CC); + efree(is_callable_error); } else { - pdo_raise_impl_error(stmt->dbh, stmt, "HY000", "user-supplied function must be a valid callback; bogus object/class name" TSRMLS_CC); - return 0; - } - - if (Z_TYPE_PP(method) != IS_STRING) { - pdo_raise_impl_error(stmt->dbh, stmt, "HY000", "user-supplied function must be a valid callback; bogus method name" TSRMLS_CC); - return 0; - } - } else if (Z_TYPE_P(callable) == IS_STRING) { - method = &callable; - } - - if (!method || !zend_is_callable(callable, 0, &fname TSRMLS_CC)) { - pdo_raise_impl_error(stmt->dbh, stmt, "HY000", "user-supplied function must be a valid callback" TSRMLS_CC); - if (fname) { - efree(fname); + pdo_raise_impl_error(stmt->dbh, stmt, "HY000", "user-supplied function must be a valid callback" TSRMLS_CC); } return 0; } - - /* ATM we do not support array($obj, "CLASS::FUNC") or "CLASS_FUNC" */ - cname = fname; - if ((fname = strstr(fname, "::")) == NULL) { - fname = cname; - cname = NULL; - } else { - *fname = '\0'; - fname += 2; + if (is_callable_error) { + /* Possible E_STRICT error message */ + efree(is_callable_error); } - if (cname) { - if (zend_lookup_class(cname, strlen(cname), &pce TSRMLS_CC) == FAILURE) { - pdo_raise_impl_error(stmt->dbh, stmt, "HY000", "user-supplied class does not exist" TSRMLS_CC); - return 0; - } else { - if (ce) { - /* pce must be base of ce or ce itself */ - if (ce != *pce && !instanceof_function(ce, *pce TSRMLS_CC)) { - pdo_raise_impl_error(stmt->dbh, stmt, "HY000", "user-supplied class has bogus lineage" TSRMLS_CC); - return 0; - } - } - ce = *pce; - } - } - - zend_str_tolower_copy(fname, fname, strlen(fname)); - fci->function_table = ce ? &ce->function_table : EG(function_table); - if (zend_hash_find(fci->function_table, fname, strlen(fname)+1, (void **)&function_handler) == FAILURE) { - pdo_raise_impl_error(stmt->dbh, stmt, "HY000", "user-supplied function does not exist" TSRMLS_CC); - return 0; - } - efree(cname ? cname : fname); - - fci->size = sizeof(zend_fcall_info); - fci->function_name = NULL; - fci->symbol_table = NULL; + fci->param_count = num_args; /* probably less */ fci->params = safe_emalloc(sizeof(zval**), num_args, 0); - fci->object_ptr = object; - - fcc->initialized = 1; - fcc->function_handler = function_handler; - fcc->calling_scope = EG(scope); - fcc->called_scope = object ? Z_OBJCE_P(object) : NULL; - fcc->object_ptr = object; return 1; } @@ -1271,9 +1199,7 @@ static int do_fetch(pdo_stmt_t *stmt, int do_bind, zval *return_value, zval_ptr_dtor(&return_value); /* we don't need that */ return_value = retval; } else if (retval) { - *return_value = *retval; - zval_copy_ctor(return_value); - INIT_PZVAL(return_value); + MAKE_COPY_ZVAL(&retval, return_value); zval_ptr_dtor(&retval); } } @@ -1566,7 +1492,9 @@ static PHP_METHOD(PDOStatement, fetchAll) case 3: case 2: stmt->fetch.func.function = arg2; - do_fetch_func_prepare(stmt TSRMLS_CC); + if (do_fetch_func_prepare(stmt TSRMLS_CC) == 0) { + error = 1; + } break; } break; @@ -1657,20 +1585,22 @@ static PHP_METHOD(PDOStatement, fetchAll) static int register_bound_param(INTERNAL_FUNCTION_PARAMETERS, pdo_stmt_t *stmt, int is_param) /* {{{ */ { struct pdo_bound_param_data param = {0}; + long param_type = PDO_PARAM_STR; param.paramno = -1; - param.param_type = PDO_PARAM_STR; if (FAILURE == zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS() TSRMLS_CC, - "lz|llz!", ¶m.paramno, ¶m.parameter, ¶m.param_type, ¶m.max_value_len, + "lz|llz!", ¶m.paramno, ¶m.parameter, ¶m_type, ¶m.max_value_len, ¶m.driver_params)) { if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sz|llz!", ¶m.name, - ¶m.namelen, ¶m.parameter, ¶m.param_type, ¶m.max_value_len, + ¶m.namelen, ¶m.parameter, ¶m_type, ¶m.max_value_len, ¶m.driver_params)) { return 0; } } - + + param.param_type = (int) param_type; + if (param.paramno > 0) { --param.paramno; /* make it zero-based internally */ } else if (!param.name) { diff --git a/ext/pdo/php_pdo.h b/ext/pdo/php_pdo.h index 6d6658196..b72c8dca2 100755 --- a/ext/pdo/php_pdo.h +++ b/ext/pdo/php_pdo.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_pdo.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_pdo.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_PDO_H #define PHP_PDO_H diff --git a/ext/pdo/php_pdo_driver.h b/ext/pdo/php_pdo_driver.h index e8aa505f9..3fcbde71b 100755 --- a/ext/pdo/php_pdo_driver.h +++ b/ext/pdo/php_pdo_driver.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_pdo_driver.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_pdo_driver.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_PDO_DRIVER_H #define PHP_PDO_DRIVER_H diff --git a/ext/pdo/php_pdo_int.h b/ext/pdo/php_pdo_int.h index 3e301b522..28f7969aa 100755 --- a/ext/pdo/php_pdo_int.h +++ b/ext/pdo/php_pdo_int.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_pdo_int.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_pdo_int.h 293036 2010-01-03 09:23:27Z sebastian $ */ /* Stuff private to the PDO extension and not for consumption by PDO drivers * */ diff --git a/ext/pdo/tests/bug_44861.phpt b/ext/pdo/tests/bug_44861.phpt index a39237290..3612561ed 100644 --- a/ext/pdo/tests/bug_44861.phpt +++ b/ext/pdo/tests/bug_44861.phpt @@ -32,7 +32,7 @@ if ($db->getAttribute(PDO::ATTR_DRIVER_NAME) == 'oci') { $from = ''; } -$query = "SELECT 'row1' AS r $from UNION SELECT 'row2' $from UNION SELECT 'row3' $from UNION SELECT 'row4' $from"; +$query = "SELECT 'row1' AS r $from UNION SELECT 'row2' $from UNION SELECT 'row3' $from UNION SELECT 'row4' $from ORDER BY r"; $aParams = array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL); $res = $db->prepare($query, $aParams); diff --git a/ext/pdo/tests/bug_50458.phpt b/ext/pdo/tests/bug_50458.phpt new file mode 100644 index 000000000..3deb2892e --- /dev/null +++ b/ext/pdo/tests/bug_50458.phpt @@ -0,0 +1,29 @@ +--TEST-- +PDO Common: Bug #50458 (PDO::FETCH_FUNC fails with Closures) +--SKIPIF-- + +--FILE-- +exec("CREATE TABLE test (a VARCHAR(10))"); +$db->exec("INSERT INTO test (a) VALUES ('xyz')"); +$res = $db->query("SELECT a FROM test"); +var_dump($res->fetchAll(PDO::FETCH_FUNC, function($a) { return strtoupper($a); })); + +?> +===DONE=== +--EXPECTF-- +array(1) { + [0]=> + string(3) "XYZ" +} +===DONE=== diff --git a/ext/pdo_dblib/config.m4 b/ext/pdo_dblib/config.m4 index 657da6263..5068b8765 100644 --- a/ext/pdo_dblib/config.m4 +++ b/ext/pdo_dblib/config.m4 @@ -1,5 +1,5 @@ dnl -dnl $Id: config.m4 266959 2008-10-04 12:52:58Z felipe $ +dnl $Id: config.m4 291414 2009-11-29 06:13:22Z rasmus $ dnl PHP_ARG_WITH(pdo-dblib, for PDO_DBLIB support via FreeTDS, diff --git a/ext/pdo_dblib/dblib_driver.c b/ext/pdo_dblib/dblib_driver.c index 7234c2bc1..5e9464e71 100644 --- a/ext/pdo_dblib/dblib_driver.c +++ b/ext/pdo_dblib/dblib_driver.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: dblib_driver.c 289440 2009-10-09 18:56:19Z pajoye $ */ +/* $Id: dblib_driver.c 294444 2010-02-03 19:48:04Z pajoye $ */ #ifdef HAVE_CONFIG_H # include "config.h" @@ -255,7 +255,7 @@ cleanup: dbh->driver_data = H; if (!ret) { - zend_throw_exception_ex(php_pdo_get_exception(), 0 TSRMLS_CC, + zend_throw_exception_ex(php_pdo_get_exception(), DBLIB_G(err).dberr TSRMLS_CC, "SQLSTATE[%s] %s (severity %d)", DBLIB_G(err).sqlstate, DBLIB_G(err).dberrstr, diff --git a/ext/pdo_dblib/dblib_stmt.c b/ext/pdo_dblib/dblib_stmt.c index 0080b30aa..290a25cb8 100644 --- a/ext/pdo_dblib/dblib_stmt.c +++ b/ext/pdo_dblib/dblib_stmt.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: dblib_stmt.c 277492 2009-03-19 22:16:29Z sfox $ */ +/* $Id: dblib_stmt.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H # include "config.h" diff --git a/ext/pdo_dblib/pdo_dblib.c b/ext/pdo_dblib/pdo_dblib.c index 73cf49b6b..0da36da19 100644 --- a/ext/pdo_dblib/pdo_dblib.c +++ b/ext/pdo_dblib/pdo_dblib.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: pdo_dblib.c 280855 2009-05-20 10:18:51Z kalle $ */ +/* $Id: pdo_dblib.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H # include "config.h" diff --git a/ext/pdo_dblib/php_pdo_dblib.h b/ext/pdo_dblib/php_pdo_dblib.h index f2096c764..dc54a87e6 100644 --- a/ext/pdo_dblib/php_pdo_dblib.h +++ b/ext/pdo_dblib/php_pdo_dblib.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_pdo_dblib.h 280765 2009-05-19 10:22:25Z kalle $ */ +/* $Id: php_pdo_dblib.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_PDO_DBLIB_H #define PHP_PDO_DBLIB_H diff --git a/ext/pdo_dblib/php_pdo_dblib_int.h b/ext/pdo_dblib/php_pdo_dblib_int.h index 518787b7c..273fb07ed 100644 --- a/ext/pdo_dblib/php_pdo_dblib_int.h +++ b/ext/pdo_dblib/php_pdo_dblib_int.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_pdo_dblib_int.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_pdo_dblib_int.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_PDO_DBLIB_INT_H #define PHP_PDO_DBLIB_INT_H diff --git a/ext/pdo_firebird/config.m4 b/ext/pdo_firebird/config.m4 index e30b4b452..e878bfb85 100644 --- a/ext/pdo_firebird/config.m4 +++ b/ext/pdo_firebird/config.m4 @@ -1,5 +1,5 @@ dnl -dnl $Id: config.m4 280986 2009-05-23 13:52:00Z nlopess $ +dnl $Id: config.m4 291414 2009-11-29 06:13:22Z rasmus $ dnl PHP_ARG_WITH(pdo-firebird,for Firebird support for PDO, diff --git a/ext/pdo_firebird/firebird_driver.c b/ext/pdo_firebird/firebird_driver.c index b099d317c..50392238d 100644 --- a/ext/pdo_firebird/firebird_driver.c +++ b/ext/pdo_firebird/firebird_driver.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: firebird_driver.c 278929 2009-04-18 18:56:11Z felipe $ */ +/* $Id: firebird_driver.c 294444 2010-02-03 19:48:04Z pajoye $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -691,7 +691,7 @@ static int pdo_firebird_handle_factory(pdo_dbh_t *dbh, zval *driver_options TSRM char errmsg[512]; ISC_STATUS *s = H->isc_status; isc_interprete(errmsg, &s); - zend_throw_exception_ex(php_pdo_get_exception(), 0 TSRMLS_CC, "SQLSTATE[%s] [%d] %s", + zend_throw_exception_ex(php_pdo_get_exception(), H->isc_status[1] TSRMLS_CC, "SQLSTATE[%s] [%d] %s", "HY000", H->isc_status[1], errmsg); } diff --git a/ext/pdo_firebird/firebird_statement.c b/ext/pdo_firebird/firebird_statement.c index b58b756b5..8c6bb83c3 100644 --- a/ext/pdo_firebird/firebird_statement.c +++ b/ext/pdo_firebird/firebird_statement.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: firebird_statement.c 284404 2009-07-20 00:17:24Z felipe $ */ +/* $Id: firebird_statement.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/pdo_firebird/pdo_firebird.c b/ext/pdo_firebird/pdo_firebird.c index 7f6364990..fb71c9d94 100644 --- a/ext/pdo_firebird/pdo_firebird.c +++ b/ext/pdo_firebird/pdo_firebird.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: pdo_firebird.c 284399 2009-07-19 23:33:50Z felipe $ */ +/* $Id: pdo_firebird.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/pdo_firebird/php_pdo_firebird.h b/ext/pdo_firebird/php_pdo_firebird.h index 4797cc624..7d770625b 100644 --- a/ext/pdo_firebird/php_pdo_firebird.h +++ b/ext/pdo_firebird/php_pdo_firebird.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_pdo_firebird.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_pdo_firebird.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_PDO_FIREBIRD_H #define PHP_PDO_FIREBIRD_H diff --git a/ext/pdo_firebird/php_pdo_firebird_int.h b/ext/pdo_firebird/php_pdo_firebird_int.h index 485a86250..0df268ebc 100644 --- a/ext/pdo_firebird/php_pdo_firebird_int.h +++ b/ext/pdo_firebird/php_pdo_firebird_int.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_pdo_firebird_int.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_pdo_firebird_int.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_PDO_FIREBIRD_INT_H #define PHP_PDO_FIREBIRD_INT_H diff --git a/ext/pdo_mysql/config.m4 b/ext/pdo_mysql/config.m4 index aa5efd899..0b0de12bd 100755 --- a/ext/pdo_mysql/config.m4 +++ b/ext/pdo_mysql/config.m4 @@ -1,4 +1,4 @@ -dnl $Id: config.m4 287424 2009-08-17 17:57:40Z jani $ +dnl $Id: config.m4 291501 2009-11-30 15:11:29Z jani $ dnl config.m4 for extension pdo_mysql dnl vim: se ts=2 sw=2 et: @@ -28,46 +28,42 @@ if test "$PHP_PDO_MYSQL" != "no"; then done ]) + if test -f $PHP_PDO_MYSQL && test -x $PHP_PDO_MYSQL ; then + PDO_MYSQL_CONFIG=$PHP_PDO_MYSQL + elif test "$PHP_PDO_MYSQL" != "yes"; then + if test -d "$PHP_PDO_MYSQL" ; then + if test -x "$PHP_PDO_MYSQL/bin/mysql_config" ; then + PDO_MYSQL_CONFIG="$PHP_PDO_MYSQL/bin/mysql_config" + else + PDO_MYSQL_DIR="$PHP_PDO_MYSQL" + fi + fi + else + for i in /usr/local /usr ; do + if test -x "$i/bin/mysql_config" ; then + PDO_MYSQL_CONFIG="$i/bin/mysql_config" + break; + fi + if test -r $i/include/mysql/mysql.h || test -r $i/include/mysql.h ; then + PDO_MYSQL_DIR="$i" + break; + fi + done + fi + if test "$PHP_PDO_MYSQL" = "mysqlnd"; then dnl enables build of mysqnd library PHP_MYSQLND_ENABLED=yes AC_DEFINE([PDO_USE_MYSQLND], 1, [Whether pdo_mysql uses mysqlnd]) else AC_DEFINE(HAVE_MYSQL, 1, [Whether you have MySQL]) - AC_MSG_CHECKING([for mysql_config]) - if test -f $PHP_PDO_MYSQL && test -x $PHP_PDO_MYSQL ; then - PDO_MYSQL_CONFIG=$PHP_PDO_MYSQL - elif test "$PHP_PDO_MYSQL" != "yes"; then - if test -d "$PHP_PDO_MYSQL" ; then - if test -x "$PHP_PDO_MYSQL/bin/mysql_config" ; then - PDO_MYSQL_CONFIG="$PHP_PDO_MYSQL/bin/mysql_config" - else - PDO_MYSQL_DIR="$PHP_PDO_MYSQL" - fi - else - AC_MSG_RESULT([$PHP_PDO_MYSQL is not a directory]) - AC_MSG_ERROR([can not find mysql under the "$PHP_PDO_MYSQL" that you specified]) - fi - else - for i in /usr/local /usr ; do - if test -x "$i/bin/mysql_config" ; then - PDO_MYSQL_CONFIG="$i/bin/mysql_config" - break; - fi - if test -r $i/include/mysql/mysql.h || test -r $i/include/mysql.h ; then - PDO_MYSQL_DIR="$i" - break; - fi - done - fi - - if test -n "$PDO_MYSQL_CONFIG" && test -x "$PDO_MYSQL_CONFIG" ; then + AC_MSG_CHECKING([for mysql_config]) + if test -n "$PDO_MYSQL_CONFIG"; then AC_MSG_RESULT($PDO_MYSQL_CONFIG) if test "x$SED" = "x"; then AC_PATH_PROG(SED, sed) fi - if test "$enable_maintainer_zts" = "yes"; then PDO_MYSQL_LIBNAME=mysqlclient_r PDO_MYSQL_LIBS=`$PDO_MYSQL_CONFIG --libs_r | $SED -e "s/'//g"` @@ -76,11 +72,7 @@ if test "$PHP_PDO_MYSQL" != "no"; then PDO_MYSQL_LIBS=`$PDO_MYSQL_CONFIG --libs | $SED -e "s/'//g"` fi PDO_MYSQL_INCLUDE=`$PDO_MYSQL_CONFIG --cflags | $SED -e "s/'//g"` - PDO_MYSQL_SOCKET=`$PDO_MYSQL_CONFIG --socket` - elif test -z "$PDO_MYSQL_DIR"; then - AC_MSG_RESULT([not found]) - AC_MSG_ERROR([Cannot find MySQL header files under $PDO_MYSQL_DIR]) - else + elif test -n "$PDO_MYSQL_DIR"; then AC_MSG_RESULT([not found]) AC_MSG_CHECKING([for mysql install under $PDO_MYSQL_DIR]) if test -r $PDO_MYSQL_DIR/include/mysql; then @@ -103,10 +95,11 @@ if test "$PHP_PDO_MYSQL" != "no"; then PHP_ADD_INCLUDE($PDO_MYSQL_INC_DIR) PDO_MYSQL_INCLUDE=-I$PDO_MYSQL_INC_DIR + else + AC_MSG_RESULT([not found]) + AC_MSG_ERROR([Unable to find your mysql installation]) fi - AC_DEFINE_UNQUOTED(PDO_MYSQL_UNIX_ADDR, "$PDO_MYSQL_SOCKET", [ ]) - PHP_CHECK_LIBRARY($PDO_MYSQL_LIBNAME, mysql_query, [ PHP_EVAL_INCLINE($PDO_MYSQL_INCLUDE) @@ -159,6 +152,10 @@ if test "$PHP_PDO_MYSQL" != "no"; then AC_MSG_RESULT($pdo_inc_path) ]) + if test -n "$PDO_MYSQL_CONFIG"; then + PDO_MYSQL_SOCKET=`$PDO_MYSQL_CONFIG --socket` + AC_DEFINE_UNQUOTED(PDO_MYSQL_UNIX_ADDR, "$PDO_MYSQL_SOCKET", [ ]) + fi dnl fix after renaming to pdo_mysql PHP_NEW_EXTENSION(pdo_mysql, pdo_mysql.c mysql_driver.c mysql_statement.c, $ext_shared,,-I$pdo_inc_path -I) diff --git a/ext/pdo_mysql/mysql_driver.c b/ext/pdo_mysql/mysql_driver.c index 1b4b227e4..37a67e56e 100755 --- a/ext/pdo_mysql/mysql_driver.c +++ b/ext/pdo_mysql/mysql_driver.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: mysql_driver.c 289630 2009-10-14 13:51:25Z johannes $ */ +/* $Id: mysql_driver.c 294543 2010-02-04 20:28:55Z johannes $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -127,7 +127,7 @@ int _pdo_mysql_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, const char *file, int lin if (!dbh->methods) { PDO_DBG_INF("Throwing exception"); - zend_throw_exception_ex(php_pdo_get_exception(), 0 TSRMLS_CC, "SQLSTATE[%s] [%d] %s", + zend_throw_exception_ex(php_pdo_get_exception(), einfo->errcode TSRMLS_CC, "SQLSTATE[%s] [%d] %s", *pdo_err, einfo->errcode, einfo->errmsg); } @@ -462,7 +462,7 @@ static int pdo_mysql_get_attribute(pdo_dbh_t *dbh, long attr, zval *return_value case PDO_ATTR_SERVER_INFO: { char *tmp; #if PDO_USE_MYSQLND - int tmp_len; + unsigned int tmp_len; if (mysqlnd_stat(H->server, &tmp, &tmp_len) == PASS) { ZVAL_STRINGL(return_value, tmp, tmp_len, 0); @@ -731,7 +731,7 @@ static int pdo_mysql_handle_factory(pdo_dbh_t *dbh, zval *driver_options TSRMLS_ } if (mysqlnd_connect(H->server, host, dbh->username, dbh->password, password_len, dbname, dbname_len, - port, unix_socket, connect_opts, PDO_MYSQL_G(mysqlnd_thd_zval_cache) TSRMLS_CC) == NULL) { + port, unix_socket, connect_opts TSRMLS_CC) == NULL) { #else if (mysql_real_connect(H->server, host, dbh->username, dbh->password, dbname, port, unix_socket, connect_opts) == NULL) { #endif diff --git a/ext/pdo_mysql/mysql_statement.c b/ext/pdo_mysql/mysql_statement.c index 6899dd77a..074e9fbb2 100755 --- a/ext/pdo_mysql/mysql_statement.c +++ b/ext/pdo_mysql/mysql_statement.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: mysql_statement.c 280838 2009-05-20 08:30:12Z kalle $ */ +/* $Id: mysql_statement.c 294543 2010-02-04 20:28:55Z johannes $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -120,7 +120,7 @@ static int pdo_mysql_stmt_dtor(pdo_stmt_t *stmt TSRMLS_DC) /* {{{ */ } /* }}} */ -static void pdo_mysql_stmt_set_row_count(pdo_stmt_t *stmt) /* {{{ */ +static void pdo_mysql_stmt_set_row_count(pdo_stmt_t *stmt TSRMLS_DC) /* {{{ */ { long row_count; pdo_mysql_stmt *S = stmt->driver_data; @@ -237,7 +237,7 @@ static int pdo_mysql_stmt_execute_prepared_libmysql(pdo_stmt_t *stmt TSRMLS_DC) } } - pdo_mysql_stmt_set_row_count(stmt); + pdo_mysql_stmt_set_row_count(stmt TSRMLS_CC); PDO_DBG_RETURN(1); } /* }}} */ @@ -280,7 +280,7 @@ static int pdo_mysql_stmt_execute_prepared_mysqlnd(pdo_stmt_t *stmt TSRMLS_DC) / } } - pdo_mysql_stmt_set_row_count(stmt); + pdo_mysql_stmt_set_row_count(stmt TSRMLS_CC); PDO_DBG_RETURN(1); } /* }}} */ diff --git a/ext/pdo_mysql/pdo_mysql.c b/ext/pdo_mysql/pdo_mysql.c index 44719fd79..158c033b0 100755 --- a/ext/pdo_mysql/pdo_mysql.c +++ b/ext/pdo_mysql/pdo_mysql.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: pdo_mysql.c 289630 2009-10-14 13:51:25Z johannes $ */ +/* $Id: pdo_mysql.c 294514 2010-02-04 09:37:38Z pajoye $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -35,43 +35,37 @@ ZEND_GET_MODULE(pdo_mysql) #endif -#if PDO_USE_MYSQLND ZEND_DECLARE_MODULE_GLOBALS(pdo_mysql); #ifndef PHP_WIN32 # ifndef PDO_MYSQL_UNIX_ADDR -# define PDO_MYSQL_UNIX_ADDR "/tmp/mysql.sock" +# ifdef PHP_MYSQL_UNIX_SOCK_ADDR +# define PDO_MYSQL_UNIX_ADDR PHP_MYSQL_UNIX_SOCK_ADDR +# else +# define PDO_MYSQL_UNIX_ADDR "/tmp/mysql.sock" +# endif # endif #endif - /* {{{ PHP_INI_BEGIN */ PHP_INI_BEGIN() #ifndef PHP_WIN32 - STD_PHP_INI_ENTRY("pdo_mysql.default_socket", PDO_MYSQL_UNIX_ADDR, PHP_INI_SYSTEM, OnUpdateString, default_socket, zend_pdo_mysql_globals, pdo_mysql_globals) + STD_PHP_INI_ENTRY("pdo_mysql.default_socket", PDO_MYSQL_UNIX_ADDR, PHP_INI_SYSTEM, OnUpdateStringUnempty, default_socket, zend_pdo_mysql_globals, pdo_mysql_globals) #endif #if PDO_DBG_ENABLED STD_PHP_INI_ENTRY("pdo_mysql.debug", NULL, PHP_INI_SYSTEM, OnUpdateString, debug, zend_pdo_mysql_globals, pdo_mysql_globals) #endif - STD_PHP_INI_ENTRY("pdo_mysql.cache_size", "2000", PHP_INI_SYSTEM, OnUpdateLong, cache_size, zend_pdo_mysql_globals, pdo_mysql_globals) PHP_INI_END() /* }}} */ -#endif -/* true global environment */ -#ifdef PDO_USE_MYSQLND -static MYSQLND_ZVAL_PCACHE *pdo_mysqlnd_zval_cache; -#endif - +/* true global environment */ /* {{{ PHP_MINIT_FUNCTION */ static PHP_MINIT_FUNCTION(pdo_mysql) { -#if PDO_USE_MYSQLND REGISTER_INI_ENTRIES(); -#endif REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_USE_BUFFERED_QUERY", (long)PDO_MYSQL_ATTR_USE_BUFFERED_QUERY); REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_LOCAL_INFILE", (long)PDO_MYSQL_ATTR_LOCAL_INFILE); @@ -86,10 +80,6 @@ static PHP_MINIT_FUNCTION(pdo_mysql) REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_FOUND_ROWS", (long)PDO_MYSQL_ATTR_FOUND_ROWS); REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_IGNORE_SPACE", (long)PDO_MYSQL_ATTR_IGNORE_SPACE); -#ifdef PDO_USE_MYSQLND - pdo_mysqlnd_zval_cache = mysqlnd_palloc_init_cache(PDO_MYSQL_G(cache_size)); -#endif - return php_pdo_register_driver(&pdo_mysql_driver); } /* }}} */ @@ -100,7 +90,6 @@ static PHP_MSHUTDOWN_FUNCTION(pdo_mysql) { php_pdo_unregister_driver(&pdo_mysql_driver); #if PDO_USE_MYSQLND - mysqlnd_palloc_free_cache(pdo_mysqlnd_zval_cache); UNREGISTER_INI_ENTRIES(); #endif @@ -117,20 +106,6 @@ static PHP_MINFO_FUNCTION(pdo_mysql) php_info_print_table_header(2, "PDO Driver for MySQL", "enabled"); php_info_print_table_row(2, "Client API version", mysql_get_client_info()); -#ifdef PDO_USE_MYSQLND - { - zval values; - - php_info_print_table_header(2, "Persistent cache", pdo_mysqlnd_zval_cache ? "enabled":"disabled"); - - if (pdo_mysqlnd_zval_cache) { - /* Now report cache status */ - mysqlnd_palloc_stats(pdo_mysqlnd_zval_cache, &values); - mysqlnd_minfo_print_hash(&values); - zval_dtor(&values); - } - } -#endif php_info_print_table_end(); #ifdef PDO_USE_MYSQLND @@ -144,12 +119,10 @@ static PHP_MINFO_FUNCTION(pdo_mysql) /* {{{ PHP_RINIT_FUNCTION */ static PHP_RINIT_FUNCTION(pdo_mysql) -{ - PDO_MYSQL_G(mysqlnd_thd_zval_cache) = mysqlnd_palloc_rinit(pdo_mysqlnd_zval_cache); - +{ #if PDO_DBG_ENABLED if (PDO_MYSQL_G(debug)) { - MYSQLND_DEBUG *dbg = mysqlnd_debug_init(TSRMLS_C); + MYSQLND_DEBUG *dbg = mysqlnd_debug_init(mysqlnd_debug_std_no_trace_funcs TSRMLS_CC); if (!dbg) { return FAILURE; } @@ -167,8 +140,6 @@ static PHP_RINIT_FUNCTION(pdo_mysql) */ static PHP_RSHUTDOWN_FUNCTION(pdo_mysql) { - mysqlnd_palloc_rshutdown(PDO_MYSQL_G(mysqlnd_thd_zval_cache)); - #if PDO_DBG_ENABLED MYSQLND_DEBUG *dbg = PDO_MYSQL_G(dbg); PDO_DBG_ENTER("RSHUTDOWN"); @@ -187,8 +158,6 @@ static PHP_RSHUTDOWN_FUNCTION(pdo_mysql) */ static PHP_GINIT_FUNCTION(pdo_mysql) { - pdo_mysql_globals->mysqlnd_thd_zval_cache = NULL; /* zval cache */ - pdo_mysql_globals->cache_size = 0; #ifndef PHP_WIN32 pdo_mysql_globals->default_socket = NULL; #endif @@ -227,7 +196,7 @@ zend_module_entry pdo_mysql_module_entry = { pdo_mysql_functions, PHP_MINIT(pdo_mysql), PHP_MSHUTDOWN(pdo_mysql), -#if PDO_USE_MYSQLND +#if PDO_USE_MYSQLND && PDO_DBG_ENABLED PHP_RINIT(pdo_mysql), PHP_RSHUTDOWN(pdo_mysql), #else diff --git a/ext/pdo_mysql/php_pdo_mysql.h b/ext/pdo_mysql/php_pdo_mysql.h index 6adfbf095..202c2a23d 100755 --- a/ext/pdo_mysql/php_pdo_mysql.h +++ b/ext/pdo_mysql/php_pdo_mysql.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_pdo_mysql.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_pdo_mysql.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_PDO_MYSQL_H #define PHP_PDO_MYSQL_H diff --git a/ext/pdo_mysql/php_pdo_mysql_int.h b/ext/pdo_mysql/php_pdo_mysql_int.h index ac0a97394..51e5e5591 100755 --- a/ext/pdo_mysql/php_pdo_mysql_int.h +++ b/ext/pdo_mysql/php_pdo_mysql_int.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_pdo_mysql_int.h 289630 2009-10-14 13:51:25Z johannes $ */ +/* $Id: php_pdo_mysql_int.h 294514 2010-02-04 09:37:38Z pajoye $ */ #ifndef PHP_PDO_MYSQL_INT_H #define PHP_PDO_MYSQL_INT_H @@ -61,10 +61,7 @@ static inline void PDO_DBG_ENTER(char *func_name) {} #include "ext/mysqlnd/mysqlnd_debug.h" #endif -#ifdef PDO_USE_MYSQLND ZEND_BEGIN_MODULE_GLOBALS(pdo_mysql) - MYSQLND_THD_ZVAL_PCACHE *mysqlnd_thd_zval_cache; - long cache_size; #ifndef PHP_WIN32 char *default_socket; #endif @@ -72,10 +69,15 @@ ZEND_BEGIN_MODULE_GLOBALS(pdo_mysql) char *debug; /* The actual string */ MYSQLND_DEBUG *dbg; /* The DBG object */ #endif +#if defined(PHP_WIN32) && !PDO_DBG_ENABLED + /* dummy member so we get at least one member in the struct + * and avoids build errors. + */ + void *dummymemmber; +#endif ZEND_END_MODULE_GLOBALS(pdo_mysql) -ZEND_EXTERN_MODULE_GLOBALS(pdo_mysql); -#endif +ZEND_EXTERN_MODULE_GLOBALS(pdo_mysql) #ifdef ZTS #define PDO_MYSQL_G(v) TSRMG(pdo_mysql_globals_id, zend_pdo_mysql_globals *, v) diff --git a/ext/pdo_mysql/tests/bug44327.phpt b/ext/pdo_mysql/tests/bug44327.phpt index 1952cce05..f82c4302d 100644 --- a/ext/pdo_mysql/tests/bug44327.phpt +++ b/ext/pdo_mysql/tests/bug44327.phpt @@ -42,22 +42,22 @@ $db = MySQLPDOTest::factory(); ?> --EXPECTF-- object(PDORow)#%d (2) { - ["queryString"]=> - string(17) "SELECT 1 AS "one"" - ["one"]=> - string(1) "1" + [%u|b%"queryString"]=> + %unicode|string%(17) "SELECT 1 AS "one"" + [%u|b%"one"]=> + %unicode|string%(1) "1" } -string(1) "1" -string(1) "1" -string(17) "SELECT 1 AS "one"" +%unicode|string%(1) "1" +%unicode|string%(1) "1" +%unicode|string%(17) "SELECT 1 AS "one"" ---------------------------------- object(PDORow)#%d (2) { - ["queryString"]=> - string(19) "SELECT id FROM test" - ["id"]=> - string(1) "1" + [%u|b%"queryString"]=> + %unicode|string%(19) "SELECT id FROM test" + [%u|b%"id"]=> + %unicode|string%(1) "1" } -string(19) "SELECT id FROM test" +%unicode|string%(19) "SELECT id FROM test" ---------------------------------- Notice: Trying to get property of non-object in %s on line %d diff --git a/ext/pdo_mysql/tests/bug46292.phpt b/ext/pdo_mysql/tests/bug46292.phpt index 80423bc7a..a0f9716c6 100644 --- a/ext/pdo_mysql/tests/bug46292.phpt +++ b/ext/pdo_mysql/tests/bug46292.phpt @@ -50,32 +50,35 @@ if (version_compare(PHP_VERSION, '5.1.0', '<')) var_dump($stmt->fetch()); var_dump($stmt->fetch()); var_dump($stmt->fetchAll()); - - $pdoDb->query('DROP TABLE IF EXISTS testz'); - +?> +--CLEAN-- +exec('DROP TABLE IF EXISTS testz'); ?> --EXPECTF-- bool(true) myclass::__construct() object(myclass)#%d (1) { - ["value"]=> - string(1) "1" + [%u|b%"value"]=> + %unicode|string%(1) "1" } myclass::__construct() object(myclass2)#%d (1) { - ["value"]=> - string(1) "2" + [%u|b%"value"]=> + %unicode|string%(1) "2" } myclass::__construct() array(2) { [0]=> object(myclass)#%d (1) { - ["value"]=> + [%u|b%"value"]=> NULL } [1]=> object(stdClass)#%d (1) { - ["value"]=> + [%u|b%"value"]=> NULL } } diff --git a/ext/pdo_mysql/tests/bug_33689.phpt b/ext/pdo_mysql/tests/bug_33689.phpt index 88392ef32..5969cae6a 100644 --- a/ext/pdo_mysql/tests/bug_33689.phpt +++ b/ext/pdo_mysql/tests/bug_33689.phpt @@ -34,10 +34,15 @@ else print_r($tmp); ?> +--CLEAN-- + --EXPECTF-- object(PDOStatement)#%d (1) { - ["queryString"]=> - string(18) "SELECT * from test" + [%u|b%"queryString"]=> + %unicode|string%(18) "SELECT * from test" } Array ( diff --git a/ext/pdo_mysql/tests/bug_37445.phpt b/ext/pdo_mysql/tests/bug_37445.phpt index 524a3d080..8e915332d 100644 --- a/ext/pdo_mysql/tests/bug_37445.phpt +++ b/ext/pdo_mysql/tests/bug_37445.phpt @@ -15,7 +15,6 @@ $db = PDOTest::test_factory(dirname(__FILE__) . '/common.phpt'); $db->setAttribute(PDO :: ATTR_EMULATE_PREPARES, true); $stmt = $db->prepare("SELECT 1"); $stmt->bindParam(':a', 'b'); - ?> --EXPECTF-- Fatal error: Cannot pass parameter 2 by reference in %sbug_37445.php on line %d diff --git a/ext/pdo_mysql/tests/bug_39858.phpt b/ext/pdo_mysql/tests/bug_39858.phpt index 6a2124d3b..47457180a 100644 --- a/ext/pdo_mysql/tests/bug_39858.phpt +++ b/ext/pdo_mysql/tests/bug_39858.phpt @@ -62,35 +62,41 @@ bug_39858($db); print "done!"; ?> +--CLEAN-- +exec("DROP PROCEDURE IF EXISTS p"); +?> --EXPECTF-- Emulated Prepared Statements... array(1) { [0]=> array(1) { - ["2 * 2"]=> - string(1) "4" + [%u|b%"2 * 2"]=> + %unicode|string%(1) "4" } } array(1) { [0]=> array(1) { - ["2 * 2"]=> - string(1) "4" + [%u|b%"2 * 2"]=> + %unicode|string%(1) "4" } } Native Prepared Statements... array(1) { [0]=> array(1) { - ["2 * 2"]=> - string(1) "4" + [%u|b%"2 * 2"]=> + %unicode|string%(1) "4" } } array(1) { [0]=> array(1) { - ["2 * 2"]=> - string(1) "4" + [%u|b%"2 * 2"]=> + %unicode|string%(1) "4" } } done! diff --git a/ext/pdo_mysql/tests/bug_41125.phpt b/ext/pdo_mysql/tests/bug_41125.phpt index 1f54cca5f..a1d8dd1ae 100644 --- a/ext/pdo_mysql/tests/bug_41125.phpt +++ b/ext/pdo_mysql/tests/bug_41125.phpt @@ -22,6 +22,7 @@ if ($version < 40100) exec("DROP TABLE IF EXISTS test"); // And now allow the evil to do his work $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, 1); @@ -37,6 +38,12 @@ do { print "done!"; ?> +--CLEAN-- +exec("DROP TABLE IF EXISTS test"); +?> --EXPECTF-- Warning: PDOStatement::fetchAll(): SQLSTATE[HY000]: General error in %s on line %d array(0) { diff --git a/ext/pdo_mysql/tests/bug_41698.phpt b/ext/pdo_mysql/tests/bug_41698.phpt index b2dee60d7..890ba7761 100644 --- a/ext/pdo_mysql/tests/bug_41698.phpt +++ b/ext/pdo_mysql/tests/bug_41698.phpt @@ -22,16 +22,16 @@ $stmt = $db->prepare('INSERT INTO test VALUES(?)'); $stmt->execute(array($value)); var_dump($db->query('SELECT * from test')->fetchAll(PDO::FETCH_ASSOC)); ?> ---EXPECT-- +--EXPECTF-- array(2) { [0]=> array(1) { - ["floatval"]=> - string(8) "2.340000" + [%u|b%"floatval"]=> + %unicode|string%(8) "2.340000" } [1]=> array(1) { - ["floatval"]=> - string(8) "4.560000" + [%u|b%"floatval"]=> + %unicode|string%(8) "4.560000" } } \ No newline at end of file diff --git a/ext/pdo_mysql/tests/bug_41997.phpt b/ext/pdo_mysql/tests/bug_41997.phpt index c48a641f9..ee0cfe9ac 100644 --- a/ext/pdo_mysql/tests/bug_41997.phpt +++ b/ext/pdo_mysql/tests/bug_41997.phpt @@ -38,17 +38,17 @@ var_dump($stmt->fetchAll(PDO::FETCH_ASSOC)); var_dump($stmt->errorInfo()); print "done!"; ?> ---EXPECT-- +--EXPECTF-- array(1) { [0]=> array(1) { - ["one"]=> - string(1) "1" + [%u|b%"one"]=> + %unicode|string%(1) "1" } } array(3) { [0]=> - string(5) "00000" + %unicode|string%(5) "00000" [1]=> NULL [2]=> @@ -57,13 +57,13 @@ array(3) { array(1) { [0]=> array(1) { - ["two"]=> - string(1) "2" + [%u|b%"two"]=> + %unicode|string%(1) "2" } } array(3) { [0]=> - string(5) "00000" + %unicode|string%(5) "00000" [1]=> NULL [2]=> diff --git a/ext/pdo_mysql/tests/bug_42499.phpt b/ext/pdo_mysql/tests/bug_42499.phpt index 4fcea874b..dece019a9 100644 --- a/ext/pdo_mysql/tests/bug_42499.phpt +++ b/ext/pdo_mysql/tests/bug_42499.phpt @@ -61,8 +61,8 @@ Emulated Prepared Statements... array(1) { [0]=> array(1) { - ["_id"]=> - string(1) "a" + [%u|b%"_id"]=> + %unicode|string%(1) "a" } } @@ -71,8 +71,8 @@ Native Prepared Statements... array(1) { [0]=> array(1) { - ["_id"]=> - string(1) "a" + [%u|b%"_id"]=> + %unicode|string%(1) "a" } } diff --git a/ext/pdo_mysql/tests/bug_44454.phpt b/ext/pdo_mysql/tests/bug_44454.phpt index e8f91a00a..7ad7f8545 100644 --- a/ext/pdo_mysql/tests/bug_44454.phpt +++ b/ext/pdo_mysql/tests/bug_44454.phpt @@ -63,9 +63,15 @@ bug_44454($db); print "done!"; ?> +--CLEAN-- +exec('DROP TABLE IF EXISTS test'); +?> --XFAIL-- For some reason the exception gets thrown at the wrong place ---EXPECT-- +--EXPECTF-- Native Prepared Statements ... SELECT has returned 1 row... ... INSERT should fail... diff --git a/ext/pdo_mysql/tests/bug_44707.phpt b/ext/pdo_mysql/tests/bug_44707.phpt index d5d4539fc..18c81040f 100644 --- a/ext/pdo_mysql/tests/bug_44707.phpt +++ b/ext/pdo_mysql/tests/bug_44707.phpt @@ -73,7 +73,7 @@ bug_44707($db); print "done!"; ?> ---EXPECT-- +--EXPECTF-- Native Prepared Statements bool(false) bool(false) @@ -83,10 +83,10 @@ array(0) { array(1) { [0]=> array(2) { - ["id"]=> - string(1) "1" - ["mybool"]=> - string(1) "0" + [%u|b%"id"]=> + %unicode|string%(1) "1" + [%u|b%"mybool"]=> + %unicode|string%(1) "0" } } done! diff --git a/ext/pdo_mysql/tests/bug_45120.phpt b/ext/pdo_mysql/tests/bug_45120.phpt index 0e46d5eaf..db5da823f 100644 --- a/ext/pdo_mysql/tests/bug_45120.phpt +++ b/ext/pdo_mysql/tests/bug_45120.phpt @@ -42,8 +42,6 @@ bug_45120($db); print "done!"; ?> ---XFAIL-- -This is an open PDO bug. It is not a PDO_MYSQL bug --EXPECT-- Emulated Prepared Statements Native Prepared Statements diff --git a/ext/pdo_mysql/tests/bug_50323.phpt b/ext/pdo_mysql/tests/bug_50323.phpt new file mode 100644 index 000000000..02050fac5 --- /dev/null +++ b/ext/pdo_mysql/tests/bug_50323.phpt @@ -0,0 +1,61 @@ +--TEST-- +Bug #50323 (No ability to connect to database named 't;', no chance to escape semicolon) +--SKIPIF-- + +--FILE-- + $v) { + $tmp = explode('=', $v); + if (count($tmp) == 2) + $old_options[$tmp[0]] = $tmp[1]; + } + + $options = $old_options; + foreach ($new_options as $k => $v) + $options[$k] = $v; + + $dsn = 'mysql:'; + foreach ($options as $k => $v) + $dsn .= sprintf('%s=%s;', $k, $v); + + $dsn = substr($dsn, 0, strlen($dsn) -1); + + return $dsn; + } + + +if (1 === @$db->exec('CREATE DATABASE `crazy;dbname`')) { + $dsn = changeDSN(getenv('PDOTEST_DSN'), array('dbname' => 'crazy;;dbname')); + $user = getenv('PDOTEST_USER'); + $pass = getenv('PDOTEST_PASS'); + + new PDO($dsn, $user, $pass); +} +echo 'done!'; +?> +--CLEAN-- +exec('DROP DATABASE IF EXISTS `crazy;dbname`'); +?> +--EXPECTF-- +done! + diff --git a/ext/pdo_mysql/tests/bug_pecl_12925.phpt b/ext/pdo_mysql/tests/bug_pecl_12925.phpt index 1e7cea5e4..1867868ec 100644 --- a/ext/pdo_mysql/tests/bug_pecl_12925.phpt +++ b/ext/pdo_mysql/tests/bug_pecl_12925.phpt @@ -42,21 +42,21 @@ bug_pecl_1295($db); $db->exec('DROP TABLE IF EXISTS test'); print "done!"; ?> ---EXPECT-- +--EXPECTF-- Emulated... array(1) { [0]=> array(1) { - ["id"]=> - string(1) "c" + [%u|b%"id"]=> + %unicode|string%(1) "c" } } Native... array(1) { [0]=> array(1) { - ["id"]=> - string(1) "c" + [%u|b%"id"]=> + %unicode|string%(1) "c" } } done! \ No newline at end of file diff --git a/ext/pdo_mysql/tests/bug_pecl_7976.phpt b/ext/pdo_mysql/tests/bug_pecl_7976.phpt index 24e934f86..5f585bd01 100644 --- a/ext/pdo_mysql/tests/bug_pecl_7976.phpt +++ b/ext/pdo_mysql/tests/bug_pecl_7976.phpt @@ -48,40 +48,45 @@ $db = MySQLPDOTest::factory(); $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, 0); bug_pecl_7976($db); -$db->exec('DROP PROCEDURE IF EXISTS p'); print "done!"; ?> +--CLEAN-- +exec('DROP PROCEDURE IF EXISTS p'); +?> --XFAIL-- Works with mysqlnd. It is not supported by libmysql. For libmysql is good enough to see no crash. ---EXPECT-- +--EXPECTF-- Emulated... array(1) { [0]=> array(1) { - ["_one"]=> - string(1) "1" + [%u|b%"_one"]=> + %unicode|string%(1) "1" } } array(1) { [0]=> array(1) { - ["_one"]=> - string(1) "1" + [%u|b%"_one"]=> + %unicode|string%(1) "1" } } Native... array(1) { [0]=> array(1) { - ["_one"]=> - string(1) "1" + [%u|b%"_one"]=> + %unicode|string%(1) "1" } } array(1) { [0]=> array(1) { - ["_one"]=> - string(1) "1" + [%u|b%"_one"]=> + %unicode|string%(1) "1" } } done! diff --git a/ext/pdo_mysql/tests/mysql_pdo_test.inc b/ext/pdo_mysql/tests/mysql_pdo_test.inc index aa98d1464..736791933 100644 --- a/ext/pdo_mysql/tests/mysql_pdo_test.inc +++ b/ext/pdo_mysql/tests/mysql_pdo_test.inc @@ -158,5 +158,12 @@ class MySQLPDOTest extends PDOTest { return (bool)preg_match('/Client API version.*mysqlnd/', $tmp); } + static function dropTestTable($db = NULL) { + if (is_null($db)) + $db = self::factory(); + + $db->exec('DROP TABLE IF EXISTS test'); + } + } -?> +?> \ No newline at end of file diff --git a/ext/pdo_mysql/tests/pdo_mysql___construct.phpt b/ext/pdo_mysql/tests/pdo_mysql___construct.phpt index 8602a4971..46015533d 100644 --- a/ext/pdo_mysql/tests/pdo_mysql___construct.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql___construct.phpt @@ -101,7 +101,8 @@ MySQLPDOTest::skip(); } // what about long values for a valid option ... - $dsn = MySQLPDOTest::getDSN(array('host' => str_repeat('0123456789', 1024 * 100))); + // hostnames > 1024 chars break on some NIS-enabled FreeBSD... + $dsn = MySQLPDOTest::getDSN(array('host' => str_repeat('0123456789', 100))); try { $db = @new PDO($dsn, $user, $pass); assert(false); printf("%s\n", $dsn); } catch (PDOException $e) { $tmp = $e->getMessage(); if (!stristr($tmp, 'HY000') && !stristr($tmp, '2005') && !stristr($tmp, '2002')) @@ -285,6 +286,7 @@ MySQLPDOTest::skip(); } print "done!"; +?> --EXPECTF-- [002] invalid data source name, [n/a] n/a [003] invalid data source name, [n/a] n/a @@ -295,4 +297,4 @@ MySQLPDOTest::skip(); [009] SQLSTATE[28000] [1045] Access denied for user 'dont%s'@'%s' (using password: YES), [n/a] n/a [010] SQLSTATE[28000] [1045] Access denied for user 'dont%s'@'%s' (using password: YES), [n/a] n/a [017] DSN=%s, SQLSTATE[%s] [%d] %s -[033] DSN = mysql:%s, character sets has not been set, @@character_set_connection reports 'latin1', expecting 'latin2'done! \ No newline at end of file +[033] DSN = mysql:%s, character sets has not been set, @@character_set_connection reports 'latin1', expecting 'latin2'done! diff --git a/ext/pdo_mysql/tests/pdo_mysql___construct_ini.phpt b/ext/pdo_mysql/tests/pdo_mysql___construct_ini.phpt index 5bd824b81..14f81a66f 100644 --- a/ext/pdo_mysql/tests/pdo_mysql___construct_ini.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql___construct_ini.phpt @@ -8,7 +8,6 @@ MySQLPDOTest::skip(); /* TODO - fix this limitation */ if (getenv('PDO_MYSQL_TEST_DSN') !== "mysql:dbname=phptest;unix_socket=/tmp/mysql.sock") die("skip Fix test to run in other environments as well!"); - ?> --INI-- pdo.dsn.mysql="mysql:dbname=phptest;socket=/tmp/mysql.sock" @@ -51,6 +50,7 @@ pdo.dsn.mysql="mysql:dbname=phptest;socket=/tmp/mysql.sock" } print "done!"; +?> --EXPECTF-- pdo.dsn.mysql cannot be accessed through ini_get_all()/ini_get() done! \ No newline at end of file diff --git a/ext/pdo_mysql/tests/pdo_mysql___construct_options.phpt b/ext/pdo_mysql/tests/pdo_mysql___construct_options.phpt index 8bd714d69..c0df4a512 100644 --- a/ext/pdo_mysql/tests/pdo_mysql___construct_options.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql___construct_options.phpt @@ -46,6 +46,8 @@ require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'skipif.inc'); PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => 'PDO::MYSQL_ATTR_USE_BUFFERED_QUERY', PDO::MYSQL_ATTR_LOCAL_INFILE => 'PDO::MYSQL_ATTR_LOCAL_INFILE', PDO::MYSQL_ATTR_DIRECT_QUERY => 'PDO::MYSQL_ATTR_DIRECT_QUERY', + + PDO::MYSQL_ATTR_INIT_COMMAND => 'PDO::MYSQL_ATTR_INIT_COMMAND', ); $defaults = array( @@ -59,6 +61,7 @@ require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'skipif.inc'); PDO::MYSQL_ATTR_LOCAL_INFILE => false, /* TODO getAttribute() does not handle it */ PDO::MYSQL_ATTR_DIRECT_QUERY => 1, + PDO::MYSQL_ATTR_INIT_COMMAND => '', ); if (NULL !== ($db = @new PDO($dsn, $user, $pass, 'wrong type'))) @@ -140,6 +143,10 @@ require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'skipif.inc'); set_option_and_check(21, PDO::MYSQL_ATTR_LOCAL_INFILE, true, 'PDO::MYSQL_ATTR_LOCAL_INFILE'); set_option_and_check(22, PDO::MYSQL_ATTR_LOCAL_INFILE, false, 'PDO::MYSQL_ATTR_LOCAL_INFILE'); + set_option_and_check(23, PDO::MYSQL_ATTR_INIT_COMMAND, 'SET @a=1', 'PDO::MYSQL_ATTR_INIT_COMMAND'); + set_option_and_check(24, PDO::MYSQL_ATTR_INIT_COMMAND, '', 'PDO::MYSQL_ATTR_INIT_COMMAND'); + set_option_and_check(25, PDO::MYSQL_ATTR_INIT_COMMAND, 'INSERT INTO nonexistent(invalid) VALUES (1)', 'PDO::MYSQL_ATTR_INIT_COMMAND'); + set_option_and_check(33, PDO::MYSQL_ATTR_DIRECT_QUERY, 1, 'PDO::MYSQL_ATTR_DIRECT_QUERY'); set_option_and_check(34, PDO::MYSQL_ATTR_DIRECT_QUERY, 0, 'PDO::MYSQL_ATTR_DIRECT_QUERY'); @@ -151,9 +158,11 @@ require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'skipif.inc'); } print "done!"; +?> --EXPECTF-- [003] [TODO][CHANGEREQUEST] Please, lets not ignore invalid options and bail out! [003a] Expecting default value for 'PDO::ATTR_EMULATE_PREPARES' of '1'/integer, getAttribute() reports setting ''/boolean +[003a] Expecting default value for 'PDO::MYSQL_ATTR_INIT_COMMAND' of ''/string, getAttribute() reports setting ''/boolean Warning: PDO::getAttribute(): SQLSTATE[IM001]: Driver does not support this function: driver does not support that attribute in %s on line %d [010] [TODO][CHANGEREQUEST] ATTR_EMULATE_PREPARES should be on @@ -167,4 +176,7 @@ Warning: PDO::getAttribute(): SQLSTATE[IM001]: Driver does not support this func Warning: PDO::getAttribute(): SQLSTATE[IM001]: Driver does not support this function: driver does not support that attribute in %s on line %d [018] PDO::MYSQL_ATTR_DIRECT_QUERY should be off [021] Execting '1'/boolean got ''/boolean' for options 'PDO::MYSQL_ATTR_LOCAL_INFILE' -done! \ No newline at end of file +[023] Execting 'SET @a=1'/string got ''/boolean' for options 'PDO::MYSQL_ATTR_INIT_COMMAND' +[024] SQLSTATE[42000] [1065] Query was empty +[025] SQLSTATE[42S02] [1146] Table 'test.nonexistent' doesn't exist +done! diff --git a/ext/pdo_mysql/tests/pdo_mysql___construct_options_libmysql.phpt b/ext/pdo_mysql/tests/pdo_mysql___construct_options_libmysql.phpt index 8a8e347a6..4c9e41437 100644 --- a/ext/pdo_mysql/tests/pdo_mysql___construct_options_libmysql.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql___construct_options_libmysql.phpt @@ -59,10 +59,6 @@ if (MySQLPDOTest::isPDOMySQLnd()) $tmp, gettype($tmp)); } - set_option_and_check(23, PDO::MYSQL_ATTR_INIT_COMMAND, 'SET @a=1', 'PDO::MYSQL_ATTR_INIT_COMMAND'); - set_option_and_check(24, PDO::MYSQL_ATTR_INIT_COMMAND, '', 'PDO::MYSQL_ATTR_INIT_COMMAND'); - set_option_and_check(25, PDO::MYSQL_ATTR_INIT_COMMAND, 'INSERT INTO nonexistent(invalid) VALUES (1)', 'PDO::MYSQL_ATTR_INIT_COMMAND'); - set_option_and_check(26, PDO::MYSQL_ATTR_READ_DEFAULT_FILE, true, 'PDO::MYSQL_ATTR_READ_DEFAULT_FILE'); set_option_and_check(27, PDO::MYSQL_ATTR_READ_DEFAULT_FILE, false, 'PDO::MYSQL_ATTR_READ_DEFAULT_FILE'); @@ -79,10 +75,8 @@ if (MySQLPDOTest::isPDOMySQLnd()) } print "done!"; +?> --EXPECTF-- [001] Expecting default value for 'PDO::MYSQL_ATTR_INIT_COMMAND' of ''/string, getAttribute() reports setting ''/boolean -[023] Execting 'SET @a=1'/string got ''/boolean' for options 'PDO::MYSQL_ATTR_INIT_COMMAND' -[024] SQLSTATE[42000] [1065] Query was empty -[025] SQLSTATE[42S02] [1146] Table '%snonexistent' doesn't exist [026] Execting '1'/boolean got ''/boolean' for options 'PDO::MYSQL_ATTR_READ_DEFAULT_FILE' done! diff --git a/ext/pdo_mysql/tests/pdo_mysql___construct_uri.phpt b/ext/pdo_mysql/tests/pdo_mysql___construct_uri.phpt index 87e1a1ee0..7e92ff2e9 100644 --- a/ext/pdo_mysql/tests/pdo_mysql___construct_uri.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql___construct_uri.phpt @@ -66,6 +66,7 @@ MySQLPDOTest::skip(); } print "done!"; +?> --EXPECTF-- Warning: PDO::__construct(%s [002] URI=uri:file:%spdomuri.tst, DSN=mysql%sdbname=%s, File=%spdomuri.tst (%d bytes, 'mysql%sdbname=%s'), invalid data source URI diff --git a/ext/pdo_mysql/tests/pdo_mysql_attr_autocommit.phpt b/ext/pdo_mysql/tests/pdo_mysql_attr_autocommit.phpt index b48952875..b1e5507f6 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_attr_autocommit.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_attr_autocommit.phpt @@ -87,7 +87,12 @@ $db = MySQLPDOTest::factory(); } - $db->exec(sprintf('DROP TABLE IF EXISTS test')); print "done!"; +?> +--CLEAN-- + --EXPECTF-- done! \ No newline at end of file diff --git a/ext/pdo_mysql/tests/pdo_mysql_attr_case.phpt b/ext/pdo_mysql/tests/pdo_mysql_attr_case.phpt index c7a203727..618d9e65e 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_attr_case.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_attr_case.phpt @@ -81,86 +81,91 @@ $db = MySQLPDOTest::factory(); var_export($db->errorInfo(), true), var_export($db->errorCode(), true)); var_dump($stmt->fetchAll(PDO::FETCH_BOTH)); - - $db->exec(sprintf('DROP TABLE IF EXISTS test')); + print "done!"; +?> +--CLEAN-- + --EXPECTF-- -string(15) "PDO::CASE_LOWER" +%unicode|string%(15) "PDO::CASE_LOWER" array(2) { [0]=> array(6) { - ["id"]=> - string(1) "1" + [%u|b%"id"]=> + %unicode|string%(1) "1" [0]=> - string(1) "1" - ["id_upper"]=> - string(1) "1" + %unicode|string%(1) "1" + [%u|b%"id_upper"]=> + %unicode|string%(1) "1" [1]=> - string(1) "1" - ["label"]=> - string(1) "a" + %unicode|string%(1) "1" + [%u|b%"label"]=> + %unicode|string%(1) "a" [2]=> - string(1) "a" + %unicode|string%(1) "a" } [1]=> array(6) { - ["id"]=> - string(1) "2" + [%u|b%"id"]=> + %unicode|string%(1) "2" [0]=> - string(1) "2" - ["id_upper"]=> - string(1) "2" + %unicode|string%(1) "2" + [%u|b%"id_upper"]=> + %unicode|string%(1) "2" [1]=> - string(1) "2" - ["label"]=> - string(1) "b" + %unicode|string%(1) "2" + [%u|b%"label"]=> + %unicode|string%(1) "b" [2]=> - string(1) "b" + %unicode|string%(1) "b" } } array(2) { [0]=> array(10) { - ["id"]=> - string(1) "1" + [%u|b%"id"]=> + %unicode|string%(1) "1" [0]=> - string(1) "1" - ["id_upper"]=> - string(1) "1" + %unicode|string%(1) "1" + [%u|b%"id_upper"]=> + %unicode|string%(1) "1" [1]=> - string(1) "1" - ["label"]=> - string(1) "a" + %unicode|string%(1) "1" + [%u|b%"label"]=> + %unicode|string%(1) "a" [2]=> - string(1) "a" - ["mixed"]=> + %unicode|string%(1) "a" + [%u|b%"mixed"]=> NULL [3]=> NULL - ["myupper"]=> + [%u|b%"myupper"]=> NULL [4]=> NULL } [1]=> array(10) { - ["id"]=> - string(1) "2" + [%u|b%"id"]=> + %unicode|string%(1) "2" [0]=> - string(1) "2" - ["id_upper"]=> - string(1) "2" + %unicode|string%(1) "2" + [%u|b%"id_upper"]=> + %unicode|string%(1) "2" [1]=> - string(1) "2" - ["label"]=> - string(1) "b" + %unicode|string%(1) "2" + [%u|b%"label"]=> + %unicode|string%(1) "b" [2]=> - string(1) "b" - ["mixed"]=> + %unicode|string%(1) "b" + [%u|b%"mixed"]=> NULL [3]=> NULL - ["myupper"]=> + [%u|b%"myupper"]=> NULL [4]=> NULL @@ -169,23 +174,23 @@ array(2) { array(1) { [0]=> array(10) { - ["ID"]=> - string(1) "1" + [%u|b%"ID"]=> + %unicode|string%(1) "1" [0]=> - string(1) "1" - ["LABEL"]=> - string(1) "a" + %unicode|string%(1) "1" + [%u|b%"LABEL"]=> + %unicode|string%(1) "a" [1]=> - string(1) "a" - ["MIXED"]=> + %unicode|string%(1) "a" + [%u|b%"MIXED"]=> NULL [2]=> NULL - ["MYUPPER"]=> + [%u|b%"MYUPPER"]=> NULL [3]=> NULL - ["LOWER"]=> + [%u|b%"LOWER"]=> NULL [4]=> NULL @@ -194,26 +199,26 @@ array(1) { array(1) { [0]=> array(10) { - ["id"]=> - string(1) "1" + [%u|b%"id"]=> + %unicode|string%(1) "1" [0]=> - string(1) "1" - ["label"]=> - string(1) "a" + %unicode|string%(1) "1" + [%u|b%"label"]=> + %unicode|string%(1) "a" [1]=> - string(1) "a" - ["MiXeD"]=> + %unicode|string%(1) "a" + [%u|b%"MiXeD"]=> NULL [2]=> NULL - ["MYUPPER"]=> + [%u|b%"MYUPPER"]=> NULL [3]=> NULL - ["ID"]=> - string(1) "1" + [%u|b%"ID"]=> + %unicode|string%(1) "1" [4]=> - string(1) "1" + %unicode|string%(1) "1" } } done! \ No newline at end of file diff --git a/ext/pdo_mysql/tests/pdo_mysql_attr_client_version.phpt b/ext/pdo_mysql/tests/pdo_mysql_attr_client_version.phpt index e3f21fbaf..2d939635c 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_attr_client_version.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_attr_client_version.phpt @@ -32,5 +32,6 @@ $db = MySQLPDOTest::factory(); printf("[003] Did we change it from '%s' to '%s'?\n", $version, $new_version); print "done!"; +?> --EXPECTF-- done! \ No newline at end of file diff --git a/ext/pdo_mysql/tests/pdo_mysql_attr_connection_status.phpt b/ext/pdo_mysql/tests/pdo_mysql_attr_connection_status.phpt index 038df3cdb..187f9ec23 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_attr_connection_status.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_attr_connection_status.phpt @@ -32,5 +32,6 @@ $db = MySQLPDOTest::factory(); printf("[005] Connection status should not have changed\n"); print "done!"; +?> --EXPECTF-- done! \ No newline at end of file diff --git a/ext/pdo_mysql/tests/pdo_mysql_attr_driver_name.phpt b/ext/pdo_mysql/tests/pdo_mysql_attr_driver_name.phpt index 0c156e4d1..8661dda59 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_attr_driver_name.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_attr_driver_name.phpt @@ -25,6 +25,7 @@ $db = MySQLPDOTest::factory(); printf("[002] Did we change it from '%s' to '%s'?\n", $name, $new_name); print "done!"; +?> --EXPECTF-- -string(5) "mysql" +%unicode|string%(5) "mysql" done! \ No newline at end of file diff --git a/ext/pdo_mysql/tests/pdo_mysql_attr_fetch_table_names.phpt b/ext/pdo_mysql/tests/pdo_mysql_attr_fetch_table_names.phpt index 3b2b0929e..b9a4fc934 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_attr_fetch_table_names.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_attr_fetch_table_names.phpt @@ -23,19 +23,20 @@ MySQLPDOTest::skip(); $stmt->closeCursor(); print "done!"; +?> --EXPECTF-- array(1) { [0]=> array(1) { - ["test.label"]=> - string(1) "a" + [%u|b%"test.label"]=> + %unicode|string%(1) "a" } } array(1) { [0]=> array(1) { - ["label"]=> - string(1) "a" + [%u|b%"label"]=> + %unicode|string%(1) "a" } } done! diff --git a/ext/pdo_mysql/tests/pdo_mysql_attr_init_command.phpt b/ext/pdo_mysql/tests/pdo_mysql_attr_init_command.phpt index 8d086b7cc..89e6f386e 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_attr_init_command.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_attr_init_command.phpt @@ -33,7 +33,8 @@ error_reporting=E_ALL var_dump($stmt->fetchAll(PDO::FETCH_ASSOC)); $db->exec(sprintf('DROP TABLE IF EXISTS %s', $table)); - print "done!\n"; + print "done!"; +?> --EXPECTF-- %unicode|string%(58) "CREATE TABLE test_%s(id INT)" %unicode|string%(5) "00000" diff --git a/ext/pdo_mysql/tests/pdo_mysql_attr_max_buffer_size.phpt b/ext/pdo_mysql/tests/pdo_mysql_attr_max_buffer_size.phpt index 9ba8dee85..115103df7 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_attr_max_buffer_size.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_attr_max_buffer_size.phpt @@ -62,6 +62,13 @@ if (MySQLPDOTest::isPDOMySQLnd()) try_buffer_size(4, 2000); print "done!"; +?> +--CLEAN-- +exec('DROP TABLE IF EXISTS test'); +?> --EXPECTF-- [001] id = 1, val = 0123456789... (length: %d) [002] id = 1, val = 0123456789... (length: 1000) diff --git a/ext/pdo_mysql/tests/pdo_mysql_attr_oracle_nulls.phpt b/ext/pdo_mysql/tests/pdo_mysql_attr_oracle_nulls.phpt index 9e938ef6a..cdc0b2643 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_attr_oracle_nulls.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_attr_oracle_nulls.phpt @@ -80,41 +80,42 @@ MySQLPDOTest::skip(); @$db->exec('DROP PROCEDURE IF EXISTS p'); print "done!"; +?> --EXPECTF-- [002] Maybe PDO could indicate that this is not a proper way of setting ATTR_ORACLE_NULLS... [003] Maybe PDO could indicate that this is not a proper way of setting ATTR_ORACLE_NULLS... array(1) { [0]=> array(6) { - ["z"]=> + [%u|b%"z"]=> NULL - ["a"]=> + [%u|b%"a"]=> NULL - ["b"]=> - string(1) " " - ["c"]=> + [%u|b%"b"]=> + %unicode|string%(1) " " + [%u|b%"c"]=> NULL - ["d"]=> - string(2) " d" - ["e"]=> - string(3) "%se" + [%u|b%"d"]=> + %unicode|string%(2) " d" + [%u|b%"e"]=> + %unicode|string%(3) "%se" } } array(1) { [0]=> array(6) { - ["z"]=> + [%u|b%"z"]=> NULL - ["a"]=> - string(0) "" - ["b"]=> - string(1) " " - ["c"]=> - string(0) "" - ["d"]=> - string(2) " d" - ["e"]=> - string(3) "%se" + [%u|b%"a"]=> + %unicode|string%(0) "" + [%u|b%"b"]=> + %unicode|string%(1) " " + [%u|b%"c"]=> + %unicode|string%(0) "" + [%u|b%"d"]=> + %unicode|string%(2) " d" + [%u|b%"e"]=> + %unicode|string%(3) "%se" } } done! \ No newline at end of file diff --git a/ext/pdo_mysql/tests/pdo_mysql_attr_server_version.phpt b/ext/pdo_mysql/tests/pdo_mysql_attr_server_version.phpt index 07bb8c39f..a59a6b0cc 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_attr_server_version.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_attr_server_version.phpt @@ -60,5 +60,6 @@ $db = MySQLPDOTest::factory(); printf("[010] Did we change it from '%s' to '%s'?\n", $version, $new_version); print "done!"; +?> --EXPECTF-- done! \ No newline at end of file diff --git a/ext/pdo_mysql/tests/pdo_mysql_attr_statement_class.phpt b/ext/pdo_mysql/tests/pdo_mysql_attr_statement_class.phpt index d077f6ebf..631a918dd 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_attr_statement_class.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_attr_statement_class.phpt @@ -106,10 +106,11 @@ $db = MySQLPDOTest::factory(); $stmt = $db->query('SELECT id, label FROM test ORDER BY id ASC LIMIT 1'); print "done!"; +?> --EXPECTF-- array(1) { [0]=> - string(12) "PDOStatement" + %unicode|string%(12) "PDOStatement" } Warning: PDO::setAttribute(): SQLSTATE[HY000]: General error: PDO::ATTR_STATEMENT_CLASS requires format array(classname, array(ctor_args)); the classname must be a string specifying an existing class in %s on line %d @@ -125,29 +126,29 @@ Warning: PDO::setAttribute(): SQLSTATE[HY000]: General error: user-supplied stat Warning: PDO::setAttribute(): SQLSTATE[HY000]: General error in %s on line %d array(2) { [0]=> - string(12) "mystatement4" + %unicode|string%(12) "mystatement4" [1]=> array(1) { [0]=> - string(6) "param1" + %unicode|string%(6) "param1" } } mystatement4 -string(6) "param1" +%unicode|string%(6) "param1" mystatement5 -string(12) "mystatement5" -string(10) "no data :)" +%unicode|string%(12) "mystatement5" +%unicode|string%(10) "no data :)" array(1) { [0]=> array(4) { - ["id"]=> - string(1) "1" + [%u|b%"id"]=> + %unicode|string%(1) "1" [0]=> - string(1) "1" - ["label"]=> - string(1) "a" + %unicode|string%(1) "1" + [%u|b%"label"]=> + %unicode|string%(1) "a" [1]=> - string(1) "a" + %unicode|string%(1) "a" } } diff --git a/ext/pdo_mysql/tests/pdo_mysql_begintransaction.phpt b/ext/pdo_mysql/tests/pdo_mysql_begintransaction.phpt index 30aecf4b5..8871a3170 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_begintransaction.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_begintransaction.phpt @@ -120,7 +120,7 @@ if (false == MySQLPDOTest::detect_transactional_mysql_engine($db)) $tmp = $stmt->fetch(PDO::FETCH_ASSOC); if ($tmp['auto_commit'] != 0) printf("[026] Autocommit mode of the MySQL Server should be off, got '%s', [%d] %s\n", - $tmp['auto_commit'], $stmt->errorCode(), implode(' ', $stmt->errorInfo())); + $tmp['auto_commit'], $stmt->errorCode(), trim(implode(' ', $stmt->errorInfo()))); $db->commit(); // Now we should be back to autocommit - we've issues a commit @@ -179,23 +179,28 @@ if (false == MySQLPDOTest::detect_transactional_mysql_engine($db)) if (1 != $db->exec('DELETE FROM test')) printf("[038] No rows deleted, can't be true.\n"); - $db->exec(sprintf('DROP TABLE IF EXISTS test')); print "done!"; +?> +--CLEAN-- + --EXPECTF-- array(2) { - ["id"]=> - string(1) "1" - ["label"]=> - string(1) "a" + [%u|b%"id"]=> + %unicode|string%(1) "1" + [%u|b%"label"]=> + %unicode|string%(1) "a" } bool(false) array(2) { - ["id"]=> - string(1) "1" - ["label"]=> - string(1) "z" + [%u|b%"id"]=> + %unicode|string%(1) "1" + [%u|b%"label"]=> + %unicode|string%(1) "z" } -[026] Autocommit mode of the MySQL Server should be off, got '1', [0] 00000 +[026] Autocommit mode of the MySQL Server should be off, got '1', [0] 00000 [028] I'm confused, how can autocommit be on? Didn't I say I want to manually control transactions? -string(5) "00000" +%unicode|string%(5) "00000" done! diff --git a/ext/pdo_mysql/tests/pdo_mysql_bit.phpt b/ext/pdo_mysql/tests/pdo_mysql_bit.phpt index 18506acef..899231a21 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_bit.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_bit.phpt @@ -35,7 +35,6 @@ if (MySQLPDOTest::isPDOMySQLnd()) var_dump($row); var_dump($value); - return true; } @@ -48,12 +47,18 @@ if (MySQLPDOTest::isPDOMySQLnd()) echo "done!\n"; ?> +--CLEAN-- +exec('DROP TABLE IF EXISTS test'); +?> --EXPECTF-- array(2) { - ["id"]=> - string(2) "20" - ["label"]=> - string(1) "1" + [%u|b%"id"]=> + %unicode|string%(2) "20" + [%u|b%"label"]=> + %unicode|string%(1) "1" } int(1) done! \ No newline at end of file diff --git a/ext/pdo_mysql/tests/pdo_mysql_class_constants.phpt b/ext/pdo_mysql/tests/pdo_mysql_class_constants.phpt index b09c1a586..9200d7bbd 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_class_constants.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_class_constants.phpt @@ -12,16 +12,16 @@ require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'skipif.inc'); 'MYSQL_ATTR_USE_BUFFERED_QUERY' => true, 'MYSQL_ATTR_LOCAL_INFILE' => true, 'MYSQL_ATTR_DIRECT_QUERY' => true, - 'MYSQL_ATTR_FOUND_ROWS' => true, + 'MYSQL_ATTR_FOUND_ROWS' => true, 'MYSQL_ATTR_IGNORE_SPACE' => true, + 'MYSQL_ATTR_INIT_COMMAND' => true, ); if (!MySQLPDOTest::isPDOMySQLnd()) { $expected['MYSQL_ATTR_MAX_BUFFER_SIZE'] = true; - $expected['MYSQL_ATTR_INIT_COMMAND'] = true; $expected['MYSQL_ATTR_READ_DEFAULT_FILE'] = true; $expected['MYSQL_ATTR_READ_DEFAULT_GROUP'] = true; - $expected['MYSQL_ATTR_COMPRESS'] = true; + $expected['MYSQL_ATTR_COMPRESS'] = true; } /* diff --git a/ext/pdo_mysql/tests/pdo_mysql_commit.phpt b/ext/pdo_mysql/tests/pdo_mysql_commit.phpt index 056c0e023..e213f66ea 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_commit.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_commit.phpt @@ -78,7 +78,13 @@ if (false == MySQLPDOTest::detect_transactional_mysql_engine($db)) $db->errorCode(), implode(' ', $db->errorInfo())); } - $db->exec(sprintf('DROP TABLE IF EXISTS test_commit')); print "done!"; +--CLEAN-- +exec('DROP TABLE IF EXISTS test_commit'); +MySQLPDOTest::dropTestTable($db); +?> --EXPECT-- done! \ No newline at end of file diff --git a/ext/pdo_mysql/tests/pdo_mysql_errorcode.phpt b/ext/pdo_mysql/tests/pdo_mysql_errorcode.phpt index 35056a74d..b970c4ef9 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_errorcode.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_errorcode.phpt @@ -75,7 +75,12 @@ $db = MySQLPDOTest::factory(); $e->getMessage(), $db->errorCode(), implode(' ', $db->errorInfo())); } - $db->exec('DROP TABLE IF EXISTS test'); print "done!"; +?> +--CLEAN-- + --EXPECTF-- done! \ No newline at end of file diff --git a/ext/pdo_mysql/tests/pdo_mysql_errorinfo.phpt b/ext/pdo_mysql/tests/pdo_mysql_errorinfo.phpt index 99b2b846b..93e1fbf1a 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_errorinfo.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_errorinfo.phpt @@ -29,8 +29,6 @@ $db = MySQLPDOTest::factory(); printf("[%03d] Driver-specific error message.not set\n", $offset); } - - } function pdo_mysql_errorinfo($db, $offset) { @@ -96,9 +94,13 @@ $db = MySQLPDOTest::factory(); printf("Native Prepared Statements...\n"); pdo_mysql_errorinfo($db, 20); - $db->exec('DROP TABLE IF EXISTS test'); print "done!"; ?> +--CLEAN-- + --EXPECTF-- Emulated Prepared Statements... [015] Driver-specific error code not set diff --git a/ext/pdo_mysql/tests/pdo_mysql_exec.phpt b/ext/pdo_mysql/tests/pdo_mysql_exec.phpt index 5ca5f4479..381a2b51d 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_exec.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_exec.phpt @@ -170,8 +170,14 @@ MySQLPDOTest::skip(); } $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, 0); - @$db->exec('DROP TABLE IF EXISTS test'); print "done!"; +?> +--CLEAN-- +exec('DROP TABLE IF EXISTS test'); +?> --EXPECTF-- Warning: PDO::exec(): SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'THIS IS NOT VALID SQL, I HOPE' at line 1 in %s on line %d [016] [42000] 42000 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'THIS IS NOT VALID SQL, I HOPE' at line %d diff --git a/ext/pdo_mysql/tests/pdo_mysql_exec_ddl.phpt b/ext/pdo_mysql/tests/pdo_mysql_exec_ddl.phpt index 00a2de169..2e8005355 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_exec_ddl.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_exec_ddl.phpt @@ -70,13 +70,6 @@ MySQLPDOTest::skip(); 11.1.17. DROP TABLESPACE Syntax */ - // clean up - @$db->exec('DROP TABLE IF EXISTS pdo_exec_ddl'); - @$db->exec('DROP TABLE IF EXISTS pdo_exec_ddl2'); - @$db->exec('DROP DATABASE IF EXISTS pdo_exec_ddl'); - @$db->exec('DROP DATABASE IF EXISTS pdo_exec_ddl2'); - - } catch (PDOException $e) { printf("[001] %s, [%s] %s\n", $e->getMessage(), @@ -84,5 +77,16 @@ MySQLPDOTest::skip(); } print "done!"; +--CLEAN-- +exec('DROP TABLE IF EXISTS pdo_exec_ddl'); +@$db->exec('DROP TABLE IF EXISTS pdo_exec_ddl2'); +@$db->exec('DROP DATABASE IF EXISTS pdo_exec_ddl'); +@$db->exec('DROP DATABASE IF EXISTS pdo_exec_ddl2'); +?> --EXPECTF-- done! \ No newline at end of file diff --git a/ext/pdo_mysql/tests/pdo_mysql_exec_load_data.phpt b/ext/pdo_mysql/tests/pdo_mysql_exec_load_data.phpt index ecfa50243..1310c0e64 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_exec_load_data.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_exec_load_data.phpt @@ -96,7 +96,13 @@ if (($tmp[1] !== 'localhost') && ($tmp[1] !== '127.0.0.1')) $db->errorCode(), implode(' ', $db->errorInfo())); } - $db->exec('DROP TABLE IF EXISTS test'); print "done!"; +?> +--CLEAN-- +exec('DROP TABLE IF EXISTS test'); +?> --EXPECTF-- done! \ No newline at end of file diff --git a/ext/pdo_mysql/tests/pdo_mysql_exec_select.phpt b/ext/pdo_mysql/tests/pdo_mysql_exec_select.phpt index a759f72cd..ef85fabe6 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_exec_select.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_exec_select.phpt @@ -50,9 +50,15 @@ MySQLPDOTest::skip(); $e->getMessage(), $db->errorCode(), implode(' ', $db->errorInfo())); } - - @$db->exec(sprintf('DROP TABLE IF EXISTS test')); + print "done!"; +?> +--CLEAN-- +exec('DROP TABLE IF EXISTS test'); +?> --EXPECTF-- Warning: PDO::exec(): SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute. in %s on line %d [006] Expecting '1'/integer got ''/boolean when running 'INSERT INTO test(id, col1) VALUES (2, "b")', [HY000] HY000 2014 Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute. diff --git a/ext/pdo_mysql/tests/pdo_mysql_fetch_both.phpt b/ext/pdo_mysql/tests/pdo_mysql_fetch_both.phpt index a8cbde6ea..da886390c 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_fetch_both.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_fetch_both.phpt @@ -56,33 +56,33 @@ $db = MySQLPDOTest::factory(); $e->getMessage(), $db->errorCode(), implode(' ', $db->errorInfo())); } - $db->exec(sprintf('DROP TABLE IF EXISTS test')); print "done!"; +?> --EXPECTF-- [002] Suspicious FETCH_BOTH result, dumping array(2) { [0]=> - string(1) "1" + %unicode|string%(1) "1" [1]=> - string(1) "1" + %unicode|string%(1) "1" } array(2) { [1]=> - string(1) "1" + %unicode|string%(1) "1" [2]=> - string(1) "1" + %unicode|string%(1) "1" } [002] Expected differes from returned data, dumping array(2) { [0]=> - string(1) "1" + %unicode|string%(1) "1" [1]=> - string(1) "1" + %unicode|string%(1) "1" } array(2) { [1]=> - string(1) "1" + %unicode|string%(1) "1" [2]=> - string(1) "1" + %unicode|string%(1) "1" } done! \ No newline at end of file diff --git a/ext/pdo_mysql/tests/pdo_mysql_get_attribute.phpt b/ext/pdo_mysql/tests/pdo_mysql_get_attribute.phpt index 74f17d598..c992d3acf 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_get_attribute.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_get_attribute.phpt @@ -94,8 +94,13 @@ PDO::ATTR_CONNECTION_STATUS PDO::ATTR_SERVER_INFO */ - $db->exec(sprintf('DROP TABLE IF EXISTS test')); print "done!"; +?> +--CLEAN-- + --EXPECTF-- [001] Call to PDO::setAttribute(int attribute, mixed value) has changed the type of value from integer to boolean, test will not work properly done! \ No newline at end of file diff --git a/ext/pdo_mysql/tests/pdo_mysql_last_insert_id.phpt b/ext/pdo_mysql/tests/pdo_mysql_last_insert_id.phpt index 552128cae..2bb5573f3 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_last_insert_id.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_last_insert_id.phpt @@ -108,7 +108,12 @@ $db = MySQLPDOTest::factory(); $e->getMessage(), $db->errorCode(), implode(' ', $db->errorInfo())); } - $db->exec(sprintf('DROP TABLE IF EXISTS test')); print "done!"; +?> +--CLEAN-- + --EXPECTF-- done! diff --git a/ext/pdo_mysql/tests/pdo_mysql_pconnect.phpt b/ext/pdo_mysql/tests/pdo_mysql_pconnect.phpt index e5ab3d5fb..eb0fff13e 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_pconnect.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_pconnect.phpt @@ -92,10 +92,6 @@ MySQLPDOTest::skip(); } print "done!"; ---XFAIL-- -Expected to fail in debug mode as PDO doesn't properly clean persistent connections +?> --EXPECTF-- -Warning: PDO::exec(): MySQL server has gone away in %s on line %d - -Warning: PDO::exec(): Error while reading SET_OPTION's EOF packet. PID=%d in %s on line %d done! \ No newline at end of file diff --git a/ext/pdo_mysql/tests/pdo_mysql_phpinfo.phpt b/ext/pdo_mysql/tests/pdo_mysql_phpinfo.phpt index 30e7bda47..a570c1fd4 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_phpinfo.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_phpinfo.phpt @@ -26,5 +26,6 @@ $db = MySQLPDOTest::factory(); } print "done!"; +?> --EXPECT-- done! diff --git a/ext/pdo_mysql/tests/pdo_mysql_prepare_emulated.phpt b/ext/pdo_mysql/tests/pdo_mysql_prepare_emulated.phpt index fa942f385..4447146ee 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_prepare_emulated.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_prepare_emulated.phpt @@ -316,99 +316,104 @@ $db = MySQLPDOTest::factory(); $e->getMessage(), $db->errorCode(), implode(' ', $db->errorInfo())); } - $db->exec('DROP TABLE IF EXISTS test'); print "done!"; ?> +--CLEAN-- +exec('DROP TABLE IF EXISTS test'); +?> --XFAIL-- PDO's PS parser has some problems with invalid SQL and crashes from time to time (check with valgrind...) --EXPECTF-- array(1) { - ["one"]=> - string(1) "1" + [%u|b%"one"]=> + %unicode|string%(1) "1" } array(1) { [0]=> array(1) { - ["label"]=> - string(12) ":placeholder" + [%u|b%"label"]=> + %unicode|string%(12) ":placeholder" } } array(1) { [0]=> array(1) { - ["label"]=> - string(12) ":placeholder" + [%u|b%"label"]=> + %unicode|string%(12) ":placeholder" } } array(2) { [0]=> array(1) { - ["label"]=> - string(9) "first row" + [%u|b%"label"]=> + %unicode|string%(9) "first row" } [1]=> array(1) { - ["label"]=> - string(10) "second row" + [%u|b%"label"]=> + %unicode|string%(10) "second row" } } array(2) { [0]=> array(2) { - ["id"]=> - string(1) "1" - ["label"]=> - string(3) "row" + [%u|b%"id"]=> + %unicode|string%(1) "1" + [%u|b%"label"]=> + %unicode|string%(3) "row" } [1]=> array(2) { - ["id"]=> - string(1) "2" - ["label"]=> - string(3) "row" + [%u|b%"id"]=> + %unicode|string%(1) "2" + [%u|b%"label"]=> + %unicode|string%(3) "row" } } array(1) { [0]=> array(1) { - ["label"]=> - string(1) "?" + [%u|b%"label"]=> + %unicode|string%(1) "?" } } array(1) { [0]=> array(1) { - ["label"]=> - string(1) "?" + [%u|b%"label"]=> + %unicode|string%(1) "?" } } array(2) { [0]=> array(1) { - ["label"]=> - string(9) "first row" + [%u|b%"label"]=> + %unicode|string%(9) "first row" } [1]=> array(1) { - ["label"]=> - string(10) "second row" + [%u|b%"label"]=> + %unicode|string%(10) "second row" } } array(2) { [0]=> array(2) { - ["id"]=> - string(1) "1" - ["label"]=> - string(3) "row" + [%u|b%"id"]=> + %unicode|string%(1) "1" + [%u|b%"label"]=> + %unicode|string%(3) "row" } [1]=> array(2) { - ["id"]=> - string(1) "2" - ["label"]=> - string(3) "row" + [%u|b%"id"]=> + %unicode|string%(1) "2" + [%u|b%"label"]=> + %unicode|string%(3) "row" } } done! diff --git a/ext/pdo_mysql/tests/pdo_mysql_prepare_emulated_anonymous.phpt b/ext/pdo_mysql/tests/pdo_mysql_prepare_emulated_anonymous.phpt index 30edcbe4b..c382025ba 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_prepare_emulated_anonymous.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_prepare_emulated_anonymous.phpt @@ -56,17 +56,22 @@ $db = MySQLPDOTest::factory(); $e->getMessage(), $db->errorCode(), implode(' ', $db->errorInfo())); } - $db->exec('DROP TABLE IF EXISTS test'); print "done!"; ?> +--CLEAN-- +exec('DROP TABLE IF EXISTS test'); +?> --EXPECTF-- array(1) { [0]=> array(2) { - ["id"]=> - string(1) "1" - ["label"]=> - string(1) "?" + [%u|b%"id"]=> + %unicode|string%(1) "1" + [%u|b%"label"]=> + %unicode|string%(1) "?" } } now the same with native PS diff --git a/ext/pdo_mysql/tests/pdo_mysql_prepare_emulated_placeholder_everywhere.phpt b/ext/pdo_mysql/tests/pdo_mysql_prepare_emulated_placeholder_everywhere.phpt index a8faa8d13..e8f7d3984 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_prepare_emulated_placeholder_everywhere.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_prepare_emulated_placeholder_everywhere.phpt @@ -52,9 +52,14 @@ MySQLPDOTest::skip(); $e->getMessage(), $db->errorCode(), implode(' ', $db->errorInfo())); } - $db->exec(sprintf('DROP TABLE IF EXISTS test')); print "done!"; ?> +--CLEAN-- +exec('DROP TABLE IF EXISTS test'); +?> --EXPECTF-- Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number in %s on line %d [003] Execute has failed, 'HY093' array ( diff --git a/ext/pdo_mysql/tests/pdo_mysql_prepare_load_data.phpt b/ext/pdo_mysql/tests/pdo_mysql_prepare_load_data.phpt index 1f8a4c2c3..b8b77ff5d 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_prepare_load_data.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_prepare_load_data.phpt @@ -100,9 +100,14 @@ if (($tmp[1] !== 'localhost') && ($tmp[1] !== '127.0.0.1')) implode(' ', $db->errorInfo()), (isset($stmt)) ? implode(' ', $stmt->errorInfo()) : 'N/A'); } - - // $db->exec('DROP TABLE IF EXISTS test'); + print "done!"; +?> +--CLEAN-- + --EXPECTF-- Warning: PDOStatement::execute(): SQLSTATE[HY000]: General error: %s in %s on line %d [004] [0] array ( diff --git a/ext/pdo_mysql/tests/pdo_mysql_prepare_match_against.phpt b/ext/pdo_mysql/tests/pdo_mysql_prepare_match_against.phpt index 54257be42..ba5142a0c 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_prepare_match_against.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_prepare_match_against.phpt @@ -36,8 +36,14 @@ MySQLPDOTest::skip(); } - $db->exec('DROP TABLE IF EXISTS test'); print "done!"; +?> +--CLEAN-- +exec('DROP TABLE IF EXISTS test'); +?> --EXPECTF-- array(0) { } diff --git a/ext/pdo_mysql/tests/pdo_mysql_prepare_native.phpt b/ext/pdo_mysql/tests/pdo_mysql_prepare_native.phpt index 1d5f30160..b9027c898 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_prepare_native.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_prepare_native.phpt @@ -333,9 +333,14 @@ $db = MySQLPDOTest::factory(); $e->getMessage(), $db->errorCode(), implode(' ', $db->errorInfo())); } - $db->exec('DROP TABLE IF EXISTS test'); print "done!"; ?> +--CLEAN-- +exec('DROP TABLE IF EXISTS test'); +?> --EXPECTF-- array(1) { [0]=> diff --git a/ext/pdo_mysql/tests/pdo_mysql_prepare_native_clear_error.phpt b/ext/pdo_mysql/tests/pdo_mysql_prepare_native_clear_error.phpt index 33c699c15..8c367af24 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_prepare_native_clear_error.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_prepare_native_clear_error.phpt @@ -66,9 +66,14 @@ $db = MySQLPDOTest::factory(); $e->getMessage(), $db->errorCode(), implode(' ', $db->errorInfo())); } - $db->exec('DROP TABLE IF EXISTS test'); print "done!"; ?> +--CLEAN-- +exec('DROP TABLE IF EXISTS test'); +?> --EXPECTF-- Warning: PDOStatement::execute(): SQLSTATE[42S22]: Column not found: 1054 Unknown column 'unknown_column' in 'field list' in %s on line %d [003] Execute has failed, '42S22' array ( diff --git a/ext/pdo_mysql/tests/pdo_mysql_prepare_native_column.phpt b/ext/pdo_mysql/tests/pdo_mysql_prepare_native_column.phpt index b497268f9..57a4529ac 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_prepare_native_column.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_prepare_native_column.phpt @@ -26,9 +26,14 @@ $db = MySQLPDOTest::factory(); var_dump($stmt->fetchAll(PDO::FETCH_ASSOC)); - $db->exec('DROP TABLE IF EXISTS test'); print "done!"; ?> +--CLEAN-- +exec('DROP TABLE IF EXISTS test'); +?> --EXPECTF-- array(1) { [0]=> diff --git a/ext/pdo_mysql/tests/pdo_mysql_prepare_native_dup_named_placeholder.phpt b/ext/pdo_mysql/tests/pdo_mysql_prepare_native_dup_named_placeholder.phpt index 4f901964e..c9d122a81 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_prepare_native_dup_named_placeholder.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_prepare_native_dup_named_placeholder.phpt @@ -92,9 +92,14 @@ $db = MySQLPDOTest::factory(); $e->getMessage(), $db->errorCode(), implode(' ', $db->errorInfo())); } - $db->exec('DROP TABLE IF EXISTS test'); print "done!"; ?> +--CLEAN-- +exec('DROP TABLE IF EXISTS test'); +?> --EXPECTF-- Native... diff --git a/ext/pdo_mysql/tests/pdo_mysql_prepare_native_mixed_style.phpt b/ext/pdo_mysql/tests/pdo_mysql_prepare_native_mixed_style.phpt index c8d1a5ba8..90cedef56 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_prepare_native_mixed_style.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_prepare_native_mixed_style.phpt @@ -24,9 +24,13 @@ $db = MySQLPDOTest::factory(); $stmt->execute(array(1, 1)); var_dump($stmt->fetchAll(PDO::FETCH_ASSOC)); - $db->exec('DROP TABLE IF EXISTS test'); print "done!"; ?> +--CLEAN-- + --EXPECTF-- Warning: PDO::prepare(): SQLSTATE[HY093]: Invalid parameter number: mixed named and positional parameters in %s on line %d diff --git a/ext/pdo_mysql/tests/pdo_mysql_prepare_native_named_placeholder.phpt b/ext/pdo_mysql/tests/pdo_mysql_prepare_native_named_placeholder.phpt index 4ead73d7f..c4a74eadf 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_prepare_native_named_placeholder.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_prepare_native_named_placeholder.phpt @@ -64,9 +64,14 @@ $db = MySQLPDOTest::factory(); $e->getMessage(), $db->errorCode(), implode(' ', $db->errorInfo())); } - $db->exec('DROP TABLE IF EXISTS test'); print "done!"; ?> +--CLEAN-- +exec('DROP TABLE IF EXISTS test'); +?> --EXPECTF-- [003] Execute has failed, 'HY093' array ( 0 => 'HY093', diff --git a/ext/pdo_mysql/tests/pdo_mysql_prepare_native_placeholder_everywhere.phpt b/ext/pdo_mysql/tests/pdo_mysql_prepare_native_placeholder_everywhere.phpt index aa7815dea..0f8c8880e 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_prepare_native_placeholder_everywhere.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_prepare_native_placeholder_everywhere.phpt @@ -57,9 +57,14 @@ $db = MySQLPDOTest::factory(); $e->getMessage(), $db->errorCode(), implode(' ', $db->errorInfo())); } - $db->exec('DROP TABLE IF EXISTS test'); print "done!"; ?> +--CLEAN-- +exec('DROP TABLE IF EXISTS test'); +?> --EXPECTF-- array(1) { [0]=> diff --git a/ext/pdo_mysql/tests/pdo_mysql_rollback.phpt b/ext/pdo_mysql/tests/pdo_mysql_rollback.phpt index 358d4a780..193b1a159 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_rollback.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_rollback.phpt @@ -79,9 +79,15 @@ if (false == MySQLPDOTest::detect_transactional_mysql_engine($db)) $db->commit(); var_dump($db->getAttribute(PDO::ATTR_AUTOCOMMIT)); - $db->exec('DROP TABLE IF EXISTS test'); - $db->exec('DROP TABLE IF EXISTS test2'); print "done!"; +?> +--CLEAN-- +exec('DROP TABLE IF EXISTS test'); +$db->exec('DROP TABLE IF EXISTS test2'); +?> --EXPECTF-- int(1) int(0) diff --git a/ext/pdo_mysql/tests/pdo_mysql_stmt_bindcolumn.phpt b/ext/pdo_mysql/tests/pdo_mysql_stmt_bindcolumn.phpt index 394ed4f45..dd4920e39 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_stmt_bindcolumn.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_stmt_bindcolumn.phpt @@ -99,9 +99,14 @@ $db = MySQLPDOTest::factory(); $e->getMessage(), $db->errorCode(), implode(' ', $db->errorInfo())); } - $db->exec('DROP TABLE IF EXISTS test'); print "done!"; ?> +--CLEAN-- +exec('DROP TABLE IF EXISTS test'); +?> --EXPECTF-- id = 1 (integer) / label = 'a' (string) id = 2 (integer) / label = 'b' (string) diff --git a/ext/pdo_mysql/tests/pdo_mysql_stmt_bindparam.phpt b/ext/pdo_mysql/tests/pdo_mysql_stmt_bindparam.phpt index 993ea0447..70b2f3fa2 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_stmt_bindparam.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_stmt_bindparam.phpt @@ -114,9 +114,13 @@ MySQLPDOTest::skip(); $e->getMessage(), $db->errorCode(), implode(' ', $db->errorInfo())); } - $db->exec('DROP TABLE IF EXISTS test'); print "done!"; ?> +--CLEAN-- + --EXPECTF-- Emulated PS... Buffered... diff --git a/ext/pdo_mysql/tests/pdo_mysql_stmt_bindparam_types.phpt b/ext/pdo_mysql/tests/pdo_mysql_stmt_bindparam_types.phpt index 64d4df064..9421f62ee 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_stmt_bindparam_types.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_stmt_bindparam_types.phpt @@ -162,8 +162,12 @@ $db = MySQLPDOTest::factory(); $e->getMessage(), $db->errorCode(), implode(' ', $db->errorInfo())); } - $db->exec('DROP TABLE IF EXISTS test'); print "done!"; ?> +--CLEAN-- + --EXPECTF-- done! \ No newline at end of file diff --git a/ext/pdo_mysql/tests/pdo_mysql_stmt_bindvalue.phpt b/ext/pdo_mysql/tests/pdo_mysql_stmt_bindvalue.phpt index 6dc557d14..1c62d7731 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_stmt_bindvalue.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_stmt_bindvalue.phpt @@ -293,9 +293,13 @@ $db = MySQLPDOTest::factory(); $e->getMessage(), $db->errorCode(), implode(' ', $db->errorInfo())); } - $db->exec('DROP TABLE IF EXISTS test'); print "done!"; ?> +--CLEAN-- + --EXPECTF-- Testing native PS... Binding variable... diff --git a/ext/pdo_mysql/tests/pdo_mysql_stmt_blobfromsteam.phpt b/ext/pdo_mysql/tests/pdo_mysql_stmt_blobfromsteam.phpt index 88b847ce8..ae7e7fc42 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_stmt_blobfromsteam.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_stmt_blobfromsteam.phpt @@ -132,11 +132,16 @@ unlink($file); printf("[001] %s [%s] %s\n", $e->getMessage(), $db->errorCode(), implode(' ', $db->errorInfo())); } - - @unlink($file); - $db->exec('DROP TABLE IF EXISTS test'); + print "done!"; ?> +--CLEAN-- +exec('DROP TABLE IF EXISTS test'); +@unlink(MySQLPDOTest::getTempDir() . DIRECTORY_SEPARATOR . 'pdoblob.tst'); +?> --EXPECTF-- Emulated PS... Native PS... diff --git a/ext/pdo_mysql/tests/pdo_mysql_stmt_blobs.phpt b/ext/pdo_mysql/tests/pdo_mysql_stmt_blobs.phpt index 2914583f6..96489ef86 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_stmt_blobs.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_stmt_blobs.phpt @@ -87,5 +87,12 @@ MySQLPDOTest::skip(); } print "done!"; +?> +--CLEAN-- +exec('DROP TABLE IF EXISTS test'); +?> --EXPECTF-- done! \ No newline at end of file diff --git a/ext/pdo_mysql/tests/pdo_mysql_stmt_closecursor.phpt b/ext/pdo_mysql/tests/pdo_mysql_stmt_closecursor.phpt index c96da1f34..455b17d1e 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_stmt_closecursor.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_stmt_closecursor.phpt @@ -142,10 +142,14 @@ $db = MySQLPDOTest::factory(); $e->getMessage(), $db->errorCode(), implode(' ', $db->errorInfo())); } - - $db->exec('DROP TABLE IF EXISTS test'); print "done!"; ?> +--CLEAN-- +exec('DROP TABLE IF EXISTS test'); +?> --EXPECTF-- Testing emulated PS... Buffered... diff --git a/ext/pdo_mysql/tests/pdo_mysql_stmt_closecursor_empty.phpt b/ext/pdo_mysql/tests/pdo_mysql_stmt_closecursor_empty.phpt index a575014c7..aea272b1d 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_stmt_closecursor_empty.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_stmt_closecursor_empty.phpt @@ -61,6 +61,11 @@ $db = MySQLPDOTest::factory(); $db->exec('DROP TABLE IF EXISTS test'); print "done!"; ?> +--CLEAN-- + --EXPECTF-- in = 0 -> id = 1 (integer) / label = 'a' (string) in = 0 -> id = 2 (integer) / label = 'b' (string) diff --git a/ext/pdo_mysql/tests/pdo_mysql_stmt_columncount.phpt b/ext/pdo_mysql/tests/pdo_mysql_stmt_columncount.phpt index 508ba0a3e..85985dde8 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_stmt_columncount.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_stmt_columncount.phpt @@ -52,9 +52,13 @@ $db = MySQLPDOTest::factory(); $e->getMessage(), $db->errorCode(), implode(' ', $db->errorInfo())); } - $db->exec('DROP TABLE IF EXISTS test'); print "done!"; ?> +--CLEAN-- + --EXPECTF-- Testing emulated PS... int(3) diff --git a/ext/pdo_mysql/tests/pdo_mysql_stmt_errorcode.phpt b/ext/pdo_mysql/tests/pdo_mysql_stmt_errorcode.phpt index 877200631..4d59e8c3b 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_stmt_errorcode.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_stmt_errorcode.phpt @@ -40,8 +40,6 @@ $db = MySQLPDOTest::factory(); $stmt->execute(); var_dump($stmt->errorCode()); - - } catch (PDOException $e) { printf("[003] %s [%s] %s\n", $e->getMessage(), $db->errorCode(), implode(' ', $db->errorInfo())); diff --git a/ext/pdo_mysql/tests/pdo_mysql_stmt_errorinfo.phpt b/ext/pdo_mysql/tests/pdo_mysql_stmt_errorinfo.phpt index da372534f..d5a348957 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_stmt_errorinfo.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_stmt_errorinfo.phpt @@ -59,11 +59,16 @@ $db = MySQLPDOTest::factory(); } print "done!"; ?> +--CLEAN-- + --EXPECTF-- Testing emulated PS... array(3) { [0]=> - string(0) "" + %unicode|string%(0) "" [1]=> NULL [2]=> @@ -73,26 +78,26 @@ array(3) { Warning: PDOStatement::execute(): SQLSTATE[42S02]: Base table or view not found: 1146 Table '%s.ihopeitdoesnotexist' doesn't exist in %s on line %d array(3) { [0]=> - string(5) "42S02" + %unicode|string%(5) "42S02" [1]=> int(1146) [2]=> - string(%d) "Table '%s.ihopeitdoesnotexist' doesn't exist" + %unicode|string%(%d) "Table '%s.ihopeitdoesnotexist' doesn't exist" } Warning: PDOStatement::execute(): SQLSTATE[42S02]: Base table or view not found: 1146 Table '%s.test' doesn't exist in %s on line %d bool(false) array(3) { [0]=> - string(5) "42S02" + %unicode|string%(5) "42S02" [1]=> int(1146) [2]=> - string(%d) "Table '%s.test' doesn't exist" + %unicode|string%(%d) "Table '%s.test' doesn't exist" } array(3) { [0]=> - string(5) "00000" + %unicode|string%(5) "00000" [1]=> NULL [2]=> @@ -104,7 +109,7 @@ Warning: PDO::prepare(): SQLSTATE[42S02]: Base table or view not found: 1146 Tab bool(false) array(3) { [0]=> - string(0) "" + %unicode|string%(0) "" [1]=> NULL [2]=> @@ -114,18 +119,18 @@ array(3) { Warning: PDOStatement::execute(): SQLSTATE[42S02]: Base table or view not found: 1146 Table '%s.test' doesn't exist in %s on line %d array(3) { [0]=> - string(5) "42S02" + %unicode|string%(5) "42S02" [1]=> int(1146) [2]=> - string(%d) "Table '%s.test' doesn't exist" + %unicode|string%(%d) "Table '%s.test' doesn't exist" } array(3) { [0]=> - string(5) "00000" + %unicode|string%(5) "00000" [1]=> int(1146) [2]=> - string(%d) "Table '%s.ihopeitdoesnotexist' doesn't exist" + %unicode|string%(%d) "Table '%s.ihopeitdoesnotexist' doesn't exist" } done! diff --git a/ext/pdo_mysql/tests/pdo_mysql_stmt_fetch_non_select.phpt b/ext/pdo_mysql/tests/pdo_mysql_stmt_fetch_non_select.phpt index fdf63ea14..928e90de6 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_stmt_fetch_non_select.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_stmt_fetch_non_select.phpt @@ -180,8 +180,12 @@ MySQLPDOTest::skip(); $e->getMessage(), $db->errorCode(), implode(' ', $db->errorInfo())); } - $db->exec('DROP TABLE IF EXISTS test'); print "done!\n"; ?> +--CLEAN-- + --EXPECTF-- done! \ No newline at end of file diff --git a/ext/pdo_mysql/tests/pdo_mysql_stmt_fetch_serialize.phpt b/ext/pdo_mysql/tests/pdo_mysql_stmt_fetch_serialize.phpt index db8f2f5ea..9c54dc2f6 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_stmt_fetch_serialize.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_stmt_fetch_serialize.phpt @@ -113,9 +113,14 @@ if (version_compare(PHP_VERSION, '5.1.0', '<')) $e->getMessage(), $db->errorCode(), implode(' ', $db->errorInfo())); } - $db->exec('DROP TABLE IF EXISTS test'); print "done!\n"; ?> +--CLEAN-- +exec('DROP TABLE IF EXISTS test'); +?> --EXPECTF-- Creating an object, serializing it and writing it to DB... myclass::singleton(Creating object) @@ -125,24 +130,24 @@ myclass::serialize() Unserializing the previously serialized object... myclass::unserialize('Data from serialize') object(myclass)#4 (1) { - ["myprotected":protected]=> - string(19) "a protected propery" + [%u|b%"myprotected":protected]=> + %unicode|string%(19) "a protected propery" } Using PDO::FETCH_CLASS|PDO::FETCH_SERIALIZE to fetch the object from DB and unserialize it... myclass::unserialize('C:7:"myclass":19:{Data from serialize}') object(myclass)#%d (1) { - ["myprotected":protected]=> - string(19) "a protected propery" + [%u|b%"myprotected":protected]=> + %unicode|string%(19) "a protected propery" } Using PDO::FETCH_CLASS to fetch the object from DB and unserialize it... -myclass::__set(myobj, 'C:7:"myclass":19:{Data from serialize}') myclass::__construct(PDO shall call __construct()) +myclass::__set(myobj, 'C:7:"myclass":19:{Data from serialize}') object(myclass)#%d (2) { - ["myprotected":protected]=> - string(19) "a protected propery" - ["myobj"]=> - string(38) "C:7:"myclass":19:{Data from serialize}" + [%u|b%"myprotected":protected]=> + %unicode|string%(19) "a protected propery" + [%u|b%"myobj"]=> + %unicode|string%(38) "C:7:"myclass":19:{Data from serialize}" } done! diff --git a/ext/pdo_mysql/tests/pdo_mysql_stmt_fetchobject.phpt b/ext/pdo_mysql/tests/pdo_mysql_stmt_fetchobject.phpt index 79ef0c34a..067f9ca70 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_stmt_fetchobject.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_stmt_fetchobject.phpt @@ -63,9 +63,13 @@ try { $e->getMessage(), $db->errorInfo(), implode(' ', $db->errorInfo())); } -$db->exec('DROP TABLE IF EXISTS test'); print "done!"; ?> +--CLEAN-- + --EXPECTF-- myclass::__set(id, -'1'-) 1 myclass::__set(, -''-) 2 @@ -83,13 +87,13 @@ myclass::__set(null, -NULL-) 3 myclass::__set(, -''-) 4 myclass::__construct(2, 3): 12 / 4 object(myclass)#%d (4) { - ["set_calls":"myclass":private]=> + [%u|b%"set_calls":"myclass":private]=> int(4) - ["grp":protected]=> + [%u|b%"grp":protected]=> NULL - ["id"]=> - string(1) "3" - ["null"]=> + [%u|b%"id"]=> + %unicode|string%(1) "3" + [%u|b%"null"]=> NULL } done! \ No newline at end of file diff --git a/ext/pdo_mysql/tests/pdo_mysql_stmt_multiquery.phpt b/ext/pdo_mysql/tests/pdo_mysql_stmt_multiquery.phpt index fbff844e3..91b5237ea 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_stmt_multiquery.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_stmt_multiquery.phpt @@ -49,14 +49,18 @@ MySQLPDOTest::skip(); $e->getMessage(), $db->errorCode(), implode(' ', $db->errorInfo())); } - $db->exec('DROP TABLE IF EXISTS test'); print "done!"; ?> +--CLEAN-- + --EXPECTF-- Emulated Prepared Statements... array(3) { [0]=> - string(5) "00000" + %unicode|string%(5) "00000" [1]=> NULL [2]=> @@ -65,13 +69,13 @@ array(3) { array(1) { [0]=> array(1) { - ["label"]=> - string(1) "a" + [%u|b%"label"]=> + %unicode|string%(1) "a" } } array(3) { [0]=> - string(5) "00000" + %unicode|string%(5) "00000" [1]=> NULL [2]=> @@ -80,15 +84,15 @@ array(3) { array(1) { [0]=> array(1) { - ["label"]=> - string(1) "a" + [%u|b%"label"]=> + %unicode|string%(1) "a" } } array(1) { [0]=> array(1) { - ["label"]=> - string(1) "a" + [%u|b%"label"]=> + %unicode|string%(1) "a" } } Native Prepared Statements... diff --git a/ext/pdo_mysql/tests/pdo_mysql_stmt_nextrowset.phpt b/ext/pdo_mysql/tests/pdo_mysql_stmt_nextrowset.phpt index f491536ab..799624543 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_stmt_nextrowset.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_stmt_nextrowset.phpt @@ -104,106 +104,110 @@ if (!MySQLPDOTest::isPDOMySQLnd()) $e->getMessage(), $db->errorCode(), implode(' ', $db->errorInfo())); } - $db->exec('DROP TABLE IF EXISTS test'); print "done!"; ?> +--CLEAN-- + --EXPECTF-- Emulated PS... array(1) { [0]=> array(1) { - ["_version"]=> - string(%d) "%s" + [%u|b%"_version"]=> + %unicode|string%(%d) "%s" } } bool(false) array(3) { [0]=> array(1) { - ["id"]=> - string(1) "1" + [%u|b%"id"]=> + %unicode|string%(1) "1" } [1]=> array(1) { - ["id"]=> - string(1) "2" + [%u|b%"id"]=> + %unicode|string%(1) "2" } [2]=> array(1) { - ["id"]=> - string(1) "3" + [%u|b%"id"]=> + %unicode|string%(1) "3" } } array(3) { [0]=> array(2) { - ["id"]=> - string(1) "3" - ["label"]=> - string(1) "c" + [%u|b%"id"]=> + %unicode|string%(1) "3" + [%u|b%"label"]=> + %unicode|string%(1) "c" } [1]=> array(2) { - ["id"]=> - string(1) "2" - ["label"]=> - string(1) "b" + [%u|b%"id"]=> + %unicode|string%(1) "2" + [%u|b%"label"]=> + %unicode|string%(1) "b" } [2]=> array(2) { - ["id"]=> - string(1) "1" - ["label"]=> - string(1) "a" + [%u|b%"id"]=> + %unicode|string%(1) "1" + [%u|b%"label"]=> + %unicode|string%(1) "a" } } bool(false) array(1) { [0]=> array(1) { - ["_version"]=> - string(%d) "%s" + [%u|b%"_version"]=> + %unicode|string%(%d) "%s" } } bool(false) array(3) { [0]=> array(1) { - ["id"]=> - string(1) "1" + [%u|b%"id"]=> + %unicode|string%(1) "1" } [1]=> array(1) { - ["id"]=> - string(1) "2" + [%u|b%"id"]=> + %unicode|string%(1) "2" } [2]=> array(1) { - ["id"]=> - string(1) "3" + [%u|b%"id"]=> + %unicode|string%(1) "3" } } array(3) { [0]=> array(2) { - ["id"]=> - string(1) "3" - ["label"]=> - string(1) "c" + [%u|b%"id"]=> + %unicode|string%(1) "3" + [%u|b%"label"]=> + %unicode|string%(1) "c" } [1]=> array(2) { - ["id"]=> - string(1) "2" - ["label"]=> - string(1) "b" + [%u|b%"id"]=> + %unicode|string%(1) "2" + [%u|b%"label"]=> + %unicode|string%(1) "b" } [2]=> array(2) { - ["id"]=> - string(1) "1" - ["label"]=> - string(1) "a" + [%u|b%"id"]=> + %unicode|string%(1) "1" + [%u|b%"label"]=> + %unicode|string%(1) "a" } } bool(false) @@ -211,98 +215,98 @@ Native PS... array(1) { [0]=> array(1) { - ["_version"]=> - string(%d) "%s" + [%u|b%"_version"]=> + %unicode|string%(%d) "%s" } } bool(false) array(3) { [0]=> array(1) { - ["id"]=> - string(1) "1" + [%u|b%"id"]=> + %unicode|string%(1) "1" } [1]=> array(1) { - ["id"]=> - string(1) "2" + [%u|b%"id"]=> + %unicode|string%(1) "2" } [2]=> array(1) { - ["id"]=> - string(1) "3" + [%u|b%"id"]=> + %unicode|string%(1) "3" } } array(3) { [0]=> array(2) { - ["id"]=> - string(1) "3" - ["label"]=> - string(1) "c" + [%u|b%"id"]=> + %unicode|string%(1) "3" + [%u|b%"label"]=> + %unicode|string%(1) "c" } [1]=> array(2) { - ["id"]=> - string(1) "2" - ["label"]=> - string(1) "b" + [%u|b%"id"]=> + %unicode|string%(1) "2" + [%u|b%"label"]=> + %unicode|string%(1) "b" } [2]=> array(2) { - ["id"]=> - string(1) "1" - ["label"]=> - string(1) "a" + [%u|b%"id"]=> + %unicode|string%(1) "1" + [%u|b%"label"]=> + %unicode|string%(1) "a" } } bool(false) array(1) { [0]=> array(1) { - ["_version"]=> - string(%d) "%s" + [%u|b%"_version"]=> + %unicode|string%(%d) "%s" } } bool(false) array(3) { [0]=> array(1) { - ["id"]=> - string(1) "1" + [%u|b%"id"]=> + %unicode|string%(1) "1" } [1]=> array(1) { - ["id"]=> - string(1) "2" + [%u|b%"id"]=> + %unicode|string%(1) "2" } [2]=> array(1) { - ["id"]=> - string(1) "3" + [%u|b%"id"]=> + %unicode|string%(1) "3" } } array(3) { [0]=> array(2) { - ["id"]=> - string(1) "3" - ["label"]=> - string(1) "c" + [%u|b%"id"]=> + %unicode|string%(1) "3" + [%u|b%"label"]=> + %unicode|string%(1) "c" } [1]=> array(2) { - ["id"]=> - string(1) "2" - ["label"]=> - string(1) "b" + [%u|b%"id"]=> + %unicode|string%(1) "2" + [%u|b%"label"]=> + %unicode|string%(1) "b" } [2]=> array(2) { - ["id"]=> - string(1) "1" - ["label"]=> - string(1) "a" + [%u|b%"id"]=> + %unicode|string%(1) "1" + [%u|b%"label"]=> + %unicode|string%(1) "a" } } bool(false) diff --git a/ext/pdo_mysql/tests/pdo_mysql_stmt_rowcount.phpt b/ext/pdo_mysql/tests/pdo_mysql_stmt_rowcount.phpt index 8883b8496..17e2412de 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_stmt_rowcount.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_stmt_rowcount.phpt @@ -25,8 +25,12 @@ MySQLPDOTest::skip(); $e->getMessage(), $db->errorCode(), implode(' ', $db->errorInfo())); } - $db->exec('DROP TABLE IF EXISTS test'); print "done!"; ?> +--CLEAN-- + --EXPECTF-- done! \ No newline at end of file diff --git a/ext/pdo_mysql/tests/pdo_mysql_stmt_unbuffered_2050.phpt b/ext/pdo_mysql/tests/pdo_mysql_stmt_unbuffered_2050.phpt index 0be9eacc7..f051403d8 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_stmt_unbuffered_2050.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_stmt_unbuffered_2050.phpt @@ -108,28 +108,32 @@ if (MYSQLPDOTest::isPDOMySQLnd()) $e->getMessage(), $db->errorCode(), implode(' ', $db->errorInfo())); } - $db->exec('DROP TABLE IF EXISTS test'); print "done!"; ?> +--CLEAN-- + --EXPECTF-- Native PS... Buffered... array(1) { [0]=> array(2) { - ["id"]=> - string(1) "1" - ["label"]=> - string(1) "a" + [%u|b%"id"]=> + %unicode|string%(1) "1" + [%u|b%"label"]=> + %unicode|string%(1) "a" } } array(1) { [0]=> array(2) { - ["id"]=> - string(1) "1" - ["label"]=> - string(1) "a" + [%u|b%"id"]=> + %unicode|string%(1) "1" + [%u|b%"label"]=> + %unicode|string%(1) "a" } } Unbuffered... @@ -144,37 +148,37 @@ array(0) { array(1) { [0]=> array(2) { - ["id"]=> - string(1) "1" - ["label"]=> - string(1) "a" + [%u|b%"id"]=> + %unicode|string%(1) "1" + [%u|b%"label"]=> + %unicode|string%(1) "a" } } array(1) { [0]=> array(2) { - ["id"]=> - string(1) "1" - ["label"]=> - string(1) "a" + [%u|b%"id"]=> + %unicode|string%(1) "1" + [%u|b%"label"]=> + %unicode|string%(1) "a" } } array(1) { [0]=> array(2) { - ["id"]=> - string(1) "1" - ["label"]=> - string(1) "a" + [%u|b%"id"]=> + %unicode|string%(1) "1" + [%u|b%"label"]=> + %unicode|string%(1) "a" } } array(1) { [0]=> array(2) { - ["id"]=> - string(1) "1" - ["label"]=> - string(1) "a" + [%u|b%"id"]=> + %unicode|string%(1) "1" + [%u|b%"label"]=> + %unicode|string%(1) "a" } } done! \ No newline at end of file diff --git a/ext/pdo_mysql/tests/pdo_mysql_stmt_variable_columncount.phpt b/ext/pdo_mysql/tests/pdo_mysql_stmt_variable_columncount.phpt index 853f5a385..c34f4a9d3 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_stmt_variable_columncount.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_stmt_variable_columncount.phpt @@ -118,5 +118,6 @@ if ($version < 50000) } print "done!"; +?> --EXPECTF-- done! \ No newline at end of file diff --git a/ext/pdo_mysql/tests/pdo_mysql_subclass.phpt b/ext/pdo_mysql/tests/pdo_mysql_subclass.phpt index fbe0e1796..c83130d8d 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_subclass.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_subclass.phpt @@ -74,6 +74,12 @@ if (version_compare(PHP_VERSION, '5.0.0', '<')) $db->exec('DROP TABLE IF EXISTS test'); print "done!\n"; ?> +--CLEAN-- +exec('DROP TABLE IF EXISTS test'); +?> --EXPECTF-- __construct('%S', '%S', '%S') exec('DROP TABLE IF EXISTS test') @@ -83,13 +89,13 @@ query('SELECT * FROM test ORDER BY id ASC') array(2) { [0]=> array(1) { - ["id"]=> - string(1) "1" + [%u|b%"id"]=> + %unicode|string%(1) "1" } [1]=> array(1) { - ["id"]=> - string(1) "2" + [%u|b%"id"]=> + %unicode|string%(1) "2" } } bool(false) diff --git a/ext/pdo_mysql/tests/pdo_mysql_types.phpt b/ext/pdo_mysql/tests/pdo_mysql_types.phpt index 7bd58232c..3629ab9a3 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_types.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_types.phpt @@ -174,5 +174,11 @@ MySQLPDOTest::skip(); echo "done!\n"; ?> +--CLEAN-- +exec('DROP TABLE IF EXISTS test'); +?> --EXPECTF-- done! diff --git a/ext/pdo_mysql/tests/pdo_mysql_types_zerofill.phpt b/ext/pdo_mysql/tests/pdo_mysql_types_zerofill.phpt index 9d521a1b8..7c0ec3701 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_types_zerofill.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_types_zerofill.phpt @@ -113,5 +113,11 @@ MySQLPDOTest::skip(); echo "done!\n"; ?> +--CLEAN-- +exec('DROP TABLE IF EXISTS test'); +?> --EXPECTF-- done! \ No newline at end of file diff --git a/ext/pdo_mysql/tests/pecl_bug_5200.phpt b/ext/pdo_mysql/tests/pecl_bug_5200.phpt index d07fe9432..ff5b0e4c3 100644 --- a/ext/pdo_mysql/tests/pecl_bug_5200.phpt +++ b/ext/pdo_mysql/tests/pecl_bug_5200.phpt @@ -17,7 +17,13 @@ $db->exec("CREATE TABLE test (bar INT NOT NULL, phase enum('please_select', 'I', foreach ($db->query('DESCRIBE test phase')->fetchAll(PDO::FETCH_ASSOC) as $row) { print_r($row); } - +?> +--CLEAN-- +exec('DROP TABLE IF EXISTS test'); +?> --EXPECT-- Array ( diff --git a/ext/pdo_mysql/tests/pecl_bug_5780.phpt b/ext/pdo_mysql/tests/pecl_bug_5780.phpt index 5cc349789..59842846d 100644 --- a/ext/pdo_mysql/tests/pecl_bug_5780.phpt +++ b/ext/pdo_mysql/tests/pecl_bug_5780.phpt @@ -26,17 +26,24 @@ $info = $logstmt->errorInfo(); unset($info[2]); var_dump($info); ?> ---EXPECT-- +--CLEAN-- +exec('DROP TABLE IF EXISTS test'); +$db->exec('DROP TABLE IF EXISTS test2'); +?> +--EXPECTF-- array(2) { [0]=> - string(7) "testing" + %unicode|string%(7) "testing" [1]=> - string(7) "testing" + %unicode|string%(7) "testing" } bool(true) array(2) { [0]=> - string(5) "00000" + %unicode|string%(5) "00000" [1]=> NULL } diff --git a/ext/pdo_mysql/tests/pecl_bug_5802.phpt b/ext/pdo_mysql/tests/pecl_bug_5802.phpt index fa22ecdcb..04aa2c955 100644 --- a/ext/pdo_mysql/tests/pecl_bug_5802.phpt +++ b/ext/pdo_mysql/tests/pecl_bug_5802.phpt @@ -32,21 +32,30 @@ $stmt = $db->prepare('select * from test') or var_dump($db->errorInfo()); if($stmt) $stmt->execute(); if($stmt) var_dump($stmt->fetchAll(PDO::FETCH_ASSOC)); ---EXPECT-- +print "done!"; +?> +--CLEAN-- +exec('DROP TABLE IF EXISTS test'); +?> +--EXPECTF-- array(3) { [0]=> array(1) { - ["bar"]=> - string(3) "foo" + [%u|b%"bar"]=> + %unicode|string%(3) "foo" } [1]=> array(1) { - ["bar"]=> + [%u|b%"bar"]=> NULL } [2]=> array(1) { - ["bar"]=> - string(3) "qaz" + [%u|b%"bar"]=> + %unicode|string%(3) "qaz" } } +done! \ No newline at end of file diff --git a/ext/pdo_oci/config.m4 b/ext/pdo_oci/config.m4 index ebe68a85a..27512a265 100755 --- a/ext/pdo_oci/config.m4 +++ b/ext/pdo_oci/config.m4 @@ -1,4 +1,4 @@ -dnl $Id: config.m4 267636 2008-10-22 19:29:24Z stas $ +dnl $Id: config.m4 294541 2010-02-04 19:50:49Z pajoye $ dnl config.m4 for extension pdo_oci dnl vim:et:sw=2:ts=2: @@ -132,7 +132,7 @@ You need to tell me where to find your Oracle Instant Client SDK, or set ORACLE_ fi case $PDO_OCI_VERSION in - 9.0|10.1|10.2|11.1) + 9.0|10.1|10.2|11.1|11.2) PHP_ADD_LIBRARY(clntsh, 1, PDO_OCI_SHARED_LIBADD) ;; diff --git a/ext/pdo_oci/oci_driver.c b/ext/pdo_oci/oci_driver.c index a862857d1..92f5045ae 100755 --- a/ext/pdo_oci/oci_driver.c +++ b/ext/pdo_oci/oci_driver.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: oci_driver.c 280403 2009-05-12 21:53:18Z mbeccati $ */ +/* $Id: oci_driver.c 294444 2010-02-03 19:48:04Z pajoye $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -173,7 +173,7 @@ ub4 _oci_error(OCIError *err, pdo_dbh_t *dbh, pdo_stmt_t *stmt, char *what, swor /* little mini hack so that we can use this code from the dbh ctor */ if (!dbh->methods) { - zend_throw_exception_ex(php_pdo_get_exception(), 0 TSRMLS_CC, "SQLSTATE[%s]: %s", *pdo_err, einfo->errmsg); + zend_throw_exception_ex(php_pdo_get_exception(), einfo->errcode TSRMLS_CC, "SQLSTATE[%s]: %s", *pdo_err, einfo->errmsg); } return einfo->errcode; diff --git a/ext/pdo_oci/oci_statement.c b/ext/pdo_oci/oci_statement.c index 62d4f9a70..87de60794 100755 --- a/ext/pdo_oci/oci_statement.c +++ b/ext/pdo_oci/oci_statement.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: oci_statement.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: oci_statement.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/pdo_oci/pdo_oci.c b/ext/pdo_oci/pdo_oci.c index 39efda4b2..43004cf89 100755 --- a/ext/pdo_oci/pdo_oci.c +++ b/ext/pdo_oci/pdo_oci.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: pdo_oci.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: pdo_oci.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/pdo_oci/php_pdo_oci.h b/ext/pdo_oci/php_pdo_oci.h index e638ca602..f73a01c67 100755 --- a/ext/pdo_oci/php_pdo_oci.h +++ b/ext/pdo_oci/php_pdo_oci.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_pdo_oci.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_pdo_oci.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_PDO_OCI_H #define PHP_PDO_OCI_H diff --git a/ext/pdo_oci/php_pdo_oci_int.h b/ext/pdo_oci/php_pdo_oci_int.h index 671c135d1..b4d754142 100755 --- a/ext/pdo_oci/php_pdo_oci_int.h +++ b/ext/pdo_oci/php_pdo_oci_int.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_pdo_oci_int.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_pdo_oci_int.h 293036 2010-01-03 09:23:27Z sebastian $ */ #include diff --git a/ext/pdo_odbc/config.m4 b/ext/pdo_odbc/config.m4 index 3dc54d810..c846d13b6 100755 --- a/ext/pdo_odbc/config.m4 +++ b/ext/pdo_odbc/config.m4 @@ -1,4 +1,4 @@ -dnl $Id: config.m4 263549 2008-07-25 13:46:24Z jani $ +dnl $Id: config.m4 291414 2009-11-29 06:13:22Z rasmus $ dnl config.m4 for extension pdo_odbc dnl vim:et:sw=2:ts=2: diff --git a/ext/pdo_odbc/odbc_driver.c b/ext/pdo_odbc/odbc_driver.c index a54add306..fbf54ff32 100755 --- a/ext/pdo_odbc/odbc_driver.c +++ b/ext/pdo_odbc/odbc_driver.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.0 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: odbc_driver.c 284099 2009-07-15 02:36:08Z felipe $ */ +/* $Id: odbc_driver.c 294444 2010-02-03 19:48:04Z pajoye $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -104,7 +104,7 @@ void pdo_odbc_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, PDO_ODBC_HSTMT statement, strcpy(*pdo_err, einfo->last_state); /* printf("@@ SQLSTATE[%s] %s\n", *pdo_err, einfo->last_err_msg); */ if (!dbh->methods) { - zend_throw_exception_ex(php_pdo_get_exception(), 0 TSRMLS_CC, "SQLSTATE[%s] %s: %d %s", + zend_throw_exception_ex(php_pdo_get_exception(), einfo->last_error TSRMLS_CC, "SQLSTATE[%s] %s: %d %s", *pdo_err, what, einfo->last_error, einfo->last_err_msg); } diff --git a/ext/pdo_odbc/odbc_stmt.c b/ext/pdo_odbc/odbc_stmt.c index d650b6fdd..589be13f6 100755 --- a/ext/pdo_odbc/odbc_stmt.c +++ b/ext/pdo_odbc/odbc_stmt.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.0 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: odbc_stmt.c 284097 2009-07-15 02:32:43Z felipe $ */ +/* $Id: odbc_stmt.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/pdo_odbc/pdo_odbc.c b/ext/pdo_odbc/pdo_odbc.c index 698fced89..311b31071 100755 --- a/ext/pdo_odbc/pdo_odbc.c +++ b/ext/pdo_odbc/pdo_odbc.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.0 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: pdo_odbc.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: pdo_odbc.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/pdo_odbc/php_pdo_odbc.h b/ext/pdo_odbc/php_pdo_odbc.h index 75247567f..e5bc65dcf 100644 --- a/ext/pdo_odbc/php_pdo_odbc.h +++ b/ext/pdo_odbc/php_pdo_odbc.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.0 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_pdo_odbc.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_pdo_odbc.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_PDO_ODBC_H #define PHP_PDO_ODBC_H diff --git a/ext/pdo_odbc/php_pdo_odbc_int.h b/ext/pdo_odbc/php_pdo_odbc_int.h index 550c4ff73..24d60dd4f 100755 --- a/ext/pdo_odbc/php_pdo_odbc_int.h +++ b/ext/pdo_odbc/php_pdo_odbc_int.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.0 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_pdo_odbc_int.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_pdo_odbc_int.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef PHP_WIN32 # define PDO_ODBC_TYPE "Win32" diff --git a/ext/pdo_pgsql/config.m4 b/ext/pdo_pgsql/config.m4 index 8e55524f5..f75d79196 100644 --- a/ext/pdo_pgsql/config.m4 +++ b/ext/pdo_pgsql/config.m4 @@ -1,4 +1,4 @@ -dnl $Id: config.m4 279602 2009-04-30 12:38:43Z mbeccati $ +dnl $Id: config.m4 291414 2009-11-29 06:13:22Z rasmus $ dnl config.m4 for extension pdo_pgsql dnl vim:et:sw=2:ts=2: diff --git a/ext/pdo_pgsql/pdo_pgsql.c b/ext/pdo_pgsql/pdo_pgsql.c index 40856557c..1be19cef7 100644 --- a/ext/pdo_pgsql/pdo_pgsql.c +++ b/ext/pdo_pgsql/pdo_pgsql.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: pdo_pgsql.c 277898 2009-03-28 01:58:49Z mbeccati $ */ +/* $Id: pdo_pgsql.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -85,8 +85,8 @@ ZEND_GET_MODULE(pdo_pgsql) */ PHP_MINIT_FUNCTION(pdo_pgsql) { - php_pdo_register_driver(&pdo_pgsql_driver); REGISTER_PDO_CLASS_CONST_LONG("PGSQL_ATTR_DISABLE_NATIVE_PREPARED_STATEMENT", PDO_PGSQL_ATTR_DISABLE_NATIVE_PREPARED_STATEMENT); + php_pdo_register_driver(&pdo_pgsql_driver); return SUCCESS; } /* }}} */ @@ -128,7 +128,7 @@ PHP_MINFO_FUNCTION(pdo_pgsql) php_info_print_table_row(2, "PostgreSQL(libpq) Version", PG_VERSION); #endif php_info_print_table_row(2, "Module version", pdo_pgsql_module_entry.version); - php_info_print_table_row(2, "Revision", " $Id: pdo_pgsql.c 277898 2009-03-28 01:58:49Z mbeccati $ "); + php_info_print_table_row(2, "Revision", " $Id: pdo_pgsql.c 293036 2010-01-03 09:23:27Z sebastian $ "); php_info_print_table_end(); } diff --git a/ext/pdo_pgsql/pgsql_driver.c b/ext/pdo_pgsql/pgsql_driver.c index ef720cdac..32fd472e9 100644 --- a/ext/pdo_pgsql/pgsql_driver.c +++ b/ext/pdo_pgsql/pgsql_driver.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: pgsql_driver.c 279604 2009-04-30 12:56:00Z mbeccati $ */ +/* $Id: pgsql_driver.c 294444 2010-02-03 19:48:04Z pajoye $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -87,7 +87,7 @@ int _pdo_pgsql_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, int errcode, const char * } if (!dbh->methods) { - zend_throw_exception_ex(php_pdo_get_exception(), 0 TSRMLS_CC, "SQLSTATE[%s] [%d] %s", + zend_throw_exception_ex(php_pdo_get_exception(), einfo->errcode TSRMLS_CC, "SQLSTATE[%s] [%d] %s", *pdo_err, einfo->errcode, einfo->errmsg); } @@ -232,22 +232,20 @@ static int pgsql_handle_preparer(pdo_dbh_t *dbh, const char *sql, long sql_len, if (S->cursor_name) { efree(S->cursor_name); } - spprintf(&S->cursor_name, 0, "pdo_crsr_%016lx", (unsigned long) stmt); + spprintf(&S->cursor_name, 0, "pdo_crsr_%08x", ++H->stmt_counter); #if HAVE_PQPREPARE emulate = 1; #endif } #if HAVE_PQPREPARE - else if (driver_options) { - if (pdo_attr_lval(driver_options, - PDO_PGSQL_ATTR_DISABLE_NATIVE_PREPARED_STATEMENT, 0 TSRMLS_CC) == 1) { - emulate = 1; - } else if (pdo_attr_lval(driver_options, PDO_ATTR_EMULATE_PREPARES, - 0 TSRMLS_CC) == 1) { + if (pdo_attr_lval(driver_options, PDO_PGSQL_ATTR_DISABLE_NATIVE_PREPARED_STATEMENT, H->disable_native_prepares TSRMLS_CC) == 1 || + pdo_attr_lval(driver_options, PDO_ATTR_EMULATE_PREPARES, H->emulate_prepares TSRMLS_CC) == 1) { emulate = 1; } + } else { + emulate = H->disable_native_prepares || H->emulate_prepares; } if (!emulate && PQprotocolVersion(H->server) > 2) { @@ -264,7 +262,7 @@ static int pgsql_handle_preparer(pdo_dbh_t *dbh, const char *sql, long sql_len, return 0; } - spprintf(&S->stmt_name, 0, "pdo_stmt_%016lx", (unsigned long)stmt); + spprintf(&S->stmt_name, 0, "pdo_stmt_%08x", ++H->stmt_counter); /* that's all for now; we'll defer the actual prepare until the first execute call */ if (nsql) { @@ -625,7 +623,21 @@ static const zend_function_entry *pdo_pgsql_get_driver_methods(pdo_dbh_t *dbh, i static int pdo_pgsql_set_attr(pdo_dbh_t *dbh, long attr, zval *val TSRMLS_DC) { - return 0; + pdo_pgsql_db_handle *H = (pdo_pgsql_db_handle *)dbh->driver_data; + + switch (attr) { +#if HAVE_PQPREPARE + case PDO_ATTR_EMULATE_PREPARES: + H->emulate_prepares = Z_LVAL_P(val); + return 1; + case PDO_PGSQL_ATTR_DISABLE_NATIVE_PREPARED_STATEMENT: + H->disable_native_prepares = Z_LVAL_P(val); + return 1; +#endif + + default: + return 0; + } } static struct pdo_dbh_methods pgsql_methods = { diff --git a/ext/pdo_pgsql/pgsql_statement.c b/ext/pdo_pgsql/pgsql_statement.c index 85ae91367..8f2c8f85c 100644 --- a/ext/pdo_pgsql/pgsql_statement.c +++ b/ext/pdo_pgsql/pgsql_statement.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: pgsql_statement.c 281107 2009-05-25 19:41:13Z kalle $ */ +/* $Id: pgsql_statement.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -185,7 +185,7 @@ stmt_retry: * deallocate it and retry ONCE (thies 2005.12.15) */ if (!strcmp(sqlstate, "42P05")) { - char buf[100]; /* stmt_name == "pdo_crsr_%016lx" */ + char buf[100]; /* stmt_name == "pdo_crsr_%08x" */ PGresult *res; snprintf(buf, sizeof(buf), "DEALLOCATE %s", S->stmt_name); res = PQexec(H->server, buf); diff --git a/ext/pdo_pgsql/php_pdo_pgsql.h b/ext/pdo_pgsql/php_pdo_pgsql.h index 1760d61b4..9cdb176fd 100644 --- a/ext/pdo_pgsql/php_pdo_pgsql.h +++ b/ext/pdo_pgsql/php_pdo_pgsql.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_pdo_pgsql.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_pdo_pgsql.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_PDO_PGSQL_H #define PHP_PDO_PGSQL_H diff --git a/ext/pdo_pgsql/php_pdo_pgsql_int.h b/ext/pdo_pgsql/php_pdo_pgsql_int.h index fb0a95ec3..a9c686ba1 100644 --- a/ext/pdo_pgsql/php_pdo_pgsql_int.h +++ b/ext/pdo_pgsql/php_pdo_pgsql_int.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_pdo_pgsql_int.h 280407 2009-05-12 22:18:15Z mbeccati $ */ +/* $Id: php_pdo_pgsql_int.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_PDO_PGSQL_INT_H #define PHP_PDO_PGSQL_INT_H @@ -43,6 +43,14 @@ typedef struct { unsigned _reserved:31; pdo_pgsql_error_info einfo; Oid pgoid; +#if HAVE_PQPREPARE + /* The following two variables have the same purpose. Unfortunately we need + to keep track of two different attributes having the same effect. + It might be worth to deprecate the driver specific one soon. */ + int emulate_prepares; + int disable_native_prepares; +#endif + unsigned int stmt_counter; } pdo_pgsql_db_handle; typedef struct { diff --git a/ext/pdo_pgsql/tests/bug48764.phpt b/ext/pdo_pgsql/tests/bug48764.phpt new file mode 100644 index 000000000..67e8f3971 --- /dev/null +++ b/ext/pdo_pgsql/tests/bug48764.phpt @@ -0,0 +1,134 @@ +--TEST-- +Bug #48764 (PDO_pgsql::query always uses implicit prepared statements if v3 proto available) +--SKIPIF-- +getAttribute(PDO::ATTR_CLIENT_VERSION); +$server_version = $db->getAttribute(PDO::ATTR_SERVER_VERSION); + +if (version_compare($server_version, '7.4', '<') || version_compare($client_version, '7.4', '<')) { + die('skip'); +} + +?> +--FILE-- +setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + +echo "Test 1\n"; +bug($db); + +echo "Test 2\n"; +bug($db, array(PDO::ATTR_EMULATE_PREPARES => 0)); +bug($db, array(PDO::ATTR_EMULATE_PREPARES => 1)); + +echo "Test 3\n"; +bug($db, array(PDO::PGSQL_ATTR_DISABLE_NATIVE_PREPARED_STATEMENT => 0)); +bug($db, array(PDO::PGSQL_ATTR_DISABLE_NATIVE_PREPARED_STATEMENT => 1)); + +echo "Test 4\n"; +$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, 1); +bug($db); +$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, 0); +bug($db); + +echo "Test 5\n"; +$db->setAttribute(PDO::PGSQL_ATTR_DISABLE_NATIVE_PREPARED_STATEMENT, 1); +bug($db); +$db->setAttribute(PDO::PGSQL_ATTR_DISABLE_NATIVE_PREPARED_STATEMENT, 0); +bug($db); + + +putenv('PDOTEST_ATTR='.serialize(array( + PDO::ATTR_EMULATE_PREPARES => 1, +))); +$db = PDOTest::factory('PDO', false); +$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + +echo "Test 6\n"; +bug($db); +bug($db, array(PDO::ATTR_EMULATE_PREPARES => 0)); +bug($db, array(PDO::PGSQL_ATTR_DISABLE_NATIVE_PREPARED_STATEMENT => 0)); + + +putenv('PDOTEST_ATTR='.serialize(array( + PDO::PGSQL_ATTR_DISABLE_NATIVE_PREPARED_STATEMENT => 1, +))); + +$db = PDOTest::factory('PDO', false); +$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + +echo "Test 7\n"; +bug($db); +bug($db, array(PDO::ATTR_EMULATE_PREPARES => 0)); +bug($db, array(PDO::PGSQL_ATTR_DISABLE_NATIVE_PREPARED_STATEMENT => 0)); + + +putenv('PDOTEST_ATTR='.serialize(array( + PDO::ATTR_EMULATE_PREPARES => 1, + PDO::PGSQL_ATTR_DISABLE_NATIVE_PREPARED_STATEMENT => 1, +))); + +$db = PDOTest::factory('PDO', false); +$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + +echo "Test 8\n"; +bug($db); +bug($db, array(PDO::ATTR_EMULATE_PREPARES => 0)); +bug($db, array(PDO::PGSQL_ATTR_DISABLE_NATIVE_PREPARED_STATEMENT => 0)); +bug($db, array( + PDO::ATTR_EMULATE_PREPARES => 0, + PDO::PGSQL_ATTR_DISABLE_NATIVE_PREPARED_STATEMENT => 0, +)); + + +putenv('PDOTEST_ATTR'); + + +function bug($db, $options = array()) { + try { + $stmt = $db->prepare("SELECT ?", $options); + $stmt->execute(array(1)); + echo "OK\n"; + } catch (PDOException $e) { + // Indetermined data type when using native prepared statements + echo $e->getCode()."\n"; + } +} + +--EXPECT-- +Test 1 +42P18 +Test 2 +42P18 +OK +Test 3 +42P18 +OK +Test 4 +OK +42P18 +Test 5 +OK +42P18 +Test 6 +OK +42P18 +OK +Test 7 +OK +OK +42P18 +Test 8 +OK +OK +OK +42P18 diff --git a/ext/pdo_pgsql/tests/bug_33876.phpt b/ext/pdo_pgsql/tests/bug_33876.phpt index 0ec04e8bd..48618e13d 100644 --- a/ext/pdo_pgsql/tests/bug_33876.phpt +++ b/ext/pdo_pgsql/tests/bug_33876.phpt @@ -80,10 +80,14 @@ else # Expected to fail; unless told otherwise, PDO assumes string inputs # false -> "" as string, which pgsql doesn't like -if (!$res->execute(array(false))) - print_r($res->errorInfo()); -else +if (!$res->execute(array(false))) { + $err = $res->errorInfo(); + // Strip additional lines ouputted by recent PgSQL versions + $err[2] = trim(current(explode("\n", $err[2]))); + print_r($err); +} else { print_r($res->fetchAll(PDO::FETCH_ASSOC)); +} diff --git a/ext/pdo_pgsql/tests/bug_49985.phpt b/ext/pdo_pgsql/tests/bug_49985.phpt new file mode 100644 index 000000000..26dcfc617 --- /dev/null +++ b/ext/pdo_pgsql/tests/bug_49985.phpt @@ -0,0 +1,35 @@ +--TEST-- +Bug #49985 (pdo_pgsql prepare() re-use previous aborted transaction) +--SKIPIF-- + +--FILE-- +setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + +$db->exec("CREATE TABLE test (a int PRIMARY KEY)"); + +for ($i = 0; $i < 3; $i++) { + try { + $db->beginTransaction(); + $stmt = $db->prepare("INSERT INTO test (a) VALUES (?)"); + var_dump($stmt->execute(array(1))); + $db->commit(); + } catch (Exception $e) { + echo trim(current(explode("\n", $e->getMessage())))."\n"; + $db->rollback(); + } +} + +?> +--EXPECTF-- +bool(true) +SQLSTATE[23505]: %s"test_pkey" +SQLSTATE[23505]: %s"test_pkey" + diff --git a/ext/pdo_sqlite/config.m4 b/ext/pdo_sqlite/config.m4 index 1735f0f47..eceb94d8b 100644 --- a/ext/pdo_sqlite/config.m4 +++ b/ext/pdo_sqlite/config.m4 @@ -1,4 +1,4 @@ -dnl $Id: config.m4 273413 2009-01-13 02:50:54Z scottmac $ +dnl $Id: config.m4 291414 2009-11-29 06:13:22Z rasmus $ dnl config.m4 for extension pdo_sqlite dnl vim:et:sw=2:ts=2: diff --git a/ext/pdo_sqlite/config.w32 b/ext/pdo_sqlite/config.w32 index d1f159d4e..6db4e4bcb 100644 --- a/ext/pdo_sqlite/config.w32 +++ b/ext/pdo_sqlite/config.w32 @@ -1,10 +1,10 @@ -// $Id: config.w32 287047 2009-08-10 16:58:53Z kalle $ +// $Id: config.w32 289692 2009-10-16 02:22:48Z scottmac $ // vim:ft=javascript ARG_WITH("pdo-sqlite", "for pdo_sqlite support", "no"); if (PHP_PDO_SQLITE != "no") { - EXTENSION("pdo_sqlite", "pdo_sqlite.c sqlite_driver.c sqlite_statement.c", null, "/DSQLITE_THREADSAFE=" + (PHP_ZTS == "yes" ? "1" : "0") + " /I" + configure_module_dirname + "/../sqlite3/libsqlite /I" + configure_module_dirname); + EXTENSION("pdo_sqlite", "pdo_sqlite.c sqlite_driver.c sqlite_statement.c", null, "/DSQLITE_THREADSAFE=" + (PHP_ZTS == "yes" ? "1" : "0") + " /D SQLITE_ENABLE_FTS3=1 /D SQLITE_ENABLE_COLUMN_METADATA=1 /D SQLITE_CORE=1 /I" + configure_module_dirname + "/../sqlite3/libsqlite /I" + configure_module_dirname); ADD_EXTENSION_DEP('pdo_sqlite', 'pdo'); // If pdo_sqlite is static, and sqlite3 is also static, then we don't add a second copy of the sqlite3 libs diff --git a/ext/pdo_sqlite/pdo_sqlite.c b/ext/pdo_sqlite/pdo_sqlite.c index ba2b697f8..f9735f555 100644 --- a/ext/pdo_sqlite/pdo_sqlite.c +++ b/ext/pdo_sqlite/pdo_sqlite.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: pdo_sqlite.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: pdo_sqlite.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/pdo_sqlite/php_pdo_sqlite.h b/ext/pdo_sqlite/php_pdo_sqlite.h index 36bbb93a9..71813e0a4 100644 --- a/ext/pdo_sqlite/php_pdo_sqlite.h +++ b/ext/pdo_sqlite/php_pdo_sqlite.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_pdo_sqlite.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_pdo_sqlite.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_PDO_SQLITE_H diff --git a/ext/pdo_sqlite/php_pdo_sqlite_int.h b/ext/pdo_sqlite/php_pdo_sqlite_int.h index 4deb99652..eb8329a81 100644 --- a/ext/pdo_sqlite/php_pdo_sqlite_int.h +++ b/ext/pdo_sqlite/php_pdo_sqlite_int.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_pdo_sqlite_int.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_pdo_sqlite_int.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_PDO_SQLITE_INT_H #define PHP_PDO_SQLITE_INT_H diff --git a/ext/pdo_sqlite/sqlite_driver.c b/ext/pdo_sqlite/sqlite_driver.c index f16e17e06..56d6f3d20 100644 --- a/ext/pdo_sqlite/sqlite_driver.c +++ b/ext/pdo_sqlite/sqlite_driver.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: sqlite_driver.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: sqlite_driver.c 294444 2010-02-03 19:48:04Z pajoye $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -78,7 +78,7 @@ int _pdo_sqlite_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, const char *file, int li } if (!dbh->methods) { - zend_throw_exception_ex(php_pdo_get_exception(), 0 TSRMLS_CC, "SQLSTATE[%s] [%d] %s", + zend_throw_exception_ex(php_pdo_get_exception(), einfo->errcode TSRMLS_CC, "SQLSTATE[%s] [%d] %s", *pdo_err, einfo->errcode, einfo->errmsg); } @@ -496,9 +496,7 @@ static PHP_METHOD(SQLite, sqliteCreateFunction) func->funcname = estrdup(func_name); MAKE_STD_ZVAL(func->func); - *(func->func) = *callback; - zval_copy_ctor(func->func); - INIT_PZVAL(func->func); + MAKE_COPY_ZVAL(&callback, func->func); func->argc = argc; @@ -575,14 +573,10 @@ static PHP_METHOD(SQLite, sqliteCreateAggregate) func->funcname = estrdup(func_name); MAKE_STD_ZVAL(func->step); - *(func->step) = *step_callback; - zval_copy_ctor(func->step); - INIT_PZVAL(func->step); + MAKE_COPY_ZVAL(&step_callback, func->step); MAKE_STD_ZVAL(func->fini); - *(func->fini) = *fini_callback; - zval_copy_ctor(func->fini); - INIT_PZVAL(func->fini); + MAKE_COPY_ZVAL(&fini_callback, func->fini); func->argc = argc; diff --git a/ext/pdo_sqlite/sqlite_statement.c b/ext/pdo_sqlite/sqlite_statement.c index d8e5049df..26e2e5f56 100644 --- a/ext/pdo_sqlite/sqlite_statement.c +++ b/ext/pdo_sqlite/sqlite_statement.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: sqlite_statement.c 280873 2009-05-20 15:05:36Z iliaa $ */ +/* $Id: sqlite_statement.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/pdo_sqlite/tests/bug50728.phpt b/ext/pdo_sqlite/tests/bug50728.phpt new file mode 100644 index 000000000..3dbbb1fff --- /dev/null +++ b/ext/pdo_sqlite/tests/bug50728.phpt @@ -0,0 +1,16 @@ +--TEST-- +Bug #50728 (All PDOExceptions hardcode 'code' property to 0) +--SKIPIF-- + +--FILE-- +getCode()); +} +?> +--EXPECTF-- +int(14) diff --git a/ext/pdo_sqlite/tests/pdo_fetch_func_001.phpt b/ext/pdo_sqlite/tests/pdo_fetch_func_001.phpt new file mode 100644 index 000000000..efcb2e7bc --- /dev/null +++ b/ext/pdo_sqlite/tests/pdo_fetch_func_001.phpt @@ -0,0 +1,130 @@ +--TEST-- +Testing several callbacks using PDO::FETCH_FUNC +--SKIPIF-- + +--FILE-- +exec('CREATE TABLE testing (id INTEGER , name VARCHAR)'); +$db->exec('INSERT INTO testing VALUES(1, "php")'); +$db->exec('INSERT INTO testing VALUES(2, "")'); + +$st = $db->query('SELECT * FROM testing'); +$st->fetchAll(PDO::FETCH_FUNC, function($x, $y) use ($st) { var_dump($st); print "data: $x, $y\n"; }); + +$st = $db->query('SELECT name FROM testing'); +var_dump($st->fetchAll(PDO::FETCH_FUNC, 'strtoupper')); + +$st = $db->query('SELECT * FROM testing'); +var_dump($st->fetchAll(PDO::FETCH_FUNC, 'nothing')); + +$st = $db->query('SELECT * FROM testing'); +var_dump($st->fetchAll(PDO::FETCH_FUNC, '')); + +$st = $db->query('SELECT * FROM testing'); +var_dump($st->fetchAll(PDO::FETCH_FUNC, NULL)); + +$st = $db->query('SELECT * FROM testing'); +var_dump($st->fetchAll(PDO::FETCH_FUNC, 1)); + +$st = $db->query('SELECT * FROM testing'); +var_dump($st->fetchAll(PDO::FETCH_FUNC, array('self', 'foo'))); + +class foo { + public function foo($x) { + return "--- $x ---"; + } +} +class bar extends foo { + public function __construct($db) { + $st = $db->query('SELECT * FROM testing'); + var_dump($st->fetchAll(PDO::FETCH_FUNC, array($this, 'parent::foo'))); + } + + static public function test($x, $y) { + return $x .'---'. $y; + } + + private function test2($x, $y) { + return $x; + } + + public function test3($x, $y) { + return $x .'==='. $y; + } +} + +new bar($db); + +$st = $db->query('SELECT * FROM testing'); +var_dump($st->fetchAll(PDO::FETCH_FUNC, array('bar', 'test'))); + +$st = $db->query('SELECT * FROM testing'); +var_dump($st->fetchAll(PDO::FETCH_FUNC, array('bar', 'test2'))); + +$st = $db->query('SELECT * FROM testing'); +var_dump($st->fetchAll(PDO::FETCH_FUNC, array('bar', 'test3'))); + +$st = $db->query('SELECT * FROM testing'); +var_dump($st->fetchAll(PDO::FETCH_FUNC, array('bar', 'inexistent'))); + +?> +--EXPECTF-- +object(PDOStatement)#%d (1) { + [%u|b%"queryString"]=> + %string|unicode%(21) "SELECT * FROM testing" +} +data: 1, php +object(PDOStatement)#%d (1) { + [%u|b%"queryString"]=> + %string|unicode%(21) "SELECT * FROM testing" +} +data: 2, +array(2) { + [0]=> + %string|unicode%(3) "PHP" + [1]=> + %string|unicode%(0) "" +} + +Warning: PDOStatement::fetchAll(): SQLSTATE[HY000]: General error: function 'nothing' not found or invalid function name in %s on line %d +bool(false) + +Warning: PDOStatement::fetchAll(): SQLSTATE[HY000]: General error: function '' not found or invalid function name in %s on line %d +bool(false) + +Warning: PDOStatement::fetchAll(): SQLSTATE[HY000]: General error: no array or string given in %s on line %d +bool(false) + +Warning: PDOStatement::fetchAll(): SQLSTATE[HY000]: General error: no array or string given in %s on line %d +bool(false) + +Warning: PDOStatement::fetchAll(): SQLSTATE[HY000]: General error: cannot access self:: when no class scope is active in %s on line %d +bool(false) +array(2) { + [0]=> + %string|unicode%(9) "--- 1 ---" + [1]=> + %string|unicode%(9) "--- 2 ---" +} +array(2) { + [0]=> + %string|unicode%(7) "1---php" + [1]=> + %string|unicode%(4) "2---" +} + +Warning: PDOStatement::fetchAll(): SQLSTATE[HY000]: General error: cannot access private method bar::test2() in %s on line %d +bool(false) +array(2) { + [0]=> + %string|unicode%(7) "1===php" + [1]=> + %string|unicode%(4) "2===" +} + +Warning: PDOStatement::fetchAll(): SQLSTATE[HY000]: General error: class 'bar' does not have a method 'inexistent' in %s on line %d +bool(false) diff --git a/ext/pgsql/pgsql.c b/ext/pgsql/pgsql.c index c8cf494e3..273bee058 100644 --- a/ext/pgsql/pgsql.c +++ b/ext/pgsql/pgsql.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -20,7 +20,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: pgsql.c 280789 2009-05-19 16:03:36Z kalle $ */ +/* $Id: pgsql.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include @@ -819,7 +819,7 @@ static void _php_pgsql_notice_handler(void *resource_id, const char *message) if (PGG(log_notices)) { php_error_docref(NULL TSRMLS_CC, E_NOTICE, "%s", notice->message); } - zend_hash_index_update(&PGG(notices), (int)resource_id, (void **)¬ice, sizeof(php_pgsql_notice *), NULL); + zend_hash_index_update(&PGG(notices), (ulong)resource_id, (void **)¬ice, sizeof(php_pgsql_notice *), NULL); } } /* }}} */ @@ -1217,13 +1217,14 @@ static void php_pgsql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) */ if (!(connect_type & PGSQL_CONNECT_FORCE_NEW) && zend_hash_find(&EG(regular_list),str.c,str.len+1,(void **) &index_ptr)==SUCCESS) { - int type,link; + int type; + ulong link; void *ptr; if (Z_TYPE_P(index_ptr) != le_index_ptr) { RETURN_FALSE; } - link = (int) index_ptr->ptr; + link = (ulong) index_ptr->ptr; ptr = zend_list_find(link,&type); /* check if the link is still there */ if (ptr && (type==le_link || type==le_plink)) { Z_LVAL_P(return_value) = link; @@ -2166,14 +2167,15 @@ PHP_FUNCTION(pg_field_table) if (return_oid) { +#if UINT_MAX > LONG_MAX /* Oid is unsigned int, we don't need this code, where LONG is wider */ if (oid > LONG_MAX) { smart_str oidstr = {0}; smart_str_append_unsigned(&oidstr, oid); smart_str_0(&oidstr); RETURN_STRINGL(oidstr.c, oidstr.len, 0); - } else { + } else +#endif RETURN_LONG((long)oid); - } } /* try to lookup the table name in the resource list */ @@ -2271,7 +2273,7 @@ static void php_pgsql_get_field_info(INTERNAL_FUNCTION_PARAMETERS, int entry_typ case PHP_PG_FIELD_TYPE_OID: oid = PQftype(pgsql_result, field); - +#if UINT_MAX > LONG_MAX if (oid > LONG_MAX) { smart_str s = {0}; smart_str_append_unsigned(&s, oid); @@ -2279,7 +2281,9 @@ static void php_pgsql_get_field_info(INTERNAL_FUNCTION_PARAMETERS, int entry_typ Z_STRVAL_P(return_value) = s.c; Z_STRLEN_P(return_value) = s.len; Z_TYPE_P(return_value) = IS_STRING; - } else { + } else +#endif + { Z_LVAL_P(return_value) = (long)oid; Z_TYPE_P(return_value) = IS_LONG; } @@ -3760,7 +3764,11 @@ PHP_FUNCTION(pg_copy_to) pg_null_as = safe_estrdup("\\\\N"); } - spprintf(&query, 0, "COPY \"%s\" TO STDOUT DELIMITERS '%c' WITH NULL AS '%s'", table_name, *pg_delim, pg_null_as); + if (memchr(table_name, '.', table_name_len)) { + spprintf(&query, 0, "COPY %s TO STDOUT DELIMITERS '%c' WITH NULL AS '%s'", table_name, *pg_delim, pg_null_as); + } else { + spprintf(&query, 0, "COPY \"%s\" TO STDOUT DELIMITERS '%c' WITH NULL AS '%s'", table_name, *pg_delim, pg_null_as); + } while ((pgsql_result = PQgetResult(pgsql))) { PQclear(pgsql_result); diff --git a/ext/pgsql/php_pgsql.h b/ext/pgsql/php_pgsql.h index efc804098..09a53c173 100644 --- a/ext/pgsql/php_pgsql.h +++ b/ext/pgsql/php_pgsql.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_pgsql.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_pgsql.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_PGSQL_H #define PHP_PGSQL_H diff --git a/ext/pgsql/tests/10pg_convert.phpt b/ext/pgsql/tests/10pg_convert.phpt index b88b8e579..73bf2b64e 100644 --- a/ext/pgsql/tests/10pg_convert.phpt +++ b/ext/pgsql/tests/10pg_convert.phpt @@ -1,7 +1,10 @@ --TEST-- PostgreSQL pg_convert() --SKIPIF-- - +='); +?> --FILE-- +--FILE-- +'1234', 'str'=>'AAA', 'bin'=>'BBB'); +$converted = pg_convert($db, $table_name, $fields); + +var_dump($converted); +?> +--EXPECT-- +array(3) { + ["num"]=> + string(4) "1234" + ["str"]=> + string(5) "'AAA'" + ["bin"]=> + string(11) "'\\x424242'" +} diff --git a/ext/pgsql/tests/12pg_insert.phpt b/ext/pgsql/tests/12pg_insert.phpt index 8d98f220f..f5cd868f8 100644 --- a/ext/pgsql/tests/12pg_insert.phpt +++ b/ext/pgsql/tests/12pg_insert.phpt @@ -1,7 +1,10 @@ --TEST-- PostgreSQL pg_insert() --SKIPIF-- - +='); +?> --FILE-- +--FILE-- +'1234', 'str'=>'AAA', 'bin'=>'BBB'); + +pg_insert($db, $table_name, $fields) or print "Error in test 1\n"; +echo pg_insert($db, $table_name, $fields, PGSQL_DML_STRING)."\n"; + +echo "Ok\n"; +?> +--EXPECT-- +INSERT INTO php_pgsql_test (num,str,bin) VALUES (1234,'AAA','\\x424242'); +Ok diff --git a/ext/pgsql/tests/13pg_select.phpt b/ext/pgsql/tests/13pg_select.phpt index 55e88db73..f1504a8b1 100644 --- a/ext/pgsql/tests/13pg_select.phpt +++ b/ext/pgsql/tests/13pg_select.phpt @@ -1,7 +1,10 @@ --TEST-- PostgreSQL pg_select() --SKIPIF-- - +='); +?> --FILE-- +--FILE-- +'1234', 'str'=>'ABC', 'bin'=>'XYZ'); +$ids = array('num'=>'1234'); + +$res = pg_select($db, $table_name, $ids) or print "Error\n"; +var_dump($res); +echo pg_select($db, $table_name, $ids, PGSQL_DML_STRING)."\n"; +echo "Ok\n"; + +?> +--EXPECT-- +array(1) { + [0]=> + array(3) { + ["num"]=> + string(4) "1234" + ["str"]=> + string(3) "AAA" + ["bin"]=> + string(8) "\x424242" + } +} +SELECT * FROM php_pgsql_test WHERE num=1234; +Ok diff --git a/ext/pgsql/tests/14pg_update.phpt b/ext/pgsql/tests/14pg_update.phpt index ef8d7e49b..b41dd1af8 100644 --- a/ext/pgsql/tests/14pg_update.phpt +++ b/ext/pgsql/tests/14pg_update.phpt @@ -1,7 +1,10 @@ --TEST-- PostgreSQL pg_update() --SKIPIF-- - +='); +?> --FILE-- +--FILE-- +'1234', 'str'=>'ABC', 'bin'=>'XYZ'); +$ids = array('num'=>'1234'); + +pg_update($db, $table_name, $fields, $ids) or print "Error in test 1\n"; +echo pg_update($db, $table_name, $fields, $ids, PGSQL_DML_STRING)."\n"; + +echo "Ok\n"; +?> +--EXPECT-- +UPDATE php_pgsql_test SET num=1234,str='ABC',bin='\\x58595a' WHERE num=1234; +Ok diff --git a/ext/pgsql/tests/bug37100.phpt b/ext/pgsql/tests/bug37100.phpt index b66149e4a..fa6b9ba9e 100644 --- a/ext/pgsql/tests/bug37100.phpt +++ b/ext/pgsql/tests/bug37100.phpt @@ -1,7 +1,10 @@ --TEST-- Bug #37100 (data is returned truncated with BINARY CURSOR) --SKIPIF-- - +='); +?> --FILE-- +--FILE-- + +--EXPECT-- +string(14) "\x0103aa000812" +string(12) "0103aa000812" +int(6) +string(12) "0103aa000812" diff --git a/ext/pgsql/tests/skipif.inc b/ext/pgsql/tests/skipif.inc index 043a0bd8d..74b27b3ad 100644 --- a/ext/pgsql/tests/skipif.inc +++ b/ext/pgsql/tests/skipif.inc @@ -15,4 +15,17 @@ $conn = @pg_connect($conn_str); if (!is_resource($conn)) { die("skip could not connect\n"); } -?> \ No newline at end of file + +function skip_server_version($version, $op = '<') { _skip_version('server', $version, $op); } +function skip_client_version($version, $op = '<') { _skip_version('client', $version, $op); } + + +function _skip_version($type, $version, $op) +{ + $pg = pg_parameter_status($type.'_version'); + if (version_compare($pg, $version, $op)) { + die("skip {$type} version {$pg} is {$op} {$version}\n"); + } +} + +?> diff --git a/ext/phar/phar.c b/ext/phar/phar.c index 571ae4577..9b8233d7d 100644 --- a/ext/phar/phar.c +++ b/ext/phar/phar.c @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: phar.c 286338 2009-07-26 01:03:47Z cellog $ */ +/* $Id: phar.c 290435 2009-11-09 17:21:15Z rasmus $ */ #define PHAR_MAIN 1 #include "phar_internal.h" @@ -3665,7 +3665,7 @@ PHP_MINFO_FUNCTION(phar) /* {{{ */ php_info_print_table_header(2, "Phar: PHP Archive support", "enabled"); php_info_print_table_row(2, "Phar EXT version", PHP_PHAR_VERSION); php_info_print_table_row(2, "Phar API version", PHP_PHAR_API_VERSION); - php_info_print_table_row(2, "CVS revision", "$Revision: 286338 $"); + php_info_print_table_row(2, "SVN revision", "$Revision: 290435 $"); php_info_print_table_row(2, "Phar-based phar archives", "enabled"); php_info_print_table_row(2, "Tar-based phar archives", "enabled"); php_info_print_table_row(2, "ZIP-based phar archives", "enabled"); @@ -3706,7 +3706,7 @@ PHP_MINFO_FUNCTION(phar) /* {{{ */ /* {{{ phar_module_entry */ -static zend_module_dep phar_deps[] = { +static const zend_module_dep phar_deps[] = { ZEND_MOD_OPTIONAL("apc") ZEND_MOD_OPTIONAL("bz2") ZEND_MOD_OPTIONAL("openssl") diff --git a/ext/phar/phar_object.c b/ext/phar/phar_object.c index 69e8e382b..9c6d8847c 100755 --- a/ext/phar/phar_object.c +++ b/ext/phar/phar_object.c @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: phar_object.c 286518 2009-07-29 16:17:57Z felipe $ */ +/* $Id: phar_object.c 290647 2009-11-13 00:58:11Z cellog $ */ #include "phar_internal.h" #include "func_interceptors.h" @@ -2945,7 +2945,7 @@ PHP_METHOD(Phar, isBuffering) { PHAR_ARCHIVE_OBJECT(); - RETURN_BOOL(!phar_obj->arc.archive->donotflush); + RETURN_BOOL(phar_obj->arc.archive->donotflush); } /* }}} */ diff --git a/ext/phar/php_phar.h b/ext/phar/php_phar.h index 494ef6717..198ac7679 100644 --- a/ext/phar/php_phar.h +++ b/ext/phar/php_phar.h @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_phar.h 290601 2009-11-12 17:43:23Z johannes $ */ +/* $Id: php_phar.h 290527 2009-11-11 21:02:59Z cellog $ */ #ifndef PHP_PHAR_H #define PHP_PHAR_H diff --git a/ext/phar/tests/phar_begin_setstub_commit.phpt b/ext/phar/tests/phar_begin_setstub_commit.phpt index 42556c3fb..9d3e38323 100755 --- a/ext/phar/tests/phar_begin_setstub_commit.phpt +++ b/ext/phar/tests/phar_begin_setstub_commit.phpt @@ -36,8 +36,8 @@ var_dump($p->getStub()); unlink(dirname(__FILE__) . '/brandnewphar.phar'); ?> --EXPECT-- -bool(true) bool(false) +bool(true) string(5) "Hello" string(84) " " @@ -45,7 +45,7 @@ string(5) "World" string(85) " " ===COMMIT=== -bool(true) +bool(false) string(5) "Hello" string(5) "World" string(85) " diff --git a/ext/phar/tests/phar_begin_setstub_commitU.phpt b/ext/phar/tests/phar_begin_setstub_commitU.phpt index c7665576b..805e76232 100644 --- a/ext/phar/tests/phar_begin_setstub_commitU.phpt +++ b/ext/phar/tests/phar_begin_setstub_commitU.phpt @@ -36,8 +36,8 @@ var_dump($p->getStub()); unlink(dirname(__FILE__) . '/brandnewphar.phar'); ?> --EXPECT-- -bool(true) bool(false) +bool(true) unicode(5) "Hello" string(84) " " @@ -45,7 +45,7 @@ unicode(5) "World" string(85) " " ===COMMIT=== -bool(true) +bool(false) unicode(5) "Hello" unicode(5) "World" string(85) " diff --git a/ext/phar/tests/phar_buildfromdirectory6.phpt b/ext/phar/tests/phar_buildfromdirectory6.phpt index 2edd0962f..99566c192 100644 --- a/ext/phar/tests/phar_buildfromdirectory6.phpt +++ b/ext/phar/tests/phar_buildfromdirectory6.phpt @@ -15,7 +15,7 @@ foreach(range(1, 4) as $i) { try { $phar = new Phar(dirname(__FILE__) . '/buildfromdirectory.phar'); - var_dump($phar->buildFromDirectory(dirname(__FILE__) . '/testdir', '/\.php/')); + var_dump($phar->buildFromDirectory(dirname(__FILE__) . '/testdir', '/\.php$/')); } catch (Exception $e) { var_dump(get_class($e)); echo $e->getMessage() . "\n"; diff --git a/ext/phar/tests/tar/phar_begin_setstub_commit.phpt b/ext/phar/tests/tar/phar_begin_setstub_commit.phpt index 693b7eda9..d18f32ed3 100755 --- a/ext/phar/tests/tar/phar_begin_setstub_commit.phpt +++ b/ext/phar/tests/tar/phar_begin_setstub_commit.phpt @@ -37,8 +37,8 @@ unlink(dirname(__FILE__) . '/brandnewphar.phar.tar'); ?> --EXPECT-- bool(true) -bool(true) bool(false) +bool(true) string(5) "Hello" string(84) " " @@ -46,7 +46,7 @@ string(5) "World" string(85) " " ===COMMIT=== -bool(true) +bool(false) string(5) "Hello" string(5) "World" string(85) " diff --git a/ext/phar/tests/tar/phar_begin_setstub_commitU.phpt b/ext/phar/tests/tar/phar_begin_setstub_commitU.phpt index 06b2bed37..d058b3616 100644 --- a/ext/phar/tests/tar/phar_begin_setstub_commitU.phpt +++ b/ext/phar/tests/tar/phar_begin_setstub_commitU.phpt @@ -37,8 +37,8 @@ unlink(dirname(__FILE__) . '/brandnewphar.phar.tar'); ?> --EXPECT-- bool(true) -bool(true) bool(false) +bool(true) unicode(5) "Hello" string(84) " " @@ -46,7 +46,7 @@ unicode(5) "World" string(85) " " ===COMMIT=== -bool(true) +bool(false) unicode(5) "Hello" unicode(5) "World" string(85) " diff --git a/ext/phar/tests/zip/phar_begin_setstub_commit.phpt b/ext/phar/tests/zip/phar_begin_setstub_commit.phpt index e0f14cc36..dc59f2f3a 100755 --- a/ext/phar/tests/zip/phar_begin_setstub_commit.phpt +++ b/ext/phar/tests/zip/phar_begin_setstub_commit.phpt @@ -50,8 +50,8 @@ unlink(dirname(__FILE__) . '/myfakestub.php'); ?> --EXPECT-- bool(true) -bool(true) bool(false) +bool(true) string(5) "Hello" string(84) " " @@ -59,7 +59,7 @@ string(5) "World" string(85) " " ===COMMIT=== -bool(true) +bool(false) string(5) "Hello" string(5) "World" string(85) " diff --git a/ext/phar/tests/zip/phar_begin_setstub_commitU.phpt b/ext/phar/tests/zip/phar_begin_setstub_commitU.phpt index 43a140f9a..2956fc6f4 100644 --- a/ext/phar/tests/zip/phar_begin_setstub_commitU.phpt +++ b/ext/phar/tests/zip/phar_begin_setstub_commitU.phpt @@ -50,8 +50,8 @@ unlink(dirname(__FILE__) . '/myfakestub.php'); ?> --EXPECT-- bool(true) -bool(true) bool(false) +bool(true) unicode(5) "Hello" string(84) " " @@ -59,7 +59,7 @@ unicode(5) "World" string(85) " " ===COMMIT=== -bool(true) +bool(false) unicode(5) "Hello" unicode(5) "World" string(85) " diff --git a/ext/phar/tests/zip/phar_stub.phpt b/ext/phar/tests/zip/phar_stub.phpt index 302a894d7..72c1f17d7 100644 --- a/ext/phar/tests/zip/phar_stub.phpt +++ b/ext/phar/tests/zip/phar_stub.phpt @@ -19,12 +19,6 @@ $p['b'] = 'b'; $p['c'] = 'c'; copy($fname2, $fname); -$a = stat($pname . '/a'); -$b = stat($pname2 . '/a'); -if ($a['mtime'] != $b['mtime']) { - echo "timestamp changed, was $a[mtime], now $b[mtime]!\n"; -} - $phar = new Phar($fname); echo $phar->getStub(); diff --git a/ext/posix/php_posix.h b/ext/posix/php_posix.h index fdc69b79e..834fc7c66 100644 --- a/ext/posix/php_posix.h +++ b/ext/posix/php_posix.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ */ -/* $Id: php_posix.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_posix.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_POSIX_H #define PHP_POSIX_H diff --git a/ext/posix/posix.c b/ext/posix/posix.c index 1e6c5eccc..3d4dd640f 100644 --- a/ext/posix/posix.c +++ b/ext/posix/posix.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: posix.c 289424 2009-10-09 14:46:48Z pajoye $ */ +/* $Id: posix.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -310,7 +310,7 @@ const zend_function_entry posix_functions[] = { static PHP_MINFO_FUNCTION(posix) { php_info_print_table_start(); - php_info_print_table_row(2, "Revision", "$Revision: 289424 $"); + php_info_print_table_row(2, "Revision", "$Revision: 293036 $"); php_info_print_table_end(); } /* }}} */ diff --git a/ext/posix/tests/posix_access.phpt b/ext/posix/tests/posix_access.phpt index a427f8a19..1bd601ad4 100644 --- a/ext/posix/tests/posix_access.phpt +++ b/ext/posix/tests/posix_access.phpt @@ -43,7 +43,7 @@ chmod ($filename, 0700); unlink($filename); ?> --EXPECTF-- -PHP Warning: Directive 'safe_mode' is deprecated in PHP 5.3 and greater in %s on line %d +Warning: Directive 'safe_mode' is deprecated in PHP 5.3 and greater in %s on line %d bool(true) bool(true) bool(true) diff --git a/ext/posix/tests/posix_access_error_modes.phpt b/ext/posix/tests/posix_access_error_modes.phpt index bfe366f81..0d79996bd 100644 --- a/ext/posix/tests/posix_access_error_modes.phpt +++ b/ext/posix/tests/posix_access_error_modes.phpt @@ -37,7 +37,7 @@ chmod ($filename, 0700); unlink($filename); ?> --EXPECTF-- -PHP Warning: Directive 'safe_mode' is deprecated in PHP 5.3 and greater in Unknown on line %d +Warning: Directive 'safe_mode' is deprecated in PHP 5.3 and greater in Unknown on line %d bool(false) bool(false) bool(false) diff --git a/ext/posix/tests/posix_access_error_wrongparams.phpt b/ext/posix/tests/posix_access_error_wrongparams.phpt index 04f933545..7f938a849 100644 --- a/ext/posix/tests/posix_access_error_wrongparams.phpt +++ b/ext/posix/tests/posix_access_error_wrongparams.phpt @@ -28,7 +28,7 @@ var_dump(posix_access('./foobar')); ?> ===DONE=== --EXPECTF-- -PHP Warning: Directive 'safe_mode' is deprecated in PHP 5.3 and greater in Unknown on line 0 +Warning: Directive 'safe_mode' is deprecated in PHP 5.3 and greater in Unknown on line 0 Warning: posix_access() expects at least 1 parameter, 0 given in %s on line %d bool(false) diff --git a/ext/posix/tests/posix_access_safemode.phpt b/ext/posix/tests/posix_access_safemode.phpt index 6055c8074..1e156f951 100644 --- a/ext/posix/tests/posix_access_safemode.phpt +++ b/ext/posix/tests/posix_access_safemode.phpt @@ -19,6 +19,6 @@ var_dump(posix_access('/tmp', POSIX_W_OK)); ?> ===DONE=== --EXPECTF-- -PHP Warning: Directive 'safe_mode' is deprecated in PHP 5.3 and greater in %s on line %d +Warning: Directive 'safe_mode' is deprecated in PHP 5.3 and greater in %s on line %d bool(false) ===DONE=== diff --git a/ext/posix/tests/posix_errno_variation1.phpt b/ext/posix/tests/posix_errno_variation1.phpt index aa9889f7f..b57b7c0ca 100644 --- a/ext/posix/tests/posix_errno_variation1.phpt +++ b/ext/posix/tests/posix_errno_variation1.phpt @@ -7,6 +7,7 @@ Francesco Fullone ff@ideato.it --SKIPIF-- --FILE-- --FILE-- --EXPECTF-- -PHP Warning: Directive 'safe_mode' is deprecated in PHP 5.3 and greater in %s on line %d +Warning: Directive 'safe_mode' is deprecated in PHP 5.3 and greater in %s on line %d Warning: posix_mkfifo(): SAFE MODE Restriction in effect. The script whose uid is %d is not allowed to access /tmp owned by uid %d in %s on line %d bool(false) diff --git a/ext/posix/tests/posix_seteuid_variation2.phpt b/ext/posix/tests/posix_seteuid_variation2.phpt index 2ab7302ce..bcba39438 100644 --- a/ext/posix/tests/posix_seteuid_variation2.phpt +++ b/ext/posix/tests/posix_seteuid_variation2.phpt @@ -3,6 +3,7 @@ Test function posix_seteuid() by substituting argument 1 with boolean values. --SKIPIF-- --CREDITS-- Marco Fabbri mrfabbri@gmail.com diff --git a/ext/posix/tests/posix_seteuid_variation3.phpt b/ext/posix/tests/posix_seteuid_variation3.phpt index 70c05c86e..8b57864de 100644 --- a/ext/posix/tests/posix_seteuid_variation3.phpt +++ b/ext/posix/tests/posix_seteuid_variation3.phpt @@ -3,6 +3,7 @@ Test function posix_seteuid() by substituting argument 1 with emptyUnsetUndefNul --SKIPIF-- --CREDITS-- Marco Fabbri mrfabbri@gmail.com diff --git a/ext/posix/tests/posix_seteuid_variation4.phpt b/ext/posix/tests/posix_seteuid_variation4.phpt index 65291417e..a6473284d 100644 --- a/ext/posix/tests/posix_seteuid_variation4.phpt +++ b/ext/posix/tests/posix_seteuid_variation4.phpt @@ -3,6 +3,7 @@ Test function posix_seteuid() by substituting argument 1 with float values. --SKIPIF-- --CREDITS-- Marco Fabbri mrfabbri@gmail.com diff --git a/ext/posix/tests/posix_seteuid_variation5.phpt b/ext/posix/tests/posix_seteuid_variation5.phpt index 91d3a72e9..8e43e1a15 100644 --- a/ext/posix/tests/posix_seteuid_variation5.phpt +++ b/ext/posix/tests/posix_seteuid_variation5.phpt @@ -3,6 +3,7 @@ Test function posix_seteuid() by substituting argument 1 with int values. --SKIPIF-- --CREDITS-- Marco Fabbri mrfabbri@gmail.com diff --git a/ext/posix/tests/posix_setgid_variation2.phpt b/ext/posix/tests/posix_setgid_variation2.phpt index 6d53b0837..b8e50bad4 100644 --- a/ext/posix/tests/posix_setgid_variation2.phpt +++ b/ext/posix/tests/posix_setgid_variation2.phpt @@ -3,6 +3,7 @@ Test function posix_setgid() by substituting argument 1 with boolean values. --SKIPIF-- --CREDITS-- Marco Fabbri mrfabbri@gmail.com @@ -36,4 +37,4 @@ bool(false) bool(false) bool(false) ===DONE=== - \ No newline at end of file + diff --git a/ext/posix/tests/posix_setgid_variation3.phpt b/ext/posix/tests/posix_setgid_variation3.phpt index 5855746f0..cb9da62a9 100644 --- a/ext/posix/tests/posix_setgid_variation3.phpt +++ b/ext/posix/tests/posix_setgid_variation3.phpt @@ -7,6 +7,7 @@ Francesco Fullone ff@ideato.it --SKIPIF-- --FILE-- --CREDITS-- Marco Fabbri mrfabbri@gmail.com @@ -38,4 +39,4 @@ bool(false) bool(false) bool(false) ===DONE=== - \ No newline at end of file + diff --git a/ext/posix/tests/posix_setgid_variation5.phpt b/ext/posix/tests/posix_setgid_variation5.phpt index 91f2bb593..49e98ec8e 100644 --- a/ext/posix/tests/posix_setgid_variation5.phpt +++ b/ext/posix/tests/posix_setgid_variation5.phpt @@ -3,6 +3,7 @@ Test function posix_setgid() by substituting argument 1 with int values. --SKIPIF-- --CREDITS-- Marco Fabbri mrfabbri@gmail.com @@ -34,4 +35,4 @@ bool(false) bool(false) bool(false) ===DONE=== - \ No newline at end of file + diff --git a/ext/posix/tests/posix_setuid_variation2.phpt b/ext/posix/tests/posix_setuid_variation2.phpt index c8ef92827..77505a64f 100644 --- a/ext/posix/tests/posix_setuid_variation2.phpt +++ b/ext/posix/tests/posix_setuid_variation2.phpt @@ -3,6 +3,7 @@ Test function posix_setuid() by substituting argument 1 with boolean values. --SKIPIF-- --CREDITS-- Marco Fabbri mrfabbri@gmail.com diff --git a/ext/posix/tests/posix_setuid_variation3.phpt b/ext/posix/tests/posix_setuid_variation3.phpt index 1630cd1d0..495722941 100644 --- a/ext/posix/tests/posix_setuid_variation3.phpt +++ b/ext/posix/tests/posix_setuid_variation3.phpt @@ -3,6 +3,7 @@ Test function posix_setuid() by substituting argument 1 with emptyUnsetUndefNull --SKIPIF-- --CREDITS-- Marco Fabbri mrfabbri@gmail.com diff --git a/ext/posix/tests/posix_setuid_variation4.phpt b/ext/posix/tests/posix_setuid_variation4.phpt index 167596492..288ac0d8f 100644 --- a/ext/posix/tests/posix_setuid_variation4.phpt +++ b/ext/posix/tests/posix_setuid_variation4.phpt @@ -3,6 +3,7 @@ Test function posix_setuid() by substituting argument 1 with float values. --SKIPIF-- --CREDITS-- Marco Fabbri mrfabbri@gmail.com diff --git a/ext/posix/tests/posix_setuid_variation5.phpt b/ext/posix/tests/posix_setuid_variation5.phpt index e1b7c05e0..a4ebe6339 100644 --- a/ext/posix/tests/posix_setuid_variation5.phpt +++ b/ext/posix/tests/posix_setuid_variation5.phpt @@ -3,6 +3,7 @@ Test function posix_setuid() by substituting argument 1 with int values. --SKIPIF-- --CREDITS-- Marco Fabbri mrfabbri@gmail.com diff --git a/ext/posix/tests/posix_uname.phpt b/ext/posix/tests/posix_uname.phpt index 12c4baec1..3acbdaf13 100644 --- a/ext/posix/tests/posix_uname.phpt +++ b/ext/posix/tests/posix_uname.phpt @@ -14,7 +14,9 @@ PHP Testfest Berlin 2009-05-10 ?> --FILE-- ===DONE=== --EXPECTF-- diff --git a/ext/posix/tests/posix_uname_basic.phpt b/ext/posix/tests/posix_uname_basic.phpt index 7dd378192..6bd5b100e 100644 --- a/ext/posix/tests/posix_uname_basic.phpt +++ b/ext/posix/tests/posix_uname_basic.phpt @@ -9,7 +9,7 @@ Test posix_uname() function : basic functionality echo "Basic test of POSIX uname function\n"; $uname = posix_uname(); - + unset($uname['domainname']); print_r($uname); ?> diff --git a/ext/pspell/php_pspell.h b/ext/pspell/php_pspell.h index 525a2c9d3..6aa91ef51 100644 --- a/ext/pspell/php_pspell.h +++ b/ext/pspell/php_pspell.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_pspell.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_pspell.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef _PSPELL_H #define _PSPELL_H diff --git a/ext/pspell/pspell.c b/ext/pspell/pspell.c index 692d597d9..4db27d9c4 100644 --- a/ext/pspell/pspell.c +++ b/ext/pspell/pspell.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: pspell.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: pspell.c 293036 2010-01-03 09:23:27Z sebastian $ */ #define IS_EXT_MODULE diff --git a/ext/readline/config.m4 b/ext/readline/config.m4 index 00875c0d6..077920350 100644 --- a/ext/readline/config.m4 +++ b/ext/readline/config.m4 @@ -1,5 +1,5 @@ dnl -dnl $Id: config.m4 286797 2009-08-04 11:20:49Z jani $ +dnl $Id: config.m4 292081 2009-12-13 17:06:47Z felipe $ dnl PHP_ARG_WITH(libedit,for libedit readline replacement, @@ -65,7 +65,7 @@ if test "$PHP_READLINE" && test "$PHP_READLINE" != "no"; then elif test "$PHP_LIBEDIT" != "no"; then for i in $PHP_LIBEDIT /usr/local /usr; do - test -f $i/include/readline/readline.h && LIBEDIT_DIR=$i && break + test -f $i/include/editline/readline.h && LIBEDIT_DIR=$i && break done if test -z "$LIBEDIT_DIR"; then diff --git a/ext/readline/php_readline.h b/ext/readline/php_readline.h index 3b4ded071..eddf1f948 100644 --- a/ext/readline/php_readline.h +++ b/ext/readline/php_readline.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_readline.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_readline.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_READLINE_H #define PHP_READLINE_H diff --git a/ext/readline/readline.c b/ext/readline/readline.c index 9678d8f4a..84b9ef257 100644 --- a/ext/readline/readline.c +++ b/ext/readline/readline.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: readline.c 274222 2009-01-22 14:40:20Z iliaa $ */ +/* $Id: readline.c 293036 2010-01-03 09:23:27Z sebastian $ */ /* {{{ includes & prototypes */ @@ -33,8 +33,10 @@ #define rl_completion_matches completion_matches #endif +#ifdef HAVE_LIBEDIT +#include +#else #include -#ifndef HAVE_LIBEDIT #include #endif diff --git a/ext/readline/tests/readline_add_history_001.phpt b/ext/readline/tests/readline_add_history_001.phpt index 4b092d07c..a4bd52473 100644 --- a/ext/readline/tests/readline_add_history_001.phpt +++ b/ext/readline/tests/readline_add_history_001.phpt @@ -1,7 +1,7 @@ --TEST-- readline_add_history(): Basic test --SKIPIF-- - + --FILE-- + --FILE-- + --FILE-- + --FILE-- + --FILE-- + --FILE-- ce = ce; reference->prop = *prop; - reference->ignore_visibility = 0; intern->ptr = reference; intern->ref_type = REF_TYPE_PROPERTY; intern->ce = ce; + intern->ignore_visibility = 0; zend_hash_update(Z_OBJPROP_P(object), "name", sizeof("name"), (void **) &name, sizeof(zval *), NULL); zend_hash_update(Z_OBJPROP_P(object), "class", sizeof("class"), (void **) &classname, sizeof(zval *), NULL); } @@ -2561,8 +2559,9 @@ ZEND_METHOD(reflection_method, invoke) GET_REFLECTION_OBJECT_PTR(mptr); - if (!(mptr->common.fn_flags & ZEND_ACC_PUBLIC) - || (mptr->common.fn_flags & ZEND_ACC_ABSTRACT)) + if ((!(mptr->common.fn_flags & ZEND_ACC_PUBLIC) + || (mptr->common.fn_flags & ZEND_ACC_ABSTRACT)) + && intern->ignore_visibility == 0) { if (mptr->common.fn_flags & ZEND_ACC_ABSTRACT) { zend_throw_exception_ex(reflection_exception_ptr, 0 TSRMLS_CC, @@ -2669,8 +2668,9 @@ ZEND_METHOD(reflection_method, invokeArgs) return; } - if (!(mptr->common.fn_flags & ZEND_ACC_PUBLIC) - || (mptr->common.fn_flags & ZEND_ACC_ABSTRACT)) + if ((!(mptr->common.fn_flags & ZEND_ACC_PUBLIC) + || (mptr->common.fn_flags & ZEND_ACC_ABSTRACT)) + && intern->ignore_visibility == 0) { if (mptr->common.fn_flags & ZEND_ACC_ABSTRACT) { zend_throw_exception_ex(reflection_exception_ptr, 0 TSRMLS_CC, @@ -2959,6 +2959,27 @@ ZEND_METHOD(reflection_method, getPrototype) } /* }}} */ +/* {{{ proto public void ReflectionMethod::setAccessible(bool visible) + Sets whether non-public methods can be invoked */ +ZEND_METHOD(reflection_method, setAccessible) +{ + reflection_object *intern; + zend_bool visible; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "b", &visible) == FAILURE) { + return; + } + + intern = (reflection_object *) zend_object_store_get_object(getThis() TSRMLS_CC); + + if (intern == NULL) { + return; + } + + intern->ignore_visibility = visible; +} +/* }}} */ + /* {{{ proto public static mixed ReflectionClass::export(mixed argument [, bool return]) throws ReflectionException Exports a reflection object. Returns the output if TRUE is specified for return, printing it otherwise. */ ZEND_METHOD(reflection_class, export) @@ -3064,9 +3085,7 @@ ZEND_METHOD(reflection_class, getStaticProperties) if (!(class_name && class_name[0] != '*' && strcmp(class_name, ce->name))) { /* copy: enforce read only access */ ALLOC_ZVAL(prop_copy); - *prop_copy = **value; - zval_copy_ctor(prop_copy); - INIT_PZVAL(prop_copy); + MAKE_COPY_ZVAL(value, prop_copy); add_assoc_zval(return_value, prop_name, prop_copy); } @@ -3189,9 +3208,7 @@ ZEND_METHOD(reflection_class, getDefaultProperties) /* copy: enforce read only access */ ALLOC_ZVAL(prop_copy); - *prop_copy = **prop; - zval_copy_ctor(prop_copy); - INIT_PZVAL(prop_copy); + MAKE_COPY_ZVAL(prop, prop_copy); add_assoc_zval(return_value, prop_name, prop_copy); } @@ -3489,6 +3506,7 @@ ZEND_METHOD(reflection_class, getMethods) ZEND_METHOD(reflection_class, hasProperty) { reflection_object *intern; + zend_property_info *property_info; zend_class_entry *ce; char *name; int name_len; @@ -3500,14 +3518,16 @@ ZEND_METHOD(reflection_class, hasProperty) } GET_REFLECTION_OBJECT_PTR(ce); - if (zend_hash_exists(&ce->properties_info, name, name_len + 1)) { + if (zend_hash_find(&ce->properties_info, name, name_len+1, (void **) &property_info) == SUCCESS) { + if (property_info->flags & ZEND_ACC_SHADOW) { + RETURN_FALSE; + } RETURN_TRUE; } else { - if (intern->obj && Z_OBJ_HANDLER_P(intern->obj, has_property)) - { + if (intern->obj && Z_OBJ_HANDLER_P(intern->obj, has_property)) { MAKE_STD_ZVAL(property); ZVAL_STRINGL(property, name, name_len, 1); - if (Z_OBJ_HANDLER_P(intern->obj, has_property)(intern->obj, property, 0 TSRMLS_CC)) { + if (Z_OBJ_HANDLER_P(intern->obj, has_property)(intern->obj, property, 2 TSRMLS_CC)) { zval_ptr_dtor(&property); RETURN_TRUE; } @@ -3720,9 +3740,7 @@ ZEND_METHOD(reflection_class, getConstant) if (zend_hash_find(&ce->constants_table, name, name_len + 1, (void **) &value) == FAILURE) { RETURN_FALSE; } - *return_value = **value; - zval_copy_ctor(return_value); - INIT_PZVAL(return_value); + MAKE_COPY_ZVAL(value, return_value); } /* }}} */ @@ -4375,10 +4393,10 @@ ZEND_METHOD(reflection_property, __construct) reference->prop = *property_info; } reference->ce = ce; - reference->ignore_visibility = 0; intern->ptr = reference; intern->ref_type = REF_TYPE_PROPERTY; intern->ce = ce; + intern->ignore_visibility = 0; } /* }}} */ @@ -4491,7 +4509,7 @@ ZEND_METHOD(reflection_property, getValue) METHOD_NOTSTATIC(reflection_property_ptr); GET_REFLECTION_OBJECT_PTR(ref); - if (!(ref->prop.flags & (ZEND_ACC_PUBLIC | ZEND_ACC_IMPLICIT_PUBLIC)) && ref->ignore_visibility == 0) { + if (!(ref->prop.flags & (ZEND_ACC_PUBLIC | ZEND_ACC_IMPLICIT_PUBLIC)) && intern->ignore_visibility == 0) { _default_get_entry(getThis(), "name", sizeof("name"), &name TSRMLS_CC); zend_throw_exception_ex(reflection_exception_ptr, 0 TSRMLS_CC, "Cannot access non-public member %s::%s", intern->ce->name, Z_STRVAL(name)); @@ -4505,9 +4523,7 @@ ZEND_METHOD(reflection_property, getValue) zend_error(E_ERROR, "Internal error: Could not find the property %s::%s", intern->ce->name, ref->prop.name); /* Bails out */ } - *return_value= **member; - zval_copy_ctor(return_value); - INIT_PZVAL(return_value); + MAKE_COPY_ZVAL(member, return_value); } else { char *class_name, *prop_name; @@ -4516,9 +4532,7 @@ ZEND_METHOD(reflection_property, getValue) } zend_unmangle_property_name(ref->prop.name, ref->prop.name_length, &class_name, &prop_name); member_p = zend_read_property(ref->ce, object, prop_name, strlen(prop_name), 1 TSRMLS_CC); - *return_value= *member_p; - zval_copy_ctor(return_value); - INIT_PZVAL(return_value); + MAKE_COPY_ZVAL(&member_p, return_value); if (member_p != EG(uninitialized_zval_ptr)) { zval_add_ref(&member_p); zval_ptr_dtor(&member_p); @@ -4543,7 +4557,7 @@ ZEND_METHOD(reflection_property, setValue) METHOD_NOTSTATIC(reflection_property_ptr); GET_REFLECTION_OBJECT_PTR(ref); - if (!(ref->prop.flags & ZEND_ACC_PUBLIC) && ref->ignore_visibility == 0) { + if (!(ref->prop.flags & ZEND_ACC_PUBLIC) && intern->ignore_visibility == 0) { _default_get_entry(getThis(), "name", sizeof("name"), &name TSRMLS_CC); zend_throw_exception_ex(reflection_exception_ptr, 0 TSRMLS_CC, "Cannot access non-public member %s::%s", intern->ce->name, Z_STRVAL(name)); @@ -4655,19 +4669,24 @@ ZEND_METHOD(reflection_property, getDocComment) } /* }}} */ -/* {{{ proto public int ReflectionProperty::setAccessible() +/* {{{ proto public int ReflectionProperty::setAccessible(bool visible) Sets whether non-public properties can be requested */ ZEND_METHOD(reflection_property, setAccessible) { reflection_object *intern; - property_reference *ref; zend_bool visible; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "b", &visible) == FAILURE) { return; } - GET_REFLECTION_OBJECT_PTR(ref); - ref->ignore_visibility = visible; + + intern = (reflection_object *) zend_object_store_get_object(getThis() TSRMLS_CC); + + if (intern == NULL) { + return; + } + + intern->ignore_visibility = visible; } /* }}} */ @@ -5000,6 +5019,9 @@ static const zend_function_entry reflection_exception_functions[] = { {NULL, NULL, NULL} }; +ZEND_BEGIN_ARG_INFO(arginfo_reflection__void, 0) +ZEND_END_ARG_INFO() + ZEND_BEGIN_ARG_INFO(arginfo_reflection_getModifierNames, 0) ZEND_ARG_INFO(0, modifiers) @@ -5018,7 +5040,7 @@ static const zend_function_entry reflection_functions[] = { static const zend_function_entry reflector_functions[] = { ZEND_FENTRY(export, NULL, NULL, ZEND_ACC_STATIC|ZEND_ACC_ABSTRACT|ZEND_ACC_PUBLIC) - ZEND_ABSTRACT_ME(reflector, __toString, NULL) + ZEND_ABSTRACT_ME(reflector, __toString, arginfo_reflection__void) {NULL, NULL, NULL} }; @@ -5040,35 +5062,35 @@ ZEND_BEGIN_ARG_INFO(arginfo_reflection_function_invokeArgs, 0) ZEND_END_ARG_INFO() static const zend_function_entry reflection_function_abstract_functions[] = { - ZEND_ME(reflection, __clone, NULL, ZEND_ACC_PRIVATE|ZEND_ACC_FINAL) - PHP_ABSTRACT_ME(reflection_function, __toString, NULL) - ZEND_ME(reflection_function, inNamespace, NULL, 0) - ZEND_ME(reflection_function, isClosure, NULL, 0) - ZEND_ME(reflection_function, isDeprecated, NULL, 0) - ZEND_ME(reflection_function, isInternal, NULL, 0) - ZEND_ME(reflection_function, isUserDefined, NULL, 0) - ZEND_ME(reflection_function, getDocComment, NULL, 0) - ZEND_ME(reflection_function, getEndLine, NULL, 0) - ZEND_ME(reflection_function, getExtension, NULL, 0) - ZEND_ME(reflection_function, getExtensionName, NULL, 0) - ZEND_ME(reflection_function, getFileName, NULL, 0) - ZEND_ME(reflection_function, getName, NULL, 0) - ZEND_ME(reflection_function, getNamespaceName, NULL, 0) - ZEND_ME(reflection_function, getNumberOfParameters, NULL, 0) - ZEND_ME(reflection_function, getNumberOfRequiredParameters, NULL, 0) - ZEND_ME(reflection_function, getParameters, NULL, 0) - ZEND_ME(reflection_function, getShortName, NULL, 0) - ZEND_ME(reflection_function, getStartLine, NULL, 0) - ZEND_ME(reflection_function, getStaticVariables, NULL, 0) - ZEND_ME(reflection_function, returnsReference, NULL, 0) + ZEND_ME(reflection, __clone, arginfo_reflection__void, ZEND_ACC_PRIVATE|ZEND_ACC_FINAL) + PHP_ABSTRACT_ME(reflection_function, __toString, arginfo_reflection__void) + ZEND_ME(reflection_function, inNamespace, arginfo_reflection__void, 0) + ZEND_ME(reflection_function, isClosure, arginfo_reflection__void, 0) + ZEND_ME(reflection_function, isDeprecated, arginfo_reflection__void, 0) + ZEND_ME(reflection_function, isInternal, arginfo_reflection__void, 0) + ZEND_ME(reflection_function, isUserDefined, arginfo_reflection__void, 0) + ZEND_ME(reflection_function, getDocComment, arginfo_reflection__void, 0) + ZEND_ME(reflection_function, getEndLine, arginfo_reflection__void, 0) + ZEND_ME(reflection_function, getExtension, arginfo_reflection__void, 0) + ZEND_ME(reflection_function, getExtensionName, arginfo_reflection__void, 0) + ZEND_ME(reflection_function, getFileName, arginfo_reflection__void, 0) + ZEND_ME(reflection_function, getName, arginfo_reflection__void, 0) + ZEND_ME(reflection_function, getNamespaceName, arginfo_reflection__void, 0) + ZEND_ME(reflection_function, getNumberOfParameters, arginfo_reflection__void, 0) + ZEND_ME(reflection_function, getNumberOfRequiredParameters, arginfo_reflection__void, 0) + ZEND_ME(reflection_function, getParameters, arginfo_reflection__void, 0) + ZEND_ME(reflection_function, getShortName, arginfo_reflection__void, 0) + ZEND_ME(reflection_function, getStartLine, arginfo_reflection__void, 0) + ZEND_ME(reflection_function, getStaticVariables, arginfo_reflection__void, 0) + ZEND_ME(reflection_function, returnsReference, arginfo_reflection__void, 0) {NULL, NULL, NULL} }; static const zend_function_entry reflection_function_functions[] = { ZEND_ME(reflection_function, __construct, arginfo_reflection_function___construct, 0) - ZEND_ME(reflection_function, __toString, NULL, 0) + ZEND_ME(reflection_function, __toString, arginfo_reflection__void, 0) ZEND_ME(reflection_function, export, arginfo_reflection_function_export, ZEND_ACC_STATIC|ZEND_ACC_PUBLIC) - ZEND_ME(reflection_function, isDisabled, NULL, 0) + ZEND_ME(reflection_function, isDisabled, arginfo_reflection__void, 0) ZEND_ME(reflection_function, invoke, arginfo_reflection_function_invoke, 0) ZEND_ME(reflection_function, invokeArgs, arginfo_reflection_function_invokeArgs, 0) {NULL, NULL, NULL} @@ -5095,23 +5117,28 @@ ZEND_BEGIN_ARG_INFO(arginfo_reflection_method_invokeArgs, 0) ZEND_ARG_ARRAY_INFO(0, args, 0) ZEND_END_ARG_INFO() +ZEND_BEGIN_ARG_INFO(arginfo_reflection_method_setAccessible, 0) + ZEND_ARG_INFO(0, value) +ZEND_END_ARG_INFO() + static const zend_function_entry reflection_method_functions[] = { ZEND_ME(reflection_method, export, arginfo_reflection_method_export, ZEND_ACC_STATIC|ZEND_ACC_PUBLIC) ZEND_ME(reflection_method, __construct, arginfo_reflection_method___construct, 0) - ZEND_ME(reflection_method, __toString, NULL, 0) - ZEND_ME(reflection_method, isPublic, NULL, 0) - ZEND_ME(reflection_method, isPrivate, NULL, 0) - ZEND_ME(reflection_method, isProtected, NULL, 0) - ZEND_ME(reflection_method, isAbstract, NULL, 0) - ZEND_ME(reflection_method, isFinal, NULL, 0) - ZEND_ME(reflection_method, isStatic, NULL, 0) - ZEND_ME(reflection_method, isConstructor, NULL, 0) - ZEND_ME(reflection_method, isDestructor, NULL, 0) - ZEND_ME(reflection_method, getModifiers, NULL, 0) + ZEND_ME(reflection_method, __toString, arginfo_reflection__void, 0) + ZEND_ME(reflection_method, isPublic, arginfo_reflection__void, 0) + ZEND_ME(reflection_method, isPrivate, arginfo_reflection__void, 0) + ZEND_ME(reflection_method, isProtected, arginfo_reflection__void, 0) + ZEND_ME(reflection_method, isAbstract, arginfo_reflection__void, 0) + ZEND_ME(reflection_method, isFinal, arginfo_reflection__void, 0) + ZEND_ME(reflection_method, isStatic, arginfo_reflection__void, 0) + ZEND_ME(reflection_method, isConstructor, arginfo_reflection__void, 0) + ZEND_ME(reflection_method, isDestructor, arginfo_reflection__void, 0) + ZEND_ME(reflection_method, getModifiers, arginfo_reflection__void, 0) ZEND_ME(reflection_method, invoke, arginfo_reflection_method_invoke, 0) ZEND_ME(reflection_method, invokeArgs, arginfo_reflection_method_invokeArgs, 0) - ZEND_ME(reflection_method, getDeclaringClass, NULL, 0) - ZEND_ME(reflection_method, getPrototype, NULL, 0) + ZEND_ME(reflection_method, getDeclaringClass, arginfo_reflection__void, 0) + ZEND_ME(reflection_method, getPrototype, arginfo_reflection__void, 0) + ZEND_ME(reflection_property, setAccessible, arginfo_reflection_method_setAccessible, 0) {NULL, NULL, NULL} }; @@ -5188,19 +5215,19 @@ ZEND_BEGIN_ARG_INFO(arginfo_reflection_class_implementsInterface, 0) ZEND_END_ARG_INFO() static const zend_function_entry reflection_class_functions[] = { - ZEND_ME(reflection, __clone, NULL, ZEND_ACC_PRIVATE|ZEND_ACC_FINAL) + ZEND_ME(reflection, __clone, arginfo_reflection__void, ZEND_ACC_PRIVATE|ZEND_ACC_FINAL) ZEND_ME(reflection_class, export, arginfo_reflection_class_export, ZEND_ACC_STATIC|ZEND_ACC_PUBLIC) ZEND_ME(reflection_class, __construct, arginfo_reflection_class___construct, 0) - ZEND_ME(reflection_class, __toString, NULL, 0) - ZEND_ME(reflection_class, getName, NULL, 0) - ZEND_ME(reflection_class, isInternal, NULL, 0) - ZEND_ME(reflection_class, isUserDefined, NULL, 0) - ZEND_ME(reflection_class, isInstantiable, NULL, 0) - ZEND_ME(reflection_class, getFileName, NULL, 0) - ZEND_ME(reflection_class, getStartLine, NULL, 0) - ZEND_ME(reflection_class, getEndLine, NULL, 0) - ZEND_ME(reflection_class, getDocComment, NULL, 0) - ZEND_ME(reflection_class, getConstructor, NULL, 0) + ZEND_ME(reflection_class, __toString, arginfo_reflection__void, 0) + ZEND_ME(reflection_class, getName, arginfo_reflection__void, 0) + ZEND_ME(reflection_class, isInternal, arginfo_reflection__void, 0) + ZEND_ME(reflection_class, isUserDefined, arginfo_reflection__void, 0) + ZEND_ME(reflection_class, isInstantiable, arginfo_reflection__void, 0) + ZEND_ME(reflection_class, getFileName, arginfo_reflection__void, 0) + ZEND_ME(reflection_class, getStartLine, arginfo_reflection__void, 0) + ZEND_ME(reflection_class, getEndLine, arginfo_reflection__void, 0) + ZEND_ME(reflection_class, getDocComment, arginfo_reflection__void, 0) + ZEND_ME(reflection_class, getConstructor, arginfo_reflection__void, 0) ZEND_ME(reflection_class, hasMethod, arginfo_reflection_class_hasMethod, 0) ZEND_ME(reflection_class, getMethod, arginfo_reflection_class_getMethod, 0) ZEND_ME(reflection_class, getMethods, arginfo_reflection_class_getMethods, 0) @@ -5208,30 +5235,30 @@ static const zend_function_entry reflection_class_functions[] = { ZEND_ME(reflection_class, getProperty, arginfo_reflection_class_getProperty, 0) ZEND_ME(reflection_class, getProperties, arginfo_reflection_class_getProperties, 0) ZEND_ME(reflection_class, hasConstant, arginfo_reflection_class_hasConstant, 0) - ZEND_ME(reflection_class, getConstants, NULL, 0) + ZEND_ME(reflection_class, getConstants, arginfo_reflection__void, 0) ZEND_ME(reflection_class, getConstant, arginfo_reflection_class_getConstant, 0) - ZEND_ME(reflection_class, getInterfaces, NULL, 0) - ZEND_ME(reflection_class, getInterfaceNames, NULL, 0) - ZEND_ME(reflection_class, isInterface, NULL, 0) - ZEND_ME(reflection_class, isAbstract, NULL, 0) - ZEND_ME(reflection_class, isFinal, NULL, 0) - ZEND_ME(reflection_class, getModifiers, NULL, 0) + ZEND_ME(reflection_class, getInterfaces, arginfo_reflection__void, 0) + ZEND_ME(reflection_class, getInterfaceNames, arginfo_reflection__void, 0) + ZEND_ME(reflection_class, isInterface, arginfo_reflection__void, 0) + ZEND_ME(reflection_class, isAbstract, arginfo_reflection__void, 0) + ZEND_ME(reflection_class, isFinal, arginfo_reflection__void, 0) + ZEND_ME(reflection_class, getModifiers, arginfo_reflection__void, 0) ZEND_ME(reflection_class, isInstance, arginfo_reflection_class_isInstance, 0) ZEND_ME(reflection_class, newInstance, arginfo_reflection_class_newInstance, 0) ZEND_ME(reflection_class, newInstanceArgs, arginfo_reflection_class_newInstanceArgs, 0) - ZEND_ME(reflection_class, getParentClass, NULL, 0) + ZEND_ME(reflection_class, getParentClass, arginfo_reflection__void, 0) ZEND_ME(reflection_class, isSubclassOf, arginfo_reflection_class_isSubclassOf, 0) - ZEND_ME(reflection_class, getStaticProperties, NULL, 0) + ZEND_ME(reflection_class, getStaticProperties, arginfo_reflection__void, 0) ZEND_ME(reflection_class, getStaticPropertyValue, arginfo_reflection_class_getStaticPropertyValue, 0) ZEND_ME(reflection_class, setStaticPropertyValue, arginfo_reflection_class_setStaticPropertyValue, 0) - ZEND_ME(reflection_class, getDefaultProperties, NULL, 0) - ZEND_ME(reflection_class, isIterateable, NULL, 0) + ZEND_ME(reflection_class, getDefaultProperties, arginfo_reflection__void, 0) + ZEND_ME(reflection_class, isIterateable, arginfo_reflection__void, 0) ZEND_ME(reflection_class, implementsInterface, arginfo_reflection_class_implementsInterface, 0) - ZEND_ME(reflection_class, getExtension, NULL, 0) - ZEND_ME(reflection_class, getExtensionName, NULL, 0) - ZEND_ME(reflection_class, inNamespace, NULL, 0) - ZEND_ME(reflection_class, getNamespaceName, NULL, 0) - ZEND_ME(reflection_class, getShortName, NULL, 0) + ZEND_ME(reflection_class, getExtension, arginfo_reflection__void, 0) + ZEND_ME(reflection_class, getExtensionName, arginfo_reflection__void, 0) + ZEND_ME(reflection_class, inNamespace, arginfo_reflection__void, 0) + ZEND_ME(reflection_class, getNamespaceName, arginfo_reflection__void, 0) + ZEND_ME(reflection_class, getShortName, arginfo_reflection__void, 0) {NULL, NULL, NULL} }; @@ -5252,44 +5279,46 @@ static const zend_function_entry reflection_object_functions[] = { }; -ZEND_BEGIN_ARG_INFO_EX(arginfo_reflection_property_export, 0, 0, 1) - ZEND_ARG_INFO(0, argument) +ZEND_BEGIN_ARG_INFO_EX(arginfo_reflection_property_export, 0, 0, 2) + ZEND_ARG_INFO(0, class) + ZEND_ARG_INFO(0, name) ZEND_ARG_INFO(0, return) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO(arginfo_reflection_property___construct, 0) - ZEND_ARG_INFO(0, argument) +ZEND_BEGIN_ARG_INFO_EX(arginfo_reflection_property___construct, 0, 0, 0) + ZEND_ARG_INFO(0, class) + ZEND_ARG_INFO(0, name) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_reflection_property_getValue, 0, 0, 0) ZEND_ARG_INFO(0, object) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO(arginfo_reflection_property_setValue, 0) +ZEND_BEGIN_ARG_INFO_EX(arginfo_reflection_property_setValue, 0, 0, 1) ZEND_ARG_INFO(0, object) ZEND_ARG_INFO(0, value) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO(arginfo_reflection_property_setAccessible, 0) - ZEND_ARG_INFO(0, value) + ZEND_ARG_INFO(0, visible) ZEND_END_ARG_INFO() static const zend_function_entry reflection_property_functions[] = { - ZEND_ME(reflection, __clone, NULL, ZEND_ACC_PRIVATE|ZEND_ACC_FINAL) + ZEND_ME(reflection, __clone, arginfo_reflection__void, ZEND_ACC_PRIVATE|ZEND_ACC_FINAL) ZEND_ME(reflection_property, export, arginfo_reflection_property_export, ZEND_ACC_STATIC|ZEND_ACC_PUBLIC) ZEND_ME(reflection_property, __construct, arginfo_reflection_property___construct, 0) - ZEND_ME(reflection_property, __toString, NULL, 0) - ZEND_ME(reflection_property, getName, NULL, 0) + ZEND_ME(reflection_property, __toString, arginfo_reflection__void, 0) + ZEND_ME(reflection_property, getName, arginfo_reflection__void, 0) ZEND_ME(reflection_property, getValue, arginfo_reflection_property_getValue, 0) ZEND_ME(reflection_property, setValue, arginfo_reflection_property_setValue, 0) - ZEND_ME(reflection_property, isPublic, NULL, 0) - ZEND_ME(reflection_property, isPrivate, NULL, 0) - ZEND_ME(reflection_property, isProtected, NULL, 0) - ZEND_ME(reflection_property, isStatic, NULL, 0) - ZEND_ME(reflection_property, isDefault, NULL, 0) - ZEND_ME(reflection_property, getModifiers, NULL, 0) - ZEND_ME(reflection_property, getDeclaringClass, NULL, 0) - ZEND_ME(reflection_property, getDocComment, NULL, 0) + ZEND_ME(reflection_property, isPublic, arginfo_reflection__void, 0) + ZEND_ME(reflection_property, isPrivate, arginfo_reflection__void, 0) + ZEND_ME(reflection_property, isProtected, arginfo_reflection__void, 0) + ZEND_ME(reflection_property, isStatic, arginfo_reflection__void, 0) + ZEND_ME(reflection_property, isDefault, arginfo_reflection__void, 0) + ZEND_ME(reflection_property, getModifiers, arginfo_reflection__void, 0) + ZEND_ME(reflection_property, getDeclaringClass, arginfo_reflection__void, 0) + ZEND_ME(reflection_property, getDocComment, arginfo_reflection__void, 0) ZEND_ME(reflection_property, setAccessible, arginfo_reflection_property_setAccessible, 0) {NULL, NULL, NULL} }; @@ -5306,21 +5335,21 @@ ZEND_BEGIN_ARG_INFO(arginfo_reflection_parameter___construct, 0) ZEND_END_ARG_INFO() static const zend_function_entry reflection_parameter_functions[] = { - ZEND_ME(reflection, __clone, NULL, ZEND_ACC_PRIVATE|ZEND_ACC_FINAL) + ZEND_ME(reflection, __clone, arginfo_reflection__void, ZEND_ACC_PRIVATE|ZEND_ACC_FINAL) ZEND_ME(reflection_parameter, export, arginfo_reflection_parameter_export, ZEND_ACC_STATIC|ZEND_ACC_PUBLIC) ZEND_ME(reflection_parameter, __construct, arginfo_reflection_parameter___construct, 0) - ZEND_ME(reflection_parameter, __toString, NULL, 0) - ZEND_ME(reflection_parameter, getName, NULL, 0) - ZEND_ME(reflection_parameter, isPassedByReference, NULL, 0) - ZEND_ME(reflection_parameter, getDeclaringFunction, NULL, 0) - ZEND_ME(reflection_parameter, getDeclaringClass, NULL, 0) - ZEND_ME(reflection_parameter, getClass, NULL, 0) - ZEND_ME(reflection_parameter, isArray, NULL, 0) - ZEND_ME(reflection_parameter, allowsNull, NULL, 0) - ZEND_ME(reflection_parameter, getPosition, NULL, 0) - ZEND_ME(reflection_parameter, isOptional, NULL, 0) - ZEND_ME(reflection_parameter, isDefaultValueAvailable, NULL, 0) - ZEND_ME(reflection_parameter, getDefaultValue, NULL, 0) + ZEND_ME(reflection_parameter, __toString, arginfo_reflection__void, 0) + ZEND_ME(reflection_parameter, getName, arginfo_reflection__void, 0) + ZEND_ME(reflection_parameter, isPassedByReference, arginfo_reflection__void, 0) + ZEND_ME(reflection_parameter, getDeclaringFunction, arginfo_reflection__void, 0) + ZEND_ME(reflection_parameter, getDeclaringClass, arginfo_reflection__void, 0) + ZEND_ME(reflection_parameter, getClass, arginfo_reflection__void, 0) + ZEND_ME(reflection_parameter, isArray, arginfo_reflection__void, 0) + ZEND_ME(reflection_parameter, allowsNull, arginfo_reflection__void, 0) + ZEND_ME(reflection_parameter, getPosition, arginfo_reflection__void, 0) + ZEND_ME(reflection_parameter, isOptional, arginfo_reflection__void, 0) + ZEND_ME(reflection_parameter, isDefaultValueAvailable, arginfo_reflection__void, 0) + ZEND_ME(reflection_parameter, getDefaultValue, arginfo_reflection__void, 0) {NULL, NULL, NULL} }; @@ -5334,19 +5363,19 @@ ZEND_BEGIN_ARG_INFO(arginfo_reflection_extension___construct, 0) ZEND_END_ARG_INFO() static const zend_function_entry reflection_extension_functions[] = { - ZEND_ME(reflection, __clone, NULL, ZEND_ACC_PRIVATE|ZEND_ACC_FINAL) + ZEND_ME(reflection, __clone, arginfo_reflection__void, ZEND_ACC_PRIVATE|ZEND_ACC_FINAL) ZEND_ME(reflection_extension, export, arginfo_reflection_extension_export, ZEND_ACC_STATIC|ZEND_ACC_PUBLIC) ZEND_ME(reflection_extension, __construct, arginfo_reflection_extension___construct, 0) - ZEND_ME(reflection_extension, __toString, NULL, 0) - ZEND_ME(reflection_extension, getName, NULL, 0) - ZEND_ME(reflection_extension, getVersion, NULL, 0) - ZEND_ME(reflection_extension, getFunctions, NULL, 0) - ZEND_ME(reflection_extension, getConstants, NULL, 0) - ZEND_ME(reflection_extension, getINIEntries, NULL, 0) - ZEND_ME(reflection_extension, getClasses, NULL, 0) - ZEND_ME(reflection_extension, getClassNames, NULL, 0) - ZEND_ME(reflection_extension, getDependencies, NULL, 0) - ZEND_ME(reflection_extension, info, NULL, 0) + ZEND_ME(reflection_extension, __toString, arginfo_reflection__void, 0) + ZEND_ME(reflection_extension, getName, arginfo_reflection__void, 0) + ZEND_ME(reflection_extension, getVersion, arginfo_reflection__void, 0) + ZEND_ME(reflection_extension, getFunctions, arginfo_reflection__void, 0) + ZEND_ME(reflection_extension, getConstants, arginfo_reflection__void, 0) + ZEND_ME(reflection_extension, getINIEntries, arginfo_reflection__void, 0) + ZEND_ME(reflection_extension, getClasses, arginfo_reflection__void, 0) + ZEND_ME(reflection_extension, getClassNames, arginfo_reflection__void, 0) + ZEND_ME(reflection_extension, getDependencies, arginfo_reflection__void, 0) + ZEND_ME(reflection_extension, info, arginfo_reflection__void, 0) {NULL, NULL, NULL} }; /* }}} */ @@ -5465,7 +5494,7 @@ PHP_MINFO_FUNCTION(reflection) /* {{{ */ php_info_print_table_start(); php_info_print_table_header(2, "Reflection", "enabled"); - php_info_print_table_row(2, "Version", "$Revision: 287991 $"); + php_info_print_table_row(2, "Version", "$Revision: 293036 $"); php_info_print_table_end(); } /* }}} */ @@ -5479,7 +5508,7 @@ zend_module_entry reflection_module_entry = { /* {{{ */ NULL, NULL, PHP_MINFO(reflection), - "$Revision: 287991 $", + "$Revision: 293036 $", STANDARD_MODULE_PROPERTIES }; /* }}} */ diff --git a/ext/reflection/php_reflection.h b/ext/reflection/php_reflection.h index d280a9f4e..f53f581cc 100644 --- a/ext/reflection/php_reflection.h +++ b/ext/reflection/php_reflection.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_reflection.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_reflection.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_REFLECTION_H #define PHP_REFLECTION_H diff --git a/ext/reflection/tests/020.phpt b/ext/reflection/tests/020.phpt index 04cc6a115..c5b0ae5c2 100755 --- a/ext/reflection/tests/020.phpt +++ b/ext/reflection/tests/020.phpt @@ -24,5 +24,4 @@ var_dump($obj->hasProperty("p4")); bool(true) bool(true) bool(true) -string(2) "p4" bool(false) diff --git a/ext/reflection/tests/ReflectionClass_hasProperty_001.phpt b/ext/reflection/tests/ReflectionClass_hasProperty_001.phpt index 94f739c33..88c4cd509 100644 --- a/ext/reflection/tests/ReflectionClass_hasProperty_001.phpt +++ b/ext/reflection/tests/ReflectionClass_hasProperty_001.phpt @@ -69,7 +69,7 @@ Reflecting on class privf: --> Check for doesntExist: bool(false) Reflecting on class subprivf: --> Check for s: bool(true) - --> Check for a: bool(true) + --> Check for a: bool(false) --> Check for A: bool(false) --> Check for doesntExist: bool(false) diff --git a/ext/reflection/tests/ReflectionClass_toString_001.phpt b/ext/reflection/tests/ReflectionClass_toString_001.phpt index bf2221c78..6173cf0c0 100644 --- a/ext/reflection/tests/ReflectionClass_toString_001.phpt +++ b/ext/reflection/tests/ReflectionClass_toString_001.phpt @@ -36,6 +36,9 @@ Class [ class ReflectionClass implements Reflector ] { - Methods [43] { Method [ final private method __clone ] { + + - Parameters [0] { + } } Method [ public method __construct ] { @@ -46,33 +49,63 @@ Class [ class ReflectionClass implements Reflector ] { } Method [ public method __toString ] { + + - Parameters [0] { + } } Method [ public method getName ] { + + - Parameters [0] { + } } Method [ public method isInternal ] { + + - Parameters [0] { + } } Method [ public method isUserDefined ] { + + - Parameters [0] { + } } Method [ public method isInstantiable ] { + + - Parameters [0] { + } } Method [ public method getFileName ] { + + - Parameters [0] { + } } Method [ public method getStartLine ] { + + - Parameters [0] { + } } Method [ public method getEndLine ] { + + - Parameters [0] { + } } Method [ public method getDocComment ] { + + - Parameters [0] { + } } Method [ public method getConstructor ] { + + - Parameters [0] { + } } Method [ public method hasMethod ] { @@ -125,6 +158,9 @@ Class [ class ReflectionClass implements Reflector ] { } Method [ public method getConstants ] { + + - Parameters [0] { + } } Method [ public method getConstant ] { @@ -135,21 +171,39 @@ Class [ class ReflectionClass implements Reflector ] { } Method [ public method getInterfaces ] { + + - Parameters [0] { + } } Method [ public method getInterfaceNames ] { + + - Parameters [0] { + } } Method [ public method isInterface ] { + + - Parameters [0] { + } } Method [ public method isAbstract ] { + + - Parameters [0] { + } } Method [ public method isFinal ] { + + - Parameters [0] { + } } Method [ public method getModifiers ] { + + - Parameters [0] { + } } Method [ public method isInstance ] { @@ -174,6 +228,9 @@ Class [ class ReflectionClass implements Reflector ] { } Method [ public method getParentClass ] { + + - Parameters [0] { + } } Method [ public method isSubclassOf ] { @@ -184,6 +241,9 @@ Class [ class ReflectionClass implements Reflector ] { } Method [ public method getStaticProperties ] { + + - Parameters [0] { + } } Method [ public method getStaticPropertyValue ] { @@ -203,9 +263,15 @@ Class [ class ReflectionClass implements Reflector ] { } Method [ public method getDefaultProperties ] { + + - Parameters [0] { + } } Method [ public method isIterateable ] { + + - Parameters [0] { + } } Method [ public method implementsInterface ] { @@ -216,18 +282,33 @@ Class [ class ReflectionClass implements Reflector ] { } Method [ public method getExtension ] { + + - Parameters [0] { + } } Method [ public method getExtensionName ] { + + - Parameters [0] { + } } Method [ public method inNamespace ] { + + - Parameters [0] { + } } Method [ public method getNamespaceName ] { + + - Parameters [0] { + } } Method [ public method getShortName ] { + + - Parameters [0] { + } } } } diff --git a/ext/reflection/tests/ReflectionMethod_basic2.phpt b/ext/reflection/tests/ReflectionMethod_basic2.phpt index 1e21c427e..e2c23c1c1 100644 --- a/ext/reflection/tests/ReflectionMethod_basic2.phpt +++ b/ext/reflection/tests/ReflectionMethod_basic2.phpt @@ -152,8 +152,9 @@ Reflecting on method ReflectionProperty::__construct() __toString(): string(%d) "Method [ public method __construct ] { - - Parameters [1] { - Parameter #0 [ $argument ] + - Parameters [2] { + Parameter #0 [ $class ] + Parameter #1 [ $name ] } } " @@ -161,8 +162,9 @@ string(%d) "Method [ public method __construct ] { export(): string(%d) "Method [ public method __construct ] { - - Parameters [1] { - Parameter #0 [ $argument ] + - Parameters [2] { + Parameter #0 [ $class ] + Parameter #1 [ $name ] } } " diff --git a/ext/reflection/tests/ReflectionMethod_setAccessible.phpt b/ext/reflection/tests/ReflectionMethod_setAccessible.phpt new file mode 100644 index 000000000..79a8fbe8a --- /dev/null +++ b/ext/reflection/tests/ReflectionMethod_setAccessible.phpt @@ -0,0 +1,111 @@ +--TEST-- +Test ReflectionMethod::setAccessible(). +--FILE-- +invoke(new A, NULL); +} + +catch (ReflectionException $e) { + var_dump($e->getMessage()); +} + +try { + $private->invokeArgs(new A, array(NULL)); +} + +catch (ReflectionException $e) { + var_dump($e->getMessage()); +} + +try { + $privateStatic->invoke(NULL, NULL); +} + +catch (ReflectionException $e) { + var_dump($e->getMessage()); +} + +try { + $privateStatic->invokeArgs(NULL, array(NULL)); +} + +catch (ReflectionException $e) { + var_dump($e->getMessage()); +} + +try { + $protected->invoke(new A, NULL); +} + +catch (ReflectionException $e) { + var_dump($e->getMessage()); +} + +try { + $protected->invokeArgs(new A, array(NULL)); +} + +catch (ReflectionException $e) { + var_dump($e->getMessage()); +} + +try { + $protectedStatic->invoke(NULL, NULL); +} + +catch (ReflectionException $e) { + var_dump($e->getMessage()); +} + +try { + $protectedStatic->invokeArgs(NULL, array(NULL)); +} + +catch (ReflectionException $e) { + var_dump($e->getMessage()); +} + +$private->setAccessible(TRUE); +$privateStatic->setAccessible(TRUE); +$protected->setAccessible(TRUE); +$protectedStatic->setAccessible(TRUE); + +$private->invoke(new A, NULL); +$private->invokeArgs(new A, array(NULL)); +$privateStatic->invoke(NULL, NULL); +$privateStatic->invokeArgs(NULL, array(NULL)); +$protected->invoke(new A, NULL); +$protected->invokeArgs(new A, array(NULL)); +$protectedStatic->invoke(NULL, NULL); +$protectedStatic->invokeArgs(NULL, array(NULL)); +?> +--EXPECT-- +string(73) "Trying to invoke private method A::aPrivate() from scope ReflectionMethod" +string(73) "Trying to invoke private method A::aPrivate() from scope ReflectionMethod" +string(79) "Trying to invoke private method A::aPrivateStatic() from scope ReflectionMethod" +string(79) "Trying to invoke private method A::aPrivateStatic() from scope ReflectionMethod" +string(77) "Trying to invoke protected method A::aProtected() from scope ReflectionMethod" +string(77) "Trying to invoke protected method A::aProtected() from scope ReflectionMethod" +string(83) "Trying to invoke protected method A::aProtectedStatic() from scope ReflectionMethod" +string(83) "Trying to invoke protected method A::aProtectedStatic() from scope ReflectionMethod" +A::aPrivate +A::aPrivate +A::aPrivateStatic +A::aPrivateStatic +A::aProtected +A::aProtected +A::aProtectedStatic +A::aProtectedStatic diff --git a/ext/reflection/tests/bug49719.phpt b/ext/reflection/tests/bug49719.phpt new file mode 100644 index 000000000..215140a45 --- /dev/null +++ b/ext/reflection/tests/bug49719.phpt @@ -0,0 +1,44 @@ +--TEST-- +Bug #49719 (ReflectionClass::hasProperty returns true for a private property in base class) +--FILE-- +hasProperty('a')); + var_dump($ref->getProperty('a')); +} catch (Exception $e) { + var_dump($e->getMessage()); +} + +class A2 { + private $a = 1; +} + +class B2 extends A2 { + private $a = 2; +} + +$b2 = new ReflectionClass('B2'); +$prop = $b2->getProperty('a'); +$prop->setAccessible(true); +var_dump($prop->getValue(new b2)); + +?> +--EXPECTF-- +bool(false) +bool(false) +bool(false) +%string|unicode%(25) "Property a does not exist" +int(2) diff --git a/ext/session/mod_files.c b/ext/session/mod_files.c index 045acdfab..512f93ee6 100644 --- a/ext/session/mod_files.c +++ b/ext/session/mod_files.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: mod_files.c 280729 2009-05-18 16:10:09Z jani $ */ +/* $Id: mod_files.c 294027 2010-01-25 23:06:09Z johannes $ */ #include "php.h" @@ -87,7 +87,9 @@ static int ps_files_valid_key(const char *key) len = p - key; - if (len == 0) { + /* Somewhat arbitrary length limit here, but should be way more than + anyone needs and avoids file-level warnings later on if we exceed MAX_PATH */ + if (len == 0 || len > 128) { ret = 0; } @@ -154,7 +156,7 @@ static void ps_files_open(ps_files *data, const char *key TSRMLS_DC) ps_files_close(data); if (!ps_files_valid_key(key)) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "The session id contains illegal characters, valid characters are a-z, A-Z, 0-9 and '-,'"); + php_error_docref(NULL TSRMLS_CC, E_WARNING, "The session id is too long or contains illegal characters, valid characters are a-z, A-Z, 0-9 and '-,'"); PS(invalid_session_id) = 1; return; } @@ -244,11 +246,7 @@ static int ps_files_cleanup_dir(const char *dirname, int maxlifetime TSRMLS_DC) /* check whether its last access was more than maxlifet ago */ if (VCWD_STAT(buf, &sbuf) == 0 && -#ifdef NETWARE - (now - sbuf.st_mtime.tv_sec) > maxlifetime) { -#else (now - sbuf.st_mtime) > maxlifetime) { -#endif VCWD_UNLINK(buf); nrdels++; } diff --git a/ext/session/mod_files.h b/ext/session/mod_files.h index 2522f6f28..bc5bb4c41 100644 --- a/ext/session/mod_files.h +++ b/ext/session/mod_files.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: mod_files.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: mod_files.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef MOD_FILES_H #define MOD_FILES_H diff --git a/ext/session/mod_mm.c b/ext/session/mod_mm.c index 37623da39..a938c48f6 100644 --- a/ext/session/mod_mm.c +++ b/ext/session/mod_mm.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: mod_mm.c 280729 2009-05-18 16:10:09Z jani $ */ +/* $Id: mod_mm.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php.h" diff --git a/ext/session/mod_mm.h b/ext/session/mod_mm.h index 983424f9f..a5c2c9935 100644 --- a/ext/session/mod_mm.h +++ b/ext/session/mod_mm.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: mod_mm.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: mod_mm.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef MOD_MM_H #define MOD_MM_H diff --git a/ext/session/mod_user.c b/ext/session/mod_user.c index f1e922fd1..01f7f8ea8 100644 --- a/ext/session/mod_user.c +++ b/ext/session/mod_user.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: mod_user.c 280729 2009-05-18 16:10:09Z jani $ */ +/* $Id: mod_user.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php.h" #include "php_session.h" diff --git a/ext/session/mod_user.h b/ext/session/mod_user.h index 3ee546e4d..2b0025021 100644 --- a/ext/session/mod_user.h +++ b/ext/session/mod_user.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: mod_user.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: mod_user.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef MOD_USER_H #define MOD_USER_H diff --git a/ext/session/php_session.h b/ext/session/php_session.h index 4dcab6c21..b321f4449 100644 --- a/ext/session/php_session.h +++ b/ext/session/php_session.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_session.h 280729 2009-05-18 16:10:09Z jani $ */ +/* $Id: php_session.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_SESSION_H #define PHP_SESSION_H diff --git a/ext/session/session.c b/ext/session/session.c index 05a66f231..0d8ddd00c 100644 --- a/ext/session/session.c +++ b/ext/session/session.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: session.c 286443 2009-07-28 08:54:23Z tony2001 $ */ +/* $Id: session.c 294515 2010-02-04 09:40:38Z pajoye $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -61,12 +61,6 @@ PHPAPI ZEND_DECLARE_MODULE_GLOBALS(ps); * Helpers * *********** */ -#ifdef NETWARE -# define SESS_SB_MTIME(sb) ((sb).st_mtime.tv_sec) -#else -# define SESS_SB_MTIME(sb) ((sb).st_mtime) -#endif - #define IF_SESSION_VARS() \ if (PS(http_session_vars) && PS(http_session_vars)->type == IS_ARRAY) @@ -693,17 +687,22 @@ static PHP_INI_MH(OnUpdateSaveDir) /* {{{ */ return FAILURE; } - if ((p = zend_memrchr(new_value, ';', new_value_length))) { + /* we do not use zend_memrchr() since path can contain ; itself */ + if ((p = strchr(new_value, ';'))) { + char *p2; p++; + if ((p2 = strchr(p, ';'))) { + p = p2 + 1; + } } else { p = new_value; } - if (PG(safe_mode) && (!php_checkuid(p, NULL, CHECKUID_CHECK_FILE_AND_DIR))) { + if (PG(safe_mode) && *p && (!php_checkuid(p, NULL, CHECKUID_CHECK_FILE_AND_DIR))) { return FAILURE; } - if (PG(open_basedir) && php_check_open_basedir(p TSRMLS_CC)) { + if (PG(open_basedir) && *p && php_check_open_basedir(p TSRMLS_CC)) { return FAILURE; } } @@ -1095,7 +1094,7 @@ static inline void last_modified(TSRMLS_D) /* {{{ */ #define LAST_MODIFIED "Last-Modified: " memcpy(buf, LAST_MODIFIED, sizeof(LAST_MODIFIED) - 1); - strcpy_gmt(buf + sizeof(LAST_MODIFIED) - 1, &SESS_SB_MTIME(sb)); + strcpy_gmt(buf + sizeof(LAST_MODIFIED) - 1, &sb.st_mtime); ADD_HEADER(buf); } } @@ -1888,7 +1887,10 @@ static PHP_FUNCTION(session_unset) } IF_SESSION_VARS() { - HashTable *ht = Z_ARRVAL_P(PS(http_session_vars)); + HashTable *ht; + + SEPARATE_ZVAL_IF_NOT_REF(&PS(http_session_vars)); + ht = Z_ARRVAL_P(PS(http_session_vars)); if (PG(register_globals)) { uint str_len; @@ -1966,7 +1968,10 @@ static PHP_FUNCTION(session_unregister) return; } - PS_DEL_VARL(p_name, p_name_len); + IF_SESSION_VARS() { + SEPARATE_ZVAL_IF_NOT_REF(&PS(http_session_vars)); + PS_DEL_VARL(p_name, p_name_len); + } RETURN_TRUE; } diff --git a/ext/session/tests/001.phpt b/ext/session/tests/001.phpt index 1007f40cc..19dff78e1 100644 --- a/ext/session/tests/001.phpt +++ b/ext/session/tests/001.phpt @@ -31,7 +31,7 @@ print session_encode()."\n"; session_destroy(); --EXPECTF-- -PHP Warning: Directive 'register_globals' is deprecated in PHP 5.3 and greater in Unknown on line 0 +Warning: Directive 'register_globals' is deprecated in PHP 5.3 and greater in Unknown on line 0 Deprecated: Function session_register() is deprecated in %s on line %d diff --git a/ext/session/tests/003.phpt b/ext/session/tests/003.phpt index 253b74062..8a4e0027f 100644 --- a/ext/session/tests/003.phpt +++ b/ext/session/tests/003.phpt @@ -28,7 +28,7 @@ var_dump($baz); var_dump($arr); session_destroy(); --EXPECT-- -PHP Warning: Directive 'register_globals' is deprecated in PHP 5.3 and greater in Unknown on line 0 +Warning: Directive 'register_globals' is deprecated in PHP 5.3 and greater in Unknown on line 0 object(foo)#1 (2) { ["bar"]=> string(2) "ok" diff --git a/ext/session/tests/004.phpt b/ext/session/tests/004.phpt index 7a6116744..2ff675e7c 100644 --- a/ext/session/tests/004.phpt +++ b/ext/session/tests/004.phpt @@ -73,7 +73,7 @@ var_dump($arr); session_destroy(); ?> --EXPECT-- -PHP Warning: Directive 'register_globals' is deprecated in PHP 5.3 and greater in Unknown on line 0 +Warning: Directive 'register_globals' is deprecated in PHP 5.3 and greater in Unknown on line 0 OPEN: PHPSESSID READ: abtest object(foo)#2 (2) { diff --git a/ext/session/tests/005.phpt b/ext/session/tests/005.phpt index 4b7386590..124f0a831 100644 --- a/ext/session/tests/005.phpt +++ b/ext/session/tests/005.phpt @@ -85,7 +85,7 @@ var_dump($baz); var_dump($arr); var_dump($c); session_destroy(); ?> --EXPECTF-- -PHP Warning: Directive 'register_globals' is deprecated in PHP 5.3 and greater in Unknown on line 0 +Warning: Directive 'register_globals' is deprecated in PHP 5.3 and greater in Unknown on line 0 OPEN: PHPSESSID READ: abtest object(foo)#2 (2) { diff --git a/ext/session/tests/006.phpt b/ext/session/tests/006.phpt index 08327eacd..7c7af61b7 100644 --- a/ext/session/tests/006.phpt +++ b/ext/session/tests/006.phpt @@ -45,7 +45,7 @@ echo "values after session:\n"; var_dump($a,$b); ?> --EXPECTF-- -PHP Warning: Directive 'register_globals' is deprecated in PHP 5.3 and greater in Unknown on line 0 +Warning: Directive 'register_globals' is deprecated in PHP 5.3 and greater in Unknown on line 0 original values: object(a)#%d (1) { ["test"]=> diff --git a/ext/session/tests/007.phpt b/ext/session/tests/007.phpt index 64b5bc93b..9531b3dd8 100644 --- a/ext/session/tests/007.phpt +++ b/ext/session/tests/007.phpt @@ -50,8 +50,9 @@ var_dump($HTTP_SESSION_VARS); session_destroy(); ?> --EXPECTF-- -PHP Warning: Directive 'register_globals' is deprecated in PHP 5.3 and greater in Unknown on line 0 -PHP Warning: Directive 'register_long_arrays' is deprecated in PHP 5.3 and greater in Unknown on line 0 +Warning: Directive 'register_globals' is deprecated in PHP 5.3 and greater in Unknown on line 0 + +Warning: Directive 'register_long_arrays' is deprecated in PHP 5.3 and greater in Unknown on line 0 Deprecated: Function session_register() is deprecated in %s on line %d float(3.14) diff --git a/ext/session/tests/008-php4.2.3.phpt b/ext/session/tests/008-php4.2.3.phpt index fffc1d314..4fe938fbc 100644 --- a/ext/session/tests/008-php4.2.3.phpt +++ b/ext/session/tests/008-php4.2.3.phpt @@ -58,7 +58,7 @@ var_dump($HTTP_SESSION_VARS); session_destroy(); ?> --EXPECTF-- -PHP Warning: Directive 'register_long_arrays' is deprecated in PHP 5.3 and greater in Unknown on line 0 +Warning: Directive 'register_long_arrays' is deprecated in PHP 5.3 and greater in Unknown on line 0 NULL session_write_close(): Your script possibly relies on a session side-effect which existed until PHP 4.2.3. Please be advised that the session extension does not consider global variables as a source of data, unless register_globals is enabled. You can disable this functionality and this warning by setting session.bug_compat_42 or session.bug_compat_warn to off, respectively array(1) { diff --git a/ext/session/tests/009.phpt b/ext/session/tests/009.phpt index 206d8cddb..705a2758f 100644 --- a/ext/session/tests/009.phpt +++ b/ext/session/tests/009.phpt @@ -43,7 +43,7 @@ var_dump($HTTP_SESSION_VARS); session_destroy(); ?> --EXPECT-- -PHP Warning: Directive 'register_long_arrays' is deprecated in PHP 5.3 and greater in Unknown on line 0 +Warning: Directive 'register_long_arrays' is deprecated in PHP 5.3 and greater in Unknown on line 0 array(0) { } array(1) { diff --git a/ext/session/tests/012.phpt b/ext/session/tests/012.phpt index c6b94de50..32aeb29c1 100644 --- a/ext/session/tests/012.phpt +++ b/ext/session/tests/012.phpt @@ -32,7 +32,7 @@ session_destroy(); print "I live\n"; ?> --EXPECTF-- -PHP Warning: Directive 'register_globals' is deprecated in PHP 5.3 and greater in Unknown on line 0 +Warning: Directive 'register_globals' is deprecated in PHP 5.3 and greater in Unknown on line 0 Deprecated: Function session_register() is deprecated in %s on line %d I live diff --git a/ext/session/tests/013.phpt b/ext/session/tests/013.phpt index 818699e75..ad6c14e13 100644 --- a/ext/session/tests/013.phpt +++ b/ext/session/tests/013.phpt @@ -24,5 +24,5 @@ session_destroy(); print "I live\n"; ?> --EXPECT-- -PHP Warning: Directive 'register_globals' is deprecated in PHP 5.3 and greater in Unknown on line 0 +Warning: Directive 'register_globals' is deprecated in PHP 5.3 and greater in Unknown on line 0 I live diff --git a/ext/session/tests/014.phpt b/ext/session/tests/014.phpt index eaeaab3bb..4e77a7aef 100644 --- a/ext/session/tests/014.phpt +++ b/ext/session/tests/014.phpt @@ -33,7 +33,7 @@ ini_set("session.use_trans_sid","1"); session_destroy(); ?> --EXPECTF-- -PHP Warning: Directive 'register_globals' is deprecated in PHP 5.3 and greater in Unknown on line 0 +Warning: Directive 'register_globals' is deprecated in PHP 5.3 and greater in Unknown on line 0 Warning: ini_set(): A session is active. You cannot change the session module's ini settings at this time in %s on line %d diff --git a/ext/session/tests/019.phpt b/ext/session/tests/019.phpt index f4d763095..5bdd03b5c 100644 --- a/ext/session/tests/019.phpt +++ b/ext/session/tests/019.phpt @@ -47,7 +47,7 @@ var_dump($_SESSION); session_destroy(); ?> --EXPECTF-- -PHP Warning: Directive 'register_globals' is deprecated in PHP 5.3 and greater in Unknown on line 0 +Warning: Directive 'register_globals' is deprecated in PHP 5.3 and greater in Unknown on line 0 Deprecated: Function session_register() is deprecated in %s on line %d array(2) { diff --git a/ext/shmop/php_shmop.h b/ext/shmop/php_shmop.h index 79d6f8198..3cf94ce08 100644 --- a/ext/shmop/php_shmop.h +++ b/ext/shmop/php_shmop.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | diff --git a/ext/shmop/shmop.c b/ext/shmop/shmop.c index aed85d645..58a0fcf1c 100644 --- a/ext/shmop/shmop.c +++ b/ext/shmop/shmop.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP version 4 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ | Ilia Alshanetsky | +----------------------------------------------------------------------+ */ -/* $Id: shmop.c 281742 2009-06-06 02:40:49Z mattwil $ */ +/* $Id: shmop.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/simplexml/php_simplexml.h b/ext/simplexml/php_simplexml.h index 37b583569..822cc51b5 100644 --- a/ext/simplexml/php_simplexml.h +++ b/ext/simplexml/php_simplexml.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_simplexml.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_simplexml.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_SIMPLEXML_H #define PHP_SIMPLEXML_H diff --git a/ext/simplexml/php_simplexml_exports.h b/ext/simplexml/php_simplexml_exports.h index 23e70e94b..73c165171 100755 --- a/ext/simplexml/php_simplexml_exports.h +++ b/ext/simplexml/php_simplexml_exports.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_simplexml_exports.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_simplexml_exports.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_SIMPLEXML_EXPORTS_H #define PHP_SIMPLEXML_EXPORTS_H diff --git a/ext/simplexml/simplexml.c b/ext/simplexml/simplexml.c index 21fb5d863..1f3966ffb 100644 --- a/ext/simplexml/simplexml.c +++ b/ext/simplexml/simplexml.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: simplexml.c 281953 2009-06-11 09:41:15Z bjori $ */ +/* $Id: simplexml.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -2531,7 +2531,8 @@ PHP_MINIT_FUNCTION(simplexml) sxe_object_handlers.get_constructor = zend_get_std_object_handlers()->get_constructor; sxe_object_handlers.get_class_entry = zend_get_std_object_handlers()->get_class_entry; sxe_object_handlers.get_class_name = zend_get_std_object_handlers()->get_class_name; - + sxe_class_entry->serialize = zend_class_serialize_deny; + sxe_class_entry->unserialize = zend_class_unserialize_deny; php_libxml_register_export(sxe_class_entry, simplexml_export_node); @@ -2556,7 +2557,7 @@ PHP_MINFO_FUNCTION(simplexml) { php_info_print_table_start(); php_info_print_table_header(2, "Simplexml support", "enabled"); - php_info_print_table_row(2, "Revision", "$Revision: 281953 $"); + php_info_print_table_row(2, "Revision", "$Revision: 293036 $"); php_info_print_table_row(2, "Schema support", #ifdef LIBXML_SCHEMAS_ENABLED "enabled"); diff --git a/ext/simplexml/sxe.c b/ext/simplexml/sxe.c index 406f89f61..30ea2da09 100755 --- a/ext/simplexml/sxe.c +++ b/ext/simplexml/sxe.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: sxe.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: sxe.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H # include "config.h" diff --git a/ext/simplexml/sxe.h b/ext/simplexml/sxe.h index d0bf59f69..90489b25a 100755 --- a/ext/simplexml/sxe.h +++ b/ext/simplexml/sxe.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: sxe.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: sxe.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef SXE_H #define SXE_H diff --git a/ext/snmp/config.w32 b/ext/snmp/config.w32 index 49d0d007c..6ee042f6e 100644 --- a/ext/snmp/config.w32 +++ b/ext/snmp/config.w32 @@ -1,16 +1,21 @@ -// $Id: config.w32 242949 2007-09-26 15:44:16Z cvs2svn $ +// $Id: config.w32 294815 2010-02-09 16:42:40Z pajoye $ // vim:ft=javascript ARG_WITH("snmp", "SNMP support", "no"); if (PHP_SNMP != "no") { - - if (CHECK_HEADER_ADD_INCLUDE("snmp.h", "CFLAGS_SNMP", PHP_PHP_BUILD + "\\include\\ucd-snmp;" + PHP_PHP_BUILD + "\\include\\net-snmp;" + PHP_SNMP) && - CHECK_LIB("libsnmp.lib", "snmp", PHP_SNMP)) { - EXTENSION('snmp', 'snmp.c'); - - AC_DEFINE('HAVE_SNMP', 1); - + if (CHECK_HEADER_ADD_INCLUDE("snmp.h", "CFLAGS_SNMP", PHP_PHP_BUILD + "\\include\\net-snmp;" + PHP_SNMP)) { + if (CHECK_LIB("netsnmp.lib", "snmp", PHP_SNMP)) { + EXTENSION('snmp', 'snmp.c'); + CHECK_LIB("libeay32.lib", "snmp", PHP_SNMP) + AC_DEFINE('HAVE_SNMP', 1); + AC_DEFINE("HAVE_NET_SNMP", 1); + } else if (CHECK_LIB("libsnmp.lib", "snmp", PHP_SNMP)) { + EXTENSION('snmp', 'snmp.c'); + AC_DEFINE('HAVE_SNMP', 1); + } else { + WARNING("snmp not enabled; libraries and headers not found"); + } } else { WARNING("snmp not enabled; libraries and headers not found"); } diff --git a/ext/snmp/php_snmp.h b/ext/snmp/php_snmp.h index f1239a736..c7b5512ea 100644 --- a/ext/snmp/php_snmp.h +++ b/ext/snmp/php_snmp.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -20,7 +20,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_snmp.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_snmp.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_SNMP_H #define PHP_SNMP_H diff --git a/ext/snmp/snmp.c b/ext/snmp/snmp.c index 7819fed06..b3d5405ab 100644 --- a/ext/snmp/snmp.c +++ b/ext/snmp/snmp.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -20,7 +20,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: snmp.c 287430 2009-08-17 22:15:18Z stas $ */ +/* $Id: snmp.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -981,7 +981,6 @@ static int netsnmp_session_set_sec_level(struct snmp_session *s, char *level TSR s->securityLevel = SNMP_SEC_LEVEL_AUTHPRIV; return (0); } - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid security level: %s", level); } return (-1); } @@ -1000,8 +999,6 @@ static int netsnmp_session_set_auth_protocol(struct snmp_session *s, char *prot s->securityAuthProto = usmHMACSHA1AuthProtocol; s->securityAuthProtoLen = OIDSIZE(usmHMACSHA1AuthProtocol); return (0); - } else if (strlen(prot)) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid authentication protocol: %s", prot); } } return (-1); @@ -1053,8 +1050,6 @@ static int netsnmp_session_set_sec_protocol(struct snmp_session *s, char *prot T return (0); #endif #endif - } else if (strlen(prot)) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid privacy protocol: %s", prot); } } return (-1); diff --git a/ext/soap/php_encoding.c b/ext/soap/php_encoding.c index 9bf3356fd..6cc6113ca 100644 --- a/ext/soap/php_encoding.c +++ b/ext/soap/php_encoding.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ | Dmitry Stogov | +----------------------------------------------------------------------+ */ -/* $Id: php_encoding.c 282177 2009-06-15 17:31:02Z felipe $ */ +/* $Id: php_encoding.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include @@ -373,7 +373,7 @@ static xmlNodePtr master_to_xml_int(encodePtr encode, zval *data, int style, xml HashTable *ht = Z_OBJPROP_P(data); if (zend_hash_find(ht, "enc_type", sizeof("enc_type"), (void **)&ztype) == FAILURE) { - soap_error0(E_ERROR, "Encoding: SoapVar hasn't 'enc_type' propery"); + soap_error0(E_ERROR, "Encoding: SoapVar hasn't 'enc_type' property"); } if (zend_hash_find(ht, "enc_stype", sizeof("enc_stype"), (void **)&zstype) == SUCCESS) { diff --git a/ext/soap/php_encoding.h b/ext/soap/php_encoding.h index e144901f0..17989c512 100644 --- a/ext/soap/php_encoding.h +++ b/ext/soap/php_encoding.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ | Dmitry Stogov | +----------------------------------------------------------------------+ */ -/* $Id: php_encoding.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_encoding.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_ENCODING_H #define PHP_ENCODING_H diff --git a/ext/soap/php_http.c b/ext/soap/php_http.c index f1efbed44..f13e89af4 100644 --- a/ext/soap/php_http.c +++ b/ext/soap/php_http.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ | Dmitry Stogov | +----------------------------------------------------------------------+ */ -/* $Id: php_http.c 281589 2009-06-03 12:39:50Z iliaa $ */ +/* $Id: php_http.c 294456 2010-02-03 20:29:09Z pajoye $ */ #include "php_soap.h" #include "ext/standard/base64.h" @@ -207,6 +207,7 @@ int make_http_soap_request(zval *this_ptr, int http_1_1; int http_status; int content_type_xml = 0; + long redirect_max = 20; char *content_encoding; char *http_msg = NULL; zend_bool old_allow_url_fopen; @@ -283,6 +284,14 @@ int make_http_soap_request(zval *this_ptr, context = php_stream_context_from_zval(*tmp, 0); } + if (context && + php_stream_context_get_option(context, "http", "max_redirects", &tmp) == SUCCESS) { + if (Z_TYPE_PP(tmp) != IS_STRING || !is_numeric_string(Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp), &redirect_max, NULL, 1)) { + if (Z_TYPE_PP(tmp) == IS_LONG) + redirect_max = Z_LVAL_PP(tmp); + } + } + try_again: if (phpurl == NULL || phpurl->host == NULL) { if (phpurl != NULL) {php_url_free(phpurl);} @@ -752,16 +761,15 @@ try_again: err = php_stream_write(stream, soap_headers.c, soap_headers.len); if (err != soap_headers.len) { if (request != buf) {efree(request);} - smart_str_free(&soap_headers); php_stream_close(stream); zend_hash_del(Z_OBJPROP_P(this_ptr), "httpurl", sizeof("httpurl")); zend_hash_del(Z_OBJPROP_P(this_ptr), "httpsocket", sizeof("httpsocket")); zend_hash_del(Z_OBJPROP_P(this_ptr), "_use_proxy", sizeof("_use_proxy")); add_soap_fault(this_ptr, "HTTP", "Failed Sending HTTP SOAP request", NULL, NULL TSRMLS_CC); + smart_str_free(&soap_headers_z); return FALSE; } smart_str_free(&soap_headers); - } else { add_soap_fault(this_ptr, "HTTP", "Failed to create stream??", NULL, NULL TSRMLS_CC); smart_str_free(&soap_headers_z); @@ -990,12 +998,20 @@ try_again: new_url->host = phpurl->host ? estrdup(phpurl->host) : NULL; new_url->port = phpurl->port; if (new_url->path && new_url->path[0] != '/') { - char *t = phpurl->path; - char *p = strrchr(t, '/'); - if (p) { - char *s = emalloc((p - t) + strlen(new_url->path) + 2); - strncpy(s, t, (p - t) + 1); - s[(p - t) + 1] = 0; + if (phpurl->path) { + char *t = phpurl->path; + char *p = strrchr(t, '/'); + if (p) { + char *s = emalloc((p - t) + strlen(new_url->path) + 2); + strncpy(s, t, (p - t) + 1); + s[(p - t) + 1] = 0; + strcat(s, new_url->path); + efree(new_url->path); + new_url->path = s; + } + } else { + char *s = emalloc(strlen(new_url->path) + 2); + s[0] = '/'; s[1] = 0; strcat(s, new_url->path); efree(new_url->path); new_url->path = s; @@ -1004,6 +1020,12 @@ try_again: } phpurl = new_url; + if (--redirect_max < 1) { + add_soap_fault(this_ptr, "HTTP", "Redirection limit reached, aborting", NULL, NULL TSRMLS_CC); + smart_str_free(&soap_headers_z); + return FALSE; + } + goto try_again; } } diff --git a/ext/soap/php_http.h b/ext/soap/php_http.h index e3470a1ce..2177e18f6 100644 --- a/ext/soap/php_http.h +++ b/ext/soap/php_http.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ | Dmitry Stogov | +----------------------------------------------------------------------+ */ -/* $Id: php_http.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_http.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_HTTP_H #define PHP_HTTP_H diff --git a/ext/soap/php_packet_soap.c b/ext/soap/php_packet_soap.c index f93e76849..0b02fbd4a 100644 --- a/ext/soap/php_packet_soap.c +++ b/ext/soap/php_packet_soap.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ | Dmitry Stogov | +----------------------------------------------------------------------+ */ -/* $Id: php_packet_soap.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_packet_soap.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php_soap.h" diff --git a/ext/soap/php_packet_soap.h b/ext/soap/php_packet_soap.h index d9c00edb2..2ba3eb17a 100644 --- a/ext/soap/php_packet_soap.h +++ b/ext/soap/php_packet_soap.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ | Dmitry Stogov | +----------------------------------------------------------------------+ */ -/* $Id: php_packet_soap.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_packet_soap.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_PACKET_SOAP_H #define PHP_PACKET_SOAP_H diff --git a/ext/soap/php_schema.c b/ext/soap/php_schema.c index c51bea4ee..0396d91e2 100644 --- a/ext/soap/php_schema.c +++ b/ext/soap/php_schema.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ | Dmitry Stogov | +----------------------------------------------------------------------+ */ -/* $Id: php_schema.c 287425 2009-08-17 18:23:48Z dmitry $ */ +/* $Id: php_schema.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php_soap.h" #include "libxml/uri.h" diff --git a/ext/soap/php_schema.h b/ext/soap/php_schema.h index d7cc00aa2..9022e3f70 100644 --- a/ext/soap/php_schema.h +++ b/ext/soap/php_schema.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ | Dmitry Stogov | +----------------------------------------------------------------------+ */ -/* $Id: php_schema.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_schema.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_SCHEMA_H #define PHP_SCHEMA_H diff --git a/ext/soap/php_sdl.c b/ext/soap/php_sdl.c index 62161f9fe..462c589b1 100644 --- a/ext/soap/php_sdl.c +++ b/ext/soap/php_sdl.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ | Dmitry Stogov | +----------------------------------------------------------------------+ */ -/* $Id: php_sdl.c 287425 2009-08-17 18:23:48Z dmitry $ */ +/* $Id: php_sdl.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php_soap.h" #include "ext/libxml/php_libxml.h" diff --git a/ext/soap/php_sdl.h b/ext/soap/php_sdl.h index 97612bf7c..5edbbdf07 100644 --- a/ext/soap/php_sdl.h +++ b/ext/soap/php_sdl.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ | Dmitry Stogov | +----------------------------------------------------------------------+ */ -/* $Id: php_sdl.h 287425 2009-08-17 18:23:48Z dmitry $ */ +/* $Id: php_sdl.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_SDL_H #define PHP_SDL_H diff --git a/ext/soap/php_soap.h b/ext/soap/php_soap.h index 11ff51029..36b154e2c 100644 --- a/ext/soap/php_soap.h +++ b/ext/soap/php_soap.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ | Dmitry Stogov | +----------------------------------------------------------------------+ */ -/* $Id: php_soap.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_soap.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_SOAP_H #define PHP_SOAP_H diff --git a/ext/soap/php_xml.c b/ext/soap/php_xml.c index 92fa6cfef..5929ee29d 100644 --- a/ext/soap/php_xml.c +++ b/ext/soap/php_xml.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ | Dmitry Stogov | +----------------------------------------------------------------------+ */ -/* $Id: php_xml.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_xml.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php_soap.h" #include "libxml/parser.h" @@ -138,6 +138,9 @@ xmlDocPtr soap_xmlParseMemory(const void *buf, size_t buf_size) ctxt->sax->warning = NULL; ctxt->sax->error = NULL; /*ctxt->sax->fatalError = NULL;*/ +#if LIBXML_VERSION >= 20703 + ctxt->options |= XML_PARSE_HUGE; +#endif xmlParseDocument(ctxt); if (ctxt->wellFormed) { ret = ctxt->myDoc; diff --git a/ext/soap/php_xml.h b/ext/soap/php_xml.h index 7d22ce715..cbef45eac 100644 --- a/ext/soap/php_xml.h +++ b/ext/soap/php_xml.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ | Dmitry Stogov | +----------------------------------------------------------------------+ */ -/* $Id: php_xml.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_xml.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_SOAP_XML_H #define PHP_SOAP_XML_H diff --git a/ext/soap/readme.html b/ext/soap/readme.html deleted file mode 100644 index 98efff3c5..000000000 --- a/ext/soap/readme.html +++ /dev/null @@ -1,646 +0,0 @@ - - -PHP SOAP Manual - - - - -

PHP SOAP

-

Introduction

- - - -
Warning
This extension is EXPERIMENTAL. The behaviour of this extension -- including the names of its functions and anything else documented about this extension -- may change without notice in a future release of PHP. Use this extension at your own risk. -
-

-SOAP extension can be used to write SOAP Servers and Clients. It supports -subsets of SOAP 1.1, -SOAP 1.2 and -WSDL 1.1 specifications. -

-
-

Requirements

-This extension makes use of the GNOME XML library. Download and install this library. You will need at least libxml-2.5.4. -
-

Installation

-This extension is only available if PHP was configured with --enable-soap. -
-

Runtime Configuration

-

The behaviour of these functions is affected by settings in php.ini.

- - - - - -
NameDefaultChangeable
soap.wsdl_cache_enabled"1"PHP_INI_ALL
soap.wsdl_cache_dir"/tmp"PHP_INI_ALL
soap.wsdl_cache_ttl86400PHP_INI_ALL
-

Here is a short explanation of the configuration directives.

-
-
soap.wsdl_cache_enabled (boolean)
-
enables or disables WSDL caching feature.
-
soap.wsdl_cache_dir (string)
-
sets the directory name where SOAP extension will put cache files
-
soap.wsdl_cache_ttl (integer)
-
(time to live) sets the number of second while cached file will be used instead of original one.
-
- - -
-

Predefined Constants

-The constants below are defined by this extension, and will only be available when the extension has either been compiled into PHP or dynamically loaded at runtime. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ConstantValueDescription
SOAP_1_1 (integer)1SOAP version - SOAP 1.1. Can be used as an option in SoapClient and SoapServer constructors.
SOAP_1_2 (integer)2SOAP version - SOAP 1.2. Can be used as an option in SoapClient and SoapServer constructors.
SOAP_FUNCTIONS_ALL (integer)999Allows to export all defined functions with SoapClient::addFunction
SOAP_PERSISTENCE_SESSION (integer)1Allows making class passed to SoapServer::setClass persistent for a PHP session.
SOAP_PERSISTENCE_REQUEST (integer)2Allows making class passed to SoapServer::setClass non-persistent for a PHP session.
SOAP_ENCODED (integer)1Can be passed as style option to SoapClient constructor in nonWSDL mode.
SOAP_LITERAL (integer)2Can be passed as style option to SoapClient constructor in nonWSDL mode.
SOAP_RPC (integer)1Can be passed as use option to SoapClient constructor in nonWSDL mode.
SOAP_DOCUMENT (integer)2Can be passed as use option to SoapClient constructor in nonWSDL mode.
SOAP_ACTOR_NEXT (integer)1Can be passed as actor to SoapHeader constructor.
SOAP_ACTOR_NONE (integer)2Can be passed as actor to SoapHeader constructor
SOAP_ACTOR_UNLIMATERECEIVER (integer)3Can be passed as actor to SoapHeader constructor
UNKNOWN_TYPE (integer)999998Encoding for unknown type. Can be passed to SoapVar constructor.
XSD_STRING (integer)101Encoding for standard XMLSchema string type. Can be passed to SoapVar constructor.
XSD_BOOLEAN (integer)102Encoding for standard XMLSchema boolen type. Can be passed to SoapVar constructor.
XSD_DECIMAL (integer)103Encoding for standard XMLSchema decimal type. Can be passed to SoapVar constructor.
XSD_FLOAT (integer)104Encoding for standard XMLSchema float type. Can be passed to SoapVar constructor.
XSD_DOUBLE (integer)105Encoding for standard XMLSchema double type. Can be passed to SoapVar constructor.
XSD_DURATION (integer)106Encoding for standard XMLSchema duration type. Can be passed to SoapVar constructor.
XSD_DATETIME (integer)107Encoding for standard XMLSchema dateTime type. Can be passed to SoapVar constructor.
XSD_TIME (integer)108Encoding for standard XMLSchema time type. Can be passed to SoapVar constructor.
XSD_DATE (integer)109Encoding for standard XMLSchema data type. Can be passed to SoapVar constructor.
XSD_GYEARMONTH (integer)110Encoding for standard XMLSchema gYearMonth type. Can be passed to SoapVar constructor.
XSD_GYEAR (integer)111Encoding for standard XMLSchema gYear type. Can be passed to SoapVar constructor.
XSD_GMONTHDAY (integer)112Encoding for standard XMLSchema gMonthDay type. Can be passed to SoapVar constructor.
XSD_GDAY (integer)113Encoding for standard XMLSchema gDay type. Can be passed to SoapVar constructor.
XSD_GMONTH (integer)114Encoding for standard XMLSchema gMonth type. Can be passed to SoapVar constructor.
XSD_HEXBINARY (integer)115Encoding for standard XMLSchema hexBinary type. Can be passed to SoapVar constructor.
XSD_BASE64BINARY (integer)116Encoding for standard XMLSchema base64Binary type. Can be passed to SoapVar constructor.
XSD_ANYURI (integer)117Encoding for standard XMLSchema anyURI type. Can be passed to SoapVar constructor.
XSD_QNAME (integer)118Encoding for standard XMLSchema QName type. Can be passed to SoapVar constructor.
XSD_NOTATION (integer)119Encoding for standard XMLSchema NOTATION type. Can be passed to SoapVar constructor.
XSD_NORMALIZEDSTRING (integer)120Encoding for standard XMLSchema normalizedString type. Can be passed to SoapVar constructor.
XSD_TOKEN (integer)121Encoding for standard XMLSchema token type. Can be passed to SoapVar constructor.
XSD_LANGUAGE (integer)122Encoding for standard XMLSchema language type. Can be passed to SoapVar constructor.
XSD_NMTOKEN (integer)123Encoding for standard XMLSchema NMTOKEN type. Can be passed to SoapVar constructor.
XSD_NAME (integer)124Encoding for standard XMLSchema Name type. Can be passed to SoapVar constructor.
XSD_NCNAME (integer)125Encoding for standard XMLSchema NCName type. Can be passed to SoapVar constructor.
XSD_ID (integer)126Encoding for standard XMLSchema ID type. Can be passed to SoapVar constructor.
XSD_IDREF (integer)127Encoding for standard XMLSchema IDREF type. Can be passed to SoapVar constructor.
XSD_IDREFS (integer)128Encoding for standard XMLSchema IDREFS type. Can be passed to SoapVar constructor.
XSD_ENTITY (integer)129Encoding for standard XMLSchema ENTITY type. Can be passed to SoapVar constructor.
XSD_ENTITIES (integer)130Encoding for standard XMLSchema ENTITIES type. Can be passed to SoapVar constructor.
XSD_INTEGER (integer)131Encoding for standard XMLSchema integer type. Can be passed to SoapVar constructor.
XSD_NONPOSITIVEINTEGER (integer)132Encoding for standard XMLSchema nonPositiveInteger type. Can be passed to SoapVar constructor.
XSD_NEGATIVEINTEGER (integer)133Encoding for standard XMLSchema negativeInteger type. Can be passed to SoapVar constructor.
XSD_LONG (integer)134Encoding for standard XMLSchema long type. Can be passed to SoapVar constructor.
XSD_INT (integer)135Encoding for standard XMLSchema int type. Can be passed to SoapVar constructor.
XSD_SHORT (integer)136Encoding for standard XMLSchema short type. Can be passed to SoapVar constructor.
XSD_BYTE (integer)137Encoding for standard XMLSchema byte type. Can be passed to SoapVar constructor.
XSD_NONNEGATIVEINTEGER (integer)138Encoding for standard XMLSchema nonNegativeInteger type. Can be passed to SoapVar constructor.
XSD_UNSIGNEDLONG (integer)139Encoding for standard XMLSchema unsignedLong type. Can be passed to SoapVar constructor.
XSD_UNSIGNEDINT (integer)140Encoding for standard XMLSchema unsignedInt type. Can be passed to SoapVar constructor.
XSD_UNSIGNEDSHORT (integer)141Encoding for standard XMLSchema unsignedShort type. Can be passed to SoapVar constructor.
XSD_UNSIGNEDBYTE (integer)142Encoding for standard XMLSchema unsignedByte type. Can be passed to SoapVar constructor.
XSD_POSITIVEINTEGER (integer)143Encoding for standard XMLSchema positiveInteger type. Can be passed to SoapVar constructor.
XSD_NMTOKENS (integer)144Encoding for standard XMLSchema NMTOKENS type. Can be passed to SoapVar constructor.
XSD_ANYTYPE (integer)145Encoding for standard XMLSchema anyType type. Can be passed to SoapVar constructor.
SOAP_ENC_ARRAY (integer)300Encoding for SOAP Array type. Can be passed to SoapVar constructor.
SOAP_ENC_OBJECT (integer)301Encoding for SOAP Struct type. Can be passed to SoapVar constructor.
XSD_1999_TIMEINSTANT (integer)401Encoding for old XMLSchema timeInstant type. Can be passed to SoapVar constructor.
XSD_NAMESPACE (string) The XML Schema namespace.
XSD_1999_NAMESPACE (string) The old XML Schema namespace.
-
-

Classes

-

List of classes

- - - - - - - -
SoapClient
SoapServer
SoapParam
SoapVar
SoapHeader
SoapFault
- -

SoapClient class

-A SOAP client, that allows calling remote methods on SOAP WebService over HTTP -or HTTPS. - - - - - - - -
SoapClient -- SoapClient constructor
__call -- calls a SOAP function
__getLastRequest -- returns last SOAP request
__getLastResponse -- returns last SOAP response
__getFunctions -- returns list of SOAP functions
__getTypes -- returns list of SOAP types
-
-

SoapServer class

-This class can be used to build SOAP WebServices, which can be accessed from -remote SOAP clients over HTTP or HTTPS. - - - - - - - -
SoapServer -- SoapServer constructor
addFunction -- adds one or several functions those will handle SOAP requests
setClass -- sets class which will handle SOAP requests
getFunctions -- returns list of defined functions
setPersistence -- sets persistence mode of SoapServer
handle -- handles a SOAP request
-
-

SoapParam class

-

-SoapParam is a special low-level class for naming parameters and return values -in nonWSDL mode. It is just a data holder and it has not any special method -except constructor. -

- - -
SoapParam -- SoapParam constructor
-
-

SoapVar classes

-

-SoapVar is a special low-level class for encoding parameters and return values -in nonWSDL mode. It is just a data holder and it has not any special method -except constructor. It is useful when you like to set type property in SOAP -request or response. -

- - -
SoapVar -- SoapVar constructor
-
-

SoapHeader class

-

-SoapHeader is a special low-level class for passing or returning SOAP headers. -It is just a data holder and it has not any special method except constructor. -

- - -
SoapHeader -- SoapHeader constructor
-
-

SoapFault class

-

-SoapFault is a special class that can be used for error reporting during -handling of SOAP request. It is derived form standard PHP Exception class, -so it can be used to throw exceptions in server side and to catch tham on -client side. -

- - -
SoapFault -- SoapFault constructor
-
- -

Table of Contents

- - - - - - - - - - - - - - - - - - -
is_soap_fault -- checks if SOAP call was failed
SoapClient::SoapClient -- SoapClient constructor
SoapClient::__call -- calls a SOAP function
SoapClient::__getLastRequest -- returns last SOAP request
SoapClient::__getLastResponse -- returns last SOAP response
SoapClient::__getFunctions -- returns list of SOAP functions
SoapClient::__getTypes -- returns list of SOAP types
SoapServer::SoapServer -- SoapServer constructor
SoapServer::addFunction -- adds one or several functions those will handle SOAP requests
SoapServer::setClass -- sets class which will handle SOAP requests
SoapServer::getFunctions -- returns list of defined functions
SoapServer::setPersistence -- sets persistence mode of SoapServer
SoapServer::handle -- handles a SOAP request
SoapParam::SoapParam -- SoapParam constructor
SoapVar::SoapVar -- SoapVar constructor
SoapHeader::SoapHeader -- SoapHeader constructor
SoapFault::SoapFault -- SoapFault constructor
- -
-

is_soap_fault

-

(PHP 5)

-

checks if SOAP call was failed

-

Description

-

bool is_soap_fault(mixed obj)

-

-This function is useful when you like to check if the SOAP call was failed, -but don't like to use exceptions. To use it you must create SoapClient object -with exceptions option set to zero or false. In this case SOAP method -will return a special SoapFault object which encapsulate the fault details -(faultcode, faultstring, faultactor and faultdetails). If exceptions is -not set then SOAP call will throw an exception on error.
-is_soap_fault() functions checks if the given parameter is a SoapFault object.
-

-

Example

-
-<?php
-    $client = SoapClient("some.wsdl",array("exceptions"=>0));
-    $result = $client->SomeFunction(...);
-    if (is_soap_fault($result)) {
-        trigger_error("SOAP Fault: (faultcode: {$result->faultcode}, faultstring: {$result->faulstring})", E_ERROR);
-    }
-?>
-

Standard method that used by SOAP extension for error reporting is excptions.

-
-<?php
-    try {
-        $client = SoapClient("some.wsdl");
-        $result = $client->SomeFunction(...);
-    } catch (SoapFault $fault) {
-        trigger_error("SOAP Fault: (faultcode: {$fault->faultcode}, faultstring: {$fault->faulstring})", E_ERROR);
-    }
-?>
- - -

SoapClient::SoapClient

-

(PHP 5)

-

SoapClient constructor

-

Description

-

SoapClient(mixed wsdl [, array options])

-

-The constructor allows creating SoapClient objects in WSDL or nonWSDL mode. -The first case requires URI of WSDL file as first parameter and optional -options array. The second case requires NULL as first parameter and options -array with location and uri options set. Where location is -a URL to request and uri is a target namespace of the SOAP service. -style and use options has effect only on nonWSDL (in WSDL mode -they comes from WSDL file). soap_version option allows to work as SOAP 1.1 or -SOAP 1.2 client. -Some additional optional options allow using HTTP authentication (login -and password) and HTTP connection through proxy server (proxy_host, -proxy_port, proxy_login and proxy_password). -

-

Examples

-
-    $client = new SoapClient("some.wsdl");
-
-    $client = new SoapClient("some.wsdl",array('soap_version'   => SOAP_1_2));
-
-    $client = new SoapClient("some.wsdl",array('login'          => "some_name",
-                                               'password'       => "some_password"));
-
-    $client = new SoapClient("some.wsdl",array('proxy_host'     => "localhost",
-                                               'proxy_port'     => 8080));
-
-    $client = new SoapClient("some.wsdl",array('proxy_host'     => "localhost",
-                                               'proxy_port'     => 8080,
-                                               'proxy_login'    => "some_name",
-                                               'proxy_password' => "some_password"));
-
-    $client = new SoapClient(null,array('location' => "http://localhost/soap.php",
-                                        'uri'      => "http://test-uri/"));
-
-    $client = new SoapClient(null,array('location' => "http://localhost/soap.php",
-                                        'uri'      => "http://test-uri/",
-                                        'style'    => SOAP_DOCUMENT,
-                                        'use'      => SOAP_LITERAL));
-
- - -

SoapClient::__call

-

(PHP 5)

-

calls a SOAP function

-

Description

-

mixed __call(string function_name, array arguments, [array options [, mixed input_headers [, mixed &output_headers]]])

-

-This is a low level API function to make a SOAP call. Usually in WSDL mode -you can simple call SOAP functions as SoapClient methods. It is useful for -nonWSDL mode when 'soapaction' is unknown, 'uri' is differ form default or -when ypu like to send and/or receive SOAP Headers. To check if function call -is failed check the result with is_soap_fault() function.
-SOAP function may return one or several values. In the first case __call will -return just the value of output parameter, in the second it will return -array with named output parameters. -

-

Examples

-
-    $client = new SoapClient("some.wsdl");
-    $client->SomeFunction($a,$b,$c);
-    $client->__call("SomeFunction",array($a,$b,$c));
-    $client->__call("SomeFunction",array($a,$b,$c), NULL,
-                    new SoapHeader(...), $output_headers);
-
-
-    $client = new SoapClient(null,array('location' => "http://localhost/soap.php",
-                                        'uri'      => "http://test-uri/"));
-    $client->SomeFunction($a,$b,$c);
-    $client->__call("SomeFunction",array($a,$b,$c));
-    $client->__call("SomeFunction",array($a,$b,$c),
-                    array('soapaction' => 'some_action',
-                          'uri'        => 'some_uri'));
-
- - -

SoapClient::__getLastRequest

-

(PHP 5)

-

returns last SOAP request

-

Description

-

string __getLastRequest()

-

-This function works only with SoapClient which was created with trace option. -

-

Example

-
-<?php
-    $client = SoapClient("some.wsdl", array('trace'=>1));
-    $result = $client->SomeFunction(...);
-    echo "REQUEST:\n".$client->__getLastRequest()."\n";
-?>
-
- - -

SoapClient::__getLastResponse

-

(PHP 5)

-

returns last SOAP response

-

Description

-

string __getLastResponse()

-

-This function works only with SoapClient which was created with trace option. -

-

Example

-
-<?php
-    $client = SoapClient("some.wsdl", array('trace'=>1));
-    $result = $client->SomeFunction(...);
-    echo "RESPONSE:\n".$client->__getLastResponse()."\n";
-?>
-
- - -

SoapClient::__getFunctions

-

(PHP 5)

-

returns list of SOAP functions

-

Description

-

array __getFunctions()

-

-This function works only in WSDL mode. -

-

Example

-
-<?php
-    $client = SoapClient("some.wsdl");
-    var_dump($client->__getFunctions());
-?>
-
- - -

SoapClient::__getTypes

-

(PHP 5)

-

returns list of SOAP types

-

Description

-

array __getTypes()

-

-This function works only in WSDL mode. -

-

Example

-
-<?php
-    $client = SoapClient("some.wsdl");
-    var_dump($client->__getTypes());
-?>
-
- - -

SoapServer::SoapServer

-

(PHP 5)

-

SoapServer constructor

-

Description

-

SoapServer(mixed wsdl [, array options])

-It allows creating SoapServer objects in WSDL or nonWSDL mode. In the first -case wsdl must be set to URI of WSDL file. In the second wsdl -must be set to null and uti option must be set. Additional options -allow setting a default SOAP version (soap_version) and actor URI -(actor). - -

Examples

-
-    $server = new SoapServer("some.wsdl");
-
-    $server = new SoapServer("some.wsdl",array('soap_version'=>SOAP_1_2));
-
-    $server = new SoapServer("some.wsdl",array('actor'=>"http://example.org/ts-tests/C"));
-
-    $server = new SoapServer(null,array('uri'=>"http://test-uri/"));
-
- - -

SoapServer::addFunction

-

(PHP 5)

-

adds one or several functions those will handle SOAP requests

-

Description

-

void addFunction(mixed functions)

-Exports one or more functions for remote clients. To export one function pass -function name into functions parameter as string. To export several -functions pass an array of function names and to export all functions pass -a special constant SOAP_FUNCTIONS_ALL.
-Functions must receive all input arguments in the same order as defined -in WSDL file (They should not receive any output parameters as arguments) and -return one or more values. To return several values they must return array with -named output parameters. -

Examples

-
-    function func($inputString) {
-        return $inputString;
-    }
-    $server->addFunction("echoString");
-
-    function echoTwoStrings($inputString1, $inputString2) {
-        return array("outputString1"=>$inputString1,"outputString2"=>$inputString2);
-    }
-    $server->addFunction(array("echoString","echoTwoStrings"));
-
-    $server->addFunction(SOAP_FUNCTIONS_ALL);
-
- -
-

SoapServer::setClass

-

(PHP 5)

-

sets class which will handle SOAP requests

-

Description

-

void setClass(string class_name [, ...])

-Exports all methods from specified class. Additional parameters will be passed -to default class constructor during object creation. The object can be maiden -persistent across request for a given PHP session with -SoapServer::setPersistence method. -

Examples

-
-    $server->setClass("foo");
-
-    $server->setClass("foo", $arg1, $arg2);
-
- - -

SoapServer::getFunctions

-

(PHP 5)

-

returns list of defined functions

-

Description

-

array getFunctions()

- -
-

SoapServer::setPersistence

-

(PHP 5)

-

sets persistence mode of SoapServer

-

Description

-

void setPersistence(int mode)

-This function allows saving data between requests in PHP session. It works only -with server that exports functions form class (see -SoapServer:setCalss). -

Examples

-
-    $server->setpersistence(SOAP_PERSISTENCE_SESSION);
-
-    $server->setpersistence(SOAP_PERSISTENCE_REQUEST);
-
- - -

SoapServer::handle

-

(PHP 5)

-

handles a SOAP request

-

Description

-

void handle([string soap_envelope])

-It processes a SOAP request, call necessary functions, and send response back. -It assumes request in input parameter or in global $HTTP_RAW_POST_DATA PHP variable -if the argument is omitted. -

Example

-
-<?php
-    function test($x) {
-        return $x;
-    }
-
-    $server = new SoapServer(null,array('uri'=>"http://test-uri/"));
-    $server->addFunction("test");
-    $server->handle();
-?>
-
- - -

SoapParam::SoapParam

-

(PHP 5)

-

SoapParam constructor

-

Description

-

SoapParam(mixed data, string name)

-

-SoapParam is a special low-level class for naming parameters and return values -in nonWSDL mode. It is just a data holder and it has not any special method -except constructor. The constructor takes data to pass or return and -name. It is possible to pass parameter directly as PHP value, but in -this case it will be named as paramN and SOAP Service may not -understand it. -

-

Example

-
-<?php
-    $client = new SoapClient(null,array('location' => "http://localhost/soap.php",
-                                        'uri'      => "http://test-uri/"));
-    $client->SomeFunction(new SoapParam($a,"a"),
-                          new SoapParam($b,"b"),
-                          new SoapParam($c,"c"));
-?>
-
- - -

SoapVar::SoapVar

-

(PHP 5)

-

SoapVar constructor

-

Description

-

SoapVar(mixed data, int encoding [, string type [, string type_ns [, string name [, string name_ns]]]])

-

-SoapVar is a special low-level class for encoding parameters and return values -in nonWSDL mode. It is just a data holder and it has not any special method -except constructor. It is useful when you like to set type property in SOAP -request or response. The constructor takes data to pass or return, -encoding ID to encode it (see XSD_... constants) and as -option type name and namespace and value name and namespace. -

-

Example

-
-<?php
-    class SOAPStruct {
-    	function SOAPStruct($s, $i, $f) {
-    		$this->varString = $s;
-    		$this->varInt = $i;
-    		$this->varFloat = $f;
-    	}
-    }
-    $client = new SoapClient(null,array('location' => "http://localhost/soap.php",
-                                        'uri'      => "http://test-uri/"));
-    $struct = new SOAPStruct('arg',34,325.325);
-    $soapstruct = new SoapVar($struct,SOAP_ENC_OBJECT,"SOAPStruct","http://soapinterop.org/xsd");
-    $client->echoStruct(new SoapParam($soapstruct, "inputStruct"));
-?>
-
- - -

SoapHeader::SoapHeader

-

(PHP 5)

-

SoapHeader constructor

-

Description

-

SoapHeader(string name_ns, string name [, mixed data [, bool must_understand [, mixed actor]]])

-

-SoapHeader is a special low-level class for passing or returning SOAP headers. -It is just a data holder and it has not any special method except constructor. -It can be used in SoapClient::__call -method to pass SOAP header or in SOAP header handler to return header in SOAP -response. name_ns and name are namespace and name of the SOAP -header element. data is a SOAP header's content. It can be a PHP value -or SoapVar object. must_understand and actor are values for -mustUnderstand and actor attributes of this SOAP -Header element. -

-

Example

-
-<?php
-    $client = new SoapClient(null,array('location' => "http://localhost/soap.php",
-                                        'uri'      => "http://test-uri/"));
-    $client->__call("echoVoid",NULL,NULL,
-                    new SoapHeader('http://soapinterop.org/echoheader/',
-                                   'echoMeStringRequest',
-                                   'hello world'));
-?>
-
- - -

SoapFault::SoapFault

-

(PHP 5)

-

SoapFault constructor

-

Description

-

SoapFault(string faultcode, string faultstring [, string faultactor [, mixed details [, string faultname [, mixed headerfault]]]])

-This class is useful when you like to send SOAP fault response from PHP handler.
-faultcode, faultstring, faultactor and details are standard elements of SOAP Fault;
-faultname is an optional parameter that can be used to select proper fault encoding from WSDL.
-headerfault is an optional parameter that can be used during SOAP header handling to report error in response header. -

Example

-
-<?php
-    function test($x) {
-        return new SoapFault("Server","Some error message");
-    }
-
-    $server = new SoapServer(null,array('uri'=>"http://test-uri/"));
-    $server->addFunction("test");
-    $server->handle();
-?>
-
-

It is possible to use PHP exception mechanism to throw SOAP Fault.

-
-<?php
-    function test($x) {
-        throw new SoapFault("Server","Some error message");
-    }
-
-    $server = new SoapServer(null,array('uri'=>"http://test-uri/"));
-    $server->addFunction("test");
-    $server->handle();
-?>
-
- - \ No newline at end of file diff --git a/ext/soap/soap.c b/ext/soap/soap.c index 62abbe5fd..c1c51ce1a 100644 --- a/ext/soap/soap.c +++ b/ext/soap/soap.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ | Dmitry Stogov | +----------------------------------------------------------------------+ */ -/* $Id: soap.c 287746 2009-08-26 14:05:48Z dmitry $ */ +/* $Id: soap.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -1416,9 +1416,7 @@ PHP_METHOD(SoapServer, setObject) service->type = SOAP_OBJECT; MAKE_STD_ZVAL(service->soap_object); - *service->soap_object = *obj; - zval_copy_ctor(service->soap_object); - INIT_PZVAL(service->soap_object); + MAKE_COPY_ZVAL(&obj, service->soap_object); SOAP_SERVER_END_CODE(); } @@ -2335,9 +2333,7 @@ static void soap_error_handler(int error_num, const char *error_filename, const } fault = add_soap_fault(SOAP_GLOBAL(error_object), code, buffer, NULL, NULL TSRMLS_CC); MAKE_STD_ZVAL(exception); - *exception = *fault; - zval_copy_ctor(exception); - INIT_PZVAL(exception); + MAKE_COPY_ZVAL(&fault, exception); zend_throw_exception_object(exception TSRMLS_CC); old_objects = EG(objects_store).object_buckets; @@ -2623,9 +2619,7 @@ PHP_METHOD(SoapClient, SoapClient) zval *class_map; MAKE_STD_ZVAL(class_map); - *class_map = **tmp; - INIT_PZVAL(class_map); - zval_copy_ctor(class_map); + MAKE_COPY_ZVAL(tmp, class_map); #ifdef ZEND_ENGINE_2 Z_DELREF_P(class_map); #endif @@ -2955,9 +2949,7 @@ static void do_soap_call(zval* this_ptr, zval *exception; MAKE_STD_ZVAL(exception); - *exception = *return_value; - zval_copy_ctor(exception); - INIT_PZVAL(exception); + MAKE_COPY_ZVAL(&return_value, exception); zend_throw_exception_object(exception TSRMLS_CC); } #endif diff --git a/ext/soap/tests/server009.phpt b/ext/soap/tests/server009.phpt index 0a3412715..28d195a3c 100644 --- a/ext/soap/tests/server009.phpt +++ b/ext/soap/tests/server009.phpt @@ -7,6 +7,9 @@ SOAP Server 9: setclass and setpersistence(SOAP_PERSISTENCE_SESSION) die('skip this test needs session extension'); } ?> +--INI-- +session.auto_start=1 +session.save_handler=files --FILE-- bsd_socket == INVALID_SOCKET) +# ifdef EPROTONOSUPPORT +# undef EPROTONOSUPPORT +# endif +# ifdef ECONNRESET +# undef ECONNRESET +# endif # define EPROTONOSUPPORT WSAEPROTONOSUPPORT # define ECONNRESET WSAECONNRESET # ifdef errno @@ -104,7 +110,7 @@ static char *php_strerror(int error TSRMLS_DC); php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s [%d]: %s", msg, errn, php_strerror(errn TSRMLS_CC)) static int le_socket; -#define le_socket_name "Socket" +#define le_socket_name php_sockets_le_socket_name /* {{{ arginfo */ ZEND_BEGIN_ARG_INFO_EX(arginfo_socket_select, 0, 0, 4) diff --git a/ext/sockets/tests/socket_getpeername_ipv6loop.phpt b/ext/sockets/tests/socket_getpeername_ipv6loop.phpt index ba3c1347d..e865f3e06 100644 --- a/ext/sockets/tests/socket_getpeername_ipv6loop.phpt +++ b/ext/sockets/tests/socket_getpeername_ipv6loop.phpt @@ -5,9 +5,10 @@ ext/sockets - socket_getpeername_ipv6loop - basic test # $Id: socket_getpeername_ipv6loop.phpt 494 2009-06-09 20:38:05Z tatjana.andersen@redpill-linpro.com $ --SKIPIF-- --FILE-- debug_info->nApplyCount == 0) { + zend_hash_clean(intern->debug_info); zend_hash_copy(intern->debug_info, intern->std.properties, (copy_ctor_func_t) zval_add_ref, (void *) &tmp, sizeof(zval *)); storage = intern->array; diff --git a/ext/spl/spl_array.h b/ext/spl/spl_array.h index 9590ca6ed..be11a51ab 100755 --- a/ext/spl/spl_array.h +++ b/ext/spl/spl_array.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: spl_array.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: spl_array.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef SPL_ARRAY_H #define SPL_ARRAY_H diff --git a/ext/spl/spl_directory.c b/ext/spl/spl_directory.c index 860c6728b..5606062a7 100755 --- a/ext/spl/spl_directory.c +++ b/ext/spl/spl_directory.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: spl_directory.c 284648 2009-07-23 14:42:46Z jani $ */ +/* $Id: spl_directory.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H # include "config.h" diff --git a/ext/spl/spl_directory.h b/ext/spl/spl_directory.h index 549cff657..404390eda 100755 --- a/ext/spl/spl_directory.h +++ b/ext/spl/spl_directory.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: spl_directory.h 283689 2009-07-08 03:06:59Z iliaa $ */ +/* $Id: spl_directory.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef SPL_DIRECTORY_H #define SPL_DIRECTORY_H diff --git a/ext/spl/spl_dllist.c b/ext/spl/spl_dllist.c index 2caf9cce4..505e92d7d 100644 --- a/ext/spl/spl_dllist.c +++ b/ext/spl/spl_dllist.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: spl_dllist.c 287266 2009-08-13 22:07:05Z colder $ */ +/* $Id: spl_dllist.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H # include "config.h" diff --git a/ext/spl/spl_dllist.h b/ext/spl/spl_dllist.h index e5b6cb798..52b029c4e 100644 --- a/ext/spl/spl_dllist.h +++ b/ext/spl/spl_dllist.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: spl_dllist.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: spl_dllist.h 294892 2010-02-11 17:24:43Z johannes $ */ #ifndef SPL_DLLIST_H #define SPL_DLLIST_H @@ -24,9 +24,9 @@ #include "php.h" #include "php_spl.h" -PHPAPI zend_class_entry *spl_ce_SplDoublyLinkedList; -PHPAPI zend_class_entry *spl_ce_SplQueue; -PHPAPI zend_class_entry *spl_ce_SplStack; +extern PHPAPI zend_class_entry *spl_ce_SplDoublyLinkedList; +extern PHPAPI zend_class_entry *spl_ce_SplQueue; +extern PHPAPI zend_class_entry *spl_ce_SplStack; PHP_MINIT_FUNCTION(spl_dllist); diff --git a/ext/spl/spl_engine.c b/ext/spl/spl_engine.c index 2eb0a4e06..e8edf6aaf 100755 --- a/ext/spl/spl_engine.c +++ b/ext/spl/spl_engine.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | diff --git a/ext/spl/spl_engine.h b/ext/spl/spl_engine.h index bb62cb363..7baea3ae4 100755 --- a/ext/spl/spl_engine.h +++ b/ext/spl/spl_engine.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: spl_engine.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: spl_engine.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef SPL_ENGINE_H #define SPL_ENGINE_H diff --git a/ext/spl/spl_exceptions.c b/ext/spl/spl_exceptions.c index 3a0904dff..b761be7c5 100755 --- a/ext/spl/spl_exceptions.c +++ b/ext/spl/spl_exceptions.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: spl_exceptions.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: spl_exceptions.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H # include "config.h" diff --git a/ext/spl/spl_exceptions.h b/ext/spl/spl_exceptions.h index 1eabcdf46..20416d5c7 100755 --- a/ext/spl/spl_exceptions.h +++ b/ext/spl/spl_exceptions.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: spl_exceptions.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: spl_exceptions.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef SPL_EXCEPTIONS_H #define SPL_EXCEPTIONS_H diff --git a/ext/spl/spl_fixedarray.c b/ext/spl/spl_fixedarray.c index 5c192c811..b7bc2464b 100644 --- a/ext/spl/spl_fixedarray.c +++ b/ext/spl/spl_fixedarray.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: spl_fixedarray.c 283486 2009-07-04 20:31:27Z felipe $ */ +/* $Id: spl_fixedarray.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/spl/spl_fixedarray.h b/ext/spl/spl_fixedarray.h index 0dfd9eb5c..83e796acc 100644 --- a/ext/spl/spl_fixedarray.h +++ b/ext/spl/spl_fixedarray.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,12 +17,12 @@ +----------------------------------------------------------------------+ */ -/* $Id: spl_fixedarray.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: spl_fixedarray.h 294892 2010-02-11 17:24:43Z johannes $ */ #ifndef SPL_FIXEDARRAY_H #define SPL_FIXEDARRAY_H -PHPAPI zend_class_entry *spl_ce_SplFixedArray; +extern PHPAPI zend_class_entry *spl_ce_SplFixedArray; PHP_MINIT_FUNCTION(spl_fixedarray); diff --git a/ext/spl/spl_functions.c b/ext/spl/spl_functions.c index 8279aeeec..177a131cc 100755 --- a/ext/spl/spl_functions.c +++ b/ext/spl/spl_functions.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: spl_functions.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: spl_functions.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/spl/spl_functions.h b/ext/spl/spl_functions.h index c992f48c4..6cfb8bf08 100755 --- a/ext/spl/spl_functions.h +++ b/ext/spl/spl_functions.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: spl_functions.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: spl_functions.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_FUNCTIONS_H #define PHP_FUNCTIONS_H diff --git a/ext/spl/spl_heap.c b/ext/spl/spl_heap.c index 550b9efce..d06337733 100644 --- a/ext/spl/spl_heap.c +++ b/ext/spl/spl_heap.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: spl_heap.c 287266 2009-08-13 22:07:05Z colder $ */ +/* $Id: spl_heap.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H # include "config.h" diff --git a/ext/spl/spl_heap.h b/ext/spl/spl_heap.h index cd9d36ab4..0cc707d60 100644 --- a/ext/spl/spl_heap.h +++ b/ext/spl/spl_heap.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: spl_heap.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: spl_heap.h 294892 2010-02-11 17:24:43Z johannes $ */ #ifndef SPL_HEAP_H #define SPL_HEAP_H @@ -24,11 +24,11 @@ #include "php.h" #include "php_spl.h" -PHPAPI zend_class_entry *spl_ce_SplHeap; -PHPAPI zend_class_entry *spl_ce_SplMinHeap; -PHPAPI zend_class_entry *spl_ce_SplMaxHeap; +extern PHPAPI zend_class_entry *spl_ce_SplHeap; +extern PHPAPI zend_class_entry *spl_ce_SplMinHeap; +extern PHPAPI zend_class_entry *spl_ce_SplMaxHeap; -PHPAPI zend_class_entry *spl_ce_SplPriorityQueue; +extern PHPAPI zend_class_entry *spl_ce_SplPriorityQueue; PHP_MINIT_FUNCTION(spl_heap); diff --git a/ext/spl/spl_iterators.c b/ext/spl/spl_iterators.c index d498890bc..daf228496 100755 --- a/ext/spl/spl_iterators.c +++ b/ext/spl/spl_iterators.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: spl_iterators.c 283486 2009-07-04 20:31:27Z felipe $ */ +/* $Id: spl_iterators.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H # include "config.h" @@ -1166,7 +1166,7 @@ static union _zend_function *spl_dual_it_get_method(zval **object_ptr, char *met intern = (spl_dual_it_object*)zend_object_store_get_object(*object_ptr TSRMLS_CC); function_handler = std_object_handlers.get_method(object_ptr, method, method_len TSRMLS_CC); - if (!function_handler) { + if (!function_handler && intern->inner.ce) { if (zend_hash_find(&intern->inner.ce->function_table, method, method_len+1, (void **) &function_handler) == FAILURE) { if (Z_OBJ_HT_P(intern->inner.zobject)->get_method) { *object_ptr = intern->inner.zobject; @@ -1332,7 +1332,7 @@ static spl_dual_it_object* spl_dual_it_construct(INTERNAL_FUNCTION_PARAMETERS, z return NULL; } if (!retval || Z_TYPE_P(retval) != IS_OBJECT || !instanceof_function(Z_OBJCE_P(retval), zend_ce_traversable TSRMLS_CC)) { - zend_throw_exception_ex(spl_ce_LogicException, 0 TSRMLS_CC, "%s::getIterator() must return an object that implememnts Traversable", ce->name); + zend_throw_exception_ex(spl_ce_LogicException, 0 TSRMLS_CC, "%s::getIterator() must return an object that implements Traversable", ce->name); zend_restore_error_handling(&error_handling TSRMLS_CC); return NULL; } @@ -2077,7 +2077,7 @@ static inline void spl_limit_it_seek(spl_dual_it_object *intern, long pos TSRMLS return; } if (pos >= intern->u.limit.offset + intern->u.limit.count && intern->u.limit.count != -1) { - zend_throw_exception_ex(spl_ce_OutOfBoundsException, 0 TSRMLS_CC, "Cannot seek to %ld which is behind offest %ld plus count %ld", pos, intern->u.limit.offset, intern->u.limit.count); + zend_throw_exception_ex(spl_ce_OutOfBoundsException, 0 TSRMLS_CC, "Cannot seek to %ld which is behind offset %ld plus count %ld", pos, intern->u.limit.offset, intern->u.limit.count); return; } if (instanceof_function(intern->inner.ce, spl_ce_SeekableIterator TSRMLS_CC)) { @@ -2382,10 +2382,8 @@ SPL_METHOD(CachingIterator, __toString) return; } } else if (intern->u.caching.flags & CIT_TOSTRING_USE_CURRENT) { - *return_value = *intern->current.data; - zval_copy_ctor(return_value); + MAKE_COPY_ZVAL(&intern->current.data, return_value); convert_to_string(return_value); - INIT_PZVAL(return_value); return; } if (intern->u.caching.zstr) { diff --git a/ext/spl/spl_iterators.h b/ext/spl/spl_iterators.h index d252d71b5..4464e0940 100755 --- a/ext/spl/spl_iterators.h +++ b/ext/spl/spl_iterators.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: spl_iterators.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: spl_iterators.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef SPL_ITERATORS_H #define SPL_ITERATORS_H diff --git a/ext/spl/spl_observer.c b/ext/spl/spl_observer.c index 3100ead59..75855ada4 100755 --- a/ext/spl/spl_observer.c +++ b/ext/spl/spl_observer.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is SplSubject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: spl_observer.c 287266 2009-08-13 22:07:05Z colder $ */ +/* $Id: spl_observer.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H # include "config.h" @@ -622,7 +622,7 @@ SPL_METHOD(SplObjectStorage, unserialize) ++p; ALLOC_INIT_ZVAL(pcount); - if (!php_var_unserialize(&pcount, &p, s + buf_len, &var_hash TSRMLS_CC) || Z_TYPE_P(pcount) != IS_LONG) { + if (!php_var_unserialize(&pcount, &p, s + buf_len, NULL TSRMLS_CC) || Z_TYPE_P(pcount) != IS_LONG) { zval_ptr_dtor(&pcount); goto outexcept; } diff --git a/ext/spl/spl_observer.h b/ext/spl/spl_observer.h index 0edb338c5..cbe25d674 100755 --- a/ext/spl/spl_observer.h +++ b/ext/spl/spl_observer.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: spl_observer.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: spl_observer.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef SPL_OBSERVER_H #define SPL_OBSERVER_H diff --git a/ext/spl/tests/bug49263.phpt b/ext/spl/tests/bug49263.phpt new file mode 100644 index 000000000..14d0950f1 --- /dev/null +++ b/ext/spl/tests/bug49263.phpt @@ -0,0 +1,54 @@ +--TEST-- +SPL: SplObjectStorage serialization references +--SKIPIF-- + +--FILE-- +attach($o1, array('prev' => 2, 'next' => $o2)); +$s->attach($o2, array('prev' => $o1)); + +$ss = serialize($s); +unset($s,$o1,$o2); +echo $ss."\n"; +var_dump(unserialize($ss)); +?> +===DONE=== +--EXPECTF-- +C:16:"SplObjectStorage":113:{x:i:2;O:8:"stdClass":0:{},a:2:{s:4:"prev";i:2;s:4:"next";O:8:"stdClass":0:{}};r:4;,a:1:{s:4:"prev";r:1;};m:a:0:{}} +object(SplObjectStorage)#2 (1) { + ["storage":"SplObjectStorage":private]=> + array(2) { + ["%s"]=> + array(2) { + ["obj"]=> + object(stdClass)#1 (0) { + } + ["inf"]=> + array(2) { + ["prev"]=> + int(2) + ["next"]=> + object(stdClass)#3 (0) { + } + } + } + ["%s"]=> + array(2) { + ["obj"]=> + object(stdClass)#3 (0) { + } + ["inf"]=> + array(1) { + ["prev"]=> + object(stdClass)#1 (0) { + } + } + } + } +} +===DONE=== diff --git a/ext/spl/tests/bug49972.phpt b/ext/spl/tests/bug49972.phpt new file mode 100755 index 000000000..843c2519b --- /dev/null +++ b/ext/spl/tests/bug49972.phpt @@ -0,0 +1,11 @@ +--TEST-- +Bug #49972 (AppendIterator undefined function crash) +--FILE-- +undefined(); + +?> +--EXPECTF-- +Fatal error: Call to undefined method AppendIterator::undefined() in %s on line %d diff --git a/ext/spl/tests/iterator_032.phpt b/ext/spl/tests/iterator_032.phpt index 8b1d97e18..84eb8e61f 100755 --- a/ext/spl/tests/iterator_032.phpt +++ b/ext/spl/tests/iterator_032.phpt @@ -45,6 +45,6 @@ int(1) int(2) Cannot seek to 0 which is below the offset 1 int(3) -Cannot seek to 3 which is behind offest 1 plus count 2 +Cannot seek to 3 which is behind offset 1 plus count 2 bool(false) ===DONE=== diff --git a/ext/spl/tests/iterator_069.phpt b/ext/spl/tests/iterator_069.phpt new file mode 100644 index 000000000..e9b3177ed --- /dev/null +++ b/ext/spl/tests/iterator_069.phpt @@ -0,0 +1,17 @@ +--TEST-- +SPL: RecursiveIteratorIterator cannot be used with foreach by reference +--FILE-- +getIterator()); + +$recItIt = new RecursiveIteratorIterator($recArrIt); + +foreach ($recItIt as &$val) echo "$val\n"; + +?> +--EXPECTF-- +Fatal error: An iterator cannot be used with foreach by reference in %s on line %d diff --git a/ext/spl/tests/iterator_070.phpt b/ext/spl/tests/iterator_070.phpt new file mode 100644 index 000000000..c45f08ec4 --- /dev/null +++ b/ext/spl/tests/iterator_070.phpt @@ -0,0 +1,20 @@ +--TEST-- +SPL: RecursiveIteratorIterator - Ensure that non-overriden methods execute problem free. +--FILE-- +beginIteration()); +var_dump($recItIt->endIteration()); +var_dump($recItIt->nextElement()); + +?> + +--EXPECTF-- +NULL +NULL +NULL \ No newline at end of file diff --git a/ext/spl/tests/iterator_071.phpt b/ext/spl/tests/iterator_071.phpt new file mode 100644 index 000000000..21ec7980a --- /dev/null +++ b/ext/spl/tests/iterator_071.phpt @@ -0,0 +1,32 @@ +--TEST-- +SPL: RecursiveIteratorIterator - Test where the case is RS_SELF and mode is CHILD_FIRST +--FILE-- +getIterator()); + +class MyRecursiveIteratorIterator extends RecursiveIteratorIterator { + + function nextelement() { + echo __METHOD__."\n"; + } +} + + +$recItIt = new MyRecursiveIteratorIterator($recArrIt, RecursiveIteratorIterator::CHILD_FIRST); + +foreach ($recItIt as $key => $val) echo "$key\n"; + +?> +--EXPECTF-- +MyRecursiveIteratorIterator::nextelement +0 +MyRecursiveIteratorIterator::nextelement +1 +MyRecursiveIteratorIterator::nextelement +0 +MyRecursiveIteratorIterator::nextelement +1 \ No newline at end of file diff --git a/ext/spl/tests/recursiveIteratorIterator_beginchildren_error.phpt b/ext/spl/tests/recursiveIteratorIterator_beginchildren_error.phpt new file mode 100644 index 000000000..f5430725d --- /dev/null +++ b/ext/spl/tests/recursiveIteratorIterator_beginchildren_error.phpt @@ -0,0 +1,36 @@ +--TEST-- +SPL: RecursiveIteratorIterator - Exception thrown in beginchildren which should be handled in next() +--FILE-- +getIterator()); + +class MyRecursiveIteratorIterator extends RecursiveIteratorIterator { + + function beginchildren() { + throw new Exception; + } +} + + +$recItIt = new MyRecursiveIteratorIterator($recArrIt, RecursiveIteratorIterator::LEAVES_ONLY, RecursiveIteratorIterator::CATCH_GET_CHILD); + +var_dump($recItIt->next()); + +$recItIt2 = new MyRecursiveIteratorIterator($recArrIt, RecursiveIteratorIterator::LEAVES_ONLY); + +var_dump($recItIt2->next()); + +?> +--EXPECTF-- +NULL + +Fatal error: Uncaught exception 'Exception' in %s +Stack trace: +#0 [internal function]: MyRecursiveIteratorIterator->beginchildren() +#1 %s: RecursiveIteratorIterator->next() +#2 {main} + thrown in %s on line %d diff --git a/ext/spl/tests/recursiveIteratorIterator_callHasChildren_error.phpt b/ext/spl/tests/recursiveIteratorIterator_callHasChildren_error.phpt new file mode 100644 index 000000000..88f03fbd8 --- /dev/null +++ b/ext/spl/tests/recursiveIteratorIterator_callHasChildren_error.phpt @@ -0,0 +1,36 @@ +--TEST-- +SPL: RecursiveIteratorIterator - Exception thrown in callHasChildren which should be handled in next() +--FILE-- +getIterator()); + +class MyRecursiveIteratorIterator extends RecursiveIteratorIterator { + + function callHasChildren() { + throw new Exception; + } +} + + +$recItIt = new MyRecursiveIteratorIterator($recArrIt, RecursiveIteratorIterator::LEAVES_ONLY, RecursiveIteratorIterator::CATCH_GET_CHILD); + +var_dump($recItIt->next()); + +$recItIt2 = new MyRecursiveIteratorIterator($recArrIt, RecursiveIteratorIterator::LEAVES_ONLY); + +var_dump($recItIt2->next()); + +?> +--EXPECTF-- +NULL + +Fatal error: Uncaught exception 'Exception' in %s +Stack trace: +#0 [internal function]: MyRecursiveIteratorIterator->callHasChildren() +#1 %s: RecursiveIteratorIterator->next() +#2 {main} + thrown in %s on line %d diff --git a/ext/spl/tests/recursiveIteratorIterator_endchildren_error.phpt b/ext/spl/tests/recursiveIteratorIterator_endchildren_error.phpt new file mode 100644 index 000000000..e25d3edc8 --- /dev/null +++ b/ext/spl/tests/recursiveIteratorIterator_endchildren_error.phpt @@ -0,0 +1,42 @@ +--TEST-- +SPL: RecursiveIteratorIterator - Exception thrown in endchildren which should be handled in next() +--FILE-- +getIterator()); + +class MyRecursiveIteratorIterator extends RecursiveIteratorIterator { + + function endchildren() { + throw new Exception; + } +} + + +$recItIt = new MyRecursiveIteratorIterator($recArrIt, RecursiveIteratorIterator::LEAVES_ONLY, RecursiveIteratorIterator::CATCH_GET_CHILD); + +foreach ($recItIt as $val) echo "$val\n"; + +$recItIt2 = new MyRecursiveIteratorIterator($recArrIt, RecursiveIteratorIterator::LEAVES_ONLY); + +echo "===NEXT LOOP===\n"; + +foreach ($recItIt2 as $val) echo "$val\n"; + +?> +--EXPECTF-- +1 +2 +===NEXT LOOP=== +1 +2 + +Fatal error: Uncaught exception 'Exception' in %s +Stack trace: +#0 [internal function]: MyRecursiveIteratorIterator->endchildren() +#1 %s: RecursiveIteratorIterator->next() +#2 {main} + thrown in %s on line %d diff --git a/ext/spl/tests/recursiveIteratorIterator_nextelement_error.phpt b/ext/spl/tests/recursiveIteratorIterator_nextelement_error.phpt new file mode 100644 index 000000000..3a91ed5b2 --- /dev/null +++ b/ext/spl/tests/recursiveIteratorIterator_nextelement_error.phpt @@ -0,0 +1,36 @@ +--TEST-- +SPL: RecursiveIteratorIterator - Exception thrown in nextelement which should be handled in next() +--FILE-- +getIterator()); + +class MyRecursiveIteratorIterator extends RecursiveIteratorIterator { + + function nextelement() { + throw new Exception; + } +} + + +$recItIt = new MyRecursiveIteratorIterator($recArrIt, RecursiveIteratorIterator::LEAVES_ONLY, RecursiveIteratorIterator::CATCH_GET_CHILD); + +var_dump($recItIt->next()); + +$recItIt = new MyRecursiveIteratorIterator($recArrIt, RecursiveIteratorIterator::LEAVES_ONLY); + +var_dump($recItIt->next()); + +?> +--EXPECTF-- +NULL + +Fatal error: Uncaught exception 'Exception' in %s +Stack trace: +#0 [internal function]: MyRecursiveIteratorIterator->nextelement() +#1 %s: RecursiveIteratorIterator->next() +#2 {main} + thrown in %s on line %d diff --git a/ext/sqlite/config.m4 b/ext/sqlite/config.m4 index 25af84696..4f7b72c9e 100644 --- a/ext/sqlite/config.m4 +++ b/ext/sqlite/config.m4 @@ -1,4 +1,4 @@ -dnl $Id: config.m4 266233 2008-09-13 00:23:48Z moriyoshi $ +dnl $Id: config.m4 291414 2009-11-29 06:13:22Z rasmus $ dnl config.m4 for extension sqlite dnl vim:et:ts=2:sw=2 diff --git a/ext/sqlite/pdo_sqlite2.c b/ext/sqlite/pdo_sqlite2.c index 663c6f5b2..826a9fac6 100644 --- a/ext/sqlite/pdo_sqlite2.c +++ b/ext/sqlite/pdo_sqlite2.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: pdo_sqlite2.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: pdo_sqlite2.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" #endif diff --git a/ext/sqlite/php_sqlite.h b/ext/sqlite/php_sqlite.h index f0cd3112f..439cbf57d 100644 --- a/ext/sqlite/php_sqlite.h +++ b/ext/sqlite/php_sqlite.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ | Marcus Boerger | +----------------------------------------------------------------------+ - $Id: php_sqlite.h 272370 2008-12-31 11:15:49Z sebastian $ + $Id: php_sqlite.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_SQLITE_H diff --git a/ext/sqlite/sess_sqlite.c b/ext/sqlite/sess_sqlite.c index 877da8b69..443f62169 100644 --- a/ext/sqlite/sess_sqlite.c +++ b/ext/sqlite/sess_sqlite.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: sess_sqlite.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: sess_sqlite.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php.h" diff --git a/ext/sqlite/sqlite.c b/ext/sqlite/sqlite.c index d9a4a796d..4ea17ee09 100644 --- a/ext/sqlite/sqlite.c +++ b/ext/sqlite/sqlite.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ | Marcus Boerger | +----------------------------------------------------------------------+ - $Id: sqlite.c 289598 2009-10-12 22:37:52Z pajoye $ + $Id: sqlite.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H @@ -1458,7 +1458,7 @@ PHP_MINFO_FUNCTION(sqlite) { php_info_print_table_start(); php_info_print_table_header(2, "SQLite support", "enabled"); - php_info_print_table_row(2, "PECL Module version", PHP_SQLITE_MODULE_VERSION " $Id: sqlite.c 289598 2009-10-12 22:37:52Z pajoye $"); + php_info_print_table_row(2, "PECL Module version", PHP_SQLITE_MODULE_VERSION " $Id: sqlite.c 293036 2010-01-03 09:23:27Z sebastian $"); php_info_print_table_row(2, "SQLite Library", sqlite_libversion()); php_info_print_table_row(2, "SQLite Encoding", sqlite_libencoding()); php_info_print_table_end(); diff --git a/ext/sqlite3/config.w32 b/ext/sqlite3/config.w32 index 3ea754659..9b360737c 100644 --- a/ext/sqlite3/config.w32 +++ b/ext/sqlite3/config.w32 @@ -1,10 +1,10 @@ -// $Id: config.w32 281461 2009-05-31 11:16:46Z kalle $ +// $Id: config.w32 289692 2009-10-16 02:22:48Z scottmac $ // vim:ft=javascript ARG_WITH("sqlite3", "SQLite 3 support", "no"); if (PHP_SQLITE3 != "no") { - ADD_FLAG("CFLAGS_SQLITE3", "/D SQLITE_THREADSAFE=" + (PHP_ZTS == "yes" ? "1" : "0") + " /D SQLITE_ENABLE_FTS3=1 /D SQLITE_CORE=1 "); + ADD_FLAG("CFLAGS_SQLITE3", "/D SQLITE_THREADSAFE=" + (PHP_ZTS == "yes" ? "1" : "0") + " /D SQLITE_ENABLE_FTS3=1 /D SQLITE_ENABLE_COLUMN_METADATA=1 /D SQLITE_CORE=1 "); EXTENSION("sqlite3", "sqlite3.c", null, "/I" + configure_module_dirname + "/libsqlite /I" + configure_module_dirname); ADD_SOURCES(configure_module_dirname + "/libsqlite", "sqlite3.c", "sqlite3"); diff --git a/ext/sqlite3/libsqlite/sqlite3.c b/ext/sqlite3/libsqlite/sqlite3.c index db34d0c0e..5339b314b 100644 --- a/ext/sqlite3/libsqlite/sqlite3.c +++ b/ext/sqlite3/libsqlite/sqlite3.c @@ -4,7 +4,7 @@ /****************************************************************************** ** This file is an amalgamation of many separate C source files from SQLite -** version 3.6.19. By combining all the individual C code files into this +** version 3.6.22. By combining all the individual C code files into this ** single large file, the entire code can be compiled as a one translation ** unit. This allows many compilers to do optimizations that would not be ** possible if the files were compiled separately. Performance improvements @@ -20,8 +20,6 @@ ** if you want a wrapper to interface SQLite with your choice of programming ** language. The code for the "sqlite3" command-line shell is also in a ** separate file. This file contains only code for the core SQLite library. -** -** This amalgamation was generated on 2009-10-14 11:35:02 UTC. */ #define SQLITE_CORE 1 #define SQLITE_AMALGAMATION 1 @@ -99,8 +97,6 @@ ************************************************************************* ** ** This file defines various limits of what SQLite can process. -** -** @(#) $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ /* @@ -285,12 +281,8 @@ ** may be executed. */ #ifndef SQLITE_MAX_TRIGGER_DEPTH -#if defined(SQLITE_SMALL_STACK) -# define SQLITE_MAX_TRIGGER_DEPTH 10 -#else # define SQLITE_MAX_TRIGGER_DEPTH 1000 #endif -#endif /************** End of sqliteLimit.h *****************************************/ /************** Continuing where we left off in sqliteInt.h ******************/ @@ -613,55 +605,43 @@ extern "C" { #endif /* -** CAPI3REF: Compile-Time Library Version Numbers {H10010} +** CAPI3REF: Compile-Time Library Version Numbers ** -** The SQLITE_VERSION and SQLITE_VERSION_NUMBER #defines in -** the sqlite3.h file specify the version of SQLite with which -** that header file is associated. -** -** The "version" of SQLite is a string of the form "W.X.Y" or "W.X.Y.Z". -** The W value is major version number and is always 3 in SQLite3. -** The W value only changes when backwards compatibility is -** broken and we intend to never break backwards compatibility. -** The X value is the minor version number and only changes when -** there are major feature enhancements that are forwards compatible -** but not backwards compatible. -** The Y value is the release number and is incremented with -** each release but resets back to 0 whenever X is incremented. -** The Z value only appears on branch releases. -** -** The SQLITE_VERSION_NUMBER is an integer that is computed as -** follows: -** -**
-** SQLITE_VERSION_NUMBER = W*1000000 + X*1000 + Y
-** 
+** ^(The [SQLITE_VERSION] C preprocessor macro in the sqlite3.h header +** evaluates to a string literal that is the SQLite version in the +** format "X.Y.Z" where X is the major version number (always 3 for +** SQLite3) and Y is the minor version number and Z is the release number.)^ +** ^(The [SQLITE_VERSION_NUMBER] C preprocessor macro resolves to an integer +** with the value (X*1000000 + Y*1000 + Z) where X, Y, and Z are the same +** numbers used in [SQLITE_VERSION].)^ +** The SQLITE_VERSION_NUMBER for any given release of SQLite will also +** be larger than the release from which it is derived. Either Y will +** be held constant and Z will be incremented or else Y will be incremented +** and Z will be reset to zero. ** ** Since version 3.6.18, SQLite source code has been stored in the -** fossil configuration management -** system. The SQLITE_SOURCE_ID -** macro is a string which identifies a particular check-in of SQLite -** within its configuration management system. The string contains the -** date and time of the check-in (UTC) and an SHA1 hash of the entire -** source tree. +** Fossil configuration management +** system. ^The SQLITE_SOURCE_ID macro evalutes to +** a string which identifies a particular check-in of SQLite +** within its configuration management system. ^The SQLITE_SOURCE_ID +** string contains the date and time of the check-in (UTC) and an SHA1 +** hash of the entire source tree. ** ** See also: [sqlite3_libversion()], ** [sqlite3_libversion_number()], [sqlite3_sourceid()], ** [sqlite_version()] and [sqlite_source_id()]. -** -** Requirements: [H10011] [H10014] */ -#define SQLITE_VERSION "3.6.19" -#define SQLITE_VERSION_NUMBER 3006019 -#define SQLITE_SOURCE_ID "2009-10-14 11:33:55 c1d499afc50d54b376945b4efb65c56c787a073d" +#define SQLITE_VERSION "3.6.22" +#define SQLITE_VERSION_NUMBER 3006022 +#define SQLITE_SOURCE_ID "2010-01-05 15:30:36 28d0d7710761114a44a1a3a425a6883c661f06e7" /* -** CAPI3REF: Run-Time Library Version Numbers {H10020} +** CAPI3REF: Run-Time Library Version Numbers ** KEYWORDS: sqlite3_version ** ** These interfaces provide the same information as the [SQLITE_VERSION], -** [SQLITE_VERSION_NUMBER], and [SQLITE_SOURCE_ID] #defines in the header, -** but are associated with the library instead of the header file. Cautious +** [SQLITE_VERSION_NUMBER], and [SQLITE_SOURCE_ID] C preprocessor macros +** but are associated with the library instead of the header file. ^(Cautious ** programmers might include assert() statements in their application to ** verify that values returned by these interfaces match the macros in ** the header, and thus insure that the application is @@ -670,19 +650,20 @@ extern "C" { **
 ** assert( sqlite3_libversion_number()==SQLITE_VERSION_NUMBER );
 ** assert( strcmp(sqlite3_sourceid(),SQLITE_SOURCE_ID)==0 );
-** assert( strcmp(sqlite3_libversion,SQLITE_VERSION)==0 );
-** 
-** -** The sqlite3_libversion() function returns the same information as is -** in the sqlite3_version[] string constant. The function is provided -** for use in DLLs since DLL users usually do not have direct access to string -** constants within the DLL. Similarly, the sqlite3_sourceid() function -** returns the same information as is in the [SQLITE_SOURCE_ID] #define of -** the header file. +** assert( strcmp(sqlite3_libversion(),SQLITE_VERSION)==0 ); +** )^ +** +** ^The sqlite3_version[] string constant contains the text of [SQLITE_VERSION] +** macro. ^The sqlite3_libversion() function returns a pointer to the +** to the sqlite3_version[] string constant. The sqlite3_libversion() +** function is provided for use in DLLs since DLL users usually do not have +** direct access to string constants within the DLL. ^The +** sqlite3_libversion_number() function returns an integer equal to +** [SQLITE_VERSION_NUMBER]. ^The sqlite3_sourceid() function a pointer +** to a string constant whose value is the same as the [SQLITE_SOURCE_ID] +** C preprocessor macro. ** ** See also: [sqlite_version()] and [sqlite_source_id()]. -** -** Requirements: [H10021] [H10022] [H10023] */ SQLITE_API const char sqlite3_version[] = SQLITE_VERSION; SQLITE_API const char *sqlite3_libversion(void); @@ -690,7 +671,11 @@ SQLITE_API const char *sqlite3_sourceid(void); SQLITE_API int sqlite3_libversion_number(void); /* -** CAPI3REF: Test To See If The Library Is Threadsafe {H10100} +** CAPI3REF: Test To See If The Library Is Threadsafe +** +** ^The sqlite3_threadsafe() function returns zero if and only if +** SQLite was compiled mutexing code omitted due to the +** [SQLITE_THREADSAFE] compile-time option being set to 0. ** ** SQLite can be compiled with or without mutexes. When ** the [SQLITE_THREADSAFE] C preprocessor macro is 1 or 2, mutexes @@ -702,7 +687,7 @@ SQLITE_API int sqlite3_libversion_number(void); ** Enabling mutexes incurs a measurable performance penalty. ** So if speed is of utmost importance, it makes sense to disable ** the mutexes. But for maximum safety, mutexes should be enabled. -** The default behavior is for mutexes to be enabled. +** ^The default behavior is for mutexes to be enabled. ** ** This interface can be used by an application to make sure that the ** version of SQLite that it is linking against was compiled with @@ -710,21 +695,21 @@ SQLITE_API int sqlite3_libversion_number(void); ** ** This interface only reports on the compile-time mutex setting ** of the [SQLITE_THREADSAFE] flag. If SQLite is compiled with -** SQLITE_THREADSAFE=1 then mutexes are enabled by default but +** SQLITE_THREADSAFE=1 or =2 then mutexes are enabled by default but ** can be fully or partially disabled using a call to [sqlite3_config()] ** with the verbs [SQLITE_CONFIG_SINGLETHREAD], [SQLITE_CONFIG_MULTITHREAD], -** or [SQLITE_CONFIG_MUTEX]. The return value of this function shows -** only the default compile-time setting, not any run-time changes -** to that setting. +** or [SQLITE_CONFIG_MUTEX]. ^(The return value of the +** sqlite3_threadsafe() function shows only the compile-time setting of +** thread safety, not any run-time changes to that setting made by +** sqlite3_config(). In other words, the return value from sqlite3_threadsafe() +** is unchanged by calls to sqlite3_config().)^ ** ** See the [threading mode] documentation for additional information. -** -** Requirements: [H10101] [H10102] */ SQLITE_API int sqlite3_threadsafe(void); /* -** CAPI3REF: Database Connection Handle {H12000} +** CAPI3REF: Database Connection Handle ** KEYWORDS: {database connection} {database connections} ** ** Each open SQLite database is represented by a pointer to an instance of @@ -739,7 +724,7 @@ SQLITE_API int sqlite3_threadsafe(void); typedef struct sqlite3 sqlite3; /* -** CAPI3REF: 64-Bit Integer Types {H10200} +** CAPI3REF: 64-Bit Integer Types ** KEYWORDS: sqlite_int64 sqlite_uint64 ** ** Because there is no cross-platform way to specify 64-bit integer types @@ -749,7 +734,10 @@ typedef struct sqlite3 sqlite3; ** The sqlite_int64 and sqlite_uint64 types are supported for backwards ** compatibility only. ** -** Requirements: [H10201] [H10202] +** ^The sqlite3_int64 and sqlite_int64 types can store integer values +** between -9223372036854775808 and +9223372036854775807 inclusive. ^The +** sqlite3_uint64 and sqlite_uint64 types can store integer values +** between 0 and +18446744073709551615 inclusive. */ #ifdef SQLITE_INT64_TYPE typedef SQLITE_INT64_TYPE sqlite_int64; @@ -773,34 +761,28 @@ typedef sqlite_uint64 sqlite3_uint64; #endif /* -** CAPI3REF: Closing A Database Connection {H12010} +** CAPI3REF: Closing A Database Connection ** -** This routine is the destructor for the [sqlite3] object. +** ^The sqlite3_close() routine is the destructor for the [sqlite3] object. +** ^Calls to sqlite3_close() return SQLITE_OK if the [sqlite3] object is +** successfullly destroyed and all associated resources are deallocated. ** -** Applications should [sqlite3_finalize | finalize] all [prepared statements] +** Applications must [sqlite3_finalize | finalize] all [prepared statements] ** and [sqlite3_blob_close | close] all [BLOB handles] associated with -** the [sqlite3] object prior to attempting to close the object. -** The [sqlite3_next_stmt()] interface can be used to locate all -** [prepared statements] associated with a [database connection] if desired. -** Typical code might look like this: -** -**
-** sqlite3_stmt *pStmt;
-** while( (pStmt = sqlite3_next_stmt(db, 0))!=0 ){
-**     sqlite3_finalize(pStmt);
-** }
-** 
+** the [sqlite3] object prior to attempting to close the object. ^If +** sqlite3_close() is called on a [database connection] that still has +** outstanding [prepared statements] or [BLOB handles], then it returns +** SQLITE_BUSY. ** -** If [sqlite3_close()] is invoked while a transaction is open, +** ^If [sqlite3_close()] is invoked while a transaction is open, ** the transaction is automatically rolled back. ** ** The C parameter to [sqlite3_close(C)] must be either a NULL ** pointer or an [sqlite3] object pointer obtained ** from [sqlite3_open()], [sqlite3_open16()], or ** [sqlite3_open_v2()], and not previously closed. -** -** Requirements: -** [H12011] [H12012] [H12013] [H12014] [H12015] [H12019] +** ^Calling sqlite3_close() with a NULL pointer argument is a +** harmless no-op. */ SQLITE_API int sqlite3_close(sqlite3 *); @@ -812,48 +794,65 @@ SQLITE_API int sqlite3_close(sqlite3 *); typedef int (*sqlite3_callback)(void*,int,char**, char**); /* -** CAPI3REF: One-Step Query Execution Interface {H12100} -** -** The sqlite3_exec() interface is a convenient way of running one or more -** SQL statements without having to write a lot of C code. The UTF-8 encoded -** SQL statements are passed in as the second parameter to sqlite3_exec(). -** The statements are evaluated one by one until either an error or -** an interrupt is encountered, or until they are all done. The 3rd parameter -** is an optional callback that is invoked once for each row of any query -** results produced by the SQL statements. The 5th parameter tells where -** to write any error messages. -** -** The error message passed back through the 5th parameter is held -** in memory obtained from [sqlite3_malloc()]. To avoid a memory leak, -** the calling application should call [sqlite3_free()] on any error -** message returned through the 5th parameter when it has finished using -** the error message. -** -** If the SQL statement in the 2nd parameter is NULL or an empty string -** or a string containing only whitespace and comments, then no SQL -** statements are evaluated and the database is not changed. -** -** The sqlite3_exec() interface is implemented in terms of -** [sqlite3_prepare_v2()], [sqlite3_step()], and [sqlite3_finalize()]. -** The sqlite3_exec() routine does nothing to the database that cannot be done -** by [sqlite3_prepare_v2()], [sqlite3_step()], and [sqlite3_finalize()]. -** -** The first parameter to [sqlite3_exec()] must be an valid and open -** [database connection]. -** -** The database connection must not be closed while -** [sqlite3_exec()] is running. +** CAPI3REF: One-Step Query Execution Interface +** +** The sqlite3_exec() interface is a convenience wrapper around +** [sqlite3_prepare_v2()], [sqlite3_step()], and [sqlite3_finalize()], +** that allows an application to run multiple statements of SQL +** without having to use a lot of C code. +** +** ^The sqlite3_exec() interface runs zero or more UTF-8 encoded, +** semicolon-separate SQL statements passed into its 2nd argument, +** in the context of the [database connection] passed in as its 1st +** argument. ^If the callback function of the 3rd argument to +** sqlite3_exec() is not NULL, then it is invoked for each result row +** coming out of the evaluated SQL statements. ^The 4th argument to +** to sqlite3_exec() is relayed through to the 1st argument of each +** callback invocation. ^If the callback pointer to sqlite3_exec() +** is NULL, then no callback is ever invoked and result rows are +** ignored. +** +** ^If an error occurs while evaluating the SQL statements passed into +** sqlite3_exec(), then execution of the current statement stops and +** subsequent statements are skipped. ^If the 5th parameter to sqlite3_exec() +** is not NULL then any error message is written into memory obtained +** from [sqlite3_malloc()] and passed back through the 5th parameter. +** To avoid memory leaks, the application should invoke [sqlite3_free()] +** on error message strings returned through the 5th parameter of +** of sqlite3_exec() after the error message string is no longer needed. +** ^If the 5th parameter to sqlite3_exec() is not NULL and no errors +** occur, then sqlite3_exec() sets the pointer in its 5th parameter to +** NULL before returning. +** +** ^If an sqlite3_exec() callback returns non-zero, the sqlite3_exec() +** routine returns SQLITE_ABORT without invoking the callback again and +** without running any subsequent SQL statements. +** +** ^The 2nd argument to the sqlite3_exec() callback function is the +** number of columns in the result. ^The 3rd argument to the sqlite3_exec() +** callback is an array of pointers to strings obtained as if from +** [sqlite3_column_text()], one for each column. ^If an element of a +** result row is NULL then the corresponding string pointer for the +** sqlite3_exec() callback is a NULL pointer. ^The 4th argument to the +** sqlite3_exec() callback is an array of pointers to strings where each +** entry represents the name of corresponding result column as obtained +** from [sqlite3_column_name()]. +** +** ^If the 2nd parameter to sqlite3_exec() is a NULL pointer, a pointer +** to an empty string, or a pointer that contains only whitespace and/or +** SQL comments, then no SQL statements are evaluated and the database +** is not changed. +** +** Restrictions: ** -** The calling function should use [sqlite3_free()] to free -** the memory that *errmsg is left pointing at once the error -** message is no longer needed. -** -** The SQL statement text in the 2nd parameter to [sqlite3_exec()] -** must remain unchanged while [sqlite3_exec()] is running. -** -** Requirements: -** [H12101] [H12102] [H12104] [H12105] [H12107] [H12110] [H12113] [H12116] -** [H12119] [H12122] [H12125] [H12131] [H12134] [H12137] [H12138] +**
    +**
  • The application must insure that the 1st parameter to sqlite3_exec() +** is a valid and open [database connection]. +**
  • The application must not close [database connection] specified by +** the 1st parameter to sqlite3_exec() while sqlite3_exec() is running. +**
  • The application must not modify the SQL statement text passed into +** the 2nd parameter of sqlite3_exec() while sqlite3_exec() is running. +**
*/ SQLITE_API int sqlite3_exec( sqlite3*, /* An open database */ @@ -864,7 +863,7 @@ SQLITE_API int sqlite3_exec( ); /* -** CAPI3REF: Result Codes {H10210} +** CAPI3REF: Result Codes ** KEYWORDS: SQLITE_OK {error code} {error codes} ** KEYWORDS: {result code} {result codes} ** @@ -908,7 +907,7 @@ SQLITE_API int sqlite3_exec( /* end-of-error-codes */ /* -** CAPI3REF: Extended Result Codes {H10220} +** CAPI3REF: Extended Result Codes ** KEYWORDS: {extended error code} {extended error codes} ** KEYWORDS: {extended result code} {extended result codes} ** @@ -950,7 +949,7 @@ SQLITE_API int sqlite3_exec( #define SQLITE_LOCKED_SHAREDCACHE (SQLITE_LOCKED | (1<<8) ) /* -** CAPI3REF: Flags For File Open Operations {H10230} +** CAPI3REF: Flags For File Open Operations ** ** These bit values are intended for use in the ** 3rd parameter to the [sqlite3_open_v2()] interface and @@ -975,7 +974,7 @@ SQLITE_API int sqlite3_exec( #define SQLITE_OPEN_PRIVATECACHE 0x00040000 /* Ok for sqlite3_open_v2() */ /* -** CAPI3REF: Device Characteristics {H10240} +** CAPI3REF: Device Characteristics ** ** The xDeviceCapabilities method of the [sqlite3_io_methods] ** object returns an integer which is a vector of the these @@ -1007,7 +1006,7 @@ SQLITE_API int sqlite3_exec( #define SQLITE_IOCAP_SEQUENTIAL 0x00000400 /* -** CAPI3REF: File Locking Levels {H10250} +** CAPI3REF: File Locking Levels ** ** SQLite uses one of these integer values as the second ** argument to calls it makes to the xLock() and xUnlock() methods @@ -1020,7 +1019,7 @@ SQLITE_API int sqlite3_exec( #define SQLITE_LOCK_EXCLUSIVE 4 /* -** CAPI3REF: Synchronization Type Flags {H10260} +** CAPI3REF: Synchronization Type Flags ** ** When SQLite invokes the xSync() method of an ** [sqlite3_io_methods] object it uses a combination of @@ -1038,7 +1037,7 @@ SQLITE_API int sqlite3_exec( #define SQLITE_SYNC_DATAONLY 0x00010 /* -** CAPI3REF: OS Interface Open File Handle {H11110} +** CAPI3REF: OS Interface Open File Handle ** ** An [sqlite3_file] object represents an open file in the ** [sqlite3_vfs | OS interface layer]. Individual OS interface @@ -1054,7 +1053,7 @@ struct sqlite3_file { }; /* -** CAPI3REF: OS Interface File Virtual Methods Object {H11120} +** CAPI3REF: OS Interface File Virtual Methods Object ** ** Every file opened by the [sqlite3_vfs] xOpen method populates an ** [sqlite3_file] object (or, more commonly, a subclass of the @@ -1159,7 +1158,7 @@ struct sqlite3_io_methods { }; /* -** CAPI3REF: Standard File Control Opcodes {H11310} +** CAPI3REF: Standard File Control Opcodes ** ** These integer constants are opcodes for the xFileControl method ** of the [sqlite3_io_methods] object and for the [sqlite3_file_control()] @@ -1179,7 +1178,7 @@ struct sqlite3_io_methods { #define SQLITE_LAST_ERRNO 4 /* -** CAPI3REF: Mutex Handle {H17110} +** CAPI3REF: Mutex Handle ** ** The mutex module within SQLite defines [sqlite3_mutex] to be an ** abstract type for a mutex object. The SQLite core never looks @@ -1191,7 +1190,7 @@ struct sqlite3_io_methods { typedef struct sqlite3_mutex sqlite3_mutex; /* -** CAPI3REF: OS Interface Object {H11140} +** CAPI3REF: OS Interface Object ** ** An instance of the sqlite3_vfs object defines the interface between ** the SQLite core and the underlying operating system. The "vfs" @@ -1345,10 +1344,10 @@ struct sqlite3_vfs { }; /* -** CAPI3REF: Flags for the xAccess VFS method {H11190} +** CAPI3REF: Flags for the xAccess VFS method ** ** These integer constants can be used as the third parameter to -** the xAccess method of an [sqlite3_vfs] object. {END} They determine +** the xAccess method of an [sqlite3_vfs] object. They determine ** what kind of permissions the xAccess method is looking for. ** With SQLITE_ACCESS_EXISTS, the xAccess method ** simply checks whether the file exists. @@ -1362,39 +1361,48 @@ struct sqlite3_vfs { #define SQLITE_ACCESS_READ 2 /* -** CAPI3REF: Initialize The SQLite Library {H10130} +** CAPI3REF: Initialize The SQLite Library ** -** The sqlite3_initialize() routine initializes the -** SQLite library. The sqlite3_shutdown() routine +** ^The sqlite3_initialize() routine initializes the +** SQLite library. ^The sqlite3_shutdown() routine ** deallocates any resources that were allocated by sqlite3_initialize(). +** These routines are designed to aid in process initialization and +** shutdown on embedded systems. Workstation applications using +** SQLite normally do not need to invoke either of these routines. ** ** A call to sqlite3_initialize() is an "effective" call if it is ** the first time sqlite3_initialize() is invoked during the lifetime of ** the process, or if it is the first time sqlite3_initialize() is invoked -** following a call to sqlite3_shutdown(). Only an effective call +** following a call to sqlite3_shutdown(). ^(Only an effective call ** of sqlite3_initialize() does any initialization. All other calls -** are harmless no-ops. +** are harmless no-ops.)^ ** ** A call to sqlite3_shutdown() is an "effective" call if it is the first -** call to sqlite3_shutdown() since the last sqlite3_initialize(). Only +** call to sqlite3_shutdown() since the last sqlite3_initialize(). ^(Only ** an effective call to sqlite3_shutdown() does any deinitialization. -** All other calls to sqlite3_shutdown() are harmless no-ops. +** All other valid calls to sqlite3_shutdown() are harmless no-ops.)^ +** +** The sqlite3_initialize() interface is threadsafe, but sqlite3_shutdown() +** is not. The sqlite3_shutdown() interface must only be called from a +** single thread. All open [database connections] must be closed and all +** other SQLite resources must be deallocated prior to invoking +** sqlite3_shutdown(). ** -** Among other things, sqlite3_initialize() shall invoke -** sqlite3_os_init(). Similarly, sqlite3_shutdown() -** shall invoke sqlite3_os_end(). +** Among other things, ^sqlite3_initialize() will invoke +** sqlite3_os_init(). Similarly, ^sqlite3_shutdown() +** will invoke sqlite3_os_end(). ** -** The sqlite3_initialize() routine returns [SQLITE_OK] on success. -** If for some reason, sqlite3_initialize() is unable to initialize +** ^The sqlite3_initialize() routine returns [SQLITE_OK] on success. +** ^If for some reason, sqlite3_initialize() is unable to initialize ** the library (perhaps it is unable to allocate a needed resource such ** as a mutex) it returns an [error code] other than [SQLITE_OK]. ** -** The sqlite3_initialize() routine is called internally by many other +** ^The sqlite3_initialize() routine is called internally by many other ** SQLite interfaces so that an application usually does not need to ** invoke sqlite3_initialize() directly. For example, [sqlite3_open()] ** calls sqlite3_initialize() so the SQLite library will be automatically ** initialized when [sqlite3_open()] is called if it has not be initialized -** already. However, if SQLite is compiled with the [SQLITE_OMIT_AUTOINIT] +** already. ^However, if SQLite is compiled with the [SQLITE_OMIT_AUTOINIT] ** compile-time option, then the automatic calls to sqlite3_initialize() ** are omitted and the application must call sqlite3_initialize() directly ** prior to using any other SQLite interface. For maximum portability, @@ -1433,7 +1441,7 @@ SQLITE_API int sqlite3_os_init(void); SQLITE_API int sqlite3_os_end(void); /* -** CAPI3REF: Configuring The SQLite Library {H14100} +** CAPI3REF: Configuring The SQLite Library ** EXPERIMENTAL ** ** The sqlite3_config() interface is used to make global configuration @@ -1447,7 +1455,9 @@ SQLITE_API int sqlite3_os_end(void); ** threads while sqlite3_config() is running. Furthermore, sqlite3_config() ** may only be invoked prior to library initialization using ** [sqlite3_initialize()] or after shutdown by [sqlite3_shutdown()]. -** Note, however, that sqlite3_config() can be called as part of the +** ^If sqlite3_config() is called after [sqlite3_initialize()] and before +** [sqlite3_shutdown()] then it will return SQLITE_MISUSE. +** Note, however, that ^sqlite3_config() can be called as part of the ** implementation of an application-defined [sqlite3_os_init()]. ** ** The first argument to sqlite3_config() is an integer @@ -1456,26 +1466,21 @@ SQLITE_API int sqlite3_os_end(void); ** vary depending on the [SQLITE_CONFIG_SINGLETHREAD | configuration option] ** in the first argument. ** -** When a configuration option is set, sqlite3_config() returns [SQLITE_OK]. -** If the option is unknown or SQLite is unable to set the option +** ^When a configuration option is set, sqlite3_config() returns [SQLITE_OK]. +** ^If the option is unknown or SQLite is unable to set the option ** then this routine returns a non-zero [error code]. -** -** Requirements: -** [H14103] [H14106] [H14120] [H14123] [H14126] [H14129] [H14132] [H14135] -** [H14138] [H14141] [H14144] [H14147] [H14150] [H14153] [H14156] [H14159] -** [H14162] [H14165] [H14168] */ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_config(int, ...); /* -** CAPI3REF: Configure database connections {H14200} +** CAPI3REF: Configure database connections ** EXPERIMENTAL ** ** The sqlite3_db_config() interface is used to make configuration ** changes to a [database connection]. The interface is similar to ** [sqlite3_config()] except that the changes apply to a single ** [database connection] (specified in the first argument). The -** sqlite3_db_config() interface can only be used immediately after +** sqlite3_db_config() interface should only be used immediately after ** the database connection is created using [sqlite3_open()], ** [sqlite3_open16()], or [sqlite3_open_v2()]. ** @@ -1486,13 +1491,13 @@ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_config(int, ...); ** New verbs are likely to be added in future releases of SQLite. ** Additional arguments depend on the verb. ** -** Requirements: -** [H14203] [H14206] [H14209] [H14212] [H14215] +** ^Calls to sqlite3_db_config() return SQLITE_OK if and only if +** the call is considered successful. */ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_db_config(sqlite3*, int op, ...); /* -** CAPI3REF: Memory Allocation Routines {H10155} +** CAPI3REF: Memory Allocation Routines ** EXPERIMENTAL ** ** An instance of this object defines the interface between SQLite @@ -1522,7 +1527,7 @@ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_db_config(sqlite3*, int op, ...); ** The xRealloc method must work like realloc() from the standard C library ** with the exception that if the second argument to xRealloc is zero, ** xRealloc must be a no-op - it must not perform any allocation or -** deallocation. SQLite guaranteeds that the second argument to +** deallocation. ^SQLite guarantees that the second argument to ** xRealloc is always a value returned by a prior call to xRoundup. ** And so in cases where xRoundup always returns a positive number, ** xRealloc can perform exactly as the standard library realloc() and @@ -1574,7 +1579,7 @@ struct sqlite3_mem_methods { }; /* -** CAPI3REF: Configuration Options {H10160} +** CAPI3REF: Configuration Options ** EXPERIMENTAL ** ** These constants are the available integer configuration options that @@ -1589,22 +1594,33 @@ struct sqlite3_mem_methods { ** **
**
SQLITE_CONFIG_SINGLETHREAD
-**
There are no arguments to this option. This option disables +**
There are no arguments to this option. ^This option sets the +** [threading mode] to Single-thread. In other words, it disables ** all mutexing and puts SQLite into a mode where it can only be used -** by a single thread.
+** by a single thread. ^If SQLite is compiled with +** the [SQLITE_THREADSAFE | SQLITE_THREADSAFE=0] compile-time option then +** it is not possible to change the [threading mode] from its default +** value of Single-thread and so [sqlite3_config()] will return +** [SQLITE_ERROR] if called with the SQLITE_CONFIG_SINGLETHREAD +** configuration option. ** **
SQLITE_CONFIG_MULTITHREAD
-**
There are no arguments to this option. This option disables +**
There are no arguments to this option. ^This option sets the +** [threading mode] to Multi-thread. In other words, it disables ** mutexing on [database connection] and [prepared statement] objects. ** The application is responsible for serializing access to ** [database connections] and [prepared statements]. But other mutexes ** are enabled so that SQLite will be safe to use in a multi-threaded ** environment as long as no two threads attempt to use the same -** [database connection] at the same time. See the [threading mode] -** documentation for additional information.
+** [database connection] at the same time. ^If SQLite is compiled with +** the [SQLITE_THREADSAFE | SQLITE_THREADSAFE=0] compile-time option then +** it is not possible to set the Multi-thread [threading mode] and +** [sqlite3_config()] will return [SQLITE_ERROR] if called with the +** SQLITE_CONFIG_MULTITHREAD configuration option. ** **
SQLITE_CONFIG_SERIALIZED
-**
There are no arguments to this option. This option enables +**
There are no arguments to this option. ^This option sets the +** [threading mode] to Serialized. In other words, this option enables ** all mutexes including the recursive ** mutexes on [database connection] and [prepared statement] objects. ** In this mode (which is the default when SQLite is compiled with @@ -1612,55 +1628,63 @@ struct sqlite3_mem_methods { ** to [database connections] and [prepared statements] so that the ** application is free to use the same [database connection] or the ** same [prepared statement] in different threads at the same time. -** See the [threading mode] documentation for additional information.
+** ^If SQLite is compiled with +** the [SQLITE_THREADSAFE | SQLITE_THREADSAFE=0] compile-time option then +** it is not possible to set the Serialized [threading mode] and +** [sqlite3_config()] will return [SQLITE_ERROR] if called with the +** SQLITE_CONFIG_SERIALIZED configuration option. ** **
SQLITE_CONFIG_MALLOC
-**
This option takes a single argument which is a pointer to an +**
^(This option takes a single argument which is a pointer to an ** instance of the [sqlite3_mem_methods] structure. The argument specifies ** alternative low-level memory allocation routines to be used in place of -** the memory allocation routines built into SQLite.
+** the memory allocation routines built into SQLite.)^ ^SQLite makes +** its own private copy of the content of the [sqlite3_mem_methods] structure +** before the [sqlite3_config()] call returns. ** **
SQLITE_CONFIG_GETMALLOC
-**
This option takes a single argument which is a pointer to an +**
^(This option takes a single argument which is a pointer to an ** instance of the [sqlite3_mem_methods] structure. The [sqlite3_mem_methods] -** structure is filled with the currently defined memory allocation routines. +** structure is filled with the currently defined memory allocation routines.)^ ** This option can be used to overload the default memory allocation ** routines with a wrapper that simulations memory allocation failure or -** tracks memory usage, for example.
+** tracks memory usage, for example. ** **
SQLITE_CONFIG_MEMSTATUS
-**
This option takes single argument of type int, interpreted as a +**
^This option takes single argument of type int, interpreted as a ** boolean, which enables or disables the collection of memory allocation -** statistics. When disabled, the following SQLite interfaces become -** non-operational: +** statistics. ^(When memory allocation statistics are disabled, the +** following SQLite interfaces become non-operational: **
    **
  • [sqlite3_memory_used()] **
  • [sqlite3_memory_highwater()] **
  • [sqlite3_soft_heap_limit()] **
  • [sqlite3_status()] -**
+** )^ +** ^Memory allocation statistics are enabled by default unless SQLite is +** compiled with [SQLITE_DEFAULT_MEMSTATUS]=0 in which case memory +** allocation statistics are disabled by default. **
** **
SQLITE_CONFIG_SCRATCH
-**
This option specifies a static memory buffer that SQLite can use for +**
^This option specifies a static memory buffer that SQLite can use for ** scratch memory. There are three arguments: A pointer an 8-byte ** aligned memory buffer from which the scrach allocations will be ** drawn, the size of each scratch allocation (sz), ** and the maximum number of scratch allocations (N). The sz ** argument must be a multiple of 16. The sz parameter should be a few bytes ** larger than the actual scratch space required due to internal overhead. -** The first argument should pointer to an 8-byte aligned buffer +** The first argument must be a pointer to an 8-byte aligned buffer ** of at least sz*N bytes of memory. -** SQLite will use no more than one scratch buffer at once per thread, so -** N should be set to the expected maximum number of threads. The sz -** parameter should be 6 times the size of the largest database page size. -** Scratch buffers are used as part of the btree balance operation. If -** The btree balancer needs additional memory beyond what is provided by -** scratch buffers or if no scratch buffer space is specified, then SQLite -** goes to [sqlite3_malloc()] to obtain the memory it needs.
+** ^SQLite will use no more than one scratch buffer per thread. So +** N should be set to the expected maximum number of threads. ^SQLite will +** never require a scratch buffer that is more than 6 times the database +** page size. ^If SQLite needs needs additional scratch memory beyond +** what is provided by this configuration option, then +** [sqlite3_malloc()] will be used to obtain the memory needed. ** **
SQLITE_CONFIG_PAGECACHE
-**
This option specifies a static memory buffer that SQLite can use for +**
^This option specifies a static memory buffer that SQLite can use for ** the database page cache with the default page cache implemenation. ** This configuration should not be used if an application-define page ** cache implementation is loaded using the SQLITE_CONFIG_PCACHE option. @@ -1668,28 +1692,28 @@ struct sqlite3_mem_methods { ** memory, the size of each page buffer (sz), and the number of pages (N). ** The sz argument should be the size of the largest database page ** (a power of two between 512 and 32768) plus a little extra for each -** page header. The page header size is 20 to 40 bytes depending on -** the host architecture. It is harmless, apart from the wasted memory, +** page header. ^The page header size is 20 to 40 bytes depending on +** the host architecture. ^It is harmless, apart from the wasted memory, ** to make sz a little too large. The first ** argument should point to an allocation of at least sz*N bytes of memory. -** SQLite will use the memory provided by the first argument to satisfy its -** memory needs for the first N pages that it adds to cache. If additional +** ^SQLite will use the memory provided by the first argument to satisfy its +** memory needs for the first N pages that it adds to cache. ^If additional ** page cache memory is needed beyond what is provided by this option, then ** SQLite goes to [sqlite3_malloc()] for the additional storage space. -** The implementation might use one or more of the N buffers to hold +** ^The implementation might use one or more of the N buffers to hold ** memory accounting information. The pointer in the first argument must ** be aligned to an 8-byte boundary or subsequent behavior of SQLite ** will be undefined.
** **
SQLITE_CONFIG_HEAP
-**
This option specifies a static memory buffer that SQLite will use +**
^This option specifies a static memory buffer that SQLite will use ** for all of its dynamic memory allocation needs beyond those provided ** for by [SQLITE_CONFIG_SCRATCH] and [SQLITE_CONFIG_PAGECACHE]. ** There are three arguments: An 8-byte aligned pointer to the memory, ** the number of bytes in the memory buffer, and the minimum allocation size. -** If the first pointer (the memory pointer) is NULL, then SQLite reverts +** ^If the first pointer (the memory pointer) is NULL, then SQLite reverts ** to using its default memory allocator (the system malloc() implementation), -** undoing any prior invocation of [SQLITE_CONFIG_MALLOC]. If the +** undoing any prior invocation of [SQLITE_CONFIG_MALLOC]. ^If the ** memory pointer is not NULL and either [SQLITE_ENABLE_MEMSYS3] or ** [SQLITE_ENABLE_MEMSYS5] are defined, then the alternative memory ** allocator is engaged to handle all of SQLites memory allocation needs. @@ -1697,39 +1721,50 @@ struct sqlite3_mem_methods { ** boundary or subsequent behavior of SQLite will be undefined.
** **
SQLITE_CONFIG_MUTEX
-**
This option takes a single argument which is a pointer to an +**
^(This option takes a single argument which is a pointer to an ** instance of the [sqlite3_mutex_methods] structure. The argument specifies ** alternative low-level mutex routines to be used in place -** the mutex routines built into SQLite.
+** the mutex routines built into SQLite.)^ ^SQLite makes a copy of the +** content of the [sqlite3_mutex_methods] structure before the call to +** [sqlite3_config()] returns. ^If SQLite is compiled with +** the [SQLITE_THREADSAFE | SQLITE_THREADSAFE=0] compile-time option then +** the entire mutexing subsystem is omitted from the build and hence calls to +** [sqlite3_config()] with the SQLITE_CONFIG_MUTEX configuration option will +** return [SQLITE_ERROR]. ** **
SQLITE_CONFIG_GETMUTEX
-**
This option takes a single argument which is a pointer to an +**
^(This option takes a single argument which is a pointer to an ** instance of the [sqlite3_mutex_methods] structure. The ** [sqlite3_mutex_methods] -** structure is filled with the currently defined mutex routines. +** structure is filled with the currently defined mutex routines.)^ ** This option can be used to overload the default mutex allocation ** routines with a wrapper used to track mutex usage for performance -** profiling or testing, for example.
+** profiling or testing, for example. ^If SQLite is compiled with +** the [SQLITE_THREADSAFE | SQLITE_THREADSAFE=0] compile-time option then +** the entire mutexing subsystem is omitted from the build and hence calls to +** [sqlite3_config()] with the SQLITE_CONFIG_GETMUTEX configuration option will +** return [SQLITE_ERROR]. ** **
SQLITE_CONFIG_LOOKASIDE
-**
This option takes two arguments that determine the default -** memory allocation lookaside optimization. The first argument is the +**
^(This option takes two arguments that determine the default +** memory allocation for the lookaside memory allocator on each +** [database connection]. The first argument is the ** size of each lookaside buffer slot and the second is the number of -** slots allocated to each database connection. This option sets the -** default lookaside size. The [SQLITE_DBCONFIG_LOOKASIDE] +** slots allocated to each database connection.)^ ^(This option sets the +** default lookaside size. The [SQLITE_DBCONFIG_LOOKASIDE] ** verb to [sqlite3_db_config()] can be used to change the lookaside -** configuration on individual connections.
+** configuration on individual connections.)^ ** **
SQLITE_CONFIG_PCACHE
-**
This option takes a single argument which is a pointer to +**
^(This option takes a single argument which is a pointer to ** an [sqlite3_pcache_methods] object. This object specifies the interface -** to a custom page cache implementation. SQLite makes a copy of the +** to a custom page cache implementation.)^ ^SQLite makes a copy of the ** object and uses it for page cache memory allocations.
** **
SQLITE_CONFIG_GETPCACHE
-**
This option takes a single argument which is a pointer to an +**
^(This option takes a single argument which is a pointer to an ** [sqlite3_pcache_methods] object. SQLite copies of the current -** page cache implementation into that object.
+** page cache implementation into that object.)^ ** **
*/ @@ -1750,7 +1785,7 @@ struct sqlite3_mem_methods { #define SQLITE_CONFIG_GETPCACHE 15 /* sqlite3_pcache_methods* */ /* -** CAPI3REF: Configuration Options {H10170} +** CAPI3REF: Configuration Options ** EXPERIMENTAL ** ** These constants are the available integer configuration options that @@ -1759,23 +1794,25 @@ struct sqlite3_mem_methods { ** New configuration options may be added in future releases of SQLite. ** Existing configuration options might be discontinued. Applications ** should check the return code from [sqlite3_db_config()] to make sure that -** the call worked. The [sqlite3_db_config()] interface will return a +** the call worked. ^The [sqlite3_db_config()] interface will return a ** non-zero [error code] if a discontinued or unsupported configuration option ** is invoked. ** **
**
SQLITE_DBCONFIG_LOOKASIDE
-**
This option takes three additional arguments that determine the +**
^This option takes three additional arguments that determine the ** [lookaside memory allocator] configuration for the [database connection]. -** The first argument (the third parameter to [sqlite3_db_config()] is a +** ^The first argument (the third parameter to [sqlite3_db_config()] is a ** pointer to an memory buffer to use for lookaside memory. -** The first argument may be NULL in which case SQLite will allocate the -** lookaside buffer itself using [sqlite3_malloc()]. The second argument is the -** size of each lookaside buffer slot and the third argument is the number of +** ^The first argument after the SQLITE_DBCONFIG_LOOKASIDE verb +** may be NULL in which case SQLite will allocate the +** lookaside buffer itself using [sqlite3_malloc()]. ^The second argument is the +** size of each lookaside buffer slot. ^The third argument is the number of ** slots. The size of the buffer in the first argument must be greater than ** or equal to the product of the second and third arguments. The buffer -** must be aligned to an 8-byte boundary. If the second argument is not -** a multiple of 8, it is internally rounded down to the next smaller +** must be aligned to an 8-byte boundary. ^If the second argument to +** SQLITE_DBCONFIG_LOOKASIDE is not a multiple of 8, it is internally +** rounded down to the next smaller ** multiple of 8. See also: [SQLITE_CONFIG_LOOKASIDE]
** **
@@ -1784,52 +1821,49 @@ struct sqlite3_mem_methods { /* -** CAPI3REF: Enable Or Disable Extended Result Codes {H12200} -** -** The sqlite3_extended_result_codes() routine enables or disables the -** [extended result codes] feature of SQLite. The extended result -** codes are disabled by default for historical compatibility considerations. +** CAPI3REF: Enable Or Disable Extended Result Codes ** -** Requirements: -** [H12201] [H12202] +** ^The sqlite3_extended_result_codes() routine enables or disables the +** [extended result codes] feature of SQLite. ^The extended result +** codes are disabled by default for historical compatibility. */ SQLITE_API int sqlite3_extended_result_codes(sqlite3*, int onoff); /* -** CAPI3REF: Last Insert Rowid {H12220} +** CAPI3REF: Last Insert Rowid ** -** Each entry in an SQLite table has a unique 64-bit signed -** integer key called the [ROWID | "rowid"]. The rowid is always available +** ^Each entry in an SQLite table has a unique 64-bit signed +** integer key called the [ROWID | "rowid"]. ^The rowid is always available ** as an undeclared column named ROWID, OID, or _ROWID_ as long as those -** names are not also used by explicitly declared columns. If +** names are not also used by explicitly declared columns. ^If ** the table has a column of type [INTEGER PRIMARY KEY] then that column ** is another alias for the rowid. ** -** This routine returns the [rowid] of the most recent +** ^This routine returns the [rowid] of the most recent ** successful [INSERT] into the database from the [database connection] -** in the first argument. If no successful [INSERT]s +** in the first argument. ^If no successful [INSERT]s ** have ever occurred on that database connection, zero is returned. ** -** If an [INSERT] occurs within a trigger, then the [rowid] of the inserted +** ^(If an [INSERT] occurs within a trigger, then the [rowid] of the inserted ** row is returned by this routine as long as the trigger is running. ** But once the trigger terminates, the value returned by this routine -** reverts to the last value inserted before the trigger fired. +** reverts to the last value inserted before the trigger fired.)^ ** -** An [INSERT] that fails due to a constraint violation is not a +** ^An [INSERT] that fails due to a constraint violation is not a ** successful [INSERT] and does not change the value returned by this -** routine. Thus INSERT OR FAIL, INSERT OR IGNORE, INSERT OR ROLLBACK, +** routine. ^Thus INSERT OR FAIL, INSERT OR IGNORE, INSERT OR ROLLBACK, ** and INSERT OR ABORT make no changes to the return value of this -** routine when their insertion fails. When INSERT OR REPLACE +** routine when their insertion fails. ^(When INSERT OR REPLACE ** encounters a constraint violation, it does not fail. The ** INSERT continues to completion after deleting rows that caused ** the constraint problem so INSERT OR REPLACE will always change -** the return value of this interface. +** the return value of this interface.)^ ** -** For the purposes of this routine, an [INSERT] is considered to +** ^For the purposes of this routine, an [INSERT] is considered to ** be successful even if it is subsequently rolled back. ** -** Requirements: -** [H12221] [H12223] +** This function is accessible to SQL statements via the +** [last_insert_rowid() SQL function]. ** ** If a separate thread performs a new [INSERT] on the same ** database connection while the [sqlite3_last_insert_rowid()] @@ -1841,25 +1875,25 @@ SQLITE_API int sqlite3_extended_result_codes(sqlite3*, int onoff); SQLITE_API sqlite3_int64 sqlite3_last_insert_rowid(sqlite3*); /* -** CAPI3REF: Count The Number Of Rows Modified {H12240} +** CAPI3REF: Count The Number Of Rows Modified ** -** This function returns the number of database rows that were changed +** ^This function returns the number of database rows that were changed ** or inserted or deleted by the most recently completed SQL statement ** on the [database connection] specified by the first parameter. -** Only changes that are directly specified by the [INSERT], [UPDATE], +** ^(Only changes that are directly specified by the [INSERT], [UPDATE], ** or [DELETE] statement are counted. Auxiliary changes caused by -** triggers or [foreign key actions] are not counted. Use the +** triggers or [foreign key actions] are not counted.)^ Use the ** [sqlite3_total_changes()] function to find the total number of changes ** including changes caused by triggers and foreign key actions. ** -** Changes to a view that are simulated by an [INSTEAD OF trigger] +** ^Changes to a view that are simulated by an [INSTEAD OF trigger] ** are not counted. Only real table changes are counted. ** -** A "row change" is a change to a single row of a single table +** ^(A "row change" is a change to a single row of a single table ** caused by an INSERT, DELETE, or UPDATE statement. Rows that ** are changed as side effects of [REPLACE] constraint resolution, ** rollback, ABORT processing, [DROP TABLE], or by any other -** mechanisms do not count as direct row changes. +** mechanisms do not count as direct row changes.)^ ** ** A "trigger context" is a scope of execution that begins and ** ends with the script of a [CREATE TRIGGER | trigger]. @@ -1869,27 +1903,24 @@ SQLITE_API sqlite3_int64 sqlite3_last_insert_rowid(sqlite3*); ** new trigger context is entered for the duration of that one ** trigger. Subtriggers create subcontexts for their duration. ** -** Calling [sqlite3_exec()] or [sqlite3_step()] recursively does +** ^Calling [sqlite3_exec()] or [sqlite3_step()] recursively does ** not create a new trigger context. ** -** This function returns the number of direct row changes in the +** ^This function returns the number of direct row changes in the ** most recent INSERT, UPDATE, or DELETE statement within the same ** trigger context. ** -** Thus, when called from the top level, this function returns the +** ^Thus, when called from the top level, this function returns the ** number of changes in the most recent INSERT, UPDATE, or DELETE -** that also occurred at the top level. Within the body of a trigger, +** that also occurred at the top level. ^(Within the body of a trigger, ** the sqlite3_changes() interface can be called to find the number of ** changes in the most recently completed INSERT, UPDATE, or DELETE ** statement within the body of the same trigger. ** However, the number returned does not include changes -** caused by subtriggers since those have their own context. +** caused by subtriggers since those have their own context.)^ ** -** See also the [sqlite3_total_changes()] interface and the -** [count_changes pragma]. -** -** Requirements: -** [H12241] [H12243] +** See also the [sqlite3_total_changes()] interface, the +** [count_changes pragma], and the [changes() SQL function]. ** ** If a separate thread makes changes on the same database connection ** while [sqlite3_changes()] is running then the value returned @@ -1898,26 +1929,24 @@ SQLITE_API sqlite3_int64 sqlite3_last_insert_rowid(sqlite3*); SQLITE_API int sqlite3_changes(sqlite3*); /* -** CAPI3REF: Total Number Of Rows Modified {H12260} +** CAPI3REF: Total Number Of Rows Modified ** -** This function returns the number of row changes caused by [INSERT], +** ^This function returns the number of row changes caused by [INSERT], ** [UPDATE] or [DELETE] statements since the [database connection] was opened. -** The count includes all changes from all [CREATE TRIGGER | trigger] -** contexts and changes made by [foreign key actions]. However, +** ^(The count returned by sqlite3_total_changes() includes all changes +** from all [CREATE TRIGGER | trigger] contexts and changes made by +** [foreign key actions]. However, ** the count does not include changes used to implement [REPLACE] constraints, ** do rollbacks or ABORT processing, or [DROP TABLE] processing. The ** count does not include rows of views that fire an [INSTEAD OF trigger], ** though if the INSTEAD OF trigger makes changes of its own, those changes -** are counted. -** The changes are counted as soon as the statement that makes them is -** completed (when the statement handle is passed to [sqlite3_reset()] or -** [sqlite3_finalize()]). -** -** See also the [sqlite3_changes()] interface and the -** [count_changes pragma]. +** are counted.)^ +** ^The sqlite3_total_changes() function counts the changes as soon as +** the statement that makes them is completed (when the statement handle +** is passed to [sqlite3_reset()] or [sqlite3_finalize()]). ** -** Requirements: -** [H12261] [H12263] +** See also the [sqlite3_changes()] interface, the +** [count_changes pragma], and the [total_changes() SQL function]. ** ** If a separate thread makes changes on the same database connection ** while [sqlite3_total_changes()] is running then the value @@ -1926,75 +1955,70 @@ SQLITE_API int sqlite3_changes(sqlite3*); SQLITE_API int sqlite3_total_changes(sqlite3*); /* -** CAPI3REF: Interrupt A Long-Running Query {H12270} +** CAPI3REF: Interrupt A Long-Running Query ** -** This function causes any pending database operation to abort and +** ^This function causes any pending database operation to abort and ** return at its earliest opportunity. This routine is typically ** called in response to a user action such as pressing "Cancel" ** or Ctrl-C where the user wants a long query operation to halt ** immediately. ** -** It is safe to call this routine from a thread different from the +** ^It is safe to call this routine from a thread different from the ** thread that is currently running the database operation. But it ** is not safe to call this routine with a [database connection] that ** is closed or might close before sqlite3_interrupt() returns. ** -** If an SQL operation is very nearly finished at the time when +** ^If an SQL operation is very nearly finished at the time when ** sqlite3_interrupt() is called, then it might not have an opportunity ** to be interrupted and might continue to completion. ** -** An SQL operation that is interrupted will return [SQLITE_INTERRUPT]. -** If the interrupted SQL operation is an INSERT, UPDATE, or DELETE +** ^An SQL operation that is interrupted will return [SQLITE_INTERRUPT]. +** ^If the interrupted SQL operation is an INSERT, UPDATE, or DELETE ** that is inside an explicit transaction, then the entire transaction ** will be rolled back automatically. ** -** The sqlite3_interrupt(D) call is in effect until all currently running -** SQL statements on [database connection] D complete. Any new SQL statements +** ^The sqlite3_interrupt(D) call is in effect until all currently running +** SQL statements on [database connection] D complete. ^Any new SQL statements ** that are started after the sqlite3_interrupt() call and before the ** running statements reaches zero are interrupted as if they had been -** running prior to the sqlite3_interrupt() call. New SQL statements +** running prior to the sqlite3_interrupt() call. ^New SQL statements ** that are started after the running statement count reaches zero are ** not effected by the sqlite3_interrupt(). -** A call to sqlite3_interrupt(D) that occurs when there are no running +** ^A call to sqlite3_interrupt(D) that occurs when there are no running ** SQL statements is a no-op and has no effect on SQL statements ** that are started after the sqlite3_interrupt() call returns. ** -** Requirements: -** [H12271] [H12272] -** ** If the database connection closes while [sqlite3_interrupt()] ** is running then bad things will likely happen. */ SQLITE_API void sqlite3_interrupt(sqlite3*); /* -** CAPI3REF: Determine If An SQL Statement Is Complete {H10510} +** CAPI3REF: Determine If An SQL Statement Is Complete ** ** These routines are useful during command-line input to determine if the ** currently entered text seems to form a complete SQL statement or ** if additional input is needed before sending the text into -** SQLite for parsing. These routines return 1 if the input string -** appears to be a complete SQL statement. A statement is judged to be +** SQLite for parsing. ^These routines return 1 if the input string +** appears to be a complete SQL statement. ^A statement is judged to be ** complete if it ends with a semicolon token and is not a prefix of a -** well-formed CREATE TRIGGER statement. Semicolons that are embedded within +** well-formed CREATE TRIGGER statement. ^Semicolons that are embedded within ** string literals or quoted identifier names or comments are not ** independent tokens (they are part of the token in which they are -** embedded) and thus do not count as a statement terminator. Whitespace +** embedded) and thus do not count as a statement terminator. ^Whitespace ** and comments that follow the final semicolon are ignored. ** -** These routines return 0 if the statement is incomplete. If a +** ^These routines return 0 if the statement is incomplete. ^If a ** memory allocation fails, then SQLITE_NOMEM is returned. ** -** These routines do not parse the SQL statements thus +** ^These routines do not parse the SQL statements thus ** will not detect syntactically incorrect SQL. ** -** If SQLite has not been initialized using [sqlite3_initialize()] prior +** ^(If SQLite has not been initialized using [sqlite3_initialize()] prior ** to invoking sqlite3_complete16() then sqlite3_initialize() is invoked ** automatically by sqlite3_complete16(). If that initialization fails, ** then the return value from sqlite3_complete16() will be non-zero -** regardless of whether or not the input SQL is complete. -** -** Requirements: [H10511] [H10512] +** regardless of whether or not the input SQL is complete.)^ ** ** The input to [sqlite3_complete()] must be a zero-terminated ** UTF-8 string. @@ -2006,27 +2030,27 @@ SQLITE_API int sqlite3_complete(const char *sql); SQLITE_API int sqlite3_complete16(const void *sql); /* -** CAPI3REF: Register A Callback To Handle SQLITE_BUSY Errors {H12310} +** CAPI3REF: Register A Callback To Handle SQLITE_BUSY Errors ** -** This routine sets a callback function that might be invoked whenever +** ^This routine sets a callback function that might be invoked whenever ** an attempt is made to open a database table that another thread ** or process has locked. ** -** If the busy callback is NULL, then [SQLITE_BUSY] or [SQLITE_IOERR_BLOCKED] -** is returned immediately upon encountering the lock. If the busy callback -** is not NULL, then the callback will be invoked with two arguments. +** ^If the busy callback is NULL, then [SQLITE_BUSY] or [SQLITE_IOERR_BLOCKED] +** is returned immediately upon encountering the lock. ^If the busy callback +** is not NULL, then the callback might be invoked with two arguments. ** -** The first argument to the handler is a copy of the void* pointer which -** is the third argument to sqlite3_busy_handler(). The second argument to -** the handler callback is the number of times that the busy handler has -** been invoked for this locking event. If the +** ^The first argument to the busy handler is a copy of the void* pointer which +** is the third argument to sqlite3_busy_handler(). ^The second argument to +** the busy handler callback is the number of times that the busy handler has +** been invoked for this locking event. ^If the ** busy callback returns 0, then no additional attempts are made to ** access the database and [SQLITE_BUSY] or [SQLITE_IOERR_BLOCKED] is returned. -** If the callback returns non-zero, then another attempt +** ^If the callback returns non-zero, then another attempt ** is made to open the database for reading and the cycle repeats. ** ** The presence of a busy handler does not guarantee that it will be invoked -** when there is lock contention. If SQLite determines that invoking the busy +** when there is lock contention. ^If SQLite determines that invoking the busy ** handler could result in a deadlock, it will go ahead and return [SQLITE_BUSY] ** or [SQLITE_IOERR_BLOCKED] instead of invoking the busy handler. ** Consider a scenario where one process is holding a read lock that @@ -2040,65 +2064,59 @@ SQLITE_API int sqlite3_complete16(const void *sql); ** will induce the first process to release its read lock and allow ** the second process to proceed. ** -** The default busy callback is NULL. +** ^The default busy callback is NULL. ** -** The [SQLITE_BUSY] error is converted to [SQLITE_IOERR_BLOCKED] +** ^The [SQLITE_BUSY] error is converted to [SQLITE_IOERR_BLOCKED] ** when SQLite is in the middle of a large transaction where all the ** changes will not fit into the in-memory cache. SQLite will ** already hold a RESERVED lock on the database file, but it needs ** to promote this lock to EXCLUSIVE so that it can spill cache ** pages into the database file without harm to concurrent -** readers. If it is unable to promote the lock, then the in-memory +** readers. ^If it is unable to promote the lock, then the in-memory ** cache will be left in an inconsistent state and so the error ** code is promoted from the relatively benign [SQLITE_BUSY] to -** the more severe [SQLITE_IOERR_BLOCKED]. This error code promotion +** the more severe [SQLITE_IOERR_BLOCKED]. ^This error code promotion ** forces an automatic rollback of the changes. See the ** ** CorruptionFollowingBusyError wiki page for a discussion of why ** this is important. ** -** There can only be a single busy handler defined for each +** ^(There can only be a single busy handler defined for each ** [database connection]. Setting a new busy handler clears any -** previously set handler. Note that calling [sqlite3_busy_timeout()] +** previously set handler.)^ ^Note that calling [sqlite3_busy_timeout()] ** will also set or clear the busy handler. ** ** The busy callback should not take any actions which modify the ** database connection that invoked the busy handler. Any such actions ** result in undefined behavior. ** -** Requirements: -** [H12311] [H12312] [H12314] [H12316] [H12318] -** ** A busy handler must not close the database connection ** or [prepared statement] that invoked the busy handler. */ SQLITE_API int sqlite3_busy_handler(sqlite3*, int(*)(void*,int), void*); /* -** CAPI3REF: Set A Busy Timeout {H12340} +** CAPI3REF: Set A Busy Timeout ** -** This routine sets a [sqlite3_busy_handler | busy handler] that sleeps -** for a specified amount of time when a table is locked. The handler +** ^This routine sets a [sqlite3_busy_handler | busy handler] that sleeps +** for a specified amount of time when a table is locked. ^The handler ** will sleep multiple times until at least "ms" milliseconds of sleeping -** have accumulated. {H12343} After "ms" milliseconds of sleeping, +** have accumulated. ^After at least "ms" milliseconds of sleeping, ** the handler returns 0 which causes [sqlite3_step()] to return ** [SQLITE_BUSY] or [SQLITE_IOERR_BLOCKED]. ** -** Calling this routine with an argument less than or equal to zero +** ^Calling this routine with an argument less than or equal to zero ** turns off all busy handlers. ** -** There can only be a single busy handler for a particular +** ^(There can only be a single busy handler for a particular ** [database connection] any any given moment. If another busy handler ** was defined (using [sqlite3_busy_handler()]) prior to calling -** this routine, that other busy handler is cleared. -** -** Requirements: -** [H12341] [H12343] [H12344] +** this routine, that other busy handler is cleared.)^ */ SQLITE_API int sqlite3_busy_timeout(sqlite3*, int ms); /* -** CAPI3REF: Convenience Routines For Running Queries {H12370} +** CAPI3REF: Convenience Routines For Running Queries ** ** Definition: A result table is memory data structure created by the ** [sqlite3_get_table()] interface. A result table records the @@ -2146,27 +2164,25 @@ SQLITE_API int sqlite3_busy_timeout(sqlite3*, int ms); ** azResult[7] = "21"; ** ** -** The sqlite3_get_table() function evaluates one or more +** ^The sqlite3_get_table() function evaluates one or more ** semicolon-separated SQL statements in the zero-terminated UTF-8 -** string of its 2nd parameter. It returns a result table to the +** string of its 2nd parameter and returns a result table to the ** pointer given in its 3rd parameter. ** -** After the calling function has finished using the result, it should -** pass the pointer to the result table to sqlite3_free_table() in order to +** After the application has finished with the result from sqlite3_get_table(), +** it should pass the result table pointer to sqlite3_free_table() in order to ** release the memory that was malloced. Because of the way the ** [sqlite3_malloc()] happens within sqlite3_get_table(), the calling ** function must not try to call [sqlite3_free()] directly. Only ** [sqlite3_free_table()] is able to release the memory properly and safely. ** -** The sqlite3_get_table() interface is implemented as a wrapper around +** ^(The sqlite3_get_table() interface is implemented as a wrapper around ** [sqlite3_exec()]. The sqlite3_get_table() routine does not have access ** to any internal data structures of SQLite. It uses only the public ** interface defined here. As a consequence, errors that occur in the ** wrapper layer outside of the internal [sqlite3_exec()] call are not -** reflected in subsequent calls to [sqlite3_errcode()] or [sqlite3_errmsg()]. -** -** Requirements: -** [H12371] [H12373] [H12374] [H12376] [H12379] [H12382] +** reflected in subsequent calls to [sqlite3_errcode()] or +** [sqlite3_errmsg()].)^ */ SQLITE_API int sqlite3_get_table( sqlite3 *db, /* An open database */ @@ -2179,33 +2195,33 @@ SQLITE_API int sqlite3_get_table( SQLITE_API void sqlite3_free_table(char **result); /* -** CAPI3REF: Formatted String Printing Functions {H17400} +** CAPI3REF: Formatted String Printing Functions ** ** These routines are work-alikes of the "printf()" family of functions ** from the standard C library. ** -** The sqlite3_mprintf() and sqlite3_vmprintf() routines write their +** ^The sqlite3_mprintf() and sqlite3_vmprintf() routines write their ** results into memory obtained from [sqlite3_malloc()]. ** The strings returned by these two routines should be -** released by [sqlite3_free()]. Both routines return a +** released by [sqlite3_free()]. ^Both routines return a ** NULL pointer if [sqlite3_malloc()] is unable to allocate enough ** memory to hold the resulting string. ** -** In sqlite3_snprintf() routine is similar to "snprintf()" from +** ^(In sqlite3_snprintf() routine is similar to "snprintf()" from ** the standard C library. The result is written into the ** buffer supplied as the second parameter whose size is given by ** the first parameter. Note that the order of the -** first two parameters is reversed from snprintf(). This is an +** first two parameters is reversed from snprintf().)^ This is an ** historical accident that cannot be fixed without breaking -** backwards compatibility. Note also that sqlite3_snprintf() +** backwards compatibility. ^(Note also that sqlite3_snprintf() ** returns a pointer to its buffer instead of the number of -** characters actually written into the buffer. We admit that +** characters actually written into the buffer.)^ We admit that ** the number of characters written would be a more useful return ** value but we cannot change the implementation of sqlite3_snprintf() ** now without breaking compatibility. ** -** As long as the buffer size is greater than zero, sqlite3_snprintf() -** guarantees that the buffer is always zero-terminated. The first +** ^As long as the buffer size is greater than zero, sqlite3_snprintf() +** guarantees that the buffer is always zero-terminated. ^The first ** parameter "n" is the total size of the buffer, including space for ** the zero terminator. So the longest string that can be completely ** written will be n-1 characters. @@ -2215,9 +2231,9 @@ SQLITE_API void sqlite3_free_table(char **result); ** All of the usual printf() formatting options apply. In addition, there ** is are "%q", "%Q", and "%z" options. ** -** The %q option works like %s in that it substitutes a null-terminated +** ^(The %q option works like %s in that it substitutes a null-terminated ** string from the argument list. But %q also doubles every '\'' character. -** %q is designed for use inside a string literal. By doubling each '\'' +** %q is designed for use inside a string literal.)^ By doubling each '\'' ** character it escapes that character and allows it to be inserted into ** the string. ** @@ -2252,10 +2268,10 @@ SQLITE_API void sqlite3_free_table(char **result); ** This second example is an SQL syntax error. As a general rule you should ** always use %q instead of %s when inserting text into a string literal. ** -** The %Q option works like %q except it also adds single quotes around +** ^(The %Q option works like %q except it also adds single quotes around ** the outside of the total string. Additionally, if the parameter in the ** argument list is a NULL pointer, %Q substitutes the text "NULL" (without -** single quotes) in place of the %Q option. So, for example, one could say: +** single quotes).)^ So, for example, one could say: ** **
 **  char *zSQL = sqlite3_mprintf("INSERT INTO table VALUES(%Q)", zText);
@@ -2266,35 +2282,32 @@ SQLITE_API void sqlite3_free_table(char **result);
 ** The code above will render a correct SQL statement in the zSQL
 ** variable even if the zText variable is a NULL pointer.
 **
-** The "%z" formatting option works exactly like "%s" with the
+** ^(The "%z" formatting option works like "%s" but with the
 ** addition that after the string has been read and copied into
-** the result, [sqlite3_free()] is called on the input string. {END}
-**
-** Requirements:
-** [H17403] [H17406] [H17407]
+** the result, [sqlite3_free()] is called on the input string.)^
 */
 SQLITE_API char *sqlite3_mprintf(const char*,...);
 SQLITE_API char *sqlite3_vmprintf(const char*, va_list);
 SQLITE_API char *sqlite3_snprintf(int,char*,const char*, ...);
 
 /*
-** CAPI3REF: Memory Allocation Subsystem {H17300} 
+** CAPI3REF: Memory Allocation Subsystem
 **
-** The SQLite core  uses these three routines for all of its own
+** The SQLite core uses these three routines for all of its own
 ** internal memory allocation needs. "Core" in the previous sentence
 ** does not include operating-system specific VFS implementation.  The
 ** Windows VFS uses native malloc() and free() for some operations.
 **
-** The sqlite3_malloc() routine returns a pointer to a block
+** ^The sqlite3_malloc() routine returns a pointer to a block
 ** of memory at least N bytes in length, where N is the parameter.
-** If sqlite3_malloc() is unable to obtain sufficient free
-** memory, it returns a NULL pointer.  If the parameter N to
+** ^If sqlite3_malloc() is unable to obtain sufficient free
+** memory, it returns a NULL pointer.  ^If the parameter N to
 ** sqlite3_malloc() is zero or negative then sqlite3_malloc() returns
 ** a NULL pointer.
 **
-** Calling sqlite3_free() with a pointer previously returned
+** ^Calling sqlite3_free() with a pointer previously returned
 ** by sqlite3_malloc() or sqlite3_realloc() releases that memory so
-** that it might be reused.  The sqlite3_free() routine is
+** that it might be reused.  ^The sqlite3_free() routine is
 ** a no-op if is called with a NULL pointer.  Passing a NULL pointer
 ** to sqlite3_free() is harmless.  After being freed, memory
 ** should neither be read nor written.  Even reading previously freed
@@ -2303,34 +2316,25 @@ SQLITE_API char *sqlite3_snprintf(int,char*,const char*, ...);
 ** might result if sqlite3_free() is called with a non-NULL pointer that
 ** was not obtained from sqlite3_malloc() or sqlite3_realloc().
 **
-** The sqlite3_realloc() interface attempts to resize a
+** ^(The sqlite3_realloc() interface attempts to resize a
 ** prior memory allocation to be at least N bytes, where N is the
 ** second parameter.  The memory allocation to be resized is the first
-** parameter.  If the first parameter to sqlite3_realloc()
+** parameter.)^ ^ If the first parameter to sqlite3_realloc()
 ** is a NULL pointer then its behavior is identical to calling
 ** sqlite3_malloc(N) where N is the second parameter to sqlite3_realloc().
-** If the second parameter to sqlite3_realloc() is zero or
+** ^If the second parameter to sqlite3_realloc() is zero or
 ** negative then the behavior is exactly the same as calling
 ** sqlite3_free(P) where P is the first parameter to sqlite3_realloc().
-** sqlite3_realloc() returns a pointer to a memory allocation
+** ^sqlite3_realloc() returns a pointer to a memory allocation
 ** of at least N bytes in size or NULL if sufficient memory is unavailable.
-** If M is the size of the prior allocation, then min(N,M) bytes
+** ^If M is the size of the prior allocation, then min(N,M) bytes
 ** of the prior allocation are copied into the beginning of buffer returned
 ** by sqlite3_realloc() and the prior allocation is freed.
-** If sqlite3_realloc() returns NULL, then the prior allocation
+** ^If sqlite3_realloc() returns NULL, then the prior allocation
 ** is not freed.
 **
-** The memory returned by sqlite3_malloc() and sqlite3_realloc()
-** is always aligned to at least an 8 byte boundary. {END}
-**
-** The default implementation of the memory allocation subsystem uses
-** the malloc(), realloc() and free() provided by the standard C library.
-** {H17382} However, if SQLite is compiled with the
-** SQLITE_MEMORY_SIZE=NNN C preprocessor macro (where NNN
-** is an integer), then SQLite create a static array of at least
-** NNN bytes in size and uses that array for all of its dynamic
-** memory allocation needs. {END}  Additional memory allocator options
-** may be added in future releases.
+** ^The memory returned by sqlite3_malloc() and sqlite3_realloc()
+** is always aligned to at least an 8 byte boundary.
 **
 ** In SQLite version 3.5.0 and 3.5.1, it was possible to define
 ** the SQLITE_OMIT_MEMORY_ALLOCATION which would cause the built-in
@@ -2345,10 +2349,6 @@ SQLITE_API char *sqlite3_snprintf(int,char*,const char*, ...);
 ** they are reported back as [SQLITE_CANTOPEN] or
 ** [SQLITE_IOERR] rather than [SQLITE_NOMEM].
 **
-** Requirements:
-** [H17303] [H17304] [H17305] [H17306] [H17310] [H17312] [H17315] [H17318]
-** [H17321] [H17322] [H17323]
-**
 ** The pointer arguments to [sqlite3_free()] and [sqlite3_realloc()]
 ** must be either NULL or else pointers obtained from a prior
 ** invocation of [sqlite3_malloc()] or [sqlite3_realloc()] that have
@@ -2363,20 +2363,33 @@ SQLITE_API void *sqlite3_realloc(void*, int);
 SQLITE_API void sqlite3_free(void*);
 
 /*
-** CAPI3REF: Memory Allocator Statistics {H17370} 
+** CAPI3REF: Memory Allocator Statistics
 **
 ** SQLite provides these two interfaces for reporting on the status
 ** of the [sqlite3_malloc()], [sqlite3_free()], and [sqlite3_realloc()]
 ** routines, which form the built-in memory allocation subsystem.
 **
-** Requirements:
-** [H17371] [H17373] [H17374] [H17375]
+** ^The [sqlite3_memory_used()] routine returns the number of bytes
+** of memory currently outstanding (malloced but not freed).
+** ^The [sqlite3_memory_highwater()] routine returns the maximum
+** value of [sqlite3_memory_used()] since the high-water mark
+** was last reset.  ^The values returned by [sqlite3_memory_used()] and
+** [sqlite3_memory_highwater()] include any overhead
+** added by SQLite in its implementation of [sqlite3_malloc()],
+** but not overhead added by the any underlying system library
+** routines that [sqlite3_malloc()] may call.
+**
+** ^The memory high-water mark is reset to the current value of
+** [sqlite3_memory_used()] if and only if the parameter to
+** [sqlite3_memory_highwater()] is true.  ^The value returned
+** by [sqlite3_memory_highwater(1)] is the high-water mark
+** prior to the reset.
 */
 SQLITE_API sqlite3_int64 sqlite3_memory_used(void);
 SQLITE_API sqlite3_int64 sqlite3_memory_highwater(int resetFlag);
 
 /*
-** CAPI3REF: Pseudo-Random Number Generator {H17390} 
+** CAPI3REF: Pseudo-Random Number Generator
 **
 ** SQLite contains a high-quality pseudo-random number generator (PRNG) used to
 ** select random [ROWID | ROWIDs] when inserting new records into a table that
@@ -2384,60 +2397,57 @@ SQLITE_API sqlite3_int64 sqlite3_memory_highwater(int resetFlag);
 ** the build-in random() and randomblob() SQL functions.  This interface allows
 ** applications to access the same PRNG for other purposes.
 **
-** A call to this routine stores N bytes of randomness into buffer P.
+** ^A call to this routine stores N bytes of randomness into buffer P.
 **
-** The first time this routine is invoked (either internally or by
+** ^The first time this routine is invoked (either internally or by
 ** the application) the PRNG is seeded using randomness obtained
 ** from the xRandomness method of the default [sqlite3_vfs] object.
-** On all subsequent invocations, the pseudo-randomness is generated
+** ^On all subsequent invocations, the pseudo-randomness is generated
 ** internally and without recourse to the [sqlite3_vfs] xRandomness
 ** method.
-**
-** Requirements:
-** [H17392]
 */
 SQLITE_API void sqlite3_randomness(int N, void *P);
 
 /*
-** CAPI3REF: Compile-Time Authorization Callbacks {H12500} 
+** CAPI3REF: Compile-Time Authorization Callbacks
 **
-** This routine registers a authorizer callback with a particular
+** ^This routine registers a authorizer callback with a particular
 ** [database connection], supplied in the first argument.
-** The authorizer callback is invoked as SQL statements are being compiled
+** ^The authorizer callback is invoked as SQL statements are being compiled
 ** by [sqlite3_prepare()] or its variants [sqlite3_prepare_v2()],
-** [sqlite3_prepare16()] and [sqlite3_prepare16_v2()].  At various
+** [sqlite3_prepare16()] and [sqlite3_prepare16_v2()].  ^At various
 ** points during the compilation process, as logic is being created
 ** to perform various actions, the authorizer callback is invoked to
-** see if those actions are allowed.  The authorizer callback should
+** see if those actions are allowed.  ^The authorizer callback should
 ** return [SQLITE_OK] to allow the action, [SQLITE_IGNORE] to disallow the
 ** specific action but allow the SQL statement to continue to be
 ** compiled, or [SQLITE_DENY] to cause the entire SQL statement to be
-** rejected with an error.  If the authorizer callback returns
+** rejected with an error.  ^If the authorizer callback returns
 ** any value other than [SQLITE_IGNORE], [SQLITE_OK], or [SQLITE_DENY]
 ** then the [sqlite3_prepare_v2()] or equivalent call that triggered
 ** the authorizer will fail with an error message.
 **
 ** When the callback returns [SQLITE_OK], that means the operation
-** requested is ok.  When the callback returns [SQLITE_DENY], the
+** requested is ok.  ^When the callback returns [SQLITE_DENY], the
 ** [sqlite3_prepare_v2()] or equivalent call that triggered the
 ** authorizer will fail with an error message explaining that
 ** access is denied. 
 **
-** The first parameter to the authorizer callback is a copy of the third
-** parameter to the sqlite3_set_authorizer() interface. The second parameter
+** ^The first parameter to the authorizer callback is a copy of the third
+** parameter to the sqlite3_set_authorizer() interface. ^The second parameter
 ** to the callback is an integer [SQLITE_COPY | action code] that specifies
-** the particular action to be authorized. The third through sixth parameters
+** the particular action to be authorized. ^The third through sixth parameters
 ** to the callback are zero-terminated strings that contain additional
 ** details about the action to be authorized.
 **
-** If the action code is [SQLITE_READ]
+** ^If the action code is [SQLITE_READ]
 ** and the callback returns [SQLITE_IGNORE] then the
 ** [prepared statement] statement is constructed to substitute
 ** a NULL value in place of the table column that would have
 ** been read if [SQLITE_OK] had been returned.  The [SQLITE_IGNORE]
 ** return can be used to deny an untrusted user access to individual
 ** columns of a table.
-** If the action code is [SQLITE_DELETE] and the callback returns
+** ^If the action code is [SQLITE_DELETE] and the callback returns
 ** [SQLITE_IGNORE] then the [DELETE] operation proceeds but the
 ** [truncate optimization] is disabled and all rows are deleted individually.
 **
@@ -2457,9 +2467,9 @@ SQLITE_API void sqlite3_randomness(int N, void *P);
 ** and limiting database size using the [max_page_count] [PRAGMA]
 ** in addition to using an authorizer.
 **
-** Only a single authorizer can be in place on a database connection
+** ^(Only a single authorizer can be in place on a database connection
 ** at a time.  Each call to sqlite3_set_authorizer overrides the
-** previous call.  Disable the authorizer by installing a NULL callback.
+** previous call.)^  ^Disable the authorizer by installing a NULL callback.
 ** The authorizer is disabled by default.
 **
 ** The authorizer callback must not do anything that will modify
@@ -2467,20 +2477,16 @@ SQLITE_API void sqlite3_randomness(int N, void *P);
 ** Note that [sqlite3_prepare_v2()] and [sqlite3_step()] both modify their
 ** database connections for the meaning of "modify" in this paragraph.
 **
-** When [sqlite3_prepare_v2()] is used to prepare a statement, the
+** ^When [sqlite3_prepare_v2()] is used to prepare a statement, the
 ** statement might be re-prepared during [sqlite3_step()] due to a 
 ** schema change.  Hence, the application should ensure that the
 ** correct authorizer callback remains in place during the [sqlite3_step()].
 **
-** Note that the authorizer callback is invoked only during
+** ^Note that the authorizer callback is invoked only during
 ** [sqlite3_prepare()] or its variants.  Authorization is not
 ** performed during statement evaluation in [sqlite3_step()], unless
 ** as stated in the previous paragraph, sqlite3_step() invokes
 ** sqlite3_prepare_v2() to reprepare a statement after a schema change.
-**
-** Requirements:
-** [H12501] [H12502] [H12503] [H12504] [H12505] [H12506] [H12507] [H12510]
-** [H12511] [H12512] [H12520] [H12521] [H12522]
 */
 SQLITE_API int sqlite3_set_authorizer(
   sqlite3*,
@@ -2489,7 +2495,7 @@ SQLITE_API int sqlite3_set_authorizer(
 );
 
 /*
-** CAPI3REF: Authorizer Return Codes {H12590} 
+** CAPI3REF: Authorizer Return Codes
 **
 ** The [sqlite3_set_authorizer | authorizer callback function] must
 ** return either [SQLITE_OK] or one of these two constants in order
@@ -2501,7 +2507,7 @@ SQLITE_API int sqlite3_set_authorizer(
 #define SQLITE_IGNORE 2   /* Don't allow access, but don't generate an error */
 
 /*
-** CAPI3REF: Authorizer Action Codes {H12550} 
+** CAPI3REF: Authorizer Action Codes
 **
 ** The [sqlite3_set_authorizer()] interface registers a callback function
 ** that is invoked to authorize certain SQL statement actions.  The
@@ -2512,15 +2518,12 @@ SQLITE_API int sqlite3_set_authorizer(
 ** These action code values signify what kind of operation is to be
 ** authorized.  The 3rd and 4th parameters to the authorization
 ** callback function will be parameters or NULL depending on which of these
-** codes is used as the second parameter.  The 5th parameter to the
+** codes is used as the second parameter.  ^(The 5th parameter to the
 ** authorizer callback is the name of the database ("main", "temp",
-** etc.) if applicable.  The 6th parameter to the authorizer callback
+** etc.) if applicable.)^  ^The 6th parameter to the authorizer callback
 ** is the name of the inner-most trigger or view that is responsible for
 ** the access attempt or NULL if this access attempt is directly from
 ** top-level SQL code.
-**
-** Requirements:
-** [H12551] [H12552] [H12553] [H12554]
 */
 /******************************************* 3rd ************ 4th ***********/
 #define SQLITE_CREATE_INDEX          1   /* Index Name      Table Name      */
@@ -2558,42 +2561,39 @@ SQLITE_API int sqlite3_set_authorizer(
 #define SQLITE_COPY                  0   /* No longer used */
 
 /*
-** CAPI3REF: Tracing And Profiling Functions {H12280} 
+** CAPI3REF: Tracing And Profiling Functions
 ** EXPERIMENTAL
 **
 ** These routines register callback functions that can be used for
 ** tracing and profiling the execution of SQL statements.
 **
-** The callback function registered by sqlite3_trace() is invoked at
+** ^The callback function registered by sqlite3_trace() is invoked at
 ** various times when an SQL statement is being run by [sqlite3_step()].
-** The callback returns a UTF-8 rendering of the SQL statement text
-** as the statement first begins executing.  Additional callbacks occur
+** ^The sqlite3_trace() callback is invoked with a UTF-8 rendering of the
+** SQL statement text as the statement first begins executing.
+** ^(Additional sqlite3_trace() callbacks might occur
 ** as each triggered subprogram is entered.  The callbacks for triggers
-** contain a UTF-8 SQL comment that identifies the trigger.
+** contain a UTF-8 SQL comment that identifies the trigger.)^
 **
-** The callback function registered by sqlite3_profile() is invoked
-** as each SQL statement finishes.  The profile callback contains
+** ^The callback function registered by sqlite3_profile() is invoked
+** as each SQL statement finishes.  ^The profile callback contains
 ** the original statement text and an estimate of wall-clock time
 ** of how long that statement took to run.
-**
-** Requirements:
-** [H12281] [H12282] [H12283] [H12284] [H12285] [H12287] [H12288] [H12289]
-** [H12290]
 */
 SQLITE_API SQLITE_EXPERIMENTAL void *sqlite3_trace(sqlite3*, void(*xTrace)(void*,const char*), void*);
 SQLITE_API SQLITE_EXPERIMENTAL void *sqlite3_profile(sqlite3*,
    void(*xProfile)(void*,const char*,sqlite3_uint64), void*);
 
 /*
-** CAPI3REF: Query Progress Callbacks {H12910} 
+** CAPI3REF: Query Progress Callbacks
 **
-** This routine configures a callback function - the
+** ^This routine configures a callback function - the
 ** progress callback - that is invoked periodically during long
 ** running calls to [sqlite3_exec()], [sqlite3_step()] and
 ** [sqlite3_get_table()].  An example use for this
 ** interface is to keep a GUI updated during a large query.
 **
-** If the progress callback returns non-zero, the operation is
+** ^If the progress callback returns non-zero, the operation is
 ** interrupted.  This feature can be used to implement a
 ** "Cancel" button on a GUI progress dialog box.
 **
@@ -2602,28 +2602,26 @@ SQLITE_API SQLITE_EXPERIMENTAL void *sqlite3_profile(sqlite3*,
 ** Note that [sqlite3_prepare_v2()] and [sqlite3_step()] both modify their
 ** database connections for the meaning of "modify" in this paragraph.
 **
-** Requirements:
-** [H12911] [H12912] [H12913] [H12914] [H12915] [H12916] [H12917] [H12918]
-**
 */
 SQLITE_API void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*);
 
 /*
-** CAPI3REF: Opening A New Database Connection {H12700} 
+** CAPI3REF: Opening A New Database Connection
 **
-** These routines open an SQLite database file whose name is given by the
-** filename argument. The filename argument is interpreted as UTF-8 for
+** ^These routines open an SQLite database file whose name is given by the
+** filename argument. ^The filename argument is interpreted as UTF-8 for
 ** sqlite3_open() and sqlite3_open_v2() and as UTF-16 in the native byte
-** order for sqlite3_open16(). A [database connection] handle is usually
+** order for sqlite3_open16(). ^(A [database connection] handle is usually
 ** returned in *ppDb, even if an error occurs.  The only exception is that
 ** if SQLite is unable to allocate memory to hold the [sqlite3] object,
 ** a NULL will be written into *ppDb instead of a pointer to the [sqlite3]
-** object. If the database is opened (and/or created) successfully, then
-** [SQLITE_OK] is returned.  Otherwise an [error code] is returned.  The
+** object.)^ ^(If the database is opened (and/or created) successfully, then
+** [SQLITE_OK] is returned.  Otherwise an [error code] is returned.)^ ^The
 ** [sqlite3_errmsg()] or [sqlite3_errmsg16()] routines can be used to obtain
-** an English language description of the error.
+** an English language description of the error following a failure of any
+** of the sqlite3_open() routines.
 **
-** The default encoding for the database will be UTF-8 if
+** ^The default encoding for the database will be UTF-8 if
 ** sqlite3_open() or sqlite3_open_v2() is called and
 ** UTF-16 in the native byte order if sqlite3_open16() is used.
 **
@@ -2633,25 +2631,26 @@ SQLITE_API void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*);
 **
 ** The sqlite3_open_v2() interface works like sqlite3_open()
 ** except that it accepts two additional parameters for additional control
-** over the new database connection.  The flags parameter can take one of
+** over the new database connection.  ^(The flags parameter to
+** sqlite3_open_v2() can take one of
 ** the following three values, optionally combined with the 
 ** [SQLITE_OPEN_NOMUTEX], [SQLITE_OPEN_FULLMUTEX], [SQLITE_OPEN_SHAREDCACHE],
-** and/or [SQLITE_OPEN_PRIVATECACHE] flags:
+** and/or [SQLITE_OPEN_PRIVATECACHE] flags:)^
 **
 ** 
-**
[SQLITE_OPEN_READONLY]
+** ^(
[SQLITE_OPEN_READONLY]
**
The database is opened in read-only mode. If the database does not -** already exist, an error is returned.
+** already exist, an error is returned.)^ ** -**
[SQLITE_OPEN_READWRITE]
+** ^(
[SQLITE_OPEN_READWRITE]
**
The database is opened for reading and writing if possible, or reading ** only if the file is write protected by the operating system. In either -** case the database must already exist, otherwise an error is returned.
+** case the database must already exist, otherwise an error is returned.)^ ** -**
[SQLITE_OPEN_READWRITE] | [SQLITE_OPEN_CREATE]
+** ^(
[SQLITE_OPEN_READWRITE] | [SQLITE_OPEN_CREATE]
**
The database is opened for reading and writing, and is creates it if ** it does not already exist. This is the behavior that is always used for -** sqlite3_open() and sqlite3_open16().
+** sqlite3_open() and sqlite3_open16().)^ **
** ** If the 3rd parameter to sqlite3_open_v2() is not one of the @@ -2660,33 +2659,33 @@ SQLITE_API void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*); ** [SQLITE_OPEN_SHAREDCACHE] and/or [SQLITE_OPEN_SHAREDCACHE] flags, ** then the behavior is undefined. ** -** If the [SQLITE_OPEN_NOMUTEX] flag is set, then the database connection +** ^If the [SQLITE_OPEN_NOMUTEX] flag is set, then the database connection ** opens in the multi-thread [threading mode] as long as the single-thread -** mode has not been set at compile-time or start-time. If the +** mode has not been set at compile-time or start-time. ^If the ** [SQLITE_OPEN_FULLMUTEX] flag is set then the database connection opens ** in the serialized [threading mode] unless single-thread was ** previously selected at compile-time or start-time. -** The [SQLITE_OPEN_SHAREDCACHE] flag causes the database connection to be +** ^The [SQLITE_OPEN_SHAREDCACHE] flag causes the database connection to be ** eligible to use [shared cache mode], regardless of whether or not shared -** cache is enabled using [sqlite3_enable_shared_cache()]. The +** cache is enabled using [sqlite3_enable_shared_cache()]. ^The ** [SQLITE_OPEN_PRIVATECACHE] flag causes the database connection to not ** participate in [shared cache mode] even if it is enabled. ** -** If the filename is ":memory:", then a private, temporary in-memory database -** is created for the connection. This in-memory database will vanish when +** ^If the filename is ":memory:", then a private, temporary in-memory database +** is created for the connection. ^This in-memory database will vanish when ** the database connection is closed. Future versions of SQLite might ** make use of additional special filenames that begin with the ":" character. ** It is recommended that when a database filename actually does begin with ** a ":" character you should prefix the filename with a pathname such as ** "./" to avoid ambiguity. ** -** If the filename is an empty string, then a private, temporary -** on-disk database will be created. This private database will be +** ^If the filename is an empty string, then a private, temporary +** on-disk database will be created. ^This private database will be ** automatically deleted as soon as the database connection is closed. ** -** The fourth parameter to sqlite3_open_v2() is the name of the +** ^The fourth parameter to sqlite3_open_v2() is the name of the ** [sqlite3_vfs] object that defines the operating system interface that -** the new database connection should use. If the fourth parameter is +** the new database connection should use. ^If the fourth parameter is ** a NULL pointer then the default [sqlite3_vfs] object is used. ** ** Note to Windows users: The encoding used for the filename argument @@ -2694,10 +2693,6 @@ SQLITE_API void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*); ** codepage is currently defined. Filenames containing international ** characters must be converted to UTF-8 prior to passing them into ** sqlite3_open() or sqlite3_open_v2(). -** -** Requirements: -** [H12701] [H12702] [H12703] [H12704] [H12706] [H12707] [H12709] [H12711] -** [H12712] [H12713] [H12714] [H12717] [H12719] [H12721] [H12723] */ SQLITE_API int sqlite3_open( const char *filename, /* Database filename (UTF-8) */ @@ -2715,23 +2710,23 @@ SQLITE_API int sqlite3_open_v2( ); /* -** CAPI3REF: Error Codes And Messages {H12800} +** CAPI3REF: Error Codes And Messages ** -** The sqlite3_errcode() interface returns the numeric [result code] or +** ^The sqlite3_errcode() interface returns the numeric [result code] or ** [extended result code] for the most recent failed sqlite3_* API call ** associated with a [database connection]. If a prior API call failed ** but the most recent API call succeeded, the return value from -** sqlite3_errcode() is undefined. The sqlite3_extended_errcode() +** sqlite3_errcode() is undefined. ^The sqlite3_extended_errcode() ** interface is the same except that it always returns the ** [extended result code] even when extended result codes are ** disabled. ** -** The sqlite3_errmsg() and sqlite3_errmsg16() return English-language +** ^The sqlite3_errmsg() and sqlite3_errmsg16() return English-language ** text that describes the error, as either UTF-8 or UTF-16 respectively. -** Memory to hold the error message string is managed internally. +** ^(Memory to hold the error message string is managed internally. ** The application does not need to worry about freeing the result. ** However, the error string might be overwritten or deallocated by -** subsequent calls to other SQLite interface functions. +** subsequent calls to other SQLite interface functions.)^ ** ** When the serialized [threading mode] is in use, it might be the ** case that a second error occurs on a separate thread in between @@ -2746,9 +2741,6 @@ SQLITE_API int sqlite3_open_v2( ** If an interface fails with SQLITE_MISUSE, that means the interface ** was invoked incorrectly by the application. In that case, the ** error code and message may or may not be set. -** -** Requirements: -** [H12801] [H12802] [H12803] [H12807] [H12808] [H12809] */ SQLITE_API int sqlite3_errcode(sqlite3 *db); SQLITE_API int sqlite3_extended_errcode(sqlite3 *db); @@ -2756,7 +2748,7 @@ SQLITE_API const char *sqlite3_errmsg(sqlite3*); SQLITE_API const void *sqlite3_errmsg16(sqlite3*); /* -** CAPI3REF: SQL Statement Object {H13000} +** CAPI3REF: SQL Statement Object ** KEYWORDS: {prepared statement} {prepared statements} ** ** An instance of this object represents a single SQL statement. @@ -2782,25 +2774,25 @@ SQLITE_API const void *sqlite3_errmsg16(sqlite3*); typedef struct sqlite3_stmt sqlite3_stmt; /* -** CAPI3REF: Run-time Limits {H12760} +** CAPI3REF: Run-time Limits ** -** This interface allows the size of various constructs to be limited +** ^(This interface allows the size of various constructs to be limited ** on a connection by connection basis. The first parameter is the ** [database connection] whose limit is to be set or queried. The ** second parameter is one of the [limit categories] that define a ** class of constructs to be size limited. The third parameter is the -** new limit for that construct. The function returns the old limit. +** new limit for that construct. The function returns the old limit.)^ ** -** If the new limit is a negative number, the limit is unchanged. -** For the limit category of SQLITE_LIMIT_XYZ there is a +** ^If the new limit is a negative number, the limit is unchanged. +** ^(For the limit category of SQLITE_LIMIT_XYZ there is a ** [limits | hard upper bound] ** set by a compile-time C preprocessor macro named ** [limits | SQLITE_MAX_XYZ]. -** (The "_LIMIT_" in the name is changed to "_MAX_".) -** Attempts to increase a limit above its hard upper bound are -** silently truncated to the hard upper limit. +** (The "_LIMIT_" in the name is changed to "_MAX_".))^ +** ^Attempts to increase a limit above its hard upper bound are +** silently truncated to the hard upper bound. ** -** Run time limits are intended for use in applications that manage +** Run-time limits are intended for use in applications that manage ** both their own internal database and also databases that are controlled ** by untrusted external sources. An example application might be a ** web browser that has its own databases for storing history and @@ -2814,15 +2806,12 @@ typedef struct sqlite3_stmt sqlite3_stmt; ** [max_page_count] [PRAGMA]. ** ** New run-time limit categories may be added in future releases. -** -** Requirements: -** [H12762] [H12766] [H12769] */ SQLITE_API int sqlite3_limit(sqlite3*, int id, int newVal); /* -** CAPI3REF: Run-Time Limit Categories {H12790} -** KEYWORDS: {limit category} {limit categories} +** CAPI3REF: Run-Time Limit Categories +** KEYWORDS: {limit category} {*limit categories} ** ** These constants define various performance limits ** that can be lowered at run-time using [sqlite3_limit()]. @@ -2830,43 +2819,43 @@ SQLITE_API int sqlite3_limit(sqlite3*, int id, int newVal); ** Additional information is available at [limits | Limits in SQLite]. ** **
-**
SQLITE_LIMIT_LENGTH
-**
The maximum size of any string or BLOB or table row.
+** ^(
SQLITE_LIMIT_LENGTH
+**
The maximum size of any string or BLOB or table row.
)^ ** -**
SQLITE_LIMIT_SQL_LENGTH
-**
The maximum length of an SQL statement.
+** ^(
SQLITE_LIMIT_SQL_LENGTH
+**
The maximum length of an SQL statement, in bytes.
)^ ** -**
SQLITE_LIMIT_COLUMN
+** ^(
SQLITE_LIMIT_COLUMN
**
The maximum number of columns in a table definition or in the ** result set of a [SELECT] or the maximum number of columns in an index -** or in an ORDER BY or GROUP BY clause.
+** or in an ORDER BY or GROUP BY clause.)^ ** -**
SQLITE_LIMIT_EXPR_DEPTH
-**
The maximum depth of the parse tree on any expression.
+** ^(
SQLITE_LIMIT_EXPR_DEPTH
+**
The maximum depth of the parse tree on any expression.
)^ ** -**
SQLITE_LIMIT_COMPOUND_SELECT
-**
The maximum number of terms in a compound SELECT statement.
+** ^(
SQLITE_LIMIT_COMPOUND_SELECT
+**
The maximum number of terms in a compound SELECT statement.
)^ ** -**
SQLITE_LIMIT_VDBE_OP
+** ^(
SQLITE_LIMIT_VDBE_OP
**
The maximum number of instructions in a virtual machine program -** used to implement an SQL statement.
+** used to implement an SQL statement.)^ ** -**
SQLITE_LIMIT_FUNCTION_ARG
-**
The maximum number of arguments on a function.
+** ^(
SQLITE_LIMIT_FUNCTION_ARG
+**
The maximum number of arguments on a function.
)^ ** -**
SQLITE_LIMIT_ATTACHED
-**
The maximum number of [ATTACH | attached databases].
+** ^(
SQLITE_LIMIT_ATTACHED
+**
The maximum number of [ATTACH | attached databases].)^
** -**
SQLITE_LIMIT_LIKE_PATTERN_LENGTH
+** ^(
SQLITE_LIMIT_LIKE_PATTERN_LENGTH
**
The maximum length of the pattern argument to the [LIKE] or -** [GLOB] operators.
+** [GLOB] operators.)^ ** -**
SQLITE_LIMIT_VARIABLE_NUMBER
+** ^(
SQLITE_LIMIT_VARIABLE_NUMBER
**
The maximum number of variables in an SQL statement that can -** be bound.
+** be bound.)^ ** -**
SQLITE_LIMIT_TRIGGER_DEPTH
-**
The maximum depth of recursion for triggers.
+** ^(
SQLITE_LIMIT_TRIGGER_DEPTH
+**
The maximum depth of recursion for triggers.
)^ **
*/ #define SQLITE_LIMIT_LENGTH 0 @@ -2882,7 +2871,7 @@ SQLITE_API int sqlite3_limit(sqlite3*, int id, int newVal); #define SQLITE_LIMIT_TRIGGER_DEPTH 10 /* -** CAPI3REF: Compiling An SQL Statement {H13010} +** CAPI3REF: Compiling An SQL Statement ** KEYWORDS: {SQL statement compiler} ** ** To execute an SQL query, it must first be compiled into a byte-code @@ -2897,9 +2886,9 @@ SQLITE_API int sqlite3_limit(sqlite3*, int id, int newVal); ** interfaces use UTF-8, and sqlite3_prepare16() and sqlite3_prepare16_v2() ** use UTF-16. ** -** If the nByte argument is less than zero, then zSql is read up to the -** first zero terminator. If nByte is non-negative, then it is the maximum -** number of bytes read from zSql. When nByte is non-negative, the +** ^If the nByte argument is less than zero, then zSql is read up to the +** first zero terminator. ^If nByte is non-negative, then it is the maximum +** number of bytes read from zSql. ^When nByte is non-negative, the ** zSql string ends at either the first '\000' or '\u0000' character or ** the nByte-th byte, whichever comes first. If the caller knows ** that the supplied string is nul-terminated, then there is a small @@ -2907,34 +2896,35 @@ SQLITE_API int sqlite3_limit(sqlite3*, int id, int newVal); ** is equal to the number of bytes in the input string including ** the nul-terminator bytes. ** -** If pzTail is not NULL then *pzTail is made to point to the first byte +** ^If pzTail is not NULL then *pzTail is made to point to the first byte ** past the end of the first SQL statement in zSql. These routines only ** compile the first statement in zSql, so *pzTail is left pointing to ** what remains uncompiled. ** -** *ppStmt is left pointing to a compiled [prepared statement] that can be -** executed using [sqlite3_step()]. If there is an error, *ppStmt is set -** to NULL. If the input text contains no SQL (if the input is an empty +** ^*ppStmt is left pointing to a compiled [prepared statement] that can be +** executed using [sqlite3_step()]. ^If there is an error, *ppStmt is set +** to NULL. ^If the input text contains no SQL (if the input is an empty ** string or a comment) then *ppStmt is set to NULL. ** The calling procedure is responsible for deleting the compiled ** SQL statement using [sqlite3_finalize()] after it has finished with it. ** ppStmt may not be NULL. ** -** On success, [SQLITE_OK] is returned, otherwise an [error code] is returned. +** ^On success, the sqlite3_prepare() family of routines return [SQLITE_OK]; +** otherwise an [error code] is returned. ** ** The sqlite3_prepare_v2() and sqlite3_prepare16_v2() interfaces are ** recommended for all new programs. The two older interfaces are retained ** for backwards compatibility, but their use is discouraged. -** In the "v2" interfaces, the prepared statement +** ^In the "v2" interfaces, the prepared statement ** that is returned (the [sqlite3_stmt] object) contains a copy of the ** original SQL text. This causes the [sqlite3_step()] interface to -** behave a differently in two ways: +** behave differently in three ways: ** **
    **
  1. -** If the database schema changes, instead of returning [SQLITE_SCHEMA] as it +** ^If the database schema changes, instead of returning [SQLITE_SCHEMA] as it ** always used to do, [sqlite3_step()] will automatically recompile the SQL -** statement and try to run it again. If the schema has changed in +** statement and try to run it again. ^If the schema has changed in ** a way that makes the statement no longer valid, [sqlite3_step()] will still ** return [SQLITE_SCHEMA]. But unlike the legacy behavior, [SQLITE_SCHEMA] is ** now a fatal error. Calling [sqlite3_prepare_v2()] again will not make the @@ -2943,18 +2933,22 @@ SQLITE_API int sqlite3_limit(sqlite3*, int id, int newVal); **
  2. ** **
  3. -** When an error occurs, [sqlite3_step()] will return one of the detailed -** [error codes] or [extended error codes]. The legacy behavior was that +** ^When an error occurs, [sqlite3_step()] will return one of the detailed +** [error codes] or [extended error codes]. ^The legacy behavior was that ** [sqlite3_step()] would only return a generic [SQLITE_ERROR] result code -** and you would have to make a second call to [sqlite3_reset()] in order -** to find the underlying cause of the problem. With the "v2" prepare +** and the application would have to make a second call to [sqlite3_reset()] +** in order to find the underlying cause of the problem. With the "v2" prepare ** interfaces, the underlying reason for the error is returned immediately. **
  4. -**
-** -** Requirements: -** [H13011] [H13012] [H13013] [H13014] [H13015] [H13016] [H13019] [H13021] ** +**
  • +** ^If the value of a [parameter | host parameter] in the WHERE clause might +** change the query plan for a statement, then the statement may be +** automatically recompiled (as if there had been a schema change) on the first +** [sqlite3_step()] call following any change to the +** [sqlite3_bind_text | bindings] of the [parameter]. +**
  • +** */ SQLITE_API int sqlite3_prepare( sqlite3 *db, /* Database handle */ @@ -2986,24 +2980,21 @@ SQLITE_API int sqlite3_prepare16_v2( ); /* -** CAPI3REF: Retrieving Statement SQL {H13100} +** CAPI3REF: Retrieving Statement SQL ** -** This interface can be used to retrieve a saved copy of the original +** ^This interface can be used to retrieve a saved copy of the original ** SQL text used to create a [prepared statement] if that statement was ** compiled using either [sqlite3_prepare_v2()] or [sqlite3_prepare16_v2()]. -** -** Requirements: -** [H13101] [H13102] [H13103] */ SQLITE_API const char *sqlite3_sql(sqlite3_stmt *pStmt); /* -** CAPI3REF: Dynamically Typed Value Object {H15000} +** CAPI3REF: Dynamically Typed Value Object ** KEYWORDS: {protected sqlite3_value} {unprotected sqlite3_value} ** ** SQLite uses the sqlite3_value object to represent all values ** that can be stored in a database table. SQLite uses dynamic typing -** for the values it stores. Values stored in sqlite3_value objects +** for the values it stores. ^Values stored in sqlite3_value objects ** can be integers, floating point values, strings, BLOBs, or NULL. ** ** An sqlite3_value object may be either "protected" or "unprotected". @@ -3025,9 +3016,9 @@ SQLITE_API const char *sqlite3_sql(sqlite3_stmt *pStmt); ** still make the distinction between between protected and unprotected ** sqlite3_value objects even when not strictly required. ** -** The sqlite3_value objects that are passed as parameters into the +** ^The sqlite3_value objects that are passed as parameters into the ** implementation of [application-defined SQL functions] are protected. -** The sqlite3_value object returned by +** ^The sqlite3_value object returned by ** [sqlite3_column_value()] is unprotected. ** Unprotected sqlite3_value objects may only be used with ** [sqlite3_result_value()] and [sqlite3_bind_value()]. @@ -3037,10 +3028,10 @@ SQLITE_API const char *sqlite3_sql(sqlite3_stmt *pStmt); typedef struct Mem sqlite3_value; /* -** CAPI3REF: SQL Function Context Object {H16001} +** CAPI3REF: SQL Function Context Object ** ** The context in which an SQL function executes is stored in an -** sqlite3_context object. A pointer to an sqlite3_context object +** sqlite3_context object. ^A pointer to an sqlite3_context object ** is always first parameter to [application-defined SQL functions]. ** The application-defined SQL function implementation will pass this ** pointer through into calls to [sqlite3_result_int | sqlite3_result()], @@ -3051,11 +3042,11 @@ typedef struct Mem sqlite3_value; typedef struct sqlite3_context sqlite3_context; /* -** CAPI3REF: Binding Values To Prepared Statements {H13500} +** CAPI3REF: Binding Values To Prepared Statements ** KEYWORDS: {host parameter} {host parameters} {host parameter name} ** KEYWORDS: {SQL parameter} {SQL parameters} {parameter binding} ** -** In the SQL strings input to [sqlite3_prepare_v2()] and its variants, +** ^(In the SQL statement text input to [sqlite3_prepare_v2()] and its variants, ** literals may be replaced by a [parameter] that matches one of following ** templates: ** @@ -3068,72 +3059,66 @@ typedef struct sqlite3_context sqlite3_context; ** ** ** In the templates above, NNN represents an integer literal, -** and VVV represents an alphanumeric identifer. The values of these +** and VVV represents an alphanumeric identifer.)^ ^The values of these ** parameters (also called "host parameter names" or "SQL parameters") ** can be set using the sqlite3_bind_*() routines defined here. ** -** The first argument to the sqlite3_bind_*() routines is always +** ^The first argument to the sqlite3_bind_*() routines is always ** a pointer to the [sqlite3_stmt] object returned from ** [sqlite3_prepare_v2()] or its variants. ** -** The second argument is the index of the SQL parameter to be set. -** The leftmost SQL parameter has an index of 1. When the same named +** ^The second argument is the index of the SQL parameter to be set. +** ^The leftmost SQL parameter has an index of 1. ^When the same named ** SQL parameter is used more than once, second and subsequent ** occurrences have the same index as the first occurrence. -** The index for named parameters can be looked up using the -** [sqlite3_bind_parameter_index()] API if desired. The index +** ^The index for named parameters can be looked up using the +** [sqlite3_bind_parameter_index()] API if desired. ^The index ** for "?NNN" parameters is the value of NNN. -** The NNN value must be between 1 and the [sqlite3_limit()] +** ^The NNN value must be between 1 and the [sqlite3_limit()] ** parameter [SQLITE_LIMIT_VARIABLE_NUMBER] (default value: 999). ** -** The third argument is the value to bind to the parameter. +** ^The third argument is the value to bind to the parameter. ** -** In those routines that have a fourth argument, its value is the +** ^(In those routines that have a fourth argument, its value is the ** number of bytes in the parameter. To be clear: the value is the -** number of bytes in the value, not the number of characters. -** If the fourth parameter is negative, the length of the string is +** number of bytes in the value, not the number of characters.)^ +** ^If the fourth parameter is negative, the length of the string is ** the number of bytes up to the first zero terminator. ** -** The fifth argument to sqlite3_bind_blob(), sqlite3_bind_text(), and +** ^The fifth argument to sqlite3_bind_blob(), sqlite3_bind_text(), and ** sqlite3_bind_text16() is a destructor used to dispose of the BLOB or -** string after SQLite has finished with it. If the fifth argument is +** string after SQLite has finished with it. ^If the fifth argument is ** the special value [SQLITE_STATIC], then SQLite assumes that the ** information is in static, unmanaged space and does not need to be freed. -** If the fifth argument has the value [SQLITE_TRANSIENT], then +** ^If the fifth argument has the value [SQLITE_TRANSIENT], then ** SQLite makes its own private copy of the data immediately, before ** the sqlite3_bind_*() routine returns. ** -** The sqlite3_bind_zeroblob() routine binds a BLOB of length N that -** is filled with zeroes. A zeroblob uses a fixed amount of memory +** ^The sqlite3_bind_zeroblob() routine binds a BLOB of length N that +** is filled with zeroes. ^A zeroblob uses a fixed amount of memory ** (just an integer to hold its size) while it is being processed. ** Zeroblobs are intended to serve as placeholders for BLOBs whose ** content is later written using ** [sqlite3_blob_open | incremental BLOB I/O] routines. -** A negative value for the zeroblob results in a zero-length BLOB. -** -** The sqlite3_bind_*() routines must be called after -** [sqlite3_prepare_v2()] (and its variants) or [sqlite3_reset()] and -** before [sqlite3_step()]. -** Bindings are not cleared by the [sqlite3_reset()] routine. -** Unbound parameters are interpreted as NULL. -** -** These routines return [SQLITE_OK] on success or an error code if -** anything goes wrong. [SQLITE_RANGE] is returned if the parameter -** index is out of range. [SQLITE_NOMEM] is returned if malloc() fails. -** [SQLITE_MISUSE] might be returned if these routines are called on a -** virtual machine that is the wrong state or which has already been finalized. -** Detection of misuse is unreliable. Applications should not depend -** on SQLITE_MISUSE returns. SQLITE_MISUSE is intended to indicate a -** a logic error in the application. Future versions of SQLite might -** panic rather than return SQLITE_MISUSE. +** ^A negative value for the zeroblob results in a zero-length BLOB. ** -** See also: [sqlite3_bind_parameter_count()], -** [sqlite3_bind_parameter_name()], and [sqlite3_bind_parameter_index()]. +** ^If any of the sqlite3_bind_*() routines are called with a NULL pointer +** for the [prepared statement] or with a prepared statement for which +** [sqlite3_step()] has been called more recently than [sqlite3_reset()], +** then the call will return [SQLITE_MISUSE]. If any sqlite3_bind_() +** routine is passed a [prepared statement] that has been finalized, the +** result is undefined and probably harmful. +** +** ^Bindings are not cleared by the [sqlite3_reset()] routine. +** ^Unbound parameters are interpreted as NULL. ** -** Requirements: -** [H13506] [H13509] [H13512] [H13515] [H13518] [H13521] [H13524] [H13527] -** [H13530] [H13533] [H13536] [H13539] [H13542] [H13545] [H13548] [H13551] +** ^The sqlite3_bind_* routines return [SQLITE_OK] on success or an +** [error code] if anything goes wrong. +** ^[SQLITE_RANGE] is returned if the parameter +** index is out of range. ^[SQLITE_NOMEM] is returned if malloc() fails. ** +** See also: [sqlite3_bind_parameter_count()], +** [sqlite3_bind_parameter_name()], and [sqlite3_bind_parameter_index()]. */ SQLITE_API int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*)); SQLITE_API int sqlite3_bind_double(sqlite3_stmt*, int, double); @@ -3146,45 +3131,42 @@ SQLITE_API int sqlite3_bind_value(sqlite3_stmt*, int, const sqlite3_value*); SQLITE_API int sqlite3_bind_zeroblob(sqlite3_stmt*, int, int n); /* -** CAPI3REF: Number Of SQL Parameters {H13600} +** CAPI3REF: Number Of SQL Parameters ** -** This routine can be used to find the number of [SQL parameters] +** ^This routine can be used to find the number of [SQL parameters] ** in a [prepared statement]. SQL parameters are tokens of the ** form "?", "?NNN", ":AAA", "$AAA", or "@AAA" that serve as ** placeholders for values that are [sqlite3_bind_blob | bound] ** to the parameters at a later time. ** -** This routine actually returns the index of the largest (rightmost) +** ^(This routine actually returns the index of the largest (rightmost) ** parameter. For all forms except ?NNN, this will correspond to the -** number of unique parameters. If parameters of the ?NNN are used, -** there may be gaps in the list. +** number of unique parameters. If parameters of the ?NNN form are used, +** there may be gaps in the list.)^ ** ** See also: [sqlite3_bind_blob|sqlite3_bind()], ** [sqlite3_bind_parameter_name()], and ** [sqlite3_bind_parameter_index()]. -** -** Requirements: -** [H13601] */ SQLITE_API int sqlite3_bind_parameter_count(sqlite3_stmt*); /* -** CAPI3REF: Name Of A Host Parameter {H13620} +** CAPI3REF: Name Of A Host Parameter ** -** This routine returns a pointer to the name of the n-th -** [SQL parameter] in a [prepared statement]. -** SQL parameters of the form "?NNN" or ":AAA" or "@AAA" or "$AAA" +** ^The sqlite3_bind_parameter_name(P,N) interface returns +** the name of the N-th [SQL parameter] in the [prepared statement] P. +** ^(SQL parameters of the form "?NNN" or ":AAA" or "@AAA" or "$AAA" ** have a name which is the string "?NNN" or ":AAA" or "@AAA" or "$AAA" ** respectively. ** In other words, the initial ":" or "$" or "@" or "?" -** is included as part of the name. -** Parameters of the form "?" without a following integer have no name -** and are also referred to as "anonymous parameters". +** is included as part of the name.)^ +** ^Parameters of the form "?" without a following integer have no name +** and are referred to as "nameless" or "anonymous parameters". ** -** The first host parameter has an index of 1, not 0. +** ^The first host parameter has an index of 1, not 0. ** -** If the value n is out of range or if the n-th parameter is -** nameless, then NULL is returned. The returned string is +** ^If the value N is out of range or if the N-th parameter is +** nameless, then NULL is returned. ^The returned string is ** always in UTF-8 encoding even if the named parameter was ** originally specified as UTF-16 in [sqlite3_prepare16()] or ** [sqlite3_prepare16_v2()]. @@ -3192,125 +3174,108 @@ SQLITE_API int sqlite3_bind_parameter_count(sqlite3_stmt*); ** See also: [sqlite3_bind_blob|sqlite3_bind()], ** [sqlite3_bind_parameter_count()], and ** [sqlite3_bind_parameter_index()]. -** -** Requirements: -** [H13621] */ SQLITE_API const char *sqlite3_bind_parameter_name(sqlite3_stmt*, int); /* -** CAPI3REF: Index Of A Parameter With A Given Name {H13640} +** CAPI3REF: Index Of A Parameter With A Given Name ** -** Return the index of an SQL parameter given its name. The +** ^Return the index of an SQL parameter given its name. ^The ** index value returned is suitable for use as the second -** parameter to [sqlite3_bind_blob|sqlite3_bind()]. A zero -** is returned if no matching parameter is found. The parameter +** parameter to [sqlite3_bind_blob|sqlite3_bind()]. ^A zero +** is returned if no matching parameter is found. ^The parameter ** name must be given in UTF-8 even if the original statement ** was prepared from UTF-16 text using [sqlite3_prepare16_v2()]. ** ** See also: [sqlite3_bind_blob|sqlite3_bind()], ** [sqlite3_bind_parameter_count()], and ** [sqlite3_bind_parameter_index()]. -** -** Requirements: -** [H13641] */ SQLITE_API int sqlite3_bind_parameter_index(sqlite3_stmt*, const char *zName); /* -** CAPI3REF: Reset All Bindings On A Prepared Statement {H13660} +** CAPI3REF: Reset All Bindings On A Prepared Statement ** -** Contrary to the intuition of many, [sqlite3_reset()] does not reset +** ^Contrary to the intuition of many, [sqlite3_reset()] does not reset ** the [sqlite3_bind_blob | bindings] on a [prepared statement]. -** Use this routine to reset all host parameters to NULL. -** -** Requirements: -** [H13661] +** ^Use this routine to reset all host parameters to NULL. */ SQLITE_API int sqlite3_clear_bindings(sqlite3_stmt*); /* -** CAPI3REF: Number Of Columns In A Result Set {H13710} +** CAPI3REF: Number Of Columns In A Result Set ** -** Return the number of columns in the result set returned by the -** [prepared statement]. This routine returns 0 if pStmt is an SQL +** ^Return the number of columns in the result set returned by the +** [prepared statement]. ^This routine returns 0 if pStmt is an SQL ** statement that does not return data (for example an [UPDATE]). -** -** Requirements: -** [H13711] */ SQLITE_API int sqlite3_column_count(sqlite3_stmt *pStmt); /* -** CAPI3REF: Column Names In A Result Set {H13720} +** CAPI3REF: Column Names In A Result Set ** -** These routines return the name assigned to a particular column -** in the result set of a [SELECT] statement. The sqlite3_column_name() +** ^These routines return the name assigned to a particular column +** in the result set of a [SELECT] statement. ^The sqlite3_column_name() ** interface returns a pointer to a zero-terminated UTF-8 string ** and sqlite3_column_name16() returns a pointer to a zero-terminated -** UTF-16 string. The first parameter is the [prepared statement] -** that implements the [SELECT] statement. The second parameter is the -** column number. The leftmost column is number 0. +** UTF-16 string. ^The first parameter is the [prepared statement] +** that implements the [SELECT] statement. ^The second parameter is the +** column number. ^The leftmost column is number 0. ** -** The returned string pointer is valid until either the [prepared statement] +** ^The returned string pointer is valid until either the [prepared statement] ** is destroyed by [sqlite3_finalize()] or until the next call to ** sqlite3_column_name() or sqlite3_column_name16() on the same column. ** -** If sqlite3_malloc() fails during the processing of either routine +** ^If sqlite3_malloc() fails during the processing of either routine ** (for example during a conversion from UTF-8 to UTF-16) then a ** NULL pointer is returned. ** -** The name of a result column is the value of the "AS" clause for +** ^The name of a result column is the value of the "AS" clause for ** that column, if there is an AS clause. If there is no AS clause ** then the name of the column is unspecified and may change from ** one release of SQLite to the next. -** -** Requirements: -** [H13721] [H13723] [H13724] [H13725] [H13726] [H13727] */ SQLITE_API const char *sqlite3_column_name(sqlite3_stmt*, int N); SQLITE_API const void *sqlite3_column_name16(sqlite3_stmt*, int N); /* -** CAPI3REF: Source Of Data In A Query Result {H13740} +** CAPI3REF: Source Of Data In A Query Result ** -** These routines provide a means to determine what column of what -** table in which database a result of a [SELECT] statement comes from. -** The name of the database or table or column can be returned as -** either a UTF-8 or UTF-16 string. The _database_ routines return +** ^These routines provide a means to determine the database, table, and +** table column that is the origin of a particular result column in +** [SELECT] statement. +** ^The name of the database or table or column can be returned as +** either a UTF-8 or UTF-16 string. ^The _database_ routines return ** the database name, the _table_ routines return the table name, and ** the origin_ routines return the column name. -** The returned string is valid until the [prepared statement] is destroyed +** ^The returned string is valid until the [prepared statement] is destroyed ** using [sqlite3_finalize()] or until the same information is requested ** again in a different encoding. ** -** The names returned are the original un-aliased names of the +** ^The names returned are the original un-aliased names of the ** database, table, and column. ** -** The first argument to the following calls is a [prepared statement]. -** These functions return information about the Nth column returned by +** ^The first argument to these interfaces is a [prepared statement]. +** ^These functions return information about the Nth result column returned by ** the statement, where N is the second function argument. +** ^The left-most column is column 0 for these routines. ** -** If the Nth column returned by the statement is an expression or +** ^If the Nth column returned by the statement is an expression or ** subquery and is not a column value, then all of these functions return -** NULL. These routine might also return NULL if a memory allocation error -** occurs. Otherwise, they return the name of the attached database, table -** and column that query result column was extracted from. +** NULL. ^These routine might also return NULL if a memory allocation error +** occurs. ^Otherwise, they return the name of the attached database, table, +** or column that query result column was extracted from. ** -** As with all other SQLite APIs, those postfixed with "16" return -** UTF-16 encoded strings, the other functions return UTF-8. {END} +** ^As with all other SQLite APIs, those whose names end with "16" return +** UTF-16 encoded strings and the other functions return UTF-8. ** -** These APIs are only available if the library was compiled with the -** [SQLITE_ENABLE_COLUMN_METADATA] C-preprocessor symbol defined. +** ^These APIs are only available if the library was compiled with the +** [SQLITE_ENABLE_COLUMN_METADATA] C-preprocessor symbol. ** -** {A13751} ** If two or more threads call one or more of these routines against the same ** prepared statement and column at the same time then the results are ** undefined. ** -** Requirements: -** [H13741] [H13742] [H13743] [H13744] [H13745] [H13746] [H13748] -** ** If two or more threads call one or more ** [sqlite3_column_database_name | column metadata interfaces] ** for the same [prepared statement] and result column @@ -3324,17 +3289,17 @@ SQLITE_API const char *sqlite3_column_origin_name(sqlite3_stmt*,int); SQLITE_API const void *sqlite3_column_origin_name16(sqlite3_stmt*,int); /* -** CAPI3REF: Declared Datatype Of A Query Result {H13760} +** CAPI3REF: Declared Datatype Of A Query Result ** -** The first parameter is a [prepared statement]. +** ^(The first parameter is a [prepared statement]. ** If this statement is a [SELECT] statement and the Nth column of the ** returned result set of that [SELECT] is a table column (not an ** expression or subquery) then the declared type of the table -** column is returned. If the Nth column of the result set is an +** column is returned.)^ ^If the Nth column of the result set is an ** expression or subquery, then a NULL pointer is returned. -** The returned string is always UTF-8 encoded. {END} +** ^The returned string is always UTF-8 encoded. ** -** For example, given the database schema: +** ^(For example, given the database schema: ** ** CREATE TABLE t1(c1 VARIANT); ** @@ -3343,23 +3308,20 @@ SQLITE_API const void *sqlite3_column_origin_name16(sqlite3_stmt*,int); ** SELECT c1 + 1, c1 FROM t1; ** ** this routine would return the string "VARIANT" for the second result -** column (i==1), and a NULL pointer for the first result column (i==0). +** column (i==1), and a NULL pointer for the first result column (i==0).)^ ** -** SQLite uses dynamic run-time typing. So just because a column +** ^SQLite uses dynamic run-time typing. ^So just because a column ** is declared to contain a particular type does not mean that the ** data stored in that column is of the declared type. SQLite is -** strongly typed, but the typing is dynamic not static. Type +** strongly typed, but the typing is dynamic not static. ^Type ** is associated with individual values, not with the containers ** used to hold those values. -** -** Requirements: -** [H13761] [H13762] [H13763] */ SQLITE_API const char *sqlite3_column_decltype(sqlite3_stmt*,int); SQLITE_API const void *sqlite3_column_decltype16(sqlite3_stmt*,int); /* -** CAPI3REF: Evaluate An SQL Statement {H13200} +** CAPI3REF: Evaluate An SQL Statement ** ** After a [prepared statement] has been prepared using either ** [sqlite3_prepare_v2()] or [sqlite3_prepare16_v2()] or one of the legacy @@ -3373,35 +3335,35 @@ SQLITE_API const void *sqlite3_column_decltype16(sqlite3_stmt*,int); ** new "v2" interface is recommended for new applications but the legacy ** interface will continue to be supported. ** -** In the legacy interface, the return value will be either [SQLITE_BUSY], +** ^In the legacy interface, the return value will be either [SQLITE_BUSY], ** [SQLITE_DONE], [SQLITE_ROW], [SQLITE_ERROR], or [SQLITE_MISUSE]. -** With the "v2" interface, any of the other [result codes] or +** ^With the "v2" interface, any of the other [result codes] or ** [extended result codes] might be returned as well. ** -** [SQLITE_BUSY] means that the database engine was unable to acquire the -** database locks it needs to do its job. If the statement is a [COMMIT] +** ^[SQLITE_BUSY] means that the database engine was unable to acquire the +** database locks it needs to do its job. ^If the statement is a [COMMIT] ** or occurs outside of an explicit transaction, then you can retry the ** statement. If the statement is not a [COMMIT] and occurs within a ** explicit transaction then you should rollback the transaction before ** continuing. ** -** [SQLITE_DONE] means that the statement has finished executing +** ^[SQLITE_DONE] means that the statement has finished executing ** successfully. sqlite3_step() should not be called again on this virtual ** machine without first calling [sqlite3_reset()] to reset the virtual ** machine back to its initial state. ** -** If the SQL statement being executed returns any data, then [SQLITE_ROW] +** ^If the SQL statement being executed returns any data, then [SQLITE_ROW] ** is returned each time a new row of data is ready for processing by the ** caller. The values may be accessed using the [column access functions]. ** sqlite3_step() is called again to retrieve the next row of data. ** -** [SQLITE_ERROR] means that a run-time error (such as a constraint +** ^[SQLITE_ERROR] means that a run-time error (such as a constraint ** violation) has occurred. sqlite3_step() should not be called again on ** the VM. More information may be found by calling [sqlite3_errmsg()]. -** With the legacy interface, a more specific error code (for example, +** ^With the legacy interface, a more specific error code (for example, ** [SQLITE_INTERRUPT], [SQLITE_SCHEMA], [SQLITE_CORRUPT], and so forth) ** can be obtained by calling [sqlite3_reset()] on the -** [prepared statement]. In the "v2" interface, +** [prepared statement]. ^In the "v2" interface, ** the more specific error code is returned directly by sqlite3_step(). ** ** [SQLITE_MISUSE] means that the this routine was called inappropriately. @@ -3422,27 +3384,22 @@ SQLITE_API const void *sqlite3_column_decltype16(sqlite3_stmt*,int); ** of the legacy [sqlite3_prepare()] and [sqlite3_prepare16()] interfaces, ** then the more specific [error codes] are returned directly ** by sqlite3_step(). The use of the "v2" interface is recommended. -** -** Requirements: -** [H13202] [H15304] [H15306] [H15308] [H15310] */ SQLITE_API int sqlite3_step(sqlite3_stmt*); /* -** CAPI3REF: Number of columns in a result set {H13770} -** -** Returns the number of values in the current row of the result set. +** CAPI3REF: Number of columns in a result set ** -** Requirements: -** [H13771] [H13772] +** ^The sqlite3_data_count(P) the number of columns in the +** of the result set of [prepared statement] P. */ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt); /* -** CAPI3REF: Fundamental Datatypes {H10265} +** CAPI3REF: Fundamental Datatypes ** KEYWORDS: SQLITE_TEXT ** -** {H10266} Every value in SQLite has one of five fundamental datatypes: +** ^(Every value in SQLite has one of five fundamental datatypes: ** **
      **
    • 64-bit signed integer @@ -3450,7 +3407,7 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt); **
    • string **
    • BLOB **
    • NULL -**
    {END} +** )^ ** ** These constants are codes for each of those types. ** @@ -3471,17 +3428,19 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt); #define SQLITE3_TEXT 3 /* -** CAPI3REF: Result Values From A Query {H13800} +** CAPI3REF: Result Values From A Query ** KEYWORDS: {column access functions} ** -** These routines form the "result set query" interface. +** These routines form the "result set" interface. ** -** These routines return information about a single column of the current -** result row of a query. In every case the first argument is a pointer +** ^These routines return information about a single column of the current +** result row of a query. ^In every case the first argument is a pointer ** to the [prepared statement] that is being evaluated (the [sqlite3_stmt*] ** that was returned from [sqlite3_prepare_v2()] or one of its variants) ** and the second argument is the index of the column for which information -** should be returned. The leftmost column of the result set has the index 0. +** should be returned. ^The leftmost column of the result set has the index 0. +** ^The number of columns in the result can be determined using +** [sqlite3_column_count()]. ** ** If the SQL statement does not currently point to a valid row, or if the ** column index is out of range, the result is undefined. @@ -3495,9 +3454,9 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt); ** are called from a different thread while any of these routines ** are pending, then the results are undefined. ** -** The sqlite3_column_type() routine returns the +** ^The sqlite3_column_type() routine returns the ** [SQLITE_INTEGER | datatype code] for the initial data type -** of the result column. The returned value is one of [SQLITE_INTEGER], +** of the result column. ^The returned value is one of [SQLITE_INTEGER], ** [SQLITE_FLOAT], [SQLITE_TEXT], [SQLITE_BLOB], or [SQLITE_NULL]. The value ** returned by sqlite3_column_type() is only meaningful if no type ** conversions have occurred as described below. After a type conversion, @@ -3505,27 +3464,27 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt); ** versions of SQLite may change the behavior of sqlite3_column_type() ** following a type conversion. ** -** If the result is a BLOB or UTF-8 string then the sqlite3_column_bytes() +** ^If the result is a BLOB or UTF-8 string then the sqlite3_column_bytes() ** routine returns the number of bytes in that BLOB or string. -** If the result is a UTF-16 string, then sqlite3_column_bytes() converts +** ^If the result is a UTF-16 string, then sqlite3_column_bytes() converts ** the string to UTF-8 and then returns the number of bytes. -** If the result is a numeric value then sqlite3_column_bytes() uses +** ^If the result is a numeric value then sqlite3_column_bytes() uses ** [sqlite3_snprintf()] to convert that value to a UTF-8 string and returns ** the number of bytes in that string. -** The value returned does not include the zero terminator at the end -** of the string. For clarity: the value returned is the number of +** ^The value returned does not include the zero terminator at the end +** of the string. ^For clarity: the value returned is the number of ** bytes in the string, not the number of characters. ** -** Strings returned by sqlite3_column_text() and sqlite3_column_text16(), -** even empty strings, are always zero terminated. The return +** ^Strings returned by sqlite3_column_text() and sqlite3_column_text16(), +** even empty strings, are always zero terminated. ^The return ** value from sqlite3_column_blob() for a zero-length BLOB is an arbitrary ** pointer, possibly even a NULL pointer. ** -** The sqlite3_column_bytes16() routine is similar to sqlite3_column_bytes() +** ^The sqlite3_column_bytes16() routine is similar to sqlite3_column_bytes() ** but leaves the result in UTF-16 in native byte order instead of UTF-8. -** The zero terminator is not included in this count. +** ^The zero terminator is not included in this count. ** -** The object returned by [sqlite3_column_value()] is an +** ^The object returned by [sqlite3_column_value()] is an ** [unprotected sqlite3_value] object. An unprotected sqlite3_value object ** may only be used with [sqlite3_bind_value()] and [sqlite3_result_value()]. ** If the [unprotected sqlite3_value] object returned by @@ -3533,10 +3492,10 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt); ** to routines like [sqlite3_value_int()], [sqlite3_value_text()], ** or [sqlite3_value_bytes()], then the behavior is undefined. ** -** These routines attempt to convert the value where appropriate. For +** These routines attempt to convert the value where appropriate. ^For ** example, if the internal representation is FLOAT and a text result ** is requested, [sqlite3_snprintf()] is used internally to perform the -** conversion automatically. The following table details the conversions +** conversion automatically. ^(The following table details the conversions ** that are applied: ** **
    @@ -3560,7 +3519,7 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt); ** BLOB FLOAT Convert to TEXT then use atof() ** BLOB TEXT Add a zero terminator if needed ** -**
    +**
    )^ ** ** The table above makes reference to standard C library functions atoi() ** and atof(). SQLite does not really use these functions. It has its @@ -3568,10 +3527,10 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt); ** used in the table for brevity and because they are familiar to most ** C programmers. ** -** Note that when type conversions occur, pointers returned by prior +** ^Note that when type conversions occur, pointers returned by prior ** calls to sqlite3_column_blob(), sqlite3_column_text(), and/or ** sqlite3_column_text16() may be invalidated. -** Type conversions and pointer invalidations might occur +** ^(Type conversions and pointer invalidations might occur ** in the following cases: ** **
      @@ -3584,22 +3543,22 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt); **
    • The initial content is UTF-16 text and sqlite3_column_bytes() or ** sqlite3_column_text() is called. The content must be converted ** to UTF-8.
    • -**
    +** )^ ** -** Conversions between UTF-16be and UTF-16le are always done in place and do +** ^Conversions between UTF-16be and UTF-16le are always done in place and do ** not invalidate a prior pointer, though of course the content of the buffer ** that the prior pointer points to will have been modified. Other kinds ** of conversion are done in place when it is possible, but sometimes they ** are not possible and in those cases prior pointers are invalidated. ** -** The safest and easiest to remember policy is to invoke these routines +** ^(The safest and easiest to remember policy is to invoke these routines ** in one of the following ways: ** **
      **
    • sqlite3_column_text() followed by sqlite3_column_bytes()
    • **
    • sqlite3_column_blob() followed by sqlite3_column_bytes()
    • **
    • sqlite3_column_text16() followed by sqlite3_column_bytes16()
    • -**
    +** )^ ** ** In other words, you should call sqlite3_column_text(), ** sqlite3_column_blob(), or sqlite3_column_text16() first to force the result @@ -3609,22 +3568,18 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt); ** sqlite3_column_bytes16(), and do not mix calls to sqlite3_column_text16() ** with calls to sqlite3_column_bytes(). ** -** The pointers returned are valid until a type conversion occurs as +** ^The pointers returned are valid until a type conversion occurs as ** described above, or until [sqlite3_step()] or [sqlite3_reset()] or -** [sqlite3_finalize()] is called. The memory space used to hold strings +** [sqlite3_finalize()] is called. ^The memory space used to hold strings ** and BLOBs is freed automatically. Do not pass the pointers returned ** [sqlite3_column_blob()], [sqlite3_column_text()], etc. into ** [sqlite3_free()]. ** -** If a memory allocation error occurs during the evaluation of any +** ^(If a memory allocation error occurs during the evaluation of any ** of these routines, a default value is returned. The default value ** is either the integer 0, the floating point number 0.0, or a NULL ** pointer. Subsequent calls to [sqlite3_errcode()] will return -** [SQLITE_NOMEM]. -** -** Requirements: -** [H13803] [H13806] [H13809] [H13812] [H13815] [H13818] [H13821] [H13824] -** [H13827] [H13830] +** [SQLITE_NOMEM].)^ */ SQLITE_API const void *sqlite3_column_blob(sqlite3_stmt*, int iCol); SQLITE_API int sqlite3_column_bytes(sqlite3_stmt*, int iCol); @@ -3638,79 +3593,76 @@ SQLITE_API int sqlite3_column_type(sqlite3_stmt*, int iCol); SQLITE_API sqlite3_value *sqlite3_column_value(sqlite3_stmt*, int iCol); /* -** CAPI3REF: Destroy A Prepared Statement Object {H13300} +** CAPI3REF: Destroy A Prepared Statement Object ** -** The sqlite3_finalize() function is called to delete a [prepared statement]. -** If the statement was executed successfully or not executed at all, then -** SQLITE_OK is returned. If execution of the statement failed then an +** ^The sqlite3_finalize() function is called to delete a [prepared statement]. +** ^If the statement was executed successfully or not executed at all, then +** SQLITE_OK is returned. ^If execution of the statement failed then an ** [error code] or [extended error code] is returned. ** -** This routine can be called at any point during the execution of the -** [prepared statement]. If the virtual machine has not +** ^This routine can be called at any point during the execution of the +** [prepared statement]. ^If the virtual machine has not ** completed execution when this routine is called, that is like ** encountering an error or an [sqlite3_interrupt | interrupt]. -** Incomplete updates may be rolled back and transactions canceled, +** ^Incomplete updates may be rolled back and transactions canceled, ** depending on the circumstances, and the ** [error code] returned will be [SQLITE_ABORT]. -** -** Requirements: -** [H11302] [H11304] */ SQLITE_API int sqlite3_finalize(sqlite3_stmt *pStmt); /* -** CAPI3REF: Reset A Prepared Statement Object {H13330} +** CAPI3REF: Reset A Prepared Statement Object ** ** The sqlite3_reset() function is called to reset a [prepared statement] ** object back to its initial state, ready to be re-executed. -** Any SQL statement variables that had values bound to them using +** ^Any SQL statement variables that had values bound to them using ** the [sqlite3_bind_blob | sqlite3_bind_*() API] retain their values. ** Use [sqlite3_clear_bindings()] to reset the bindings. ** -** {H11332} The [sqlite3_reset(S)] interface resets the [prepared statement] S -** back to the beginning of its program. +** ^The [sqlite3_reset(S)] interface resets the [prepared statement] S +** back to the beginning of its program. ** -** {H11334} If the most recent call to [sqlite3_step(S)] for the -** [prepared statement] S returned [SQLITE_ROW] or [SQLITE_DONE], -** or if [sqlite3_step(S)] has never before been called on S, -** then [sqlite3_reset(S)] returns [SQLITE_OK]. +** ^If the most recent call to [sqlite3_step(S)] for the +** [prepared statement] S returned [SQLITE_ROW] or [SQLITE_DONE], +** or if [sqlite3_step(S)] has never before been called on S, +** then [sqlite3_reset(S)] returns [SQLITE_OK]. ** -** {H11336} If the most recent call to [sqlite3_step(S)] for the -** [prepared statement] S indicated an error, then -** [sqlite3_reset(S)] returns an appropriate [error code]. +** ^If the most recent call to [sqlite3_step(S)] for the +** [prepared statement] S indicated an error, then +** [sqlite3_reset(S)] returns an appropriate [error code]. ** -** {H11338} The [sqlite3_reset(S)] interface does not change the values -** of any [sqlite3_bind_blob|bindings] on the [prepared statement] S. +** ^The [sqlite3_reset(S)] interface does not change the values +** of any [sqlite3_bind_blob|bindings] on the [prepared statement] S. */ SQLITE_API int sqlite3_reset(sqlite3_stmt *pStmt); /* -** CAPI3REF: Create Or Redefine SQL Functions {H16100} +** CAPI3REF: Create Or Redefine SQL Functions ** KEYWORDS: {function creation routines} ** KEYWORDS: {application-defined SQL function} ** KEYWORDS: {application-defined SQL functions} ** -** These two functions (collectively known as "function creation routines") +** ^These two functions (collectively known as "function creation routines") ** are used to add SQL functions or aggregates or to redefine the behavior ** of existing SQL functions or aggregates. The only difference between the ** two is that the second parameter, the name of the (scalar) function or ** aggregate, is encoded in UTF-8 for sqlite3_create_function() and UTF-16 ** for sqlite3_create_function16(). ** -** The first parameter is the [database connection] to which the SQL -** function is to be added. If a single program uses more than one database -** connection internally, then SQL functions must be added individually to -** each database connection. +** ^The first parameter is the [database connection] to which the SQL +** function is to be added. ^If an application uses more than one database +** connection then application-defined SQL functions must be added +** to each database connection separately. ** ** The second parameter is the name of the SQL function to be created or -** redefined. The length of the name is limited to 255 bytes, exclusive of +** redefined. ^The length of the name is limited to 255 bytes, exclusive of ** the zero-terminator. Note that the name length limit is in bytes, not -** characters. Any attempt to create a function with a longer name +** characters. ^Any attempt to create a function with a longer name ** will result in [SQLITE_ERROR] being returned. ** -** The third parameter (nArg) +** ^The third parameter (nArg) ** is the number of arguments that the SQL function or -** aggregate takes. If this parameter is -1, then the SQL function or +** aggregate takes. ^If this parameter is -1, then the SQL function or ** aggregate may take any number of arguments between 0 and the limit ** set by [sqlite3_limit]([SQLITE_LIMIT_FUNCTION_ARG]). If the third ** parameter is less than -1 or greater than 127 then the behavior is @@ -3720,53 +3672,49 @@ SQLITE_API int sqlite3_reset(sqlite3_stmt *pStmt); ** [SQLITE_UTF8 | text encoding] this SQL function prefers for ** its parameters. Any SQL function implementation should be able to work ** work with UTF-8, UTF-16le, or UTF-16be. But some implementations may be -** more efficient with one encoding than another. An application may +** more efficient with one encoding than another. ^An application may ** invoke sqlite3_create_function() or sqlite3_create_function16() multiple ** times with the same function but with different values of eTextRep. -** When multiple implementations of the same function are available, SQLite +** ^When multiple implementations of the same function are available, SQLite ** will pick the one that involves the least amount of data conversion. ** If there is only a single implementation which does not care what text ** encoding is used, then the fourth argument should be [SQLITE_ANY]. ** -** The fifth parameter is an arbitrary pointer. The implementation of the -** function can gain access to this pointer using [sqlite3_user_data()]. +** ^(The fifth parameter is an arbitrary pointer. The implementation of the +** function can gain access to this pointer using [sqlite3_user_data()].)^ ** ** The seventh, eighth and ninth parameters, xFunc, xStep and xFinal, are ** pointers to C-language functions that implement the SQL function or -** aggregate. A scalar SQL function requires an implementation of the xFunc -** callback only, NULL pointers should be passed as the xStep and xFinal -** parameters. An aggregate SQL function requires an implementation of xStep -** and xFinal and NULL should be passed for xFunc. To delete an existing +** aggregate. ^A scalar SQL function requires an implementation of the xFunc +** callback only; NULL pointers should be passed as the xStep and xFinal +** parameters. ^An aggregate SQL function requires an implementation of xStep +** and xFinal and NULL should be passed for xFunc. ^To delete an existing ** SQL function or aggregate, pass NULL for all three function callbacks. ** -** It is permitted to register multiple implementations of the same +** ^It is permitted to register multiple implementations of the same ** functions with the same name but with either differing numbers of -** arguments or differing preferred text encodings. SQLite will use +** arguments or differing preferred text encodings. ^SQLite will use ** the implementation that most closely matches the way in which the -** SQL function is used. A function implementation with a non-negative +** SQL function is used. ^A function implementation with a non-negative ** nArg parameter is a better match than a function implementation with -** a negative nArg. A function where the preferred text encoding +** a negative nArg. ^A function where the preferred text encoding ** matches the database encoding is a better ** match than a function where the encoding is different. -** A function where the encoding difference is between UTF16le and UTF16be +** ^A function where the encoding difference is between UTF16le and UTF16be ** is a closer match than a function where the encoding difference is ** between UTF8 and UTF16. ** -** Built-in functions may be overloaded by new application-defined functions. -** The first application-defined function with a given name overrides all +** ^Built-in functions may be overloaded by new application-defined functions. +** ^The first application-defined function with a given name overrides all ** built-in functions in the same [database connection] with the same name. -** Subsequent application-defined functions of the same name only override +** ^Subsequent application-defined functions of the same name only override ** prior application-defined functions that are an exact match for the ** number of parameters and preferred encoding. ** -** An application-defined function is permitted to call other +** ^An application-defined function is permitted to call other ** SQLite interfaces. However, such calls must not ** close the database connection nor finalize or reset the prepared ** statement in which the function is running. -** -** Requirements: -** [H16103] [H16106] [H16109] [H16112] [H16118] [H16121] [H16127] -** [H16130] [H16133] [H16136] [H16139] [H16142] */ SQLITE_API int sqlite3_create_function( sqlite3 *db, @@ -3790,7 +3738,7 @@ SQLITE_API int sqlite3_create_function16( ); /* -** CAPI3REF: Text Encodings {H10267} +** CAPI3REF: Text Encodings ** ** These constant define integer codes that represent the various ** text encodings supported by SQLite. @@ -3822,7 +3770,7 @@ SQLITE_API SQLITE_DEPRECATED int sqlite3_memory_alarm(void(*)(void*,sqlite3_int6 #endif /* -** CAPI3REF: Obtaining SQL Function Parameter Values {H15100} +** CAPI3REF: Obtaining SQL Function Parameter Values ** ** The C-language implementation of SQL functions and aggregates uses ** this set of interface routines to access the parameter values on @@ -3840,22 +3788,22 @@ SQLITE_API SQLITE_DEPRECATED int sqlite3_memory_alarm(void(*)(void*,sqlite3_int6 ** Any attempt to use these routines on an [unprotected sqlite3_value] ** object results in undefined behavior. ** -** These routines work just like the corresponding [column access functions] +** ^These routines work just like the corresponding [column access functions] ** except that these routines take a single [protected sqlite3_value] object ** pointer instead of a [sqlite3_stmt*] pointer and an integer column number. ** -** The sqlite3_value_text16() interface extracts a UTF-16 string -** in the native byte-order of the host machine. The +** ^The sqlite3_value_text16() interface extracts a UTF-16 string +** in the native byte-order of the host machine. ^The ** sqlite3_value_text16be() and sqlite3_value_text16le() interfaces ** extract UTF-16 strings as big-endian and little-endian respectively. ** -** The sqlite3_value_numeric_type() interface attempts to apply +** ^(The sqlite3_value_numeric_type() interface attempts to apply ** numeric affinity to the value. This means that an attempt is ** made to convert the value to an integer or floating point. If ** such a conversion is possible without loss of information (in other ** words, if the value is a string that looks like a number) ** then the conversion is performed. Otherwise no conversion occurs. -** The [SQLITE_INTEGER | datatype] after conversion is returned. +** The [SQLITE_INTEGER | datatype] after conversion is returned.)^ ** ** Please pay particular attention to the fact that the pointer returned ** from [sqlite3_value_blob()], [sqlite3_value_text()], or @@ -3865,10 +3813,6 @@ SQLITE_API SQLITE_DEPRECATED int sqlite3_memory_alarm(void(*)(void*,sqlite3_int6 ** ** These routines must be called from the same thread as ** the SQL function that supplied the [sqlite3_value*] parameters. -** -** Requirements: -** [H15103] [H15106] [H15109] [H15112] [H15115] [H15118] [H15121] [H15124] -** [H15127] [H15130] [H15133] [H15136] */ SQLITE_API const void *sqlite3_value_blob(sqlite3_value*); SQLITE_API int sqlite3_value_bytes(sqlite3_value*); @@ -3884,66 +3828,73 @@ SQLITE_API int sqlite3_value_type(sqlite3_value*); SQLITE_API int sqlite3_value_numeric_type(sqlite3_value*); /* -** CAPI3REF: Obtain Aggregate Function Context {H16210} +** CAPI3REF: Obtain Aggregate Function Context ** -** The implementation of aggregate SQL functions use this routine to allocate -** a structure for storing their state. +** Implementions of aggregate SQL functions use this +** routine to allocate memory for storing their state. ** -** The first time the sqlite3_aggregate_context() routine is called for a -** particular aggregate, SQLite allocates nBytes of memory, zeroes out that -** memory, and returns a pointer to it. On second and subsequent calls to -** sqlite3_aggregate_context() for the same aggregate function index, -** the same buffer is returned. The implementation of the aggregate can use -** the returned buffer to accumulate data. +** ^The first time the sqlite3_aggregate_context(C,N) routine is called +** for a particular aggregate function, SQLite +** allocates N of memory, zeroes out that memory, and returns a pointer +** to the new memory. ^On second and subsequent calls to +** sqlite3_aggregate_context() for the same aggregate function instance, +** the same buffer is returned. Sqlite3_aggregate_context() is normally +** called once for each invocation of the xStep callback and then one +** last time when the xFinal callback is invoked. ^(When no rows match +** an aggregate query, the xStep() callback of the aggregate function +** implementation is never called and xFinal() is called exactly once. +** In those cases, sqlite3_aggregate_context() might be called for the +** first time from within xFinal().)^ ** -** SQLite automatically frees the allocated buffer when the aggregate -** query concludes. +** ^The sqlite3_aggregate_context(C,N) routine returns a NULL pointer if N is +** less than or equal to zero or if a memory allocate error occurs. ** -** The first parameter should be a copy of the +** ^(The amount of space allocated by sqlite3_aggregate_context(C,N) is +** determined by the N parameter on first successful call. Changing the +** value of N in subsequent call to sqlite3_aggregate_context() within +** the same aggregate function instance will not resize the memory +** allocation.)^ +** +** ^SQLite automatically frees the memory allocated by +** sqlite3_aggregate_context() when the aggregate query concludes. +** +** The first parameter must be a copy of the ** [sqlite3_context | SQL function context] that is the first parameter -** to the callback routine that implements the aggregate function. +** to the xStep or xFinal callback routine that implements the aggregate +** function. ** ** This routine must be called from the same thread in which ** the aggregate SQL function is running. -** -** Requirements: -** [H16211] [H16213] [H16215] [H16217] */ SQLITE_API void *sqlite3_aggregate_context(sqlite3_context*, int nBytes); /* -** CAPI3REF: User Data For Functions {H16240} +** CAPI3REF: User Data For Functions ** -** The sqlite3_user_data() interface returns a copy of +** ^The sqlite3_user_data() interface returns a copy of ** the pointer that was the pUserData parameter (the 5th parameter) ** of the [sqlite3_create_function()] ** and [sqlite3_create_function16()] routines that originally -** registered the application defined function. {END} +** registered the application defined function. ** ** This routine must be called from the same thread in which ** the application-defined function is running. -** -** Requirements: -** [H16243] */ SQLITE_API void *sqlite3_user_data(sqlite3_context*); /* -** CAPI3REF: Database Connection For Functions {H16250} +** CAPI3REF: Database Connection For Functions ** -** The sqlite3_context_db_handle() interface returns a copy of +** ^The sqlite3_context_db_handle() interface returns a copy of ** the pointer to the [database connection] (the 1st parameter) ** of the [sqlite3_create_function()] ** and [sqlite3_create_function16()] routines that originally ** registered the application defined function. -** -** Requirements: -** [H16253] */ SQLITE_API sqlite3 *sqlite3_context_db_handle(sqlite3_context*); /* -** CAPI3REF: Function Auxiliary Data {H16270} +** CAPI3REF: Function Auxiliary Data ** ** The following two functions may be used by scalar SQL functions to ** associate metadata with argument values. If the same value is passed to @@ -3956,48 +3907,45 @@ SQLITE_API sqlite3 *sqlite3_context_db_handle(sqlite3_context*); ** invocations of the same function so that the original pattern string ** does not need to be recompiled on each invocation. ** -** The sqlite3_get_auxdata() interface returns a pointer to the metadata +** ^The sqlite3_get_auxdata() interface returns a pointer to the metadata ** associated by the sqlite3_set_auxdata() function with the Nth argument -** value to the application-defined function. If no metadata has been ever +** value to the application-defined function. ^If no metadata has been ever ** been set for the Nth argument of the function, or if the corresponding ** function parameter has changed since the meta-data was set, ** then sqlite3_get_auxdata() returns a NULL pointer. ** -** The sqlite3_set_auxdata() interface saves the metadata +** ^The sqlite3_set_auxdata() interface saves the metadata ** pointed to by its 3rd parameter as the metadata for the N-th ** argument of the application-defined function. Subsequent ** calls to sqlite3_get_auxdata() might return this data, if it has ** not been destroyed. -** If it is not NULL, SQLite will invoke the destructor +** ^If it is not NULL, SQLite will invoke the destructor ** function given by the 4th parameter to sqlite3_set_auxdata() on ** the metadata when the corresponding function parameter changes ** or when the SQL statement completes, whichever comes first. ** ** SQLite is free to call the destructor and drop metadata on any -** parameter of any function at any time. The only guarantee is that +** parameter of any function at any time. ^The only guarantee is that ** the destructor will be called before the metadata is dropped. ** -** In practice, metadata is preserved between function calls for +** ^(In practice, metadata is preserved between function calls for ** expressions that are constant at compile time. This includes literal -** values and SQL variables. +** values and [parameters].)^ ** ** These routines must be called from the same thread in which ** the SQL function is running. -** -** Requirements: -** [H16272] [H16274] [H16276] [H16277] [H16278] [H16279] */ SQLITE_API void *sqlite3_get_auxdata(sqlite3_context*, int N); SQLITE_API void sqlite3_set_auxdata(sqlite3_context*, int N, void*, void (*)(void*)); /* -** CAPI3REF: Constants Defining Special Destructor Behavior {H10280} +** CAPI3REF: Constants Defining Special Destructor Behavior ** ** These are special values for the destructor that is passed in as the -** final argument to routines like [sqlite3_result_blob()]. If the destructor +** final argument to routines like [sqlite3_result_blob()]. ^If the destructor ** argument is SQLITE_STATIC, it means that the content pointer is constant -** and will never change. It does not need to be destroyed. The +** and will never change. It does not need to be destroyed. ^The ** SQLITE_TRANSIENT value means that the content will likely change in ** the near future and that SQLite should make its own private copy of ** the content before returning. @@ -4010,7 +3958,7 @@ typedef void (*sqlite3_destructor_type)(void*); #define SQLITE_TRANSIENT ((sqlite3_destructor_type)-1) /* -** CAPI3REF: Setting The Result Of An SQL Function {H16400} +** CAPI3REF: Setting The Result Of An SQL Function ** ** These routines are used by the xFunc or xFinal callbacks that ** implement SQL functions and aggregates. See @@ -4021,103 +3969,98 @@ typedef void (*sqlite3_destructor_type)(void*); ** functions used to bind values to host parameters in prepared statements. ** Refer to the [SQL parameter] documentation for additional information. ** -** The sqlite3_result_blob() interface sets the result from +** ^The sqlite3_result_blob() interface sets the result from ** an application-defined function to be the BLOB whose content is pointed ** to by the second parameter and which is N bytes long where N is the ** third parameter. ** -** The sqlite3_result_zeroblob() interfaces set the result of +** ^The sqlite3_result_zeroblob() interfaces set the result of ** the application-defined function to be a BLOB containing all zero ** bytes and N bytes in size, where N is the value of the 2nd parameter. ** -** The sqlite3_result_double() interface sets the result from +** ^The sqlite3_result_double() interface sets the result from ** an application-defined function to be a floating point value specified ** by its 2nd argument. ** -** The sqlite3_result_error() and sqlite3_result_error16() functions +** ^The sqlite3_result_error() and sqlite3_result_error16() functions ** cause the implemented SQL function to throw an exception. -** SQLite uses the string pointed to by the +** ^SQLite uses the string pointed to by the ** 2nd parameter of sqlite3_result_error() or sqlite3_result_error16() -** as the text of an error message. SQLite interprets the error -** message string from sqlite3_result_error() as UTF-8. SQLite +** as the text of an error message. ^SQLite interprets the error +** message string from sqlite3_result_error() as UTF-8. ^SQLite ** interprets the string from sqlite3_result_error16() as UTF-16 in native -** byte order. If the third parameter to sqlite3_result_error() +** byte order. ^If the third parameter to sqlite3_result_error() ** or sqlite3_result_error16() is negative then SQLite takes as the error ** message all text up through the first zero character. -** If the third parameter to sqlite3_result_error() or +** ^If the third parameter to sqlite3_result_error() or ** sqlite3_result_error16() is non-negative then SQLite takes that many ** bytes (not characters) from the 2nd parameter as the error message. -** The sqlite3_result_error() and sqlite3_result_error16() +** ^The sqlite3_result_error() and sqlite3_result_error16() ** routines make a private copy of the error message text before ** they return. Hence, the calling function can deallocate or ** modify the text after they return without harm. -** The sqlite3_result_error_code() function changes the error code -** returned by SQLite as a result of an error in a function. By default, -** the error code is SQLITE_ERROR. A subsequent call to sqlite3_result_error() +** ^The sqlite3_result_error_code() function changes the error code +** returned by SQLite as a result of an error in a function. ^By default, +** the error code is SQLITE_ERROR. ^A subsequent call to sqlite3_result_error() ** or sqlite3_result_error16() resets the error code to SQLITE_ERROR. ** -** The sqlite3_result_toobig() interface causes SQLite to throw an error -** indicating that a string or BLOB is to long to represent. +** ^The sqlite3_result_toobig() interface causes SQLite to throw an error +** indicating that a string or BLOB is too long to represent. ** -** The sqlite3_result_nomem() interface causes SQLite to throw an error +** ^The sqlite3_result_nomem() interface causes SQLite to throw an error ** indicating that a memory allocation failed. ** -** The sqlite3_result_int() interface sets the return value +** ^The sqlite3_result_int() interface sets the return value ** of the application-defined function to be the 32-bit signed integer ** value given in the 2nd argument. -** The sqlite3_result_int64() interface sets the return value +** ^The sqlite3_result_int64() interface sets the return value ** of the application-defined function to be the 64-bit signed integer ** value given in the 2nd argument. ** -** The sqlite3_result_null() interface sets the return value +** ^The sqlite3_result_null() interface sets the return value ** of the application-defined function to be NULL. ** -** The sqlite3_result_text(), sqlite3_result_text16(), +** ^The sqlite3_result_text(), sqlite3_result_text16(), ** sqlite3_result_text16le(), and sqlite3_result_text16be() interfaces ** set the return value of the application-defined function to be ** a text string which is represented as UTF-8, UTF-16 native byte order, ** UTF-16 little endian, or UTF-16 big endian, respectively. -** SQLite takes the text result from the application from +** ^SQLite takes the text result from the application from ** the 2nd parameter of the sqlite3_result_text* interfaces. -** If the 3rd parameter to the sqlite3_result_text* interfaces +** ^If the 3rd parameter to the sqlite3_result_text* interfaces ** is negative, then SQLite takes result text from the 2nd parameter ** through the first zero character. -** If the 3rd parameter to the sqlite3_result_text* interfaces +** ^If the 3rd parameter to the sqlite3_result_text* interfaces ** is non-negative, then as many bytes (not characters) of the text ** pointed to by the 2nd parameter are taken as the application-defined ** function result. -** If the 4th parameter to the sqlite3_result_text* interfaces +** ^If the 4th parameter to the sqlite3_result_text* interfaces ** or sqlite3_result_blob is a non-NULL pointer, then SQLite calls that ** function as the destructor on the text or BLOB result when it has ** finished using that result. -** If the 4th parameter to the sqlite3_result_text* interfaces or to +** ^If the 4th parameter to the sqlite3_result_text* interfaces or to ** sqlite3_result_blob is the special constant SQLITE_STATIC, then SQLite ** assumes that the text or BLOB result is in constant space and does not ** copy the content of the parameter nor call a destructor on the content ** when it has finished using that result. -** If the 4th parameter to the sqlite3_result_text* interfaces +** ^If the 4th parameter to the sqlite3_result_text* interfaces ** or sqlite3_result_blob is the special constant SQLITE_TRANSIENT ** then SQLite makes a copy of the result into space obtained from ** from [sqlite3_malloc()] before it returns. ** -** The sqlite3_result_value() interface sets the result of +** ^The sqlite3_result_value() interface sets the result of ** the application-defined function to be a copy the -** [unprotected sqlite3_value] object specified by the 2nd parameter. The +** [unprotected sqlite3_value] object specified by the 2nd parameter. ^The ** sqlite3_result_value() interface makes a copy of the [sqlite3_value] ** so that the [sqlite3_value] specified in the parameter may change or ** be deallocated after sqlite3_result_value() returns without harm. -** A [protected sqlite3_value] object may always be used where an +** ^A [protected sqlite3_value] object may always be used where an ** [unprotected sqlite3_value] object is required, so either ** kind of [sqlite3_value] object can be used with this interface. ** ** If these routines are called from within the different thread ** than the one containing the application-defined function that received ** the [sqlite3_context] pointer, the results are undefined. -** -** Requirements: -** [H16403] [H16406] [H16409] [H16412] [H16415] [H16418] [H16421] [H16424] -** [H16427] [H16430] [H16433] [H16436] [H16439] [H16442] [H16445] [H16448] -** [H16451] [H16454] [H16457] [H16460] [H16463] */ SQLITE_API void sqlite3_result_blob(sqlite3_context*, const void*, int, void(*)(void*)); SQLITE_API void sqlite3_result_double(sqlite3_context*, double); @@ -4137,20 +4080,20 @@ SQLITE_API void sqlite3_result_value(sqlite3_context*, sqlite3_value*); SQLITE_API void sqlite3_result_zeroblob(sqlite3_context*, int n); /* -** CAPI3REF: Define New Collating Sequences {H16600} +** CAPI3REF: Define New Collating Sequences ** ** These functions are used to add new collation sequences to the ** [database connection] specified as the first argument. ** -** The name of the new collation sequence is specified as a UTF-8 string +** ^The name of the new collation sequence is specified as a UTF-8 string ** for sqlite3_create_collation() and sqlite3_create_collation_v2() -** and a UTF-16 string for sqlite3_create_collation16(). In all cases +** and a UTF-16 string for sqlite3_create_collation16(). ^In all cases ** the name is passed as the second function argument. ** -** The third argument may be one of the constants [SQLITE_UTF8], +** ^The third argument may be one of the constants [SQLITE_UTF8], ** [SQLITE_UTF16LE], or [SQLITE_UTF16BE], indicating that the user-supplied ** routine expects to be passed pointers to strings encoded using UTF-8, -** UTF-16 little-endian, or UTF-16 big-endian, respectively. The +** UTF-16 little-endian, or UTF-16 big-endian, respectively. ^The ** third argument might also be [SQLITE_UTF16] to indicate that the routine ** expects pointers to be UTF-16 strings in the native byte order, or the ** argument can be [SQLITE_UTF16_ALIGNED] if the @@ -4158,33 +4101,29 @@ SQLITE_API void sqlite3_result_zeroblob(sqlite3_context*, int n); ** of UTF-16 in the native byte order. ** ** A pointer to the user supplied routine must be passed as the fifth -** argument. If it is NULL, this is the same as deleting the collation +** argument. ^If it is NULL, this is the same as deleting the collation ** sequence (so that SQLite cannot call it anymore). -** Each time the application supplied function is invoked, it is passed +** ^Each time the application supplied function is invoked, it is passed ** as its first parameter a copy of the void* passed as the fourth argument ** to sqlite3_create_collation() or sqlite3_create_collation16(). ** -** The remaining arguments to the application-supplied routine are two strings, +** ^The remaining arguments to the application-supplied routine are two strings, ** each represented by a (length, data) pair and encoded in the encoding ** that was passed as the third argument when the collation sequence was -** registered. {END} The application defined collation routine should +** registered. The application defined collation routine should ** return negative, zero or positive if the first string is less than, ** equal to, or greater than the second string. i.e. (STRING1 - STRING2). ** -** The sqlite3_create_collation_v2() works like sqlite3_create_collation() +** ^The sqlite3_create_collation_v2() works like sqlite3_create_collation() ** except that it takes an extra argument which is a destructor for -** the collation. The destructor is called when the collation is +** the collation. ^The destructor is called when the collation is ** destroyed and is passed a copy of the fourth parameter void* pointer ** of the sqlite3_create_collation_v2(). -** Collations are destroyed when they are overridden by later calls to the +** ^Collations are destroyed when they are overridden by later calls to the ** collation creation functions or when the [database connection] is closed ** using [sqlite3_close()]. ** ** See also: [sqlite3_collation_needed()] and [sqlite3_collation_needed16()]. -** -** Requirements: -** [H16603] [H16604] [H16606] [H16609] [H16612] [H16615] [H16618] [H16621] -** [H16624] [H16627] [H16630] */ SQLITE_API int sqlite3_create_collation( sqlite3*, @@ -4210,33 +4149,30 @@ SQLITE_API int sqlite3_create_collation16( ); /* -** CAPI3REF: Collation Needed Callbacks {H16700} +** CAPI3REF: Collation Needed Callbacks ** -** To avoid having to register all collation sequences before a database +** ^To avoid having to register all collation sequences before a database ** can be used, a single callback function may be registered with the -** [database connection] to be called whenever an undefined collation +** [database connection] to be invoked whenever an undefined collation ** sequence is required. ** -** If the function is registered using the sqlite3_collation_needed() API, +** ^If the function is registered using the sqlite3_collation_needed() API, ** then it is passed the names of undefined collation sequences as strings -** encoded in UTF-8. {H16703} If sqlite3_collation_needed16() is used, +** encoded in UTF-8. ^If sqlite3_collation_needed16() is used, ** the names are passed as UTF-16 in machine native byte order. -** A call to either function replaces any existing callback. +** ^A call to either function replaces the existing collation-needed callback. ** -** When the callback is invoked, the first argument passed is a copy +** ^(When the callback is invoked, the first argument passed is a copy ** of the second argument to sqlite3_collation_needed() or ** sqlite3_collation_needed16(). The second argument is the database ** connection. The third argument is one of [SQLITE_UTF8], [SQLITE_UTF16BE], ** or [SQLITE_UTF16LE], indicating the most desirable form of the collation ** sequence function required. The fourth parameter is the name of the -** required collation sequence. +** required collation sequence.)^ ** ** The callback function should register the desired collation using ** [sqlite3_create_collation()], [sqlite3_create_collation16()], or ** [sqlite3_create_collation_v2()]. -** -** Requirements: -** [H16702] [H16704] [H16706] */ SQLITE_API int sqlite3_collation_needed( sqlite3*, @@ -4275,29 +4211,28 @@ SQLITE_API int sqlite3_rekey( ); /* -** CAPI3REF: Suspend Execution For A Short Time {H10530} +** CAPI3REF: Suspend Execution For A Short Time ** -** The sqlite3_sleep() function causes the current thread to suspend execution +** ^The sqlite3_sleep() function causes the current thread to suspend execution ** for at least a number of milliseconds specified in its parameter. ** -** If the operating system does not support sleep requests with +** ^If the operating system does not support sleep requests with ** millisecond time resolution, then the time will be rounded up to -** the nearest second. The number of milliseconds of sleep actually +** the nearest second. ^The number of milliseconds of sleep actually ** requested from the operating system is returned. ** -** SQLite implements this interface by calling the xSleep() +** ^SQLite implements this interface by calling the xSleep() ** method of the default [sqlite3_vfs] object. -** -** Requirements: [H10533] [H10536] */ SQLITE_API int sqlite3_sleep(int); /* -** CAPI3REF: Name Of The Folder Holding Temporary Files {H10310} +** CAPI3REF: Name Of The Folder Holding Temporary Files ** -** If this global variable is made to point to a string which is +** ^(If this global variable is made to point to a string which is ** the name of a folder (a.k.a. directory), then all temporary files -** created by SQLite will be placed in that directory. If this variable +** created by SQLite when using a built-in [sqlite3_vfs | VFS] +** will be placed in that directory.)^ ^If this variable ** is a NULL pointer, then SQLite performs a search for an appropriate ** temporary file directory. ** @@ -4310,8 +4245,8 @@ SQLITE_API int sqlite3_sleep(int); ** routines have been called and that this variable remain unchanged ** thereafter. ** -** The [temp_store_directory pragma] may modify this variable and cause -** it to point to memory obtained from [sqlite3_malloc]. Furthermore, +** ^The [temp_store_directory pragma] may modify this variable and cause +** it to point to memory obtained from [sqlite3_malloc]. ^Furthermore, ** the [temp_store_directory pragma] always assumes that any string ** that this variable points to is held in memory obtained from ** [sqlite3_malloc] and the pragma may attempt to free that memory @@ -4323,14 +4258,14 @@ SQLITE_API int sqlite3_sleep(int); SQLITE_API char *sqlite3_temp_directory; /* -** CAPI3REF: Test For Auto-Commit Mode {H12930} +** CAPI3REF: Test For Auto-Commit Mode ** KEYWORDS: {autocommit mode} ** -** The sqlite3_get_autocommit() interface returns non-zero or +** ^The sqlite3_get_autocommit() interface returns non-zero or ** zero if the given database connection is or is not in autocommit mode, -** respectively. Autocommit mode is on by default. -** Autocommit mode is disabled by a [BEGIN] statement. -** Autocommit mode is re-enabled by a [COMMIT] or [ROLLBACK]. +** respectively. ^Autocommit mode is on by default. +** ^Autocommit mode is disabled by a [BEGIN] statement. +** ^Autocommit mode is re-enabled by a [COMMIT] or [ROLLBACK]. ** ** If certain kinds of errors occur on a statement within a multi-statement ** transaction (errors including [SQLITE_FULL], [SQLITE_IOERR], @@ -4342,58 +4277,55 @@ SQLITE_API char *sqlite3_temp_directory; ** If another thread changes the autocommit status of the database ** connection while this routine is running, then the return value ** is undefined. -** -** Requirements: [H12931] [H12932] [H12933] [H12934] */ SQLITE_API int sqlite3_get_autocommit(sqlite3*); /* -** CAPI3REF: Find The Database Handle Of A Prepared Statement {H13120} +** CAPI3REF: Find The Database Handle Of A Prepared Statement ** -** The sqlite3_db_handle interface returns the [database connection] handle -** to which a [prepared statement] belongs. The [database connection] -** returned by sqlite3_db_handle is the same [database connection] that was the first argument +** ^The sqlite3_db_handle interface returns the [database connection] handle +** to which a [prepared statement] belongs. ^The [database connection] +** returned by sqlite3_db_handle is the same [database connection] +** that was the first argument ** to the [sqlite3_prepare_v2()] call (or its variants) that was used to ** create the statement in the first place. -** -** Requirements: [H13123] */ SQLITE_API sqlite3 *sqlite3_db_handle(sqlite3_stmt*); /* -** CAPI3REF: Find the next prepared statement {H13140} +** CAPI3REF: Find the next prepared statement ** -** This interface returns a pointer to the next [prepared statement] after -** pStmt associated with the [database connection] pDb. If pStmt is NULL +** ^This interface returns a pointer to the next [prepared statement] after +** pStmt associated with the [database connection] pDb. ^If pStmt is NULL ** then this interface returns a pointer to the first prepared statement -** associated with the database connection pDb. If no prepared statement +** associated with the database connection pDb. ^If no prepared statement ** satisfies the conditions of this routine, it returns NULL. ** ** The [database connection] pointer D in a call to ** [sqlite3_next_stmt(D,S)] must refer to an open database ** connection and in particular must not be a NULL pointer. -** -** Requirements: [H13143] [H13146] [H13149] [H13152] */ SQLITE_API sqlite3_stmt *sqlite3_next_stmt(sqlite3 *pDb, sqlite3_stmt *pStmt); /* -** CAPI3REF: Commit And Rollback Notification Callbacks {H12950} +** CAPI3REF: Commit And Rollback Notification Callbacks ** -** The sqlite3_commit_hook() interface registers a callback +** ^The sqlite3_commit_hook() interface registers a callback ** function to be invoked whenever a transaction is [COMMIT | committed]. -** Any callback set by a previous call to sqlite3_commit_hook() +** ^Any callback set by a previous call to sqlite3_commit_hook() ** for the same database connection is overridden. -** The sqlite3_rollback_hook() interface registers a callback +** ^The sqlite3_rollback_hook() interface registers a callback ** function to be invoked whenever a transaction is [ROLLBACK | rolled back]. -** Any callback set by a previous call to sqlite3_commit_hook() +** ^Any callback set by a previous call to sqlite3_rollback_hook() ** for the same database connection is overridden. -** The pArg argument is passed through to the callback. -** If the callback on a commit hook function returns non-zero, +** ^The pArg argument is passed through to the callback. +** ^If the callback on a commit hook function returns non-zero, ** then the commit is converted into a rollback. ** -** If another function was previously registered, its -** pArg value is returned. Otherwise NULL is returned. +** ^The sqlite3_commit_hook(D,C,P) and sqlite3_rollback_hook(D,C,P) functions +** return the P argument from the previous call of the same function +** on the same [database connection] D, or NULL for +** the first call for each function on D. ** ** The callback implementation must not do anything that will modify ** the database connection that invoked the callback. Any actions @@ -4403,59 +4335,54 @@ SQLITE_API sqlite3_stmt *sqlite3_next_stmt(sqlite3 *pDb, sqlite3_stmt *pStmt); ** Note that [sqlite3_prepare_v2()] and [sqlite3_step()] both modify their ** database connections for the meaning of "modify" in this paragraph. ** -** Registering a NULL function disables the callback. +** ^Registering a NULL function disables the callback. ** -** When the commit hook callback routine returns zero, the [COMMIT] -** operation is allowed to continue normally. If the commit hook +** ^When the commit hook callback routine returns zero, the [COMMIT] +** operation is allowed to continue normally. ^If the commit hook ** returns non-zero, then the [COMMIT] is converted into a [ROLLBACK]. -** The rollback hook is invoked on a rollback that results from a commit +** ^The rollback hook is invoked on a rollback that results from a commit ** hook returning non-zero, just as it would be with any other rollback. ** -** For the purposes of this API, a transaction is said to have been +** ^For the purposes of this API, a transaction is said to have been ** rolled back if an explicit "ROLLBACK" statement is executed, or ** an error or constraint causes an implicit rollback to occur. -** The rollback callback is not invoked if a transaction is +** ^The rollback callback is not invoked if a transaction is ** automatically rolled back because the database connection is closed. -** The rollback callback is not invoked if a transaction is +** ^The rollback callback is not invoked if a transaction is ** rolled back because a commit callback returned non-zero. -** Check on this ** ** See also the [sqlite3_update_hook()] interface. -** -** Requirements: -** [H12951] [H12952] [H12953] [H12954] [H12955] -** [H12961] [H12962] [H12963] [H12964] */ SQLITE_API void *sqlite3_commit_hook(sqlite3*, int(*)(void*), void*); SQLITE_API void *sqlite3_rollback_hook(sqlite3*, void(*)(void *), void*); /* -** CAPI3REF: Data Change Notification Callbacks {H12970} +** CAPI3REF: Data Change Notification Callbacks ** -** The sqlite3_update_hook() interface registers a callback function +** ^The sqlite3_update_hook() interface registers a callback function ** with the [database connection] identified by the first argument ** to be invoked whenever a row is updated, inserted or deleted. -** Any callback set by a previous call to this function +** ^Any callback set by a previous call to this function ** for the same database connection is overridden. ** -** The second argument is a pointer to the function to invoke when a +** ^The second argument is a pointer to the function to invoke when a ** row is updated, inserted or deleted. -** The first argument to the callback is a copy of the third argument +** ^The first argument to the callback is a copy of the third argument ** to sqlite3_update_hook(). -** The second callback argument is one of [SQLITE_INSERT], [SQLITE_DELETE], +** ^The second callback argument is one of [SQLITE_INSERT], [SQLITE_DELETE], ** or [SQLITE_UPDATE], depending on the operation that caused the callback ** to be invoked. -** The third and fourth arguments to the callback contain pointers to the +** ^The third and fourth arguments to the callback contain pointers to the ** database and table name containing the affected row. -** The final callback parameter is the [rowid] of the row. -** In the case of an update, this is the [rowid] after the update takes place. +** ^The final callback parameter is the [rowid] of the row. +** ^In the case of an update, this is the [rowid] after the update takes place. ** -** The update hook is not invoked when internal system tables are -** modified (i.e. sqlite_master and sqlite_sequence). +** ^(The update hook is not invoked when internal system tables are +** modified (i.e. sqlite_master and sqlite_sequence).)^ ** -** In the current implementation, the update hook +** ^In the current implementation, the update hook ** is not invoked when duplication rows are deleted because of an -** [ON CONFLICT | ON CONFLICT REPLACE] clause. Nor is the update hook +** [ON CONFLICT | ON CONFLICT REPLACE] clause. ^Nor is the update hook ** invoked when rows are deleted using the [truncate optimization]. ** The exceptions defined in this paragraph might change in a future ** release of SQLite. @@ -4467,14 +4394,13 @@ SQLITE_API void *sqlite3_rollback_hook(sqlite3*, void(*)(void *), void*); ** Note that [sqlite3_prepare_v2()] and [sqlite3_step()] both modify their ** database connections for the meaning of "modify" in this paragraph. ** -** If another function was previously registered, its pArg value -** is returned. Otherwise NULL is returned. +** ^The sqlite3_update_hook(D,C,P) function +** returns the P argument from the previous call +** on the same [database connection] D, or NULL for +** the first call on D. ** ** See also the [sqlite3_commit_hook()] and [sqlite3_rollback_hook()] ** interfaces. -** -** Requirements: -** [H12971] [H12973] [H12975] [H12977] [H12979] [H12981] [H12983] [H12986] */ SQLITE_API void *sqlite3_update_hook( sqlite3*, @@ -4483,74 +4409,66 @@ SQLITE_API void *sqlite3_update_hook( ); /* -** CAPI3REF: Enable Or Disable Shared Pager Cache {H10330} +** CAPI3REF: Enable Or Disable Shared Pager Cache ** KEYWORDS: {shared cache} ** -** This routine enables or disables the sharing of the database cache +** ^(This routine enables or disables the sharing of the database cache ** and schema data structures between [database connection | connections] ** to the same database. Sharing is enabled if the argument is true -** and disabled if the argument is false. +** and disabled if the argument is false.)^ ** -** Cache sharing is enabled and disabled for an entire process. +** ^Cache sharing is enabled and disabled for an entire process. ** This is a change as of SQLite version 3.5.0. In prior versions of SQLite, ** sharing was enabled or disabled for each thread separately. ** -** The cache sharing mode set by this interface effects all subsequent +** ^(The cache sharing mode set by this interface effects all subsequent ** calls to [sqlite3_open()], [sqlite3_open_v2()], and [sqlite3_open16()]. ** Existing database connections continue use the sharing mode -** that was in effect at the time they were opened. -** -** Virtual tables cannot be used with a shared cache. When shared -** cache is enabled, the [sqlite3_create_module()] API used to register -** virtual tables will always return an error. +** that was in effect at the time they were opened.)^ ** -** This routine returns [SQLITE_OK] if shared cache was enabled or disabled -** successfully. An [error code] is returned otherwise. +** ^(This routine returns [SQLITE_OK] if shared cache was enabled or disabled +** successfully. An [error code] is returned otherwise.)^ ** -** Shared cache is disabled by default. But this might change in +** ^Shared cache is disabled by default. But this might change in ** future releases of SQLite. Applications that care about shared ** cache setting should set it explicitly. ** ** See Also: [SQLite Shared-Cache Mode] -** -** Requirements: [H10331] [H10336] [H10337] [H10339] */ SQLITE_API int sqlite3_enable_shared_cache(int); /* -** CAPI3REF: Attempt To Free Heap Memory {H17340} +** CAPI3REF: Attempt To Free Heap Memory ** -** The sqlite3_release_memory() interface attempts to free N bytes +** ^The sqlite3_release_memory() interface attempts to free N bytes ** of heap memory by deallocating non-essential memory allocations -** held by the database library. {END} Memory used to cache database +** held by the database library. Memory used to cache database ** pages to improve performance is an example of non-essential memory. -** sqlite3_release_memory() returns the number of bytes actually freed, +** ^sqlite3_release_memory() returns the number of bytes actually freed, ** which might be more or less than the amount requested. -** -** Requirements: [H17341] [H17342] */ SQLITE_API int sqlite3_release_memory(int); /* -** CAPI3REF: Impose A Limit On Heap Size {H17350} +** CAPI3REF: Impose A Limit On Heap Size ** -** The sqlite3_soft_heap_limit() interface places a "soft" limit +** ^The sqlite3_soft_heap_limit() interface places a "soft" limit ** on the amount of heap memory that may be allocated by SQLite. -** If an internal allocation is requested that would exceed the +** ^If an internal allocation is requested that would exceed the ** soft heap limit, [sqlite3_release_memory()] is invoked one or ** more times to free up some space before the allocation is performed. ** -** The limit is called "soft", because if [sqlite3_release_memory()] +** ^The limit is called "soft" because if [sqlite3_release_memory()] ** cannot free sufficient memory to prevent the limit from being exceeded, ** the memory is allocated anyway and the current operation proceeds. ** -** A negative or zero value for N means that there is no soft heap limit and +** ^A negative or zero value for N means that there is no soft heap limit and ** [sqlite3_release_memory()] will only be called when memory is exhausted. -** The default value for the soft heap limit is zero. +** ^The default value for the soft heap limit is zero. ** -** SQLite makes a best effort to honor the soft heap limit. +** ^(SQLite makes a best effort to honor the soft heap limit. ** But if the soft heap limit cannot be honored, execution will -** continue without error or notification. This is why the limit is +** continue without error or notification.)^ This is why the limit is ** called a "soft" limit. It is advisory only. ** ** Prior to SQLite version 3.5.0, this routine only constrained the memory @@ -4560,35 +4478,32 @@ SQLITE_API int sqlite3_release_memory(int); ** is an upper bound on the total memory allocation for all threads. In ** version 3.5.0 there is no mechanism for limiting the heap usage for ** individual threads. -** -** Requirements: -** [H16351] [H16352] [H16353] [H16354] [H16355] [H16358] */ SQLITE_API void sqlite3_soft_heap_limit(int); /* -** CAPI3REF: Extract Metadata About A Column Of A Table {H12850} +** CAPI3REF: Extract Metadata About A Column Of A Table ** -** This routine returns metadata about a specific column of a specific +** ^This routine returns metadata about a specific column of a specific ** database table accessible using the [database connection] handle ** passed as the first function argument. ** -** The column is identified by the second, third and fourth parameters to -** this function. The second parameter is either the name of the database -** (i.e. "main", "temp" or an attached database) containing the specified -** table or NULL. If it is NULL, then all attached databases are searched +** ^The column is identified by the second, third and fourth parameters to +** this function. ^The second parameter is either the name of the database +** (i.e. "main", "temp", or an attached database) containing the specified +** table or NULL. ^If it is NULL, then all attached databases are searched ** for the table using the same algorithm used by the database engine to ** resolve unqualified table references. ** -** The third and fourth parameters to this function are the table and column +** ^The third and fourth parameters to this function are the table and column ** name of the desired column, respectively. Neither of these parameters ** may be NULL. ** -** Metadata is returned by writing to the memory locations passed as the 5th -** and subsequent parameters to this function. Any of these arguments may be +** ^Metadata is returned by writing to the memory locations passed as the 5th +** and subsequent parameters to this function. ^Any of these arguments may be ** NULL, in which case the corresponding element of metadata is omitted. ** -**
    +** ^(
    ** **
    Parameter Output
    Type
    Description ** @@ -4598,17 +4513,17 @@ SQLITE_API void sqlite3_soft_heap_limit(int); **
    8th int True if column is part of the PRIMARY KEY **
    9th int True if column is [AUTOINCREMENT] **
    -**
    +**
    )^ ** -** The memory pointed to by the character pointers returned for the +** ^The memory pointed to by the character pointers returned for the ** declaration type and collation sequence is valid only until the next ** call to any SQLite API function. ** -** If the specified table is actually a view, an [error code] is returned. +** ^If the specified table is actually a view, an [error code] is returned. ** -** If the specified column is "rowid", "oid" or "_rowid_" and an +** ^If the specified column is "rowid", "oid" or "_rowid_" and an ** [INTEGER PRIMARY KEY] column has been explicitly declared, then the output -** parameters are set for the explicitly declared column. If there is no +** parameters are set for the explicitly declared column. ^(If there is no ** explicitly declared [INTEGER PRIMARY KEY] column, then the output ** parameters are set as follows: ** @@ -4618,14 +4533,14 @@ SQLITE_API void sqlite3_soft_heap_limit(int); ** not null: 0 ** primary key: 1 ** auto increment: 0 -** +** )^ ** -** This function may load one or more schemas from database files. If an +** ^(This function may load one or more schemas from database files. If an ** error occurs during this process, or if the requested table or column ** cannot be found, an [error code] is returned and an error message left -** in the [database connection] (to be retrieved using sqlite3_errmsg()). +** in the [database connection] (to be retrieved using sqlite3_errmsg()).)^ ** -** This API is only available if the library was compiled with the +** ^This API is only available if the library was compiled with the ** [SQLITE_ENABLE_COLUMN_METADATA] C-preprocessor symbol defined. */ SQLITE_API int sqlite3_table_column_metadata( @@ -4641,30 +4556,29 @@ SQLITE_API int sqlite3_table_column_metadata( ); /* -** CAPI3REF: Load An Extension {H12600} -** -** This interface loads an SQLite extension library from the named file. +** CAPI3REF: Load An Extension ** -** {H12601} The sqlite3_load_extension() interface attempts to load an -** SQLite extension library contained in the file zFile. +** ^This interface loads an SQLite extension library from the named file. ** -** {H12602} The entry point is zProc. +** ^The sqlite3_load_extension() interface attempts to load an +** SQLite extension library contained in the file zFile. ** -** {H12603} zProc may be 0, in which case the name of the entry point -** defaults to "sqlite3_extension_init". +** ^The entry point is zProc. +** ^zProc may be 0, in which case the name of the entry point +** defaults to "sqlite3_extension_init". +** ^The sqlite3_load_extension() interface returns +** [SQLITE_OK] on success and [SQLITE_ERROR] if something goes wrong. +** ^If an error occurs and pzErrMsg is not 0, then the +** [sqlite3_load_extension()] interface shall attempt to +** fill *pzErrMsg with error message text stored in memory +** obtained from [sqlite3_malloc()]. The calling function +** should free this memory by calling [sqlite3_free()]. ** -** {H12604} The sqlite3_load_extension() interface shall return -** [SQLITE_OK] on success and [SQLITE_ERROR] if something goes wrong. +** ^Extension loading must be enabled using +** [sqlite3_enable_load_extension()] prior to calling this API, +** otherwise an error will be returned. ** -** {H12605} If an error occurs and pzErrMsg is not 0, then the -** [sqlite3_load_extension()] interface shall attempt to -** fill *pzErrMsg with error message text stored in memory -** obtained from [sqlite3_malloc()]. {END} The calling function -** should free this memory by calling [sqlite3_free()]. -** -** {H12606} Extension loading must be enabled using -** [sqlite3_enable_load_extension()] prior to calling this API, -** otherwise an error will be returned. +** See also the [load_extension() SQL function]. */ SQLITE_API int sqlite3_load_extension( sqlite3 *db, /* Load the extension into this database connection */ @@ -4674,61 +4588,49 @@ SQLITE_API int sqlite3_load_extension( ); /* -** CAPI3REF: Enable Or Disable Extension Loading {H12620} +** CAPI3REF: Enable Or Disable Extension Loading ** -** So as not to open security holes in older applications that are +** ^So as not to open security holes in older applications that are ** unprepared to deal with extension loading, and as a means of disabling ** extension loading while evaluating user-entered SQL, the following API ** is provided to turn the [sqlite3_load_extension()] mechanism on and off. ** -** Extension loading is off by default. See ticket #1863. -** -** {H12621} Call the sqlite3_enable_load_extension() routine with onoff==1 -** to turn extension loading on and call it with onoff==0 to turn -** it back off again. -** -** {H12622} Extension loading is off by default. +** ^Extension loading is off by default. See ticket #1863. +** ^Call the sqlite3_enable_load_extension() routine with onoff==1 +** to turn extension loading on and call it with onoff==0 to turn +** it back off again. */ SQLITE_API int sqlite3_enable_load_extension(sqlite3 *db, int onoff); /* -** CAPI3REF: Automatically Load An Extensions {H12640} +** CAPI3REF: Automatically Load An Extensions ** -** This API can be invoked at program startup in order to register +** ^This API can be invoked at program startup in order to register ** one or more statically linked extensions that will be available -** to all new [database connections]. {END} -** -** This routine stores a pointer to the extension in an array that is -** obtained from [sqlite3_malloc()]. If you run a memory leak checker -** on your program and it reports a leak because of this array, invoke -** [sqlite3_reset_auto_extension()] prior to shutdown to free the memory. +** to all new [database connections]. ** -** {H12641} This function registers an extension entry point that is -** automatically invoked whenever a new [database connection] -** is opened using [sqlite3_open()], [sqlite3_open16()], -** or [sqlite3_open_v2()]. +** ^(This routine stores a pointer to the extension entry point +** in an array that is obtained from [sqlite3_malloc()]. That memory +** is deallocated by [sqlite3_reset_auto_extension()].)^ ** -** {H12642} Duplicate extensions are detected so calling this routine -** multiple times with the same extension is harmless. -** -** {H12643} This routine stores a pointer to the extension in an array -** that is obtained from [sqlite3_malloc()]. -** -** {H12644} Automatic extensions apply across all threads. +** ^This function registers an extension entry point that is +** automatically invoked whenever a new [database connection] +** is opened using [sqlite3_open()], [sqlite3_open16()], +** or [sqlite3_open_v2()]. +** ^Duplicate extensions are detected so calling this routine +** multiple times with the same extension is harmless. +** ^Automatic extensions apply across all threads. */ SQLITE_API int sqlite3_auto_extension(void (*xEntryPoint)(void)); /* -** CAPI3REF: Reset Automatic Extension Loading {H12660} -** -** This function disables all previously registered automatic -** extensions. {END} It undoes the effect of all prior -** [sqlite3_auto_extension()] calls. +** CAPI3REF: Reset Automatic Extension Loading ** -** {H12661} This function disables all previously registered -** automatic extensions. +** ^(This function disables all previously registered automatic +** extensions. It undoes the effect of all prior +** [sqlite3_auto_extension()] calls.)^ ** -** {H12662} This function disables automatic extensions in all threads. +** ^This function disables automatic extensions in all threads. */ SQLITE_API void sqlite3_reset_auto_extension(void); @@ -4752,7 +4654,7 @@ typedef struct sqlite3_vtab_cursor sqlite3_vtab_cursor; typedef struct sqlite3_module sqlite3_module; /* -** CAPI3REF: Virtual Table Object {H18000} +** CAPI3REF: Virtual Table Object ** KEYWORDS: sqlite3_module {virtual table module} ** EXPERIMENTAL ** @@ -4760,10 +4662,10 @@ typedef struct sqlite3_module sqlite3_module; ** defines the implementation of a [virtual tables]. ** This structure consists mostly of methods for the module. ** -** A virtual table module is created by filling in a persistent +** ^A virtual table module is created by filling in a persistent ** instance of this structure and passing a pointer to that instance ** to [sqlite3_create_module()] or [sqlite3_create_module_v2()]. -** The registration remains valid until it is replaced by a different +** ^The registration remains valid until it is replaced by a different ** module or until the [database connection] closes. The content ** of this structure must not change while it is registered with ** any database connection. @@ -4799,7 +4701,7 @@ struct sqlite3_module { }; /* -** CAPI3REF: Virtual Table Indexing Information {H18100} +** CAPI3REF: Virtual Table Indexing Information ** KEYWORDS: sqlite3_index_info ** EXPERIMENTAL ** @@ -4809,42 +4711,42 @@ struct sqlite3_module { ** inputs to xBestIndex and are read-only. xBestIndex inserts its ** results into the **Outputs** fields. ** -** The aConstraint[] array records WHERE clause constraints of the form: +** ^(The aConstraint[] array records WHERE clause constraints of the form: ** **
    column OP expr
    ** -** where OP is =, <, <=, >, or >=. The particular operator is -** stored in aConstraint[].op. The index of the column is stored in -** aConstraint[].iColumn. aConstraint[].usable is TRUE if the +** where OP is =, <, <=, >, or >=.)^ ^(The particular operator is +** stored in aConstraint[].op.)^ ^(The index of the column is stored in +** aConstraint[].iColumn.)^ ^(aConstraint[].usable is TRUE if the ** expr on the right-hand side can be evaluated (and thus the constraint -** is usable) and false if it cannot. +** is usable) and false if it cannot.)^ ** -** The optimizer automatically inverts terms of the form "expr OP column" +** ^The optimizer automatically inverts terms of the form "expr OP column" ** and makes other simplifications to the WHERE clause in an attempt to ** get as many WHERE clause terms into the form shown above as possible. -** The aConstraint[] array only reports WHERE clause terms in the correct -** form that refer to the particular virtual table being queried. +** ^The aConstraint[] array only reports WHERE clause terms that are +** relevant to the particular virtual table being queried. ** -** Information about the ORDER BY clause is stored in aOrderBy[]. -** Each term of aOrderBy records a column of the ORDER BY clause. +** ^Information about the ORDER BY clause is stored in aOrderBy[]. +** ^Each term of aOrderBy records a column of the ORDER BY clause. ** ** The [xBestIndex] method must fill aConstraintUsage[] with information -** about what parameters to pass to xFilter. If argvIndex>0 then +** about what parameters to pass to xFilter. ^If argvIndex>0 then ** the right-hand side of the corresponding aConstraint[] is evaluated -** and becomes the argvIndex-th entry in argv. If aConstraintUsage[].omit +** and becomes the argvIndex-th entry in argv. ^(If aConstraintUsage[].omit ** is true, then the constraint is assumed to be fully handled by the -** virtual table and is not checked again by SQLite. +** virtual table and is not checked again by SQLite.)^ ** -** The idxNum and idxPtr values are recorded and passed into the +** ^The idxNum and idxPtr values are recorded and passed into the ** [xFilter] method. -** [sqlite3_free()] is used to free idxPtr if and only iff +** ^[sqlite3_free()] is used to free idxPtr if and only if ** needToFreeIdxPtr is true. ** -** The orderByConsumed means that output from [xFilter]/[xNext] will occur in +** ^The orderByConsumed means that output from [xFilter]/[xNext] will occur in ** the correct order to satisfy the ORDER BY clause so that no separate ** sorting step is required. ** -** The estimatedCost value is an estimate of the cost of doing the +** ^The estimatedCost value is an estimate of the cost of doing the ** particular lookup. A full scan of a table with N entries should have ** a cost of N. A binary search of a table of N entries should have a ** cost of approximately log(N). @@ -4882,24 +4784,28 @@ struct sqlite3_index_info { #define SQLITE_INDEX_CONSTRAINT_MATCH 64 /* -** CAPI3REF: Register A Virtual Table Implementation {H18200} +** CAPI3REF: Register A Virtual Table Implementation ** EXPERIMENTAL ** -** This routine is used to register a new [virtual table module] name. -** Module names must be registered before -** creating a new [virtual table] using the module, or before using a +** ^These routines are used to register a new [virtual table module] name. +** ^Module names must be registered before +** creating a new [virtual table] using the module and before using a ** preexisting [virtual table] for the module. ** -** The module name is registered on the [database connection] specified -** by the first parameter. The name of the module is given by the -** second parameter. The third parameter is a pointer to -** the implementation of the [virtual table module]. The fourth +** ^The module name is registered on the [database connection] specified +** by the first parameter. ^The name of the module is given by the +** second parameter. ^The third parameter is a pointer to +** the implementation of the [virtual table module]. ^The fourth ** parameter is an arbitrary client data pointer that is passed through ** into the [xCreate] and [xConnect] methods of the virtual table module ** when a new virtual table is be being created or reinitialized. ** -** This interface has exactly the same effect as calling -** [sqlite3_create_module_v2()] with a NULL client data destructor. +** ^The sqlite3_create_module_v2() interface has a fifth parameter which +** is a pointer to a destructor for the pClientData. ^SQLite will +** invoke the destructor function (if it is not NULL) when SQLite +** no longer needs the pClientData pointer. ^The sqlite3_create_module() +** interface is equivalent to sqlite3_create_module_v2() with a NULL +** destructor. */ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_create_module( sqlite3 *db, /* SQLite connection to register module with */ @@ -4907,17 +4813,6 @@ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_create_module( const sqlite3_module *p, /* Methods for the module */ void *pClientData /* Client data for xCreate/xConnect */ ); - -/* -** CAPI3REF: Register A Virtual Table Implementation {H18210} -** EXPERIMENTAL -** -** This routine is identical to the [sqlite3_create_module()] method, -** except that it has an extra parameter to specify -** a destructor function for the client data pointer. SQLite will -** invoke the destructor function (if it is not NULL) when SQLite -** no longer needs the pClientData pointer. -*/ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_create_module_v2( sqlite3 *db, /* SQLite connection to register module with */ const char *zName, /* Name of the module */ @@ -4927,21 +4822,21 @@ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_create_module_v2( ); /* -** CAPI3REF: Virtual Table Instance Object {H18010} +** CAPI3REF: Virtual Table Instance Object ** KEYWORDS: sqlite3_vtab ** EXPERIMENTAL ** ** Every [virtual table module] implementation uses a subclass -** of the following structure to describe a particular instance +** of this object to describe a particular instance ** of the [virtual table]. Each subclass will ** be tailored to the specific needs of the module implementation. ** The purpose of this superclass is to define certain fields that are ** common to all module implementations. ** -** Virtual tables methods can set an error message by assigning a +** ^Virtual tables methods can set an error message by assigning a ** string obtained from [sqlite3_mprintf()] to zErrMsg. The method should ** take care that any prior string is freed by a call to [sqlite3_free()] -** prior to assigning a new string to zErrMsg. After the error message +** prior to assigning a new string to zErrMsg. ^After the error message ** is delivered up to the client application, the string will be automatically ** freed by sqlite3_free() and the zErrMsg field will be zeroed. */ @@ -4953,7 +4848,7 @@ struct sqlite3_vtab { }; /* -** CAPI3REF: Virtual Table Cursor Object {H18020} +** CAPI3REF: Virtual Table Cursor Object ** KEYWORDS: sqlite3_vtab_cursor {virtual table cursor} ** EXPERIMENTAL ** @@ -4962,7 +4857,7 @@ struct sqlite3_vtab { ** [virtual table] and are used ** to loop through the virtual table. Cursors are created using the ** [sqlite3_module.xOpen | xOpen] method of the module and are destroyed -** by the [sqlite3_module.xClose | xClose] method. Cussors are used +** by the [sqlite3_module.xClose | xClose] method. Cursors are used ** by the [xFilter], [xNext], [xEof], [xColumn], and [xRowid] methods ** of the module. Each module implementation will define ** the content of a cursor structure to suit its own needs. @@ -4976,10 +4871,10 @@ struct sqlite3_vtab_cursor { }; /* -** CAPI3REF: Declare The Schema Of A Virtual Table {H18280} +** CAPI3REF: Declare The Schema Of A Virtual Table ** EXPERIMENTAL ** -** The [xCreate] and [xConnect] methods of a +** ^The [xCreate] and [xConnect] methods of a ** [virtual table module] call this interface ** to declare the format (the names and datatypes of the columns) of ** the virtual tables they implement. @@ -4987,17 +4882,17 @@ struct sqlite3_vtab_cursor { SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_declare_vtab(sqlite3*, const char *zSQL); /* -** CAPI3REF: Overload A Function For A Virtual Table {H18300} +** CAPI3REF: Overload A Function For A Virtual Table ** EXPERIMENTAL ** -** Virtual tables can provide alternative implementations of functions +** ^(Virtual tables can provide alternative implementations of functions ** using the [xFindFunction] method of the [virtual table module]. ** But global versions of those functions -** must exist in order to be overloaded. +** must exist in order to be overloaded.)^ ** -** This API makes sure a global version of a function with a particular +** ^(This API makes sure a global version of a function with a particular ** name and number of parameters exists. If no such function exists -** before this API is called, a new function is created. The implementation +** before this API is called, a new function is created.)^ ^The implementation ** of the new function always causes an exception to be thrown. So ** the new function is not good for anything by itself. Its only ** purpose is to be a placeholder function that can be overloaded @@ -5018,77 +4913,74 @@ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_overload_function(sqlite3*, const cha */ /* -** CAPI3REF: A Handle To An Open BLOB {H17800} +** CAPI3REF: A Handle To An Open BLOB ** KEYWORDS: {BLOB handle} {BLOB handles} ** ** An instance of this object represents an open BLOB on which ** [sqlite3_blob_open | incremental BLOB I/O] can be performed. -** Objects of this type are created by [sqlite3_blob_open()] +** ^Objects of this type are created by [sqlite3_blob_open()] ** and destroyed by [sqlite3_blob_close()]. -** The [sqlite3_blob_read()] and [sqlite3_blob_write()] interfaces +** ^The [sqlite3_blob_read()] and [sqlite3_blob_write()] interfaces ** can be used to read or write small subsections of the BLOB. -** The [sqlite3_blob_bytes()] interface returns the size of the BLOB in bytes. +** ^The [sqlite3_blob_bytes()] interface returns the size of the BLOB in bytes. */ typedef struct sqlite3_blob sqlite3_blob; /* -** CAPI3REF: Open A BLOB For Incremental I/O {H17810} +** CAPI3REF: Open A BLOB For Incremental I/O ** -** This interfaces opens a [BLOB handle | handle] to the BLOB located +** ^(This interfaces opens a [BLOB handle | handle] to the BLOB located ** in row iRow, column zColumn, table zTable in database zDb; ** in other words, the same BLOB that would be selected by: ** **
     **     SELECT zColumn FROM zDb.zTable WHERE [rowid] = iRow;
    -** 
    {END} +** )^ ** -** If the flags parameter is non-zero, then the BLOB is opened for read -** and write access. If it is zero, the BLOB is opened for read access. -** It is not possible to open a column that is part of an index or primary +** ^If the flags parameter is non-zero, then the BLOB is opened for read +** and write access. ^If it is zero, the BLOB is opened for read access. +** ^It is not possible to open a column that is part of an index or primary ** key for writing. ^If [foreign key constraints] are enabled, it is ** not possible to open a column that is part of a [child key] for writing. ** -** Note that the database name is not the filename that contains +** ^Note that the database name is not the filename that contains ** the database but rather the symbolic name of the database that -** is assigned when the database is connected using [ATTACH]. -** For the main database file, the database name is "main". -** For TEMP tables, the database name is "temp". +** appears after the AS keyword when the database is connected using [ATTACH]. +** ^For the main database file, the database name is "main". +** ^For TEMP tables, the database name is "temp". ** -** On success, [SQLITE_OK] is returned and the new [BLOB handle] is written +** ^(On success, [SQLITE_OK] is returned and the new [BLOB handle] is written ** to *ppBlob. Otherwise an [error code] is returned and *ppBlob is set -** to be a null pointer. -** This function sets the [database connection] error code and message +** to be a null pointer.)^ +** ^This function sets the [database connection] error code and message ** accessible via [sqlite3_errcode()] and [sqlite3_errmsg()] and related -** functions. Note that the *ppBlob variable is always initialized in a +** functions. ^Note that the *ppBlob variable is always initialized in a ** way that makes it safe to invoke [sqlite3_blob_close()] on *ppBlob ** regardless of the success or failure of this routine. ** -** If the row that a BLOB handle points to is modified by an +** ^(If the row that a BLOB handle points to is modified by an ** [UPDATE], [DELETE], or by [ON CONFLICT] side-effects ** then the BLOB handle is marked as "expired". ** This is true if any column of the row is changed, even a column -** other than the one the BLOB handle is open on. -** Calls to [sqlite3_blob_read()] and [sqlite3_blob_write()] for +** other than the one the BLOB handle is open on.)^ +** ^Calls to [sqlite3_blob_read()] and [sqlite3_blob_write()] for ** a expired BLOB handle fail with an return code of [SQLITE_ABORT]. -** Changes written into a BLOB prior to the BLOB expiring are not -** rollback by the expiration of the BLOB. Such changes will eventually -** commit if the transaction continues to completion. +** ^(Changes written into a BLOB prior to the BLOB expiring are not +** rolled back by the expiration of the BLOB. Such changes will eventually +** commit if the transaction continues to completion.)^ ** -** Use the [sqlite3_blob_bytes()] interface to determine the size of -** the opened blob. The size of a blob may not be changed by this +** ^Use the [sqlite3_blob_bytes()] interface to determine the size of +** the opened blob. ^The size of a blob may not be changed by this ** interface. Use the [UPDATE] SQL command to change the size of a ** blob. ** -** The [sqlite3_bind_zeroblob()] and [sqlite3_result_zeroblob()] interfaces +** ^The [sqlite3_bind_zeroblob()] and [sqlite3_result_zeroblob()] interfaces ** and the built-in [zeroblob] SQL function can be used, if desired, ** to create an empty, zero-filled blob in which to read or write using ** this interface. ** ** To avoid a resource leak, every open [BLOB handle] should eventually ** be released by a call to [sqlite3_blob_close()]. -** -** Requirements: -** [H17813] [H17814] [H17816] [H17819] [H17821] [H17824] */ SQLITE_API int sqlite3_blob_open( sqlite3*, @@ -5101,37 +4993,34 @@ SQLITE_API int sqlite3_blob_open( ); /* -** CAPI3REF: Close A BLOB Handle {H17830} +** CAPI3REF: Close A BLOB Handle ** -** Closes an open [BLOB handle]. +** ^Closes an open [BLOB handle]. ** -** Closing a BLOB shall cause the current transaction to commit +** ^Closing a BLOB shall cause the current transaction to commit ** if there are no other BLOBs, no pending prepared statements, and the ** database connection is in [autocommit mode]. -** If any writes were made to the BLOB, they might be held in cache +** ^If any writes were made to the BLOB, they might be held in cache ** until the close operation if they will fit. ** -** Closing the BLOB often forces the changes +** ^(Closing the BLOB often forces the changes ** out to disk and so if any I/O errors occur, they will likely occur ** at the time when the BLOB is closed. Any errors that occur during -** closing are reported as a non-zero return value. -** -** The BLOB is closed unconditionally. Even if this routine returns -** an error code, the BLOB is still closed. +** closing are reported as a non-zero return value.)^ ** -** Calling this routine with a null pointer (which as would be returned -** by failed call to [sqlite3_blob_open()]) is a harmless no-op. +** ^(The BLOB is closed unconditionally. Even if this routine returns +** an error code, the BLOB is still closed.)^ ** -** Requirements: -** [H17833] [H17836] [H17839] +** ^Calling this routine with a null pointer (such as would be returned +** by a failed call to [sqlite3_blob_open()]) is a harmless no-op. */ SQLITE_API int sqlite3_blob_close(sqlite3_blob *); /* -** CAPI3REF: Return The Size Of An Open BLOB {H17840} +** CAPI3REF: Return The Size Of An Open BLOB ** -** Returns the size in bytes of the BLOB accessible via the -** successfully opened [BLOB handle] in its only argument. The +** ^Returns the size in bytes of the BLOB accessible via the +** successfully opened [BLOB handle] in its only argument. ^The ** incremental blob I/O routines can only read or overwriting existing ** blob content; they cannot change the size of a blob. ** @@ -5139,30 +5028,27 @@ SQLITE_API int sqlite3_blob_close(sqlite3_blob *); ** by a prior successful call to [sqlite3_blob_open()] and which has not ** been closed by [sqlite3_blob_close()]. Passing any other pointer in ** to this routine results in undefined and probably undesirable behavior. -** -** Requirements: -** [H17843] */ SQLITE_API int sqlite3_blob_bytes(sqlite3_blob *); /* -** CAPI3REF: Read Data From A BLOB Incrementally {H17850} +** CAPI3REF: Read Data From A BLOB Incrementally ** -** This function is used to read data from an open [BLOB handle] into a +** ^(This function is used to read data from an open [BLOB handle] into a ** caller-supplied buffer. N bytes of data are copied into buffer Z -** from the open BLOB, starting at offset iOffset. +** from the open BLOB, starting at offset iOffset.)^ ** -** If offset iOffset is less than N bytes from the end of the BLOB, -** [SQLITE_ERROR] is returned and no data is read. If N or iOffset is +** ^If offset iOffset is less than N bytes from the end of the BLOB, +** [SQLITE_ERROR] is returned and no data is read. ^If N or iOffset is ** less than zero, [SQLITE_ERROR] is returned and no data is read. -** The size of the blob (and hence the maximum value of N+iOffset) +** ^The size of the blob (and hence the maximum value of N+iOffset) ** can be determined using the [sqlite3_blob_bytes()] interface. ** -** An attempt to read from an expired [BLOB handle] fails with an +** ^An attempt to read from an expired [BLOB handle] fails with an ** error code of [SQLITE_ABORT]. ** -** On success, SQLITE_OK is returned. -** Otherwise, an [error code] or an [extended error code] is returned. +** ^(On success, sqlite3_blob_read() returns SQLITE_OK. +** Otherwise, an [error code] or an [extended error code] is returned.)^ ** ** This routine only works on a [BLOB handle] which has been created ** by a prior successful call to [sqlite3_blob_open()] and which has not @@ -5170,40 +5056,37 @@ SQLITE_API int sqlite3_blob_bytes(sqlite3_blob *); ** to this routine results in undefined and probably undesirable behavior. ** ** See also: [sqlite3_blob_write()]. -** -** Requirements: -** [H17853] [H17856] [H17859] [H17862] [H17863] [H17865] [H17868] */ SQLITE_API int sqlite3_blob_read(sqlite3_blob *, void *Z, int N, int iOffset); /* -** CAPI3REF: Write Data Into A BLOB Incrementally {H17870} +** CAPI3REF: Write Data Into A BLOB Incrementally ** -** This function is used to write data into an open [BLOB handle] from a -** caller-supplied buffer. N bytes of data are copied from the buffer Z +** ^This function is used to write data into an open [BLOB handle] from a +** caller-supplied buffer. ^N bytes of data are copied from the buffer Z ** into the open BLOB, starting at offset iOffset. ** -** If the [BLOB handle] passed as the first argument was not opened for +** ^If the [BLOB handle] passed as the first argument was not opened for ** writing (the flags parameter to [sqlite3_blob_open()] was zero), ** this function returns [SQLITE_READONLY]. ** -** This function may only modify the contents of the BLOB; it is +** ^This function may only modify the contents of the BLOB; it is ** not possible to increase the size of a BLOB using this API. -** If offset iOffset is less than N bytes from the end of the BLOB, -** [SQLITE_ERROR] is returned and no data is written. If N is +** ^If offset iOffset is less than N bytes from the end of the BLOB, +** [SQLITE_ERROR] is returned and no data is written. ^If N is ** less than zero [SQLITE_ERROR] is returned and no data is written. ** The size of the BLOB (and hence the maximum value of N+iOffset) ** can be determined using the [sqlite3_blob_bytes()] interface. ** -** An attempt to write to an expired [BLOB handle] fails with an -** error code of [SQLITE_ABORT]. Writes to the BLOB that occurred +** ^An attempt to write to an expired [BLOB handle] fails with an +** error code of [SQLITE_ABORT]. ^Writes to the BLOB that occurred ** before the [BLOB handle] expired are not rolled back by the ** expiration of the handle, though of course those changes might ** have been overwritten by the statement that expired the BLOB handle ** or by other independent statements. ** -** On success, SQLITE_OK is returned. -** Otherwise, an [error code] or an [extended error code] is returned. +** ^(On success, sqlite3_blob_write() returns SQLITE_OK. +** Otherwise, an [error code] or an [extended error code] is returned.)^ ** ** This routine only works on a [BLOB handle] which has been created ** by a prior successful call to [sqlite3_blob_open()] and which has not @@ -5211,15 +5094,11 @@ SQLITE_API int sqlite3_blob_read(sqlite3_blob *, void *Z, int N, int iOffset); ** to this routine results in undefined and probably undesirable behavior. ** ** See also: [sqlite3_blob_read()]. -** -** Requirements: -** [H17873] [H17874] [H17875] [H17876] [H17877] [H17879] [H17882] [H17885] -** [H17888] */ SQLITE_API int sqlite3_blob_write(sqlite3_blob *, const void *z, int n, int iOffset); /* -** CAPI3REF: Virtual File System Objects {H11200} +** CAPI3REF: Virtual File System Objects ** ** A virtual filesystem (VFS) is an [sqlite3_vfs] object ** that SQLite uses to interact @@ -5228,34 +5107,31 @@ SQLITE_API int sqlite3_blob_write(sqlite3_blob *, const void *z, int n, int iOff ** New VFSes can be registered and existing VFSes can be unregistered. ** The following interfaces are provided. ** -** The sqlite3_vfs_find() interface returns a pointer to a VFS given its name. -** Names are case sensitive. -** Names are zero-terminated UTF-8 strings. -** If there is no match, a NULL pointer is returned. -** If zVfsName is NULL then the default VFS is returned. +** ^The sqlite3_vfs_find() interface returns a pointer to a VFS given its name. +** ^Names are case sensitive. +** ^Names are zero-terminated UTF-8 strings. +** ^If there is no match, a NULL pointer is returned. +** ^If zVfsName is NULL then the default VFS is returned. ** -** New VFSes are registered with sqlite3_vfs_register(). -** Each new VFS becomes the default VFS if the makeDflt flag is set. -** The same VFS can be registered multiple times without injury. -** To make an existing VFS into the default VFS, register it again +** ^New VFSes are registered with sqlite3_vfs_register(). +** ^Each new VFS becomes the default VFS if the makeDflt flag is set. +** ^The same VFS can be registered multiple times without injury. +** ^To make an existing VFS into the default VFS, register it again ** with the makeDflt flag set. If two different VFSes with the ** same name are registered, the behavior is undefined. If a ** VFS is registered with a name that is NULL or an empty string, ** then the behavior is undefined. ** -** Unregister a VFS with the sqlite3_vfs_unregister() interface. -** If the default VFS is unregistered, another VFS is chosen as -** the default. The choice for the new VFS is arbitrary. -** -** Requirements: -** [H11203] [H11206] [H11209] [H11212] [H11215] [H11218] +** ^Unregister a VFS with the sqlite3_vfs_unregister() interface. +** ^(If the default VFS is unregistered, another VFS is chosen as +** the default. The choice for the new VFS is arbitrary.)^ */ SQLITE_API sqlite3_vfs *sqlite3_vfs_find(const char *zVfsName); SQLITE_API int sqlite3_vfs_register(sqlite3_vfs*, int makeDflt); SQLITE_API int sqlite3_vfs_unregister(sqlite3_vfs*); /* -** CAPI3REF: Mutexes {H17000} +** CAPI3REF: Mutexes ** ** The SQLite core uses these routines for thread ** synchronization. Though they are intended for internal @@ -5264,7 +5140,7 @@ SQLITE_API int sqlite3_vfs_unregister(sqlite3_vfs*); ** ** The SQLite source code contains multiple implementations ** of these mutex routines. An appropriate implementation -** is selected automatically at compile-time. The following +** is selected automatically at compile-time. ^(The following ** implementations are available in the SQLite core: ** **
      @@ -5272,26 +5148,26 @@ SQLITE_API int sqlite3_vfs_unregister(sqlite3_vfs*); **
    • SQLITE_MUTEX_PTHREAD **
    • SQLITE_MUTEX_W32 **
    • SQLITE_MUTEX_NOOP -**
    +** )^ ** -** The SQLITE_MUTEX_NOOP implementation is a set of routines +** ^The SQLITE_MUTEX_NOOP implementation is a set of routines ** that does no real locking and is appropriate for use in -** a single-threaded application. The SQLITE_MUTEX_OS2, +** a single-threaded application. ^The SQLITE_MUTEX_OS2, ** SQLITE_MUTEX_PTHREAD, and SQLITE_MUTEX_W32 implementations ** are appropriate for use on OS/2, Unix, and Windows. ** -** If SQLite is compiled with the SQLITE_MUTEX_APPDEF preprocessor +** ^(If SQLite is compiled with the SQLITE_MUTEX_APPDEF preprocessor ** macro defined (with "-DSQLITE_MUTEX_APPDEF=1"), then no mutex ** implementation is included with the library. In this case the ** application must supply a custom mutex implementation using the ** [SQLITE_CONFIG_MUTEX] option of the sqlite3_config() function ** before calling sqlite3_initialize() or any other public sqlite3_ -** function that calls sqlite3_initialize(). +** function that calls sqlite3_initialize().)^ ** -** {H17011} The sqlite3_mutex_alloc() routine allocates a new -** mutex and returns a pointer to it. {H17012} If it returns NULL -** that means that a mutex could not be allocated. {H17013} SQLite -** will unwind its stack and return an error. {H17014} The argument +** ^The sqlite3_mutex_alloc() routine allocates a new +** mutex and returns a pointer to it. ^If it returns NULL +** that means that a mutex could not be allocated. ^SQLite +** will unwind its stack and return an error. ^(The argument ** to sqlite3_mutex_alloc() is one of these integer constants: ** **
      @@ -5303,64 +5179,66 @@ SQLITE_API int sqlite3_vfs_unregister(sqlite3_vfs*); **
    • SQLITE_MUTEX_STATIC_PRNG **
    • SQLITE_MUTEX_STATIC_LRU **
    • SQLITE_MUTEX_STATIC_LRU2 -**
    +** )^ ** -** {H17015} The first two constants cause sqlite3_mutex_alloc() to create -** a new mutex. The new mutex is recursive when SQLITE_MUTEX_RECURSIVE -** is used but not necessarily so when SQLITE_MUTEX_FAST is used. {END} +** ^The first two constants (SQLITE_MUTEX_FAST and SQLITE_MUTEX_RECURSIVE) +** cause sqlite3_mutex_alloc() to create +** a new mutex. ^The new mutex is recursive when SQLITE_MUTEX_RECURSIVE +** is used but not necessarily so when SQLITE_MUTEX_FAST is used. ** The mutex implementation does not need to make a distinction ** between SQLITE_MUTEX_RECURSIVE and SQLITE_MUTEX_FAST if it does -** not want to. {H17016} But SQLite will only request a recursive mutex in -** cases where it really needs one. {END} If a faster non-recursive mutex +** not want to. ^SQLite will only request a recursive mutex in +** cases where it really needs one. ^If a faster non-recursive mutex ** implementation is available on the host platform, the mutex subsystem ** might return such a mutex in response to SQLITE_MUTEX_FAST. ** -** {H17017} The other allowed parameters to sqlite3_mutex_alloc() each return -** a pointer to a static preexisting mutex. {END} Six static mutexes are +** ^The other allowed parameters to sqlite3_mutex_alloc() (anything other +** than SQLITE_MUTEX_FAST and SQLITE_MUTEX_RECURSIVE) each return +** a pointer to a static preexisting mutex. ^Six static mutexes are ** used by the current version of SQLite. Future versions of SQLite ** may add additional static mutexes. Static mutexes are for internal ** use by SQLite only. Applications that use SQLite mutexes should ** use only the dynamic mutexes returned by SQLITE_MUTEX_FAST or ** SQLITE_MUTEX_RECURSIVE. ** -** {H17018} Note that if one of the dynamic mutex parameters (SQLITE_MUTEX_FAST +** ^Note that if one of the dynamic mutex parameters (SQLITE_MUTEX_FAST ** or SQLITE_MUTEX_RECURSIVE) is used then sqlite3_mutex_alloc() -** returns a different mutex on every call. {H17034} But for the static +** returns a different mutex on every call. ^But for the static ** mutex types, the same mutex is returned on every call that has ** the same type number. ** -** {H17019} The sqlite3_mutex_free() routine deallocates a previously -** allocated dynamic mutex. {H17020} SQLite is careful to deallocate every -** dynamic mutex that it allocates. {A17021} The dynamic mutexes must not be in -** use when they are deallocated. {A17022} Attempting to deallocate a static -** mutex results in undefined behavior. {H17023} SQLite never deallocates -** a static mutex. {END} +** ^The sqlite3_mutex_free() routine deallocates a previously +** allocated dynamic mutex. ^SQLite is careful to deallocate every +** dynamic mutex that it allocates. The dynamic mutexes must not be in +** use when they are deallocated. Attempting to deallocate a static +** mutex results in undefined behavior. ^SQLite never deallocates +** a static mutex. ** -** The sqlite3_mutex_enter() and sqlite3_mutex_try() routines attempt -** to enter a mutex. {H17024} If another thread is already within the mutex, +** ^The sqlite3_mutex_enter() and sqlite3_mutex_try() routines attempt +** to enter a mutex. ^If another thread is already within the mutex, ** sqlite3_mutex_enter() will block and sqlite3_mutex_try() will return -** SQLITE_BUSY. {H17025} The sqlite3_mutex_try() interface returns [SQLITE_OK] -** upon successful entry. {H17026} Mutexes created using +** SQLITE_BUSY. ^The sqlite3_mutex_try() interface returns [SQLITE_OK] +** upon successful entry. ^(Mutexes created using ** SQLITE_MUTEX_RECURSIVE can be entered multiple times by the same thread. -** {H17027} In such cases the, +** In such cases the, ** mutex must be exited an equal number of times before another thread -** can enter. {A17028} If the same thread tries to enter any other +** can enter.)^ ^(If the same thread tries to enter any other ** kind of mutex more than once, the behavior is undefined. -** {H17029} SQLite will never exhibit -** such behavior in its own use of mutexes. +** SQLite will never exhibit +** such behavior in its own use of mutexes.)^ ** -** Some systems (for example, Windows 95) do not support the operation +** ^(Some systems (for example, Windows 95) do not support the operation ** implemented by sqlite3_mutex_try(). On those systems, sqlite3_mutex_try() -** will always return SQLITE_BUSY. {H17030} The SQLite core only ever uses -** sqlite3_mutex_try() as an optimization so this is acceptable behavior. +** will always return SQLITE_BUSY. The SQLite core only ever uses +** sqlite3_mutex_try() as an optimization so this is acceptable behavior.)^ ** -** {H17031} The sqlite3_mutex_leave() routine exits a mutex that was -** previously entered by the same thread. {A17032} The behavior +** ^The sqlite3_mutex_leave() routine exits a mutex that was +** previously entered by the same thread. ^(The behavior ** is undefined if the mutex is not currently entered by the -** calling thread or is not currently allocated. {H17033} SQLite will -** never do either. {END} +** calling thread or is not currently allocated. SQLite will +** never do either.)^ ** -** If the argument to sqlite3_mutex_enter(), sqlite3_mutex_try(), or +** ^If the argument to sqlite3_mutex_enter(), sqlite3_mutex_try(), or ** sqlite3_mutex_leave() is a NULL pointer, then all three routines ** behave as no-ops. ** @@ -5373,7 +5251,7 @@ SQLITE_API int sqlite3_mutex_try(sqlite3_mutex*); SQLITE_API void sqlite3_mutex_leave(sqlite3_mutex*); /* -** CAPI3REF: Mutex Methods Object {H17120} +** CAPI3REF: Mutex Methods Object ** EXPERIMENTAL ** ** An instance of this structure defines the low-level routines @@ -5389,19 +5267,19 @@ SQLITE_API void sqlite3_mutex_leave(sqlite3_mutex*); ** output variable when querying the system for the current mutex ** implementation, using the [SQLITE_CONFIG_GETMUTEX] option. ** -** The xMutexInit method defined by this structure is invoked as +** ^The xMutexInit method defined by this structure is invoked as ** part of system initialization by the sqlite3_initialize() function. -** {H17001} The xMutexInit routine shall be called by SQLite once for each +** ^The xMutexInit routine is calle by SQLite exactly once for each ** effective call to [sqlite3_initialize()]. ** -** The xMutexEnd method defined by this structure is invoked as +** ^The xMutexEnd method defined by this structure is invoked as ** part of system shutdown by the sqlite3_shutdown() function. The ** implementation of this method is expected to release all outstanding ** resources obtained by the mutex methods implementation, especially -** those obtained by the xMutexInit method. {H17003} The xMutexEnd() -** interface shall be invoked once for each call to [sqlite3_shutdown()]. +** those obtained by the xMutexInit method. ^The xMutexEnd() +** interface is invoked exactly once for each call to [sqlite3_shutdown()]. ** -** The remaining seven methods defined by this structure (xMutexAlloc, +** ^(The remaining seven methods defined by this structure (xMutexAlloc, ** xMutexFree, xMutexEnter, xMutexTry, xMutexLeave, xMutexHeld and ** xMutexNotheld) implement the following interfaces (respectively): ** @@ -5413,7 +5291,7 @@ SQLITE_API void sqlite3_mutex_leave(sqlite3_mutex*); **
  • [sqlite3_mutex_leave()]
  • **
  • [sqlite3_mutex_held()]
  • **
  • [sqlite3_mutex_notheld()]
  • -** +** )^ ** ** The only difference is that the public sqlite3_XXX functions enumerated ** above silently ignore any invocations that pass a NULL pointer instead @@ -5423,17 +5301,17 @@ SQLITE_API void sqlite3_mutex_leave(sqlite3_mutex*); ** (i.e. it is acceptable to provide an implementation that segfaults if ** it is passed a NULL pointer). ** -** The xMutexInit() method must be threadsafe. It must be harmless to +** The xMutexInit() method must be threadsafe. ^It must be harmless to ** invoke xMutexInit() mutiple times within the same process and without ** intervening calls to xMutexEnd(). Second and subsequent calls to ** xMutexInit() must be no-ops. ** -** xMutexInit() must not use SQLite memory allocation ([sqlite3_malloc()] -** and its associates). Similarly, xMutexAlloc() must not use SQLite memory -** allocation for a static mutex. However xMutexAlloc() may use SQLite +** ^xMutexInit() must not use SQLite memory allocation ([sqlite3_malloc()] +** and its associates). ^Similarly, xMutexAlloc() must not use SQLite memory +** allocation for a static mutex. ^However xMutexAlloc() may use SQLite ** memory allocation for a fast or recursive mutex. ** -** SQLite will invoke the xMutexEnd() method when [sqlite3_shutdown()] is +** ^SQLite will invoke the xMutexEnd() method when [sqlite3_shutdown()] is ** called, but only if the prior call to xMutexInit returned SQLITE_OK. ** If xMutexInit fails in any way, it is expected to clean up after itself ** prior to returning. @@ -5452,39 +5330,41 @@ struct sqlite3_mutex_methods { }; /* -** CAPI3REF: Mutex Verification Routines {H17080} +** CAPI3REF: Mutex Verification Routines ** ** The sqlite3_mutex_held() and sqlite3_mutex_notheld() routines -** are intended for use inside assert() statements. {H17081} The SQLite core +** are intended for use inside assert() statements. ^The SQLite core ** never uses these routines except inside an assert() and applications -** are advised to follow the lead of the core. {H17082} The core only +** are advised to follow the lead of the core. ^The SQLite core only ** provides implementations for these routines when it is compiled -** with the SQLITE_DEBUG flag. {A17087} External mutex implementations +** with the SQLITE_DEBUG flag. ^External mutex implementations ** are only required to provide these routines if SQLITE_DEBUG is ** defined and if NDEBUG is not defined. ** -** {H17083} These routines should return true if the mutex in their argument +** ^These routines should return true if the mutex in their argument ** is held or not held, respectively, by the calling thread. ** -** {X17084} The implementation is not required to provided versions of these +** ^The implementation is not required to provided versions of these ** routines that actually work. If the implementation does not provide working ** versions of these routines, it should at least provide stubs that always ** return true so that one does not get spurious assertion failures. ** -** {H17085} If the argument to sqlite3_mutex_held() is a NULL pointer then -** the routine should return 1. {END} This seems counter-intuitive since +** ^If the argument to sqlite3_mutex_held() is a NULL pointer then +** the routine should return 1. This seems counter-intuitive since ** clearly the mutex cannot be held if it does not exist. But the ** the reason the mutex does not exist is because the build is not ** using mutexes. And we do not want the assert() containing the ** call to sqlite3_mutex_held() to fail, so a non-zero return is -** the appropriate thing to do. {H17086} The sqlite3_mutex_notheld() +** the appropriate thing to do. ^The sqlite3_mutex_notheld() ** interface should also return 1 when given a NULL pointer. */ +#ifndef NDEBUG SQLITE_API int sqlite3_mutex_held(sqlite3_mutex*); SQLITE_API int sqlite3_mutex_notheld(sqlite3_mutex*); +#endif /* -** CAPI3REF: Mutex Types {H17001} +** CAPI3REF: Mutex Types ** ** The [sqlite3_mutex_alloc()] interface takes a single argument ** which is one of these integer constants. @@ -5504,48 +5384,50 @@ SQLITE_API int sqlite3_mutex_notheld(sqlite3_mutex*); #define SQLITE_MUTEX_STATIC_LRU2 7 /* lru page list */ /* -** CAPI3REF: Retrieve the mutex for a database connection {H17002} +** CAPI3REF: Retrieve the mutex for a database connection ** -** This interface returns a pointer the [sqlite3_mutex] object that +** ^This interface returns a pointer the [sqlite3_mutex] object that ** serializes access to the [database connection] given in the argument ** when the [threading mode] is Serialized. -** If the [threading mode] is Single-thread or Multi-thread then this +** ^If the [threading mode] is Single-thread or Multi-thread then this ** routine returns a NULL pointer. */ SQLITE_API sqlite3_mutex *sqlite3_db_mutex(sqlite3*); /* -** CAPI3REF: Low-Level Control Of Database Files {H11300} +** CAPI3REF: Low-Level Control Of Database Files ** -** {H11301} The [sqlite3_file_control()] interface makes a direct call to the +** ^The [sqlite3_file_control()] interface makes a direct call to the ** xFileControl method for the [sqlite3_io_methods] object associated -** with a particular database identified by the second argument. {H11302} The -** name of the database is the name assigned to the database by the -** ATTACH SQL command that opened the -** database. {H11303} To control the main database file, use the name "main" -** or a NULL pointer. {H11304} The third and fourth parameters to this routine +** with a particular database identified by the second argument. ^The +** name of the database "main" for the main database or "temp" for the +** TEMP database, or the name that appears after the AS keyword for +** databases that are added using the [ATTACH] SQL command. +** ^A NULL pointer can be used in place of "main" to refer to the +** main database file. +** ^The third and fourth parameters to this routine ** are passed directly through to the second and third parameters of -** the xFileControl method. {H11305} The return value of the xFileControl +** the xFileControl method. ^The return value of the xFileControl ** method becomes the return value of this routine. ** -** {H11306} If the second parameter (zDbName) does not match the name of any -** open database file, then SQLITE_ERROR is returned. {H11307} This error +** ^If the second parameter (zDbName) does not match the name of any +** open database file, then SQLITE_ERROR is returned. ^This error ** code is not remembered and will not be recalled by [sqlite3_errcode()] -** or [sqlite3_errmsg()]. {A11308} The underlying xFileControl method might -** also return SQLITE_ERROR. {A11309} There is no way to distinguish between +** or [sqlite3_errmsg()]. The underlying xFileControl method might +** also return SQLITE_ERROR. There is no way to distinguish between ** an incorrect zDbName and an SQLITE_ERROR return from the underlying -** xFileControl method. {END} +** xFileControl method. ** ** See also: [SQLITE_FCNTL_LOCKSTATE] */ SQLITE_API int sqlite3_file_control(sqlite3*, const char *zDbName, int op, void*); /* -** CAPI3REF: Testing Interface {H11400} +** CAPI3REF: Testing Interface ** -** The sqlite3_test_control() interface is used to read out internal +** ^The sqlite3_test_control() interface is used to read out internal ** state of SQLite and to inject faults into SQLite for testing -** purposes. The first parameter is an operation code that determines +** purposes. ^The first parameter is an operation code that determines ** the number, meaning, and operation of all subsequent parameters. ** ** This interface is not for use by applications. It exists solely @@ -5560,7 +5442,7 @@ SQLITE_API int sqlite3_file_control(sqlite3*, const char *zDbName, int op, void* SQLITE_API int sqlite3_test_control(int op, ...); /* -** CAPI3REF: Testing Interface Operation Codes {H11410} +** CAPI3REF: Testing Interface Operation Codes ** ** These constants are the valid operation code parameters used ** as the first argument to [sqlite3_test_control()]. @@ -5570,6 +5452,7 @@ SQLITE_API int sqlite3_test_control(int op, ...); ** Applications should not use any of these parameters or the ** [sqlite3_test_control()] interface. */ +#define SQLITE_TESTCTRL_FIRST 5 #define SQLITE_TESTCTRL_PRNG_SAVE 5 #define SQLITE_TESTCTRL_PRNG_RESTORE 6 #define SQLITE_TESTCTRL_PRNG_RESET 7 @@ -5580,27 +5463,30 @@ SQLITE_API int sqlite3_test_control(int op, ...); #define SQLITE_TESTCTRL_ASSERT 12 #define SQLITE_TESTCTRL_ALWAYS 13 #define SQLITE_TESTCTRL_RESERVE 14 +#define SQLITE_TESTCTRL_OPTIMIZATIONS 15 +#define SQLITE_TESTCTRL_ISKEYWORD 16 +#define SQLITE_TESTCTRL_LAST 16 /* -** CAPI3REF: SQLite Runtime Status {H17200} +** CAPI3REF: SQLite Runtime Status ** EXPERIMENTAL ** -** This interface is used to retrieve runtime status information +** ^This interface is used to retrieve runtime status information ** about the preformance of SQLite, and optionally to reset various -** highwater marks. The first argument is an integer code for -** the specific parameter to measure. Recognized integer codes -** are of the form [SQLITE_STATUS_MEMORY_USED | SQLITE_STATUS_...]. -** The current value of the parameter is returned into *pCurrent. -** The highest recorded value is returned in *pHighwater. If the +** highwater marks. ^The first argument is an integer code for +** the specific parameter to measure. ^(Recognized integer codes +** are of the form [SQLITE_STATUS_MEMORY_USED | SQLITE_STATUS_...].)^ +** ^The current value of the parameter is returned into *pCurrent. +** ^The highest recorded value is returned in *pHighwater. ^If the ** resetFlag is true, then the highest record value is reset after -** *pHighwater is written. Some parameters do not record the highest +** *pHighwater is written. ^(Some parameters do not record the highest ** value. For those parameters -** nothing is written into *pHighwater and the resetFlag is ignored. -** Other parameters record only the highwater mark and not the current -** value. For these latter parameters nothing is written into *pCurrent. +** nothing is written into *pHighwater and the resetFlag is ignored.)^ +** ^(Other parameters record only the highwater mark and not the current +** value. For these latter parameters nothing is written into *pCurrent.)^ ** -** This routine returns SQLITE_OK on success and a non-zero -** [error code] on failure. +** ^The sqlite3_db_status() routine returns SQLITE_OK on success and a +** non-zero [error code] on failure. ** ** This routine is threadsafe but is not atomic. This routine can be ** called while other threads are running the same or different SQLite @@ -5615,14 +5501,14 @@ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_status(int op, int *pCurrent, int *pH /* -** CAPI3REF: Status Parameters {H17250} +** CAPI3REF: Status Parameters ** EXPERIMENTAL ** ** These integer constants designate various run-time status parameters ** that can be returned by [sqlite3_status()]. ** **
    -**
    SQLITE_STATUS_MEMORY_USED
    +** ^(
    SQLITE_STATUS_MEMORY_USED
    **
    This parameter is the current amount of memory checked out ** using [sqlite3_malloc()], either directly or indirectly. The ** figure includes calls made to [sqlite3_malloc()] by the application @@ -5630,45 +5516,45 @@ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_status(int op, int *pCurrent, int *pH ** controlled by [SQLITE_CONFIG_SCRATCH] and auxiliary page-cache ** memory controlled by [SQLITE_CONFIG_PAGECACHE] is not included in ** this parameter. The amount returned is the sum of the allocation -** sizes as reported by the xSize method in [sqlite3_mem_methods].
    +** sizes as reported by the xSize method in [sqlite3_mem_methods].)^ ** -**
    SQLITE_STATUS_MALLOC_SIZE
    +** ^(
    SQLITE_STATUS_MALLOC_SIZE
    **
    This parameter records the largest memory allocation request ** handed to [sqlite3_malloc()] or [sqlite3_realloc()] (or their ** internal equivalents). Only the value returned in the ** *pHighwater parameter to [sqlite3_status()] is of interest. -** The value written into the *pCurrent parameter is undefined.
    +** The value written into the *pCurrent parameter is undefined.)^ ** -**
    SQLITE_STATUS_PAGECACHE_USED
    +** ^(
    SQLITE_STATUS_PAGECACHE_USED
    **
    This parameter returns the number of pages used out of the ** [pagecache memory allocator] that was configured using ** [SQLITE_CONFIG_PAGECACHE]. The -** value returned is in pages, not in bytes.
    +** value returned is in pages, not in bytes.)^ ** -**
    SQLITE_STATUS_PAGECACHE_OVERFLOW
    +** ^(
    SQLITE_STATUS_PAGECACHE_OVERFLOW
    **
    This parameter returns the number of bytes of page cache ** allocation which could not be statisfied by the [SQLITE_CONFIG_PAGECACHE] ** buffer and where forced to overflow to [sqlite3_malloc()]. The ** returned value includes allocations that overflowed because they ** where too large (they were larger than the "sz" parameter to ** [SQLITE_CONFIG_PAGECACHE]) and allocations that overflowed because -** no space was left in the page cache.
    +** no space was left in the page cache.)^ ** -**
    SQLITE_STATUS_PAGECACHE_SIZE
    +** ^(
    SQLITE_STATUS_PAGECACHE_SIZE
    **
    This parameter records the largest memory allocation request ** handed to [pagecache memory allocator]. Only the value returned in the ** *pHighwater parameter to [sqlite3_status()] is of interest. -** The value written into the *pCurrent parameter is undefined.
    +** The value written into the *pCurrent parameter is undefined.)^ ** -**
    SQLITE_STATUS_SCRATCH_USED
    +** ^(
    SQLITE_STATUS_SCRATCH_USED
    **
    This parameter returns the number of allocations used out of the ** [scratch memory allocator] configured using ** [SQLITE_CONFIG_SCRATCH]. The value returned is in allocations, not ** in bytes. Since a single thread may only have one scratch allocation ** outstanding at time, this parameter also reports the number of threads -** using scratch memory at the same time.
    +** using scratch memory at the same time.)^ ** -**
    SQLITE_STATUS_SCRATCH_OVERFLOW
    +** ^(
    SQLITE_STATUS_SCRATCH_OVERFLOW
    **
    This parameter returns the number of bytes of scratch memory ** allocation which could not be statisfied by the [SQLITE_CONFIG_SCRATCH] ** buffer and where forced to overflow to [sqlite3_malloc()]. The values @@ -5676,17 +5562,17 @@ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_status(int op, int *pCurrent, int *pH ** larger (that is, because the requested allocation was larger than the ** "sz" parameter to [SQLITE_CONFIG_SCRATCH]) and because no scratch buffer ** slots were available. -**
    +** )^ ** -**
    SQLITE_STATUS_SCRATCH_SIZE
    +** ^(
    SQLITE_STATUS_SCRATCH_SIZE
    **
    This parameter records the largest memory allocation request ** handed to [scratch memory allocator]. Only the value returned in the ** *pHighwater parameter to [sqlite3_status()] is of interest. -** The value written into the *pCurrent parameter is undefined.
    +** The value written into the *pCurrent parameter is undefined.)^ ** -**
    SQLITE_STATUS_PARSER_STACK
    +** ^(
    SQLITE_STATUS_PARSER_STACK
    **
    This parameter records the deepest parser stack. It is only -** meaningful if SQLite is compiled with [YYTRACKMAXSTACKDEPTH].
    +** meaningful if SQLite is compiled with [YYTRACKMAXSTACKDEPTH].)^ **
    ** ** New status parameters may be added from time to time. @@ -5702,18 +5588,18 @@ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_status(int op, int *pCurrent, int *pH #define SQLITE_STATUS_SCRATCH_SIZE 8 /* -** CAPI3REF: Database Connection Status {H17500} +** CAPI3REF: Database Connection Status ** EXPERIMENTAL ** -** This interface is used to retrieve runtime status information -** about a single [database connection]. The first argument is the -** database connection object to be interrogated. The second argument -** is the parameter to interrogate. Currently, the only allowed value +** ^This interface is used to retrieve runtime status information +** about a single [database connection]. ^The first argument is the +** database connection object to be interrogated. ^The second argument +** is the parameter to interrogate. ^Currently, the only allowed value ** for the second parameter is [SQLITE_DBSTATUS_LOOKASIDE_USED]. ** Additional options will likely appear in future releases of SQLite. ** -** The current value of the requested parameter is written into *pCur -** and the highest instantaneous value is written into *pHiwtr. If +** ^The current value of the requested parameter is written into *pCur +** and the highest instantaneous value is written into *pHiwtr. ^If ** the resetFlg is true, then the highest instantaneous value is ** reset back down to the current value. ** @@ -5722,7 +5608,7 @@ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_status(int op, int *pCurrent, int *pH SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int resetFlg); /* -** CAPI3REF: Status Parameters for database connections {H17520} +** CAPI3REF: Status Parameters for database connections ** EXPERIMENTAL ** ** These constants are the available integer "verbs" that can be passed as @@ -5735,34 +5621,34 @@ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_db_status(sqlite3*, int op, int *pCur ** if a discontinued or unsupported verb is invoked. ** **
    -**
    SQLITE_DBSTATUS_LOOKASIDE_USED
    +** ^(
    SQLITE_DBSTATUS_LOOKASIDE_USED
    **
    This parameter returns the number of lookaside memory slots currently -** checked out.
    +** checked out.)^ **
    */ #define SQLITE_DBSTATUS_LOOKASIDE_USED 0 /* -** CAPI3REF: Prepared Statement Status {H17550} +** CAPI3REF: Prepared Statement Status ** EXPERIMENTAL ** -** Each prepared statement maintains various +** ^(Each prepared statement maintains various ** [SQLITE_STMTSTATUS_SORT | counters] that measure the number -** of times it has performed specific operations. These counters can +** of times it has performed specific operations.)^ These counters can ** be used to monitor the performance characteristics of the prepared ** statements. For example, if the number of table steps greatly exceeds ** the number of table searches or result rows, that would tend to indicate ** that the prepared statement is using a full table scan rather than ** an index. ** -** This interface is used to retrieve and reset counter values from +** ^(This interface is used to retrieve and reset counter values from ** a [prepared statement]. The first argument is the prepared statement ** object to be interrogated. The second argument ** is an integer code for a specific [SQLITE_STMTSTATUS_SORT | counter] -** to be interrogated. -** The current value of the requested counter is returned. -** If the resetFlg is true, then the counter is reset to zero after this +** to be interrogated.)^ +** ^The current value of the requested counter is returned. +** ^If the resetFlg is true, then the counter is reset to zero after this ** interface call returns. ** ** See also: [sqlite3_status()] and [sqlite3_db_status()]. @@ -5770,7 +5656,7 @@ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_db_status(sqlite3*, int op, int *pCur SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_stmt_status(sqlite3_stmt*, int op,int resetFlg); /* -** CAPI3REF: Status Parameters for prepared statements {H17570} +** CAPI3REF: Status Parameters for prepared statements ** EXPERIMENTAL ** ** These preprocessor macros define integer codes that name counter @@ -5779,13 +5665,13 @@ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_stmt_status(sqlite3_stmt*, int op,int ** **
    **
    SQLITE_STMTSTATUS_FULLSCAN_STEP
    -**
    This is the number of times that SQLite has stepped forward in +**
    ^This is the number of times that SQLite has stepped forward in ** a table as part of a full table scan. Large numbers for this counter ** may indicate opportunities for performance improvement through ** careful use of indices.
    ** **
    SQLITE_STMTSTATUS_SORT
    -**
    This is the number of sort operations that have occurred. +**
    ^This is the number of sort operations that have occurred. ** A non-zero value in this counter may indicate an opportunity to ** improvement performance through careful use of indices.
    ** @@ -5813,9 +5699,9 @@ typedef struct sqlite3_pcache sqlite3_pcache; ** KEYWORDS: {page cache} ** EXPERIMENTAL ** -** The [sqlite3_config]([SQLITE_CONFIG_PCACHE], ...) interface can +** ^(The [sqlite3_config]([SQLITE_CONFIG_PCACHE], ...) interface can ** register an alternative page cache implementation by passing in an -** instance of the sqlite3_pcache_methods structure. The majority of the +** instance of the sqlite3_pcache_methods structure.)^ The majority of the ** heap memory used by SQLite is used by the page cache to cache data read ** from, or ready to be written to, the database file. By implementing a ** custom page cache using this API, an application can control more @@ -5824,69 +5710,69 @@ typedef struct sqlite3_pcache sqlite3_pcache; ** determine exactly which parts of a database file are cached and for ** how long. ** -** The contents of the sqlite3_pcache_methods structure are copied to an +** ^(The contents of the sqlite3_pcache_methods structure are copied to an ** internal buffer by SQLite within the call to [sqlite3_config]. Hence ** the application may discard the parameter after the call to -** [sqlite3_config()] returns. +** [sqlite3_config()] returns.)^ ** -** The xInit() method is called once for each call to [sqlite3_initialize()] -** (usually only once during the lifetime of the process). It is passed -** a copy of the sqlite3_pcache_methods.pArg value. It can be used to set -** up global structures and mutexes required by the custom page cache -** implementation. +** ^The xInit() method is called once for each call to [sqlite3_initialize()] +** (usually only once during the lifetime of the process). ^(The xInit() +** method is passed a copy of the sqlite3_pcache_methods.pArg value.)^ +** ^The xInit() method can set up up global structures and/or any mutexes +** required by the custom page cache implementation. ** -** The xShutdown() method is called from within [sqlite3_shutdown()], +** ^The xShutdown() method is called from within [sqlite3_shutdown()], ** if the application invokes this API. It can be used to clean up ** any outstanding resources before process shutdown, if required. ** -** SQLite holds a [SQLITE_MUTEX_RECURSIVE] mutex when it invokes -** the xInit method, so the xInit method need not be threadsafe. The +** ^SQLite holds a [SQLITE_MUTEX_RECURSIVE] mutex when it invokes +** the xInit method, so the xInit method need not be threadsafe. ^The ** xShutdown method is only called from [sqlite3_shutdown()] so it does ** not need to be threadsafe either. All other methods must be threadsafe ** in multithreaded applications. ** -** SQLite will never invoke xInit() more than once without an intervening +** ^SQLite will never invoke xInit() more than once without an intervening ** call to xShutdown(). ** -** The xCreate() method is used to construct a new cache instance. SQLite +** ^The xCreate() method is used to construct a new cache instance. SQLite ** will typically create one cache instance for each open database file, -** though this is not guaranteed. The +** though this is not guaranteed. ^The ** first parameter, szPage, is the size in bytes of the pages that must -** be allocated by the cache. szPage will not be a power of two. szPage +** be allocated by the cache. ^szPage will not be a power of two. ^szPage ** will the page size of the database file that is to be cached plus an -** increment (here called "R") of about 100 or 200. SQLite will use the +** increment (here called "R") of about 100 or 200. ^SQLite will use the ** extra R bytes on each page to store metadata about the underlying ** database page on disk. The value of R depends ** on the SQLite version, the target platform, and how SQLite was compiled. -** R is constant for a particular build of SQLite. The second argument to +** ^R is constant for a particular build of SQLite. ^The second argument to ** xCreate(), bPurgeable, is true if the cache being created will ** be used to cache database pages of a file stored on disk, or -** false if it is used for an in-memory database. The cache implementation +** false if it is used for an in-memory database. ^The cache implementation ** does not have to do anything special based with the value of bPurgeable; -** it is purely advisory. On a cache where bPurgeable is false, SQLite will +** it is purely advisory. ^On a cache where bPurgeable is false, SQLite will ** never invoke xUnpin() except to deliberately delete a page. -** In other words, a cache created with bPurgeable set to false will +** ^In other words, a cache created with bPurgeable set to false will ** never contain any unpinned pages. ** -** The xCachesize() method may be called at any time by SQLite to set the +** ^(The xCachesize() method may be called at any time by SQLite to set the ** suggested maximum cache-size (number of pages stored by) the cache ** instance passed as the first argument. This is the value configured using -** the SQLite "[PRAGMA cache_size]" command. As with the bPurgeable parameter, -** the implementation is not required to do anything with this +** the SQLite "[PRAGMA cache_size]" command.)^ ^As with the bPurgeable +** parameter, the implementation is not required to do anything with this ** value; it is advisory only. ** -** The xPagecount() method should return the number of pages currently +** ^The xPagecount() method should return the number of pages currently ** stored in the cache. ** -** The xFetch() method is used to fetch a page and return a pointer to it. -** A 'page', in this context, is a buffer of szPage bytes aligned at an -** 8-byte boundary. The page to be fetched is determined by the key. The +** ^The xFetch() method is used to fetch a page and return a pointer to it. +** ^A 'page', in this context, is a buffer of szPage bytes aligned at an +** 8-byte boundary. ^The page to be fetched is determined by the key. ^The ** mimimum key value is 1. After it has been retrieved using xFetch, the page ** is considered to be "pinned". ** -** If the requested page is already in the page cache, then the page cache +** ^If the requested page is already in the page cache, then the page cache ** implementation must return a pointer to the page buffer with its content -** intact. If the requested page is not already in the cache, then the +** intact. ^(If the requested page is not already in the cache, then the ** behavior of the cache implementation is determined by the value of the ** createFlag parameter passed to xFetch, according to the following table: ** @@ -5897,7 +5783,7 @@ typedef struct sqlite3_pcache sqlite3_pcache; ** Otherwise return NULL. ** 2 Make every effort to allocate a new page. Only return ** NULL if allocating a new page is effectively impossible. -** +** )^ ** ** SQLite will normally invoke xFetch() with a createFlag of 0 or 1. If ** a call to xFetch() with createFlag==1 returns NULL, then SQLite will @@ -5906,32 +5792,32 @@ typedef struct sqlite3_pcache sqlite3_pcache; ** attempting to unpin pages, the xFetch() method will be invoked again with ** a createFlag of 2. ** -** xUnpin() is called by SQLite with a pointer to a currently pinned page -** as its second argument. If the third parameter, discard, is non-zero, +** ^xUnpin() is called by SQLite with a pointer to a currently pinned page +** as its second argument. ^(If the third parameter, discard, is non-zero, ** then the page should be evicted from the cache. In this case SQLite ** assumes that the next time the page is retrieved from the cache using -** the xFetch() method, it will be zeroed. If the discard parameter is -** zero, then the page is considered to be unpinned. The cache implementation +** the xFetch() method, it will be zeroed.)^ ^If the discard parameter is +** zero, then the page is considered to be unpinned. ^The cache implementation ** may choose to evict unpinned pages at any time. ** -** The cache is not required to perform any reference counting. A single +** ^(The cache is not required to perform any reference counting. A single ** call to xUnpin() unpins the page regardless of the number of prior calls -** to xFetch(). +** to xFetch().)^ ** -** The xRekey() method is used to change the key value associated with the -** page passed as the second argument from oldKey to newKey. If the cache +** ^The xRekey() method is used to change the key value associated with the +** page passed as the second argument from oldKey to newKey. ^If the cache ** previously contains an entry associated with newKey, it should be -** discarded. Any prior cache entry associated with newKey is guaranteed not +** discarded. ^Any prior cache entry associated with newKey is guaranteed not ** to be pinned. ** -** When SQLite calls the xTruncate() method, the cache must discard all +** ^When SQLite calls the xTruncate() method, the cache must discard all ** existing cache entries with page numbers (keys) greater than or equal -** to the value of the iLimit parameter passed to xTruncate(). If any +** to the value of the iLimit parameter passed to xTruncate(). ^If any ** of these pages are pinned, they are implicitly unpinned, meaning that ** they can be safely discarded. ** -** The xDestroy() method is used to delete a cache allocated by xCreate(). -** All resources associated with the specified cache should be freed. After +** ^The xDestroy() method is used to delete a cache allocated by xCreate(). +** All resources associated with the specified cache should be freed. ^After ** calling the xDestroy() method, SQLite considers the [sqlite3_pcache*] ** handle invalid, and will not use it with any other sqlite3_pcache_methods ** functions. @@ -5956,7 +5842,7 @@ struct sqlite3_pcache_methods { ** EXPERIMENTAL ** ** The sqlite3_backup object records state information about an ongoing -** online backup operation. The sqlite3_backup object is created by +** online backup operation. ^The sqlite3_backup object is created by ** a call to [sqlite3_backup_init()] and is destroyed by a call to ** [sqlite3_backup_finish()]. ** @@ -5968,20 +5854,20 @@ typedef struct sqlite3_backup sqlite3_backup; ** CAPI3REF: Online Backup API. ** EXPERIMENTAL ** -** This API is used to overwrite the contents of one database with that -** of another. It is useful either for creating backups of databases or +** The backup API copies the content of one database into another. +** It is useful either for creating backups of databases or ** for copying in-memory databases to or from persistent files. ** ** See Also: [Using the SQLite Online Backup API] ** -** Exclusive access is required to the destination database for the -** duration of the operation. However the source database is only -** read-locked while it is actually being read, it is not locked -** continuously for the entire operation. Thus, the backup may be -** performed on a live database without preventing other users from -** writing to the database for an extended period of time. +** ^Exclusive access is required to the destination database for the +** duration of the operation. ^However the source database is only +** read-locked while it is actually being read; it is not locked +** continuously for the entire backup operation. ^Thus, the backup may be +** performed on a live source database without preventing other users from +** reading or writing to the source database while the backup is underway. ** -** To perform a backup operation: +** ^(To perform a backup operation: **
      **
    1. sqlite3_backup_init() is called once to initialize the ** backup, @@ -5989,143 +5875,148 @@ typedef struct sqlite3_backup sqlite3_backup; ** the data between the two databases, and finally **
    2. sqlite3_backup_finish() is called to release all resources ** associated with the backup operation. -**
    +** )^ ** There should be exactly one call to sqlite3_backup_finish() for each ** successful call to sqlite3_backup_init(). ** ** sqlite3_backup_init() ** -** The first two arguments passed to [sqlite3_backup_init()] are the database -** handle associated with the destination database and the database name -** used to attach the destination database to the handle. The database name -** is "main" for the main database, "temp" for the temporary database, or -** the name specified as part of the [ATTACH] statement if the destination is -** an attached database. The third and fourth arguments passed to -** sqlite3_backup_init() identify the [database connection] -** and database name used -** to access the source database. The values passed for the source and -** destination [database connection] parameters must not be the same. -** -** If an error occurs within sqlite3_backup_init(), then NULL is returned -** and an error code and error message written into the [database connection] -** passed as the first argument. They may be retrieved using the -** [sqlite3_errcode()], [sqlite3_errmsg()], and [sqlite3_errmsg16()] functions. -** Otherwise, if successful, a pointer to an [sqlite3_backup] object is -** returned. This pointer may be used with the sqlite3_backup_step() and +** ^The D and N arguments to sqlite3_backup_init(D,N,S,M) are the +** [database connection] associated with the destination database +** and the database name, respectively. +** ^The database name is "main" for the main database, "temp" for the +** temporary database, or the name specified after the AS keyword in +** an [ATTACH] statement for an attached database. +** ^The S and M arguments passed to +** sqlite3_backup_init(D,N,S,M) identify the [database connection] +** and database name of the source database, respectively. +** ^The source and destination [database connections] (parameters S and D) +** must be different or else sqlite3_backup_init(D,N,S,M) will file with +** an error. +** +** ^If an error occurs within sqlite3_backup_init(D,N,S,M), then NULL is +** returned and an error code and error message are store3d in the +** destination [database connection] D. +** ^The error code and message for the failed call to sqlite3_backup_init() +** can be retrieved using the [sqlite3_errcode()], [sqlite3_errmsg()], and/or +** [sqlite3_errmsg16()] functions. +** ^A successful call to sqlite3_backup_init() returns a pointer to an +** [sqlite3_backup] object. +** ^The [sqlite3_backup] object may be used with the sqlite3_backup_step() and ** sqlite3_backup_finish() functions to perform the specified backup ** operation. ** ** sqlite3_backup_step() ** -** Function [sqlite3_backup_step()] is used to copy up to nPage pages between -** the source and destination databases, where nPage is the value of the -** second parameter passed to sqlite3_backup_step(). If nPage is a negative -** value, all remaining source pages are copied. If the required pages are -** succesfully copied, but there are still more pages to copy before the -** backup is complete, it returns [SQLITE_OK]. If no error occured and there -** are no more pages to copy, then [SQLITE_DONE] is returned. If an error -** occurs, then an SQLite error code is returned. As well as [SQLITE_OK] and +** ^Function sqlite3_backup_step(B,N) will copy up to N pages between +** the source and destination databases specified by [sqlite3_backup] object B. +** ^If N is negative, all remaining source pages are copied. +** ^If sqlite3_backup_step(B,N) successfully copies N pages and there +** are still more pages to be copied, then the function resturns [SQLITE_OK]. +** ^If sqlite3_backup_step(B,N) successfully finishes copying all pages +** from source to destination, then it returns [SQLITE_DONE]. +** ^If an error occurs while running sqlite3_backup_step(B,N), +** then an [error code] is returned. ^As well as [SQLITE_OK] and ** [SQLITE_DONE], a call to sqlite3_backup_step() may return [SQLITE_READONLY], ** [SQLITE_NOMEM], [SQLITE_BUSY], [SQLITE_LOCKED], or an ** [SQLITE_IOERR_ACCESS | SQLITE_IOERR_XXX] extended error code. ** -** As well as the case where the destination database file was opened for -** read-only access, sqlite3_backup_step() may return [SQLITE_READONLY] if +** ^The sqlite3_backup_step() might return [SQLITE_READONLY] if the destination +** database was opened read-only or if ** the destination is an in-memory database with a different page size ** from the source database. ** -** If sqlite3_backup_step() cannot obtain a required file-system lock, then +** ^If sqlite3_backup_step() cannot obtain a required file-system lock, then ** the [sqlite3_busy_handler | busy-handler function] -** is invoked (if one is specified). If the +** is invoked (if one is specified). ^If the ** busy-handler returns non-zero before the lock is available, then -** [SQLITE_BUSY] is returned to the caller. In this case the call to -** sqlite3_backup_step() can be retried later. If the source +** [SQLITE_BUSY] is returned to the caller. ^In this case the call to +** sqlite3_backup_step() can be retried later. ^If the source ** [database connection] ** is being used to write to the source database when sqlite3_backup_step() -** is called, then [SQLITE_LOCKED] is returned immediately. Again, in this -** case the call to sqlite3_backup_step() can be retried later on. If +** is called, then [SQLITE_LOCKED] is returned immediately. ^Again, in this +** case the call to sqlite3_backup_step() can be retried later on. ^(If ** [SQLITE_IOERR_ACCESS | SQLITE_IOERR_XXX], [SQLITE_NOMEM], or ** [SQLITE_READONLY] is returned, then ** there is no point in retrying the call to sqlite3_backup_step(). These -** errors are considered fatal. At this point the application must accept +** errors are considered fatal.)^ The application must accept ** that the backup operation has failed and pass the backup operation handle ** to the sqlite3_backup_finish() to release associated resources. ** -** Following the first call to sqlite3_backup_step(), an exclusive lock is -** obtained on the destination file. It is not released until either +** ^The first call to sqlite3_backup_step() obtains an exclusive lock +** on the destination file. ^The exclusive lock is not released until either ** sqlite3_backup_finish() is called or the backup operation is complete -** and sqlite3_backup_step() returns [SQLITE_DONE]. Additionally, each time -** a call to sqlite3_backup_step() is made a [shared lock] is obtained on -** the source database file. This lock is released before the -** sqlite3_backup_step() call returns. Because the source database is not -** locked between calls to sqlite3_backup_step(), it may be modified mid-way -** through the backup procedure. If the source database is modified by an +** and sqlite3_backup_step() returns [SQLITE_DONE]. ^Every call to +** sqlite3_backup_step() obtains a [shared lock] on the source database that +** lasts for the duration of the sqlite3_backup_step() call. +** ^Because the source database is not locked between calls to +** sqlite3_backup_step(), the source database may be modified mid-way +** through the backup process. ^If the source database is modified by an ** external process or via a database connection other than the one being -** used by the backup operation, then the backup will be transparently -** restarted by the next call to sqlite3_backup_step(). If the source +** used by the backup operation, then the backup will be automatically +** restarted by the next call to sqlite3_backup_step(). ^If the source ** database is modified by the using the same database connection as is used -** by the backup operation, then the backup database is transparently +** by the backup operation, then the backup database is automatically ** updated at the same time. ** ** sqlite3_backup_finish() ** -** Once sqlite3_backup_step() has returned [SQLITE_DONE], or when the -** application wishes to abandon the backup operation, the [sqlite3_backup] -** object should be passed to sqlite3_backup_finish(). This releases all -** resources associated with the backup operation. If sqlite3_backup_step() -** has not yet returned [SQLITE_DONE], then any active write-transaction on the -** destination database is rolled back. The [sqlite3_backup] object is invalid +** When sqlite3_backup_step() has returned [SQLITE_DONE], or when the +** application wishes to abandon the backup operation, the application +** should destroy the [sqlite3_backup] by passing it to sqlite3_backup_finish(). +** ^The sqlite3_backup_finish() interfaces releases all +** resources associated with the [sqlite3_backup] object. +** ^If sqlite3_backup_step() has not yet returned [SQLITE_DONE], then any +** active write-transaction on the destination database is rolled back. +** The [sqlite3_backup] object is invalid ** and may not be used following a call to sqlite3_backup_finish(). ** -** The value returned by sqlite3_backup_finish is [SQLITE_OK] if no error -** occurred, regardless or whether or not sqlite3_backup_step() was called -** a sufficient number of times to complete the backup operation. Or, if -** an out-of-memory condition or IO error occured during a call to -** sqlite3_backup_step() then [SQLITE_NOMEM] or an -** [SQLITE_IOERR_ACCESS | SQLITE_IOERR_XXX] error code -** is returned. In this case the error code and an error message are -** written to the destination [database connection]. -** -** A return of [SQLITE_BUSY] or [SQLITE_LOCKED] from sqlite3_backup_step() is -** not a permanent error and does not affect the return value of +** ^The value returned by sqlite3_backup_finish is [SQLITE_OK] if no +** sqlite3_backup_step() errors occurred, regardless or whether or not +** sqlite3_backup_step() completed. +** ^If an out-of-memory condition or IO error occurred during any prior +** sqlite3_backup_step() call on the same [sqlite3_backup] object, then +** sqlite3_backup_finish() returns the corresponding [error code]. +** +** ^A return of [SQLITE_BUSY] or [SQLITE_LOCKED] from sqlite3_backup_step() +** is not a permanent error and does not affect the return value of ** sqlite3_backup_finish(). ** ** sqlite3_backup_remaining(), sqlite3_backup_pagecount() ** -** Each call to sqlite3_backup_step() sets two values stored internally -** by an [sqlite3_backup] object. The number of pages still to be backed -** up, which may be queried by sqlite3_backup_remaining(), and the total -** number of pages in the source database file, which may be queried by -** sqlite3_backup_pagecount(). +** ^Each call to sqlite3_backup_step() sets two values inside +** the [sqlite3_backup] object: the number of pages still to be backed +** up and the total number of pages in the source databae file. +** The sqlite3_backup_remaining() and sqlite3_backup_pagecount() interfaces +** retrieve these two values, respectively. ** -** The values returned by these functions are only updated by -** sqlite3_backup_step(). If the source database is modified during a backup +** ^The values returned by these functions are only updated by +** sqlite3_backup_step(). ^If the source database is modified during a backup ** operation, then the values are not updated to account for any extra ** pages that need to be updated or the size of the source database file ** changing. ** ** Concurrent Usage of Database Handles ** -** The source [database connection] may be used by the application for other +** ^The source [database connection] may be used by the application for other ** purposes while a backup operation is underway or being initialized. -** If SQLite is compiled and configured to support threadsafe database +** ^If SQLite is compiled and configured to support threadsafe database ** connections, then the source database connection may be used concurrently ** from within other threads. ** -** However, the application must guarantee that the destination database -** connection handle is not passed to any other API (by any thread) after +** However, the application must guarantee that the destination +** [database connection] is not passed to any other API (by any thread) after ** sqlite3_backup_init() is called and before the corresponding call to -** sqlite3_backup_finish(). Unfortunately SQLite does not currently check -** for this, if the application does use the destination [database connection] -** for some other purpose during a backup operation, things may appear to -** work correctly but in fact be subtly malfunctioning. Use of the -** destination database connection while a backup is in progress might -** also cause a mutex deadlock. -** -** Furthermore, if running in [shared cache mode], the application must +** sqlite3_backup_finish(). SQLite does not currently check to see +** if the application incorrectly accesses the destination [database connection] +** and so no error code is reported, but the operations may malfunction +** nevertheless. Use of the destination database connection while a +** backup is in progress might also also cause a mutex deadlock. +** +** If running in [shared cache mode], the application must ** guarantee that the shared cache used by the destination database ** is not accessed while the backup is running. In practice this means -** that the application must guarantee that the file-system file being +** that the application must guarantee that the disk file being ** backed up to is not accessed by any connection within the process, ** not just the specific connection that was passed to sqlite3_backup_init(). ** @@ -6151,48 +6042,48 @@ SQLITE_API int sqlite3_backup_pagecount(sqlite3_backup *p); ** CAPI3REF: Unlock Notification ** EXPERIMENTAL ** -** When running in shared-cache mode, a database operation may fail with +** ^When running in shared-cache mode, a database operation may fail with ** an [SQLITE_LOCKED] error if the required locks on the shared-cache or ** individual tables within the shared-cache cannot be obtained. See ** [SQLite Shared-Cache Mode] for a description of shared-cache locking. -** This API may be used to register a callback that SQLite will invoke +** ^This API may be used to register a callback that SQLite will invoke ** when the connection currently holding the required lock relinquishes it. -** This API is only available if the library was compiled with the +** ^This API is only available if the library was compiled with the ** [SQLITE_ENABLE_UNLOCK_NOTIFY] C-preprocessor symbol defined. ** ** See Also: [Using the SQLite Unlock Notification Feature]. ** -** Shared-cache locks are released when a database connection concludes +** ^Shared-cache locks are released when a database connection concludes ** its current transaction, either by committing it or rolling it back. ** -** When a connection (known as the blocked connection) fails to obtain a +** ^When a connection (known as the blocked connection) fails to obtain a ** shared-cache lock and SQLITE_LOCKED is returned to the caller, the ** identity of the database connection (the blocking connection) that -** has locked the required resource is stored internally. After an +** has locked the required resource is stored internally. ^After an ** application receives an SQLITE_LOCKED error, it may call the ** sqlite3_unlock_notify() method with the blocked connection handle as ** the first argument to register for a callback that will be invoked -** when the blocking connections current transaction is concluded. The +** when the blocking connections current transaction is concluded. ^The ** callback is invoked from within the [sqlite3_step] or [sqlite3_close] ** call that concludes the blocking connections transaction. ** -** If sqlite3_unlock_notify() is called in a multi-threaded application, +** ^(If sqlite3_unlock_notify() is called in a multi-threaded application, ** there is a chance that the blocking connection will have already ** concluded its transaction by the time sqlite3_unlock_notify() is invoked. ** If this happens, then the specified callback is invoked immediately, -** from within the call to sqlite3_unlock_notify(). +** from within the call to sqlite3_unlock_notify().)^ ** -** If the blocked connection is attempting to obtain a write-lock on a +** ^If the blocked connection is attempting to obtain a write-lock on a ** shared-cache table, and more than one other connection currently holds ** a read-lock on the same table, then SQLite arbitrarily selects one of ** the other connections to use as the blocking connection. ** -** There may be at most one unlock-notify callback registered by a +** ^(There may be at most one unlock-notify callback registered by a ** blocked connection. If sqlite3_unlock_notify() is called when the ** blocked connection already has a registered unlock-notify callback, -** then the new callback replaces the old. If sqlite3_unlock_notify() is +** then the new callback replaces the old.)^ ^If sqlite3_unlock_notify() is ** called with a NULL pointer as its second argument, then any existing -** unlock-notify callback is cancelled. The blocked connections +** unlock-notify callback is cancelled. ^The blocked connections ** unlock-notify callback may also be canceled by closing the blocked ** connection using [sqlite3_close()]. ** @@ -6200,7 +6091,7 @@ SQLITE_API int sqlite3_backup_pagecount(sqlite3_backup *p); ** any sqlite3_xxx API functions from within an unlock-notify callback, a ** crash or deadlock may be the result. ** -** Unless deadlock is detected (see below), sqlite3_unlock_notify() always +** ^Unless deadlock is detected (see below), sqlite3_unlock_notify() always ** returns SQLITE_OK. ** ** Callback Invocation Details @@ -6214,7 +6105,7 @@ SQLITE_API int sqlite3_backup_pagecount(sqlite3_backup *p); ** ** When a blocking connections transaction is concluded, there may be ** more than one blocked connection that has registered for an unlock-notify -** callback. If two or more such blocked connections have specified the +** callback. ^If two or more such blocked connections have specified the ** same callback function, then instead of invoking the callback function ** multiple times, it is invoked once with the set of void* context pointers ** specified by the blocked connections bundled together into an array. @@ -6232,16 +6123,16 @@ SQLITE_API int sqlite3_backup_pagecount(sqlite3_backup *p); ** will proceed and the system may remain deadlocked indefinitely. ** ** To avoid this scenario, the sqlite3_unlock_notify() performs deadlock -** detection. If a given call to sqlite3_unlock_notify() would put the +** detection. ^If a given call to sqlite3_unlock_notify() would put the ** system in a deadlocked state, then SQLITE_LOCKED is returned and no ** unlock-notify callback is registered. The system is said to be in ** a deadlocked state if connection A has registered for an unlock-notify ** callback on the conclusion of connection B's transaction, and connection ** B has itself registered for an unlock-notify callback when connection -** A's transaction is concluded. Indirect deadlock is also detected, so +** A's transaction is concluded. ^Indirect deadlock is also detected, so ** the system is also considered to be deadlocked if connection B has ** registered for an unlock-notify callback on the conclusion of connection -** C's transaction, where connection C is waiting on connection A. Any +** C's transaction, where connection C is waiting on connection A. ^Any ** number of levels of indirection are allowed. ** ** The "DROP TABLE" Exception @@ -6257,10 +6148,10 @@ SQLITE_API int sqlite3_backup_pagecount(sqlite3_backup *p); ** or "DROP INDEX" query, an infinite loop might be the result. ** ** One way around this problem is to check the extended error code returned -** by an sqlite3_step() call. If there is a blocking connection, then the +** by an sqlite3_step() call. ^(If there is a blocking connection, then the ** extended error code is set to SQLITE_LOCKED_SHAREDCACHE. Otherwise, in ** the special "DROP TABLE/INDEX" case, the extended error code is just -** SQLITE_LOCKED. +** SQLITE_LOCKED.)^ */ SQLITE_API int sqlite3_unlock_notify( sqlite3 *pBlocked, /* Waiting connection */ @@ -6273,7 +6164,7 @@ SQLITE_API int sqlite3_unlock_notify( ** CAPI3REF: String Comparison ** EXPERIMENTAL ** -** The [sqlite3_strnicmp()] API allows applications and extensions to +** ^The [sqlite3_strnicmp()] API allows applications and extensions to ** compare the contents of two buffers containing UTF-8 strings in a ** case-indendent fashion, using the same definition of case independence ** that SQLite uses internally when comparing identifiers. @@ -6311,8 +6202,6 @@ SQLITE_API int sqlite3_strnicmp(const char *, const char *, int); ************************************************************************* ** This is the header file for the generic hash-table implemenation ** used in SQLite. -** -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ #ifndef _SQLITE_HASH_H_ #define _SQLITE_HASH_H_ @@ -6505,30 +6394,30 @@ SQLITE_PRIVATE void sqlite3HashClear(Hash*); #define TK_REFERENCES 102 #define TK_AUTOINCR 103 #define TK_ON 104 -#define TK_DELETE 105 -#define TK_UPDATE 106 -#define TK_SET 107 -#define TK_DEFERRABLE 108 -#define TK_FOREIGN 109 -#define TK_DROP 110 -#define TK_UNION 111 -#define TK_ALL 112 -#define TK_EXCEPT 113 -#define TK_INTERSECT 114 -#define TK_SELECT 115 -#define TK_DISTINCT 116 -#define TK_DOT 117 -#define TK_FROM 118 -#define TK_JOIN 119 -#define TK_USING 120 -#define TK_ORDER 121 -#define TK_GROUP 122 -#define TK_HAVING 123 -#define TK_LIMIT 124 -#define TK_WHERE 125 -#define TK_INTO 126 -#define TK_VALUES 127 -#define TK_INSERT 128 +#define TK_INSERT 105 +#define TK_DELETE 106 +#define TK_UPDATE 107 +#define TK_SET 108 +#define TK_DEFERRABLE 109 +#define TK_FOREIGN 110 +#define TK_DROP 111 +#define TK_UNION 112 +#define TK_ALL 113 +#define TK_EXCEPT 114 +#define TK_INTERSECT 115 +#define TK_SELECT 116 +#define TK_DISTINCT 117 +#define TK_DOT 118 +#define TK_FROM 119 +#define TK_JOIN 120 +#define TK_USING 121 +#define TK_ORDER 122 +#define TK_GROUP 123 +#define TK_HAVING 124 +#define TK_LIMIT 125 +#define TK_WHERE 126 +#define TK_INTO 127 +#define TK_VALUES 128 #define TK_INTEGER 129 #define TK_FLOAT 130 #define TK_BLOB 131 @@ -6753,9 +6642,19 @@ SQLITE_PRIVATE const int sqlite3one; #define ROUNDDOWN8(x) ((x)&~7) /* -** Assert that the pointer X is aligned to an 8-byte boundary. +** Assert that the pointer X is aligned to an 8-byte boundary. This +** macro is used only within assert() to verify that the code gets +** all alignment restrictions correct. +** +** Except, if SQLITE_4_BYTE_ALIGNED_MALLOC is defined, then the +** underlying malloc() implemention might return us 4-byte aligned +** pointers. In that case, only verify 4-byte alignment. */ -#define EIGHT_BYTE_ALIGNMENT(X) ((((char*)(X) - (char*)0)&7)==0) +#ifdef SQLITE_4_BYTE_ALIGNED_MALLOC +# define EIGHT_BYTE_ALIGNMENT(X) ((((char*)(X) - (char*)0)&3)==0) +#else +# define EIGHT_BYTE_ALIGNMENT(X) ((((char*)(X) - (char*)0)&7)==0) +#endif /* @@ -6915,8 +6814,6 @@ typedef struct WhereLevel WhereLevel; ** This header file defines the interface that the sqlite B-Tree file ** subsystem. See comments in the source code for a detailed description ** of what each interface routine does. -** -** @(#) $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ #ifndef _BTREE_H_ #define _BTREE_H_ @@ -7053,6 +6950,7 @@ SQLITE_PRIVATE int sqlite3BtreeCursor( BtCursor *pCursor /* Space to write cursor structure */ ); SQLITE_PRIVATE int sqlite3BtreeCursorSize(void); +SQLITE_PRIVATE void sqlite3BtreeCursorZero(BtCursor*); SQLITE_PRIVATE int sqlite3BtreeCloseCursor(BtCursor*); SQLITE_PRIVATE int sqlite3BtreeMovetoUnpacked( @@ -7164,8 +7062,6 @@ SQLITE_PRIVATE int sqlite3BtreeHoldsAllMutexes(sqlite3*); ** This header defines the interface to the virtual database engine ** or VDBE. The VDBE implements an abstract machine that runs a ** simple program to access and modify the underlying database. -** -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ #ifndef _SQLITE_VDBE_H_ #define _SQLITE_VDBE_H_ @@ -7193,7 +7089,7 @@ typedef struct SubProgram SubProgram; struct VdbeOp { u8 opcode; /* What operation to perform */ signed char p4type; /* One of the P4_xxx constants for p4 */ - u8 opflags; /* Not currently used */ + u8 opflags; /* Mask of the OPFLG_* flags in opcodes.h */ u8 p5; /* Fifth parameter is an unsigned character */ int p1; /* First operand */ int p2; /* Second parameter (often the jump destination) */ @@ -7313,147 +7209,147 @@ typedef struct VdbeOpList VdbeOpList; /************** Begin file opcodes.h *****************************************/ /* Automatically generated. Do not edit */ /* See the mkopcodeh.awk script for details */ -#define OP_VNext 1 -#define OP_Affinity 2 -#define OP_Column 3 -#define OP_SetCookie 4 -#define OP_Seek 5 +#define OP_Goto 1 +#define OP_Gosub 2 +#define OP_Return 3 +#define OP_Yield 4 +#define OP_HaltIfNull 5 +#define OP_Halt 6 +#define OP_Integer 7 +#define OP_Int64 8 #define OP_Real 130 /* same as TK_FLOAT */ -#define OP_Sequence 6 -#define OP_Savepoint 7 -#define OP_Ge 80 /* same as TK_GE */ -#define OP_RowKey 8 -#define OP_SCopy 9 -#define OP_Eq 76 /* same as TK_EQ */ -#define OP_OpenWrite 10 -#define OP_NotNull 74 /* same as TK_NOTNULL */ -#define OP_If 11 -#define OP_ToInt 144 /* same as TK_TO_INT */ #define OP_String8 94 /* same as TK_STRING */ -#define OP_CollSeq 12 -#define OP_OpenRead 13 -#define OP_Expire 14 -#define OP_AutoCommit 15 -#define OP_Gt 77 /* same as TK_GT */ -#define OP_Pagecount 16 -#define OP_IntegrityCk 17 -#define OP_Sort 18 -#define OP_Copy 20 -#define OP_Trace 21 -#define OP_Function 22 -#define OP_IfNeg 23 -#define OP_And 69 /* same as TK_AND */ +#define OP_String 9 +#define OP_Null 10 +#define OP_Blob 11 +#define OP_Variable 12 +#define OP_Move 13 +#define OP_Copy 14 +#define OP_SCopy 15 +#define OP_ResultRow 16 +#define OP_Concat 91 /* same as TK_CONCAT */ +#define OP_Add 86 /* same as TK_PLUS */ #define OP_Subtract 87 /* same as TK_MINUS */ -#define OP_Noop 24 -#define OP_Program 25 -#define OP_Return 26 -#define OP_Remainder 90 /* same as TK_REM */ -#define OP_NewRowid 27 #define OP_Multiply 88 /* same as TK_STAR */ -#define OP_FkCounter 28 -#define OP_Variable 29 -#define OP_String 30 -#define OP_RealAffinity 31 -#define OP_VRename 32 -#define OP_ParseSchema 33 -#define OP_VOpen 34 -#define OP_Close 35 -#define OP_CreateIndex 36 -#define OP_IsUnique 37 -#define OP_NotFound 38 -#define OP_Int64 39 -#define OP_MustBeInt 40 -#define OP_Halt 41 -#define OP_Rowid 42 -#define OP_IdxLT 43 -#define OP_AddImm 44 -#define OP_RowData 45 -#define OP_MemMax 46 -#define OP_Or 68 /* same as TK_OR */ -#define OP_NotExists 47 -#define OP_Gosub 48 #define OP_Divide 89 /* same as TK_SLASH */ -#define OP_Integer 49 -#define OP_ToNumeric 143 /* same as TK_TO_NUMERIC*/ -#define OP_Prev 50 -#define OP_RowSetRead 51 -#define OP_Concat 91 /* same as TK_CONCAT */ -#define OP_RowSetAdd 52 +#define OP_Remainder 90 /* same as TK_REM */ +#define OP_CollSeq 17 +#define OP_Function 18 #define OP_BitAnd 82 /* same as TK_BITAND */ -#define OP_VColumn 53 -#define OP_CreateTable 54 -#define OP_Last 55 -#define OP_SeekLe 56 -#define OP_IsNull 73 /* same as TK_ISNULL */ -#define OP_IncrVacuum 57 -#define OP_IdxRowid 58 -#define OP_ShiftRight 85 /* same as TK_RSHIFT */ -#define OP_ResetCount 59 -#define OP_Yield 60 -#define OP_DropTrigger 61 -#define OP_DropIndex 62 -#define OP_Param 63 -#define OP_IdxGE 64 -#define OP_IdxDelete 65 -#define OP_Vacuum 66 -#define OP_IfNot 67 -#define OP_DropTable 70 -#define OP_SeekLt 71 -#define OP_MakeRecord 72 -#define OP_ToBlob 142 /* same as TK_TO_BLOB */ -#define OP_ResultRow 81 -#define OP_Delete 92 -#define OP_AggFinal 95 -#define OP_Compare 96 +#define OP_BitOr 83 /* same as TK_BITOR */ #define OP_ShiftLeft 84 /* same as TK_LSHIFT */ -#define OP_Goto 97 -#define OP_TableLock 98 -#define OP_Clear 99 -#define OP_Le 78 /* same as TK_LE */ -#define OP_VerifyCookie 100 -#define OP_AggStep 101 +#define OP_ShiftRight 85 /* same as TK_RSHIFT */ +#define OP_AddImm 20 +#define OP_MustBeInt 21 +#define OP_RealAffinity 22 #define OP_ToText 141 /* same as TK_TO_TEXT */ -#define OP_Not 19 /* same as TK_NOT */ +#define OP_ToBlob 142 /* same as TK_TO_BLOB */ +#define OP_ToNumeric 143 /* same as TK_TO_NUMERIC*/ +#define OP_ToInt 144 /* same as TK_TO_INT */ #define OP_ToReal 145 /* same as TK_TO_REAL */ -#define OP_Transaction 102 -#define OP_VFilter 103 +#define OP_Eq 76 /* same as TK_EQ */ #define OP_Ne 75 /* same as TK_NE */ -#define OP_VDestroy 104 -#define OP_BitOr 83 /* same as TK_BITOR */ -#define OP_Next 105 -#define OP_Count 106 -#define OP_IdxInsert 107 #define OP_Lt 79 /* same as TK_LT */ -#define OP_FkIfZero 108 -#define OP_SeekGe 109 -#define OP_Insert 110 -#define OP_Destroy 111 -#define OP_ReadCookie 112 -#define OP_RowSetTest 113 -#define OP_LoadAnalysis 114 -#define OP_Explain 115 -#define OP_HaltIfNull 116 -#define OP_OpenPseudo 117 -#define OP_OpenEphemeral 118 -#define OP_Null 119 -#define OP_Move 120 -#define OP_Blob 121 -#define OP_Add 86 /* same as TK_PLUS */ -#define OP_Rewind 122 -#define OP_SeekGt 123 -#define OP_VBegin 124 -#define OP_VUpdate 125 -#define OP_IfZero 126 +#define OP_Le 78 /* same as TK_LE */ +#define OP_Gt 77 /* same as TK_GT */ +#define OP_Ge 80 /* same as TK_GE */ +#define OP_Permutation 23 +#define OP_Compare 24 +#define OP_Jump 25 +#define OP_And 69 /* same as TK_AND */ +#define OP_Or 68 /* same as TK_OR */ +#define OP_Not 19 /* same as TK_NOT */ #define OP_BitNot 93 /* same as TK_BITNOT */ -#define OP_VCreate 127 -#define OP_Found 128 -#define OP_IfPos 129 -#define OP_NullRow 131 -#define OP_Jump 132 -#define OP_Permutation 133 +#define OP_If 26 +#define OP_IfNot 27 +#define OP_IsNull 73 /* same as TK_ISNULL */ +#define OP_NotNull 74 /* same as TK_NOTNULL */ +#define OP_Column 28 +#define OP_Affinity 29 +#define OP_MakeRecord 30 +#define OP_Count 31 +#define OP_Savepoint 32 +#define OP_AutoCommit 33 +#define OP_Transaction 34 +#define OP_ReadCookie 35 +#define OP_SetCookie 36 +#define OP_VerifyCookie 37 +#define OP_OpenRead 38 +#define OP_OpenWrite 39 +#define OP_OpenEphemeral 40 +#define OP_OpenPseudo 41 +#define OP_Close 42 +#define OP_SeekLt 43 +#define OP_SeekLe 44 +#define OP_SeekGe 45 +#define OP_SeekGt 46 +#define OP_Seek 47 +#define OP_NotFound 48 +#define OP_Found 49 +#define OP_IsUnique 50 +#define OP_NotExists 51 +#define OP_Sequence 52 +#define OP_NewRowid 53 +#define OP_Insert 54 +#define OP_InsertInt 55 +#define OP_Delete 56 +#define OP_ResetCount 57 +#define OP_RowKey 58 +#define OP_RowData 59 +#define OP_Rowid 60 +#define OP_NullRow 61 +#define OP_Last 62 +#define OP_Sort 63 +#define OP_Rewind 64 +#define OP_Prev 65 +#define OP_Next 66 +#define OP_IdxInsert 67 +#define OP_IdxDelete 70 +#define OP_IdxRowid 71 +#define OP_IdxLT 72 +#define OP_IdxGE 81 +#define OP_Destroy 92 +#define OP_Clear 95 +#define OP_CreateIndex 96 +#define OP_CreateTable 97 +#define OP_ParseSchema 98 +#define OP_LoadAnalysis 99 +#define OP_DropTable 100 +#define OP_DropIndex 101 +#define OP_DropTrigger 102 +#define OP_IntegrityCk 103 +#define OP_RowSetAdd 104 +#define OP_RowSetRead 105 +#define OP_RowSetTest 106 +#define OP_Program 107 +#define OP_Param 108 +#define OP_FkCounter 109 +#define OP_FkIfZero 110 +#define OP_MemMax 111 +#define OP_IfPos 112 +#define OP_IfNeg 113 +#define OP_IfZero 114 +#define OP_AggStep 115 +#define OP_AggFinal 116 +#define OP_Vacuum 117 +#define OP_IncrVacuum 118 +#define OP_Expire 119 +#define OP_TableLock 120 +#define OP_VBegin 121 +#define OP_VCreate 122 +#define OP_VDestroy 123 +#define OP_VOpen 124 +#define OP_VFilter 125 +#define OP_VColumn 126 +#define OP_VNext 127 +#define OP_VRename 128 +#define OP_VUpdate 129 +#define OP_Pagecount 131 +#define OP_Trace 132 +#define OP_Noop 133 +#define OP_Explain 134 /* The following opcode values are never used */ -#define OP_NotUsed_134 134 #define OP_NotUsed_135 135 #define OP_NotUsed_136 136 #define OP_NotUsed_137 137 @@ -7471,25 +7367,26 @@ typedef struct VdbeOpList VdbeOpList; #define OPFLG_IN1 0x0004 /* in1: P1 is an input */ #define OPFLG_IN2 0x0008 /* in2: P2 is an input */ #define OPFLG_IN3 0x0010 /* in3: P3 is an input */ -#define OPFLG_OUT3 0x0020 /* out3: P3 is an output */ +#define OPFLG_OUT2 0x0020 /* out2: P2 is an output */ +#define OPFLG_OUT3 0x0040 /* out3: P3 is an output */ #define OPFLG_INITIALIZER {\ -/* 0 */ 0x00, 0x01, 0x00, 0x00, 0x10, 0x08, 0x02, 0x00,\ -/* 8 */ 0x00, 0x04, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00,\ -/* 16 */ 0x02, 0x00, 0x01, 0x04, 0x04, 0x00, 0x00, 0x05,\ -/* 24 */ 0x00, 0x01, 0x04, 0x02, 0x00, 0x00, 0x02, 0x04,\ -/* 32 */ 0x00, 0x00, 0x00, 0x00, 0x02, 0x11, 0x11, 0x02,\ -/* 40 */ 0x05, 0x00, 0x02, 0x11, 0x04, 0x00, 0x08, 0x11,\ -/* 48 */ 0x01, 0x02, 0x01, 0x21, 0x08, 0x00, 0x02, 0x01,\ -/* 56 */ 0x11, 0x01, 0x02, 0x00, 0x04, 0x00, 0x00, 0x02,\ -/* 64 */ 0x11, 0x00, 0x00, 0x05, 0x2c, 0x2c, 0x00, 0x11,\ -/* 72 */ 0x00, 0x05, 0x05, 0x15, 0x15, 0x15, 0x15, 0x15,\ -/* 80 */ 0x15, 0x00, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c,\ -/* 88 */ 0x2c, 0x2c, 0x2c, 0x2c, 0x00, 0x04, 0x02, 0x00,\ -/* 96 */ 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,\ -/* 104 */ 0x00, 0x01, 0x02, 0x08, 0x01, 0x11, 0x00, 0x02,\ -/* 112 */ 0x02, 0x15, 0x00, 0x00, 0x10, 0x00, 0x00, 0x02,\ -/* 120 */ 0x00, 0x02, 0x01, 0x11, 0x00, 0x00, 0x05, 0x00,\ -/* 128 */ 0x11, 0x05, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00,\ +/* 0 */ 0x00, 0x01, 0x05, 0x04, 0x04, 0x10, 0x00, 0x02,\ +/* 8 */ 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x24, 0x24,\ +/* 16 */ 0x00, 0x00, 0x00, 0x24, 0x04, 0x05, 0x04, 0x00,\ +/* 24 */ 0x00, 0x01, 0x05, 0x05, 0x00, 0x00, 0x00, 0x02,\ +/* 32 */ 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00,\ +/* 40 */ 0x00, 0x00, 0x00, 0x11, 0x11, 0x11, 0x11, 0x08,\ +/* 48 */ 0x11, 0x11, 0x11, 0x11, 0x02, 0x02, 0x00, 0x00,\ +/* 56 */ 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x01,\ +/* 64 */ 0x01, 0x01, 0x01, 0x08, 0x4c, 0x4c, 0x00, 0x02,\ +/* 72 */ 0x01, 0x05, 0x05, 0x15, 0x15, 0x15, 0x15, 0x15,\ +/* 80 */ 0x15, 0x01, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c,\ +/* 88 */ 0x4c, 0x4c, 0x4c, 0x4c, 0x02, 0x24, 0x02, 0x00,\ +/* 96 */ 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\ +/* 104 */ 0x0c, 0x45, 0x15, 0x01, 0x02, 0x00, 0x01, 0x08,\ +/* 112 */ 0x05, 0x05, 0x05, 0x00, 0x00, 0x00, 0x01, 0x00,\ +/* 120 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01,\ +/* 128 */ 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00,\ /* 136 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04,\ /* 144 */ 0x04, 0x04,} @@ -7506,6 +7403,7 @@ SQLITE_PRIVATE int sqlite3VdbeAddOp1(Vdbe*,int,int); SQLITE_PRIVATE int sqlite3VdbeAddOp2(Vdbe*,int,int,int); SQLITE_PRIVATE int sqlite3VdbeAddOp3(Vdbe*,int,int,int,int); SQLITE_PRIVATE int sqlite3VdbeAddOp4(Vdbe*,int,int,int,int,const char *zP4,int); +SQLITE_PRIVATE int sqlite3VdbeAddOp4Int(Vdbe*,int,int,int,int,int); SQLITE_PRIVATE int sqlite3VdbeAddOpList(Vdbe*, int nOp, VdbeOpList const *aOp); SQLITE_PRIVATE void sqlite3VdbeChangeP1(Vdbe*, int addr, int P1); SQLITE_PRIVATE void sqlite3VdbeChangeP2(Vdbe*, int addr, int P2); @@ -7536,10 +7434,12 @@ SQLITE_PRIVATE void sqlite3VdbeSetSql(Vdbe*, const char *z, int n, int); SQLITE_PRIVATE void sqlite3VdbeSwap(Vdbe*,Vdbe*); SQLITE_PRIVATE VdbeOp *sqlite3VdbeTakeOpArray(Vdbe*, int*, int*); SQLITE_PRIVATE void sqlite3VdbeProgramDelete(sqlite3 *, SubProgram *, int); - -#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT -SQLITE_PRIVATE int sqlite3VdbeReleaseMemory(int); +SQLITE_PRIVATE sqlite3_value *sqlite3VdbeGetValue(Vdbe*, int, u8); +SQLITE_PRIVATE void sqlite3VdbeSetVarmask(Vdbe*, int); +#ifndef SQLITE_OMIT_TRACE +SQLITE_PRIVATE char *sqlite3VdbeExpandSql(Vdbe*, const char*); #endif + SQLITE_PRIVATE UnpackedRecord *sqlite3VdbeRecordUnpack(KeyInfo*,int,const void*,char*,int); SQLITE_PRIVATE void sqlite3VdbeDeleteUnpackedRecord(UnpackedRecord*); SQLITE_PRIVATE int sqlite3VdbeRecordCompare(int,const void*,UnpackedRecord*); @@ -7575,8 +7475,6 @@ SQLITE_PRIVATE void sqlite3VdbeNoopComment(Vdbe*, const char*, ...); ** This header file defines the interface that the sqlite page cache ** subsystem. The page cache subsystem reads and writes a file a page ** at a time and provides a journal for rollback. -** -** @(#) $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ #ifndef _PAGER_H_ @@ -7746,8 +7644,6 @@ SQLITE_PRIVATE void sqlite3PagerRefdump(Pager*); ************************************************************************* ** This header file defines the interface that the sqlite page cache ** subsystem. -** -** @(#) $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ #ifndef _PCACHE_H_ @@ -7914,8 +7810,6 @@ SQLITE_PRIVATE void sqlite3PCacheSetDefault(void); ** ** This header file is #include-ed by sqliteInt.h and thus ends up ** being included by every source file. -** -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ #ifndef _SQLITE_OS_H_ #define _SQLITE_OS_H_ @@ -8194,8 +8088,6 @@ SQLITE_PRIVATE int sqlite3OsCloseFree(sqlite3_file *); ** NOTE: source files should *not* #include this header file directly. ** Source files should #include the sqliteInt.h file and let that file ** include this one indirectly. -** -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ @@ -8501,37 +8393,43 @@ struct sqlite3 { #define ENC(db) ((db)->aDb[0].pSchema->enc) /* -** Possible values for the sqlite.flags and or Db.flags fields. -** -** On sqlite.flags, the SQLITE_InTrans value means that we have -** executed a BEGIN. On Db.flags, SQLITE_InTrans means a statement -** transaction is active on that particular database file. +** Possible values for the sqlite3.flags. */ -#define SQLITE_VdbeTrace 0x00000001 /* True to trace VDBE execution */ -#define SQLITE_InTrans 0x00000008 /* True if in a transaction */ -#define SQLITE_InternChanges 0x00000010 /* Uncommitted Hash table changes */ -#define SQLITE_FullColNames 0x00000020 /* Show full column names on SELECT */ -#define SQLITE_ShortColNames 0x00000040 /* Show short columns names */ -#define SQLITE_CountRows 0x00000080 /* Count rows changed by INSERT, */ +#define SQLITE_VdbeTrace 0x00000100 /* True to trace VDBE execution */ +#define SQLITE_InternChanges 0x00000200 /* Uncommitted Hash table changes */ +#define SQLITE_FullColNames 0x00000400 /* Show full column names on SELECT */ +#define SQLITE_ShortColNames 0x00000800 /* Show short columns names */ +#define SQLITE_CountRows 0x00001000 /* Count rows changed by INSERT, */ /* DELETE, or UPDATE and return */ /* the count using a callback. */ -#define SQLITE_NullCallback 0x00000100 /* Invoke the callback once if the */ +#define SQLITE_NullCallback 0x00002000 /* Invoke the callback once if the */ /* result set is empty */ -#define SQLITE_SqlTrace 0x00000200 /* Debug print SQL as it executes */ -#define SQLITE_VdbeListing 0x00000400 /* Debug listings of VDBE programs */ -#define SQLITE_WriteSchema 0x00000800 /* OK to update SQLITE_MASTER */ -#define SQLITE_NoReadlock 0x00001000 /* Readlocks are omitted when +#define SQLITE_SqlTrace 0x00004000 /* Debug print SQL as it executes */ +#define SQLITE_VdbeListing 0x00008000 /* Debug listings of VDBE programs */ +#define SQLITE_WriteSchema 0x00010000 /* OK to update SQLITE_MASTER */ +#define SQLITE_NoReadlock 0x00020000 /* Readlocks are omitted when ** accessing read-only databases */ -#define SQLITE_IgnoreChecks 0x00002000 /* Do not enforce check constraints */ -#define SQLITE_ReadUncommitted 0x00004000 /* For shared-cache mode */ -#define SQLITE_LegacyFileFmt 0x00008000 /* Create new databases in format 1 */ -#define SQLITE_FullFSync 0x00010000 /* Use full fsync on the backend */ -#define SQLITE_LoadExtension 0x00020000 /* Enable load_extension */ +#define SQLITE_IgnoreChecks 0x00040000 /* Do not enforce check constraints */ +#define SQLITE_ReadUncommitted 0x0080000 /* For shared-cache mode */ +#define SQLITE_LegacyFileFmt 0x00100000 /* Create new databases in format 1 */ +#define SQLITE_FullFSync 0x00200000 /* Use full fsync on the backend */ +#define SQLITE_LoadExtension 0x00400000 /* Enable load_extension */ +#define SQLITE_RecoveryMode 0x00800000 /* Ignore schema errors */ +#define SQLITE_ReverseOrder 0x01000000 /* Reverse unordered SELECTs */ +#define SQLITE_RecTriggers 0x02000000 /* Enable recursive triggers */ +#define SQLITE_ForeignKeys 0x04000000 /* Enforce foreign key constraints */ -#define SQLITE_RecoveryMode 0x00040000 /* Ignore schema errors */ -#define SQLITE_ReverseOrder 0x00100000 /* Reverse unordered SELECTs */ -#define SQLITE_RecTriggers 0x00200000 /* Enable recursive triggers */ -#define SQLITE_ForeignKeys 0x00400000 /* Enforce foreign key constraints */ +/* +** Bits of the sqlite3.flags field that are used by the +** sqlite3_test_control(SQLITE_TESTCTRL_OPTIMIZATIONS,...) interface. +** These must be the low-order bits of the flags field. +*/ +#define SQLITE_QueryFlattener 0x01 /* Disable query flattening */ +#define SQLITE_ColumnCache 0x02 /* Disable the column cache */ +#define SQLITE_IndexSort 0x04 /* Disable indexes for sorting */ +#define SQLITE_IndexSearch 0x08 /* Disable indexes for searching */ +#define SQLITE_IndexCover 0x10 /* Disable index covering table */ +#define SQLITE_OptMask 0x1f /* Mask of all disablable opts */ /* ** Possible values for the sqlite.magic field. @@ -8572,6 +8470,7 @@ struct FuncDef { #define SQLITE_FUNC_NEEDCOLL 0x08 /* sqlite3GetFuncCollSeq() might be called */ #define SQLITE_FUNC_PRIVATE 0x10 /* Allowed for internal use only */ #define SQLITE_FUNC_COUNT 0x20 /* Built-in count(*) aggregate */ +#define SQLITE_FUNC_COALESCE 0x40 /* Built-in coalesce() or ifnull() function */ /* ** The following three macros, FUNCTION(), LIKEFUNC() and AGGREGATE() are @@ -9110,6 +9009,22 @@ struct AggInfo { int nFuncAlloc; /* Number of slots allocated for aFunc[] */ }; +/* +** The datatype ynVar is a signed integer, either 16-bit or 32-bit. +** Usually it is 16-bits. But if SQLITE_MAX_VARIABLE_NUMBER is greater +** than 32767 we have to make it 32-bit. 16-bit is preferred because +** it uses less memory in the Expr object, which is a big memory user +** in systems with lots of prepared statements. And few applications +** need more than about 10 or 20 variables. But some extreme users want +** to have prepared statements with over 32767 variables, and for them +** the option is available (at compile-time). +*/ +#if SQLITE_MAX_VARIABLE_NUMBER<=32767 +typedef i16 ynVar; +#else +typedef int ynVar; +#endif + /* ** Each node of an expression in the parse tree is an instance ** of this structure. @@ -9203,7 +9118,8 @@ struct Expr { int iTable; /* TK_COLUMN: cursor number of table holding column ** TK_REGISTER: register number ** TK_TRIGGER: 1 -> new, 0 -> old */ - i16 iColumn; /* TK_COLUMN: column index. -1 for rowid */ + ynVar iColumn; /* TK_COLUMN: column index. -1 for rowid. + ** TK_VARIABLE: variable number (always >= 1). */ i16 iAgg; /* Which entry in pAggInfo->aCol[] or ->aFunc[] */ i16 iRightJoinTable; /* If EP_FromJoin, the right table of the join */ u8 flags2; /* Second set of flags. EP2_... */ @@ -9227,14 +9143,13 @@ struct Expr { #define EP_DblQuoted 0x0040 /* token.z was originally in "..." */ #define EP_InfixFunc 0x0080 /* True for an infix function: LIKE, GLOB, etc */ #define EP_ExpCollate 0x0100 /* Collating sequence specified explicitly */ -#define EP_AnyAff 0x0200 /* Can take a cached column of any affinity */ -#define EP_FixedDest 0x0400 /* Result needed in a specific register */ -#define EP_IntValue 0x0800 /* Integer value contained in u.iValue */ -#define EP_xIsSelect 0x1000 /* x.pSelect is valid (otherwise x.pList is) */ +#define EP_FixedDest 0x0200 /* Result needed in a specific register */ +#define EP_IntValue 0x0400 /* Integer value contained in u.iValue */ +#define EP_xIsSelect 0x0800 /* x.pSelect is valid (otherwise x.pList is) */ -#define EP_Reduced 0x2000 /* Expr struct is EXPR_REDUCEDSIZE bytes only */ -#define EP_TokenOnly 0x4000 /* Expr struct is EXPR_TOKENONLYSIZE bytes only */ -#define EP_Static 0x8000 /* Held in memory not obtained from malloc() */ +#define EP_Reduced 0x1000 /* Expr struct is EXPR_REDUCEDSIZE bytes only */ +#define EP_TokenOnly 0x2000 /* Expr struct is EXPR_TOKENONLYSIZE bytes only */ +#define EP_Static 0x4000 /* Held in memory not obtained from malloc() */ /* ** The following are the meanings of bits in the Expr.flags2 field. @@ -9479,6 +9394,7 @@ struct WhereLevel { #define WHERE_OMIT_OPEN 0x0010 /* Table cursor are already open */ #define WHERE_OMIT_CLOSE 0x0020 /* Omit close of table & index cursors */ #define WHERE_FORCE_TABLE 0x0040 /* Do not use an index-only search */ +#define WHERE_ONETABLE_ONLY 0x0080 /* Only code the 1st table in pTabList */ /* ** The WHERE clause processing routine has two halves. The @@ -9491,6 +9407,7 @@ struct WhereInfo { Parse *pParse; /* Parsing and code generating context */ u16 wctrlFlags; /* Flags originally passed to sqlite3WhereBegin() */ u8 okOnePass; /* Ok to use one-pass algorithm for UPDATE or DELETE */ + u8 untestedTerms; /* Not all WHERE terms resolved by outer loop */ SrcList *pTabList; /* List of tables in the join */ int iTop; /* The very beginning of the WHERE loop */ int iContinue; /* Jump here to continue with next record */ @@ -9654,15 +9571,16 @@ struct AutoincInfo { ** The Parse.pTriggerPrg list never contains two entries with the same ** values for both pTrigger and orconf. ** -** The TriggerPrg.oldmask variable is set to a mask of old.* columns +** The TriggerPrg.aColmask[0] variable is set to a mask of old.* columns ** accessed (or set to 0 for triggers fired as a result of INSERT -** statements). +** statements). Similarly, the TriggerPrg.aColmask[1] variable is set to +** a mask of new.* columns used by the program. */ struct TriggerPrg { Trigger *pTrigger; /* Trigger this program was coded from */ int orconf; /* Default ON CONFLICT policy */ SubProgram *pProgram; /* Program implementing pTrigger/orconf */ - u32 oldmask; /* Mask of old.* columns accessed */ + u32 aColmask[2]; /* Masks of old.*, new.* columns accessed */ TriggerPrg *pNext; /* Next entry in Parse.pTriggerPrg list */ }; @@ -9709,7 +9627,6 @@ struct Parse { struct yColCache { int iTable; /* Table cursor number */ int iColumn; /* Table column number */ - u8 affChange; /* True if this register has had an affinity change */ u8 tempReg; /* iReg is a temp register that needs to be freed */ int iLevel; /* Nesting level */ int iReg; /* Reg with value of this column. 0 means none. */ @@ -9734,6 +9651,7 @@ struct Parse { Parse *pToplevel; /* Parse structure for main program (or NULL) */ Table *pTriggerTab; /* Table triggers are being coded for */ u32 oldmask; /* Mask of old.* columns referenced */ + u32 newmask; /* Mask of new.* columns referenced */ u8 eTriggerOp; /* TK_UPDATE, TK_INSERT or TK_DELETE */ u8 eOrconf; /* Default ON CONFLICT policy for trigger steps */ u8 disableTriggers; /* True to disable triggers */ @@ -9745,6 +9663,7 @@ struct Parse { int nVarExpr; /* Number of used slots in apVarExpr[] */ int nVarExprAlloc; /* Number of allocated slots in apVarExpr[] */ Expr **apVarExpr; /* Pointers to :aaa and $aaaa wildcard expressions */ + Vdbe *pReprepare; /* VM being reprepared (sqlite3Reprepare()) */ int nAlias; /* Number of aliased result set columns */ int nAliasAlloc; /* Number of allocated slots for aAlias[] */ int *aAlias; /* Register used to hold aliased result */ @@ -10111,6 +10030,9 @@ SQLITE_PRIVATE void sqlite3StatusSet(int, int); SQLITE_PRIVATE int sqlite3IsNaN(double); SQLITE_PRIVATE void sqlite3VXPrintf(StrAccum*, int, const char*, va_list); +#ifndef SQLITE_OMIT_TRACE +SQLITE_PRIVATE void sqlite3XPrintf(StrAccum*, const char*, ...); +#endif SQLITE_PRIVATE char *sqlite3MPrintf(sqlite3*,const char*, ...); SQLITE_PRIVATE char *sqlite3VMPrintf(sqlite3*,const char*, va_list); SQLITE_PRIVATE char *sqlite3MAppendf(sqlite3*,char*,const char*,...); @@ -10138,7 +10060,6 @@ SQLITE_PRIVATE Expr *sqlite3PExpr(Parse*, int, Expr*, Expr*, const Token*); SQLITE_PRIVATE Expr *sqlite3ExprAnd(sqlite3*,Expr*, Expr*); SQLITE_PRIVATE Expr *sqlite3ExprFunction(Parse*,ExprList*, Token*); SQLITE_PRIVATE void sqlite3ExprAssignVarNumber(Parse*, Expr*); -SQLITE_PRIVATE void sqlite3ExprClear(sqlite3*, Expr*); SQLITE_PRIVATE void sqlite3ExprDelete(sqlite3*, Expr*); SQLITE_PRIVATE ExprList *sqlite3ExprListAppend(Parse*,ExprList*,Expr*); SQLITE_PRIVATE void sqlite3ExprListSetName(Parse*,ExprList*,Token*,int); @@ -10224,13 +10145,13 @@ SQLITE_PRIVATE void sqlite3DeleteFrom(Parse*, SrcList*, Expr*); SQLITE_PRIVATE void sqlite3Update(Parse*, SrcList*, ExprList*, Expr*, int); SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(Parse*, SrcList*, Expr*, ExprList**, u16); SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo*); -SQLITE_PRIVATE int sqlite3ExprCodeGetColumn(Parse*, Table*, int, int, int, int); +SQLITE_PRIVATE int sqlite3ExprCodeGetColumn(Parse*, Table*, int, int, int); SQLITE_PRIVATE void sqlite3ExprCodeMove(Parse*, int, int, int); SQLITE_PRIVATE void sqlite3ExprCodeCopy(Parse*, int, int, int); SQLITE_PRIVATE void sqlite3ExprCacheStore(Parse*, int, int, int); SQLITE_PRIVATE void sqlite3ExprCachePush(Parse*); SQLITE_PRIVATE void sqlite3ExprCachePop(Parse*, int); -SQLITE_PRIVATE void sqlite3ExprCacheRemove(Parse*, int); +SQLITE_PRIVATE void sqlite3ExprCacheRemove(Parse*, int, int); SQLITE_PRIVATE void sqlite3ExprCacheClear(Parse*); SQLITE_PRIVATE void sqlite3ExprCacheAffinityChange(Parse*, int, int); SQLITE_PRIVATE void sqlite3ExprHardCopy(Parse*,int,int); @@ -10254,7 +10175,6 @@ SQLITE_PRIVATE int sqlite3ExprCompare(Expr*, Expr*); SQLITE_PRIVATE void sqlite3ExprAnalyzeAggregates(NameContext*, Expr*); SQLITE_PRIVATE void sqlite3ExprAnalyzeAggList(NameContext*,ExprList*); SQLITE_PRIVATE Vdbe *sqlite3GetVdbe(Parse*); -SQLITE_PRIVATE Expr *sqlite3CreateIdExpr(Parse *, const char*); SQLITE_PRIVATE void sqlite3PrngSaveState(void); SQLITE_PRIVATE void sqlite3PrngRestoreState(void); SQLITE_PRIVATE void sqlite3PrngResetState(void); @@ -10269,6 +10189,9 @@ SQLITE_PRIVATE int sqlite3ExprIsConstant(Expr*); SQLITE_PRIVATE int sqlite3ExprIsConstantNotJoin(Expr*); SQLITE_PRIVATE int sqlite3ExprIsConstantOrFunction(Expr*); SQLITE_PRIVATE int sqlite3ExprIsInteger(Expr*, int*); +SQLITE_PRIVATE int sqlite3ExprCanBeNull(const Expr*); +SQLITE_PRIVATE void sqlite3ExprCodeIsNullJump(Vdbe*, const Expr*, int, int); +SQLITE_PRIVATE int sqlite3ExprNeedsNoAffinityChange(const Expr*, char); SQLITE_PRIVATE int sqlite3IsRowid(const char*); SQLITE_PRIVATE void sqlite3GenerateRowDelete(Parse*, Table*, int, int, int, Trigger *, int); SQLITE_PRIVATE void sqlite3GenerateRowIndexDelete(Parse*, Table*, int, int*); @@ -10326,7 +10249,7 @@ SQLITE_PRIVATE TriggerStep *sqlite3TriggerUpdateStep(sqlite3*,Token*,ExprList* SQLITE_PRIVATE TriggerStep *sqlite3TriggerDeleteStep(sqlite3*,Token*, Expr*); SQLITE_PRIVATE void sqlite3DeleteTrigger(sqlite3*, Trigger*); SQLITE_PRIVATE void sqlite3UnlinkAndDeleteTrigger(sqlite3*,int,const char*); -SQLITE_PRIVATE u32 sqlite3TriggerOldmask(Parse*,Trigger*,ExprList*,Table*,int); +SQLITE_PRIVATE u32 sqlite3TriggerColmask(Parse*,Trigger*,ExprList*,int,int,Table*,int); # define sqlite3ParseToplevel(p) ((p)->pToplevel ? (p)->pToplevel : (p)) #else # define sqlite3TriggersExist(B,C,D,E,F) 0 @@ -10337,7 +10260,7 @@ SQLITE_PRIVATE u32 sqlite3TriggerOldmask(Parse*,Trigger*,ExprList*,Table*,int) # define sqlite3CodeRowTriggerDirect(A,B,C,D,E,F) # define sqlite3TriggerList(X, Y) 0 # define sqlite3ParseToplevel(p) p -# define sqlite3TriggerOldmask(A,B,C,D,E) 0 +# define sqlite3TriggerColmask(A,B,C,D,E,F,G) 0 #endif SQLITE_PRIVATE int sqlite3JoinType(Parse*, Token*, Token*, Token*); @@ -10357,7 +10280,7 @@ SQLITE_PRIVATE int sqlite3AuthReadCol(Parse*, const char *, const char *, int) #endif SQLITE_PRIVATE void sqlite3Attach(Parse*, Expr*, Expr*, Expr*); SQLITE_PRIVATE void sqlite3Detach(Parse*, Expr*); -SQLITE_PRIVATE int sqlite3BtreeFactory(const sqlite3 *db, const char *zFilename, +SQLITE_PRIVATE int sqlite3BtreeFactory(sqlite3 *db, const char *zFilename, int omitJournal, int nCache, int flags, Btree **ppBtree); SQLITE_PRIVATE int sqlite3FixInit(DbFixer*, Parse*, int, const char*, const Token*); SQLITE_PRIVATE int sqlite3FixSrcList(DbFixer*, SrcList*); @@ -10440,6 +10363,7 @@ SQLITE_PRIVATE char *sqlite3Utf8to16(sqlite3 *, u8, char *, int, int *); SQLITE_PRIVATE int sqlite3ValueFromExpr(sqlite3 *, Expr *, u8, u8, sqlite3_value **); SQLITE_PRIVATE void sqlite3ValueApplyAffinity(sqlite3_value *, u8, u8); #ifndef SQLITE_AMALGAMATION +SQLITE_PRIVATE const unsigned char sqlite3OpcodeProperty[]; SQLITE_PRIVATE const unsigned char sqlite3UpperToLower[]; SQLITE_PRIVATE const unsigned char sqlite3CtypeMap[]; SQLITE_PRIVATE SQLITE_WSD struct Sqlite3Config sqlite3Config; @@ -10453,7 +10377,7 @@ SQLITE_PRIVATE void sqlite3AlterRenameTable(Parse*, SrcList*, Token*); SQLITE_PRIVATE int sqlite3GetToken(const unsigned char *, int *); SQLITE_PRIVATE void sqlite3NestedParse(Parse*, const char*, ...); SQLITE_PRIVATE void sqlite3ExpirePreparedStatements(sqlite3*); -SQLITE_PRIVATE void sqlite3CodeSubselect(Parse *, Expr *, int, int); +SQLITE_PRIVATE int sqlite3CodeSubselect(Parse *, Expr *, int, int); SQLITE_PRIVATE void sqlite3SelectPrep(Parse*, Select*, NameContext*); SQLITE_PRIVATE int sqlite3ResolveExprNames(NameContext*, Expr*); SQLITE_PRIVATE void sqlite3ResolveSelectNames(Parse*, Select*, NameContext*); @@ -10488,6 +10412,7 @@ SQLITE_PRIVATE void sqlite3StrAccumAppend(StrAccum*,const char*,int); SQLITE_PRIVATE char *sqlite3StrAccumFinish(StrAccum*); SQLITE_PRIVATE void sqlite3StrAccumReset(StrAccum*); SQLITE_PRIVATE void sqlite3SelectDestInit(SelectDest*,int,int); +SQLITE_PRIVATE Expr *sqlite3CreateColumnExpr(sqlite3 *, SrcList *, int, int); SQLITE_PRIVATE void sqlite3BackupRestart(sqlite3_backup *); SQLITE_PRIVATE void sqlite3BackupUpdate(sqlite3_backup *, Pgno, const u8 *); @@ -10549,6 +10474,7 @@ SQLITE_PRIVATE int sqlite3VtabCallDestroy(sqlite3*, int, const char *); SQLITE_PRIVATE int sqlite3VtabBegin(sqlite3 *, VTable *); SQLITE_PRIVATE FuncDef *sqlite3VtabOverloadFunction(sqlite3 *,FuncDef*, int nArg, Expr*); SQLITE_PRIVATE void sqlite3InvalidFunction(sqlite3_context*,int,sqlite3_value**); +SQLITE_PRIVATE int sqlite3VdbeParameterIndex(Vdbe*, const char*, int); SQLITE_PRIVATE int sqlite3TransferBindings(sqlite3_stmt *, sqlite3_stmt *); SQLITE_PRIVATE int sqlite3Reprepare(Vdbe*); SQLITE_PRIVATE void sqlite3ExprListCheckLength(Parse*, ExprList*, const char*); @@ -10680,7 +10606,6 @@ SQLITE_PRIVATE void (*sqlite3IoTrace)(const char*,...); ** This file contains definitions of global variables and contants. */ - /* An array to map all upper-case characters into their corresponding ** lower-case character. ** @@ -10736,6 +10661,7 @@ SQLITE_PRIVATE const unsigned char sqlite3UpperToLower[] = { ** isalnum() 0x06 ** isxdigit() 0x08 ** toupper() 0x20 +** SQLite identifier character 0x40 ** ** Bit 0x20 is set if the mapped character requires translation to upper ** case. i.e. if the character is a lower-case ASCII character. @@ -10747,6 +10673,11 @@ SQLITE_PRIVATE const unsigned char sqlite3UpperToLower[] = { ** Standard function tolower() is implemented using the sqlite3UpperToLower[] ** array. tolower() is used more often than toupper() by SQLite. ** +** Bit 0x40 is set if the character non-alphanumeric and can be used in an +** SQLite identifier. Identifiers are alphanumerics, "_", "$", and any +** non-ASCII UTF character. Hence the test for whether or not a character is +** part of an identifier is 0x46. +** ** SQLite's versions are identical to the standard versions assuming a ** locale of "C". They are implemented as macros in sqliteInt.h. */ @@ -10756,7 +10687,7 @@ SQLITE_PRIVATE const unsigned char sqlite3CtypeMap[256] = { 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, /* 08..0f ........ */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 10..17 ........ */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 18..1f ........ */ - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 20..27 !"#$%&' */ + 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, /* 20..27 !"#$%&' */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 28..2f ()*+,-./ */ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, /* 30..37 01234567 */ 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 38..3f 89:;<=>? */ @@ -10764,29 +10695,29 @@ SQLITE_PRIVATE const unsigned char sqlite3CtypeMap[256] = { 0x00, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x02, /* 40..47 @ABCDEFG */ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, /* 48..4f HIJKLMNO */ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, /* 50..57 PQRSTUVW */ - 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, /* 58..5f XYZ[\]^_ */ + 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x40, /* 58..5f XYZ[\]^_ */ 0x00, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x22, /* 60..67 `abcdefg */ 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, /* 68..6f hijklmno */ 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, /* 70..77 pqrstuvw */ 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, /* 78..7f xyz{|}~. */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 80..87 ........ */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 88..8f ........ */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 90..97 ........ */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 98..9f ........ */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* a0..a7 ........ */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* a8..af ........ */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* b0..b7 ........ */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* b8..bf ........ */ - - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* c0..c7 ........ */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* c8..cf ........ */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* d0..d7 ........ */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* d8..df ........ */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* e0..e7 ........ */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* e8..ef ........ */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* f0..f7 ........ */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 /* f8..ff ........ */ + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, /* 80..87 ........ */ + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, /* 88..8f ........ */ + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, /* 90..97 ........ */ + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, /* 98..9f ........ */ + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, /* a0..a7 ........ */ + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, /* a8..af ........ */ + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, /* b0..b7 ........ */ + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, /* b8..bf ........ */ + + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, /* c0..c7 ........ */ + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, /* c8..cf ........ */ + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, /* d0..d7 ........ */ + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, /* d8..df ........ */ + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, /* e0..e7 ........ */ + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, /* e8..ef ........ */ + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, /* f0..f7 ........ */ + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40 /* f8..ff ........ */ }; #endif @@ -10855,6 +10786,14 @@ SQLITE_PRIVATE SQLITE_WSD FuncDefHash sqlite3GlobalFunctions; */ SQLITE_PRIVATE int sqlite3PendingByte = 0x40000000; +/* +** Properties of opcodes. The OPFLG_INITIALIZER macro is +** created by mkopcodeh.awk during compilation. Data is obtained +** from the comments following the "case OP_xxxx:" statements in +** the vdbe.c file. +*/ +SQLITE_PRIVATE const unsigned char sqlite3OpcodeProperty[] = OPFLG_INITIALIZER; + /************** End of global.c **********************************************/ /************** Begin file status.c ******************************************/ /* @@ -10871,8 +10810,6 @@ SQLITE_PRIVATE int sqlite3PendingByte = 0x40000000; ** ** This module implements the sqlite3_status() interface and related ** functionality. -** -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ /* @@ -10999,8 +10936,6 @@ SQLITE_API int sqlite3_db_status( ** sqlite3RegisterDateTimeFunctions() found at the bottom of the file. ** All other code has file scope. ** -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ -** ** SQLite processes all times and dates as Julian Day numbers. The ** dates and times are stored as the number of days since noon ** in Greenwich on November 24, 4714 B.C. according to the Gregorian @@ -12103,8 +12038,6 @@ SQLITE_PRIVATE void sqlite3RegisterDateTimeFunctions(void){ ** ** This file contains OS interface code that is common to all ** architectures. -** -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ #define _SQLITE_OS_C_ 1 #undef _SQLITE_OS_C_ @@ -12230,6 +12163,7 @@ SQLITE_PRIVATE int sqlite3OsFullPathname( int nPathOut, char *zPathOut ){ + zPathOut[0] = 0; return pVfs->xFullPathname(pVfs, zPath, nPathOut, zPathOut); } #ifndef SQLITE_OMIT_LOAD_EXTENSION @@ -12401,10 +12335,6 @@ SQLITE_API int sqlite3_vfs_unregister(sqlite3_vfs *pVfs){ ** ************************************************************************* ** -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ -*/ - -/* ** This file contains code to support the concept of "benign" ** malloc failures (when the xMalloc() or xRealloc() method of the ** sqlite3_mem_methods structure fails to allocate a block of memory @@ -12499,8 +12429,6 @@ SQLITE_PRIVATE void sqlite3EndBenignMalloc(void){ ** here always fail. SQLite will not operate with these drivers. These ** are merely placeholders. Real drivers must be substituted using ** sqlite3_config() before SQLite will operate. -** -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ /* @@ -12563,8 +12491,6 @@ SQLITE_PRIVATE void sqlite3MemSetDefault(void){ ** ** This file contains implementations of the low-level memory allocation ** routines specified in the sqlite3_mem_methods object. -** -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ /* @@ -12712,8 +12638,6 @@ SQLITE_PRIVATE void sqlite3MemSetDefault(void){ ** ** This file contains implementations of the low-level memory allocation ** routines specified in the sqlite3_mem_methods object. -** -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ /* @@ -12904,6 +12828,31 @@ static int sqlite3MemRoundup(int n){ return ROUND8(n); } +/* +** Fill a buffer with pseudo-random bytes. This is used to preset +** the content of a new memory allocation to unpredictable values and +** to clear the content of a freed allocation to unpredictable values. +*/ +static void randomFill(char *pBuf, int nByte){ + unsigned int x, y, r; + x = SQLITE_PTR_TO_INT(pBuf); + y = nByte | 1; + while( nByte >= 4 ){ + x = (x>>1) ^ (-(x&1) & 0xd0000001); + y = y*1103515245 + 12345; + r = x ^ y; + *(int*)pBuf = r; + pBuf += 4; + nByte -= 4; + } + while( nByte-- > 0 ){ + x = (x>>1) ^ (-(x&1) & 0xd0000001); + y = y*1103515245 + 12345; + r = x ^ y; + *(pBuf++) = r & 0xff; + } +} + /* ** Allocate nByte bytes of memory. */ @@ -12954,7 +12903,8 @@ static void *sqlite3MemMalloc(int nByte){ adjustStats(nByte, +1); pInt = (int*)&pHdr[1]; pInt[nReserve/sizeof(int)] = REARGUARD; - memset(pInt, 0x65, nReserve); + randomFill((char*)pInt, nByte); + memset(((char*)pInt)+nByte, 0x65, nReserve-nByte); p = (void*)pInt; } sqlite3_mutex_leave(mem.mutex); @@ -12990,8 +12940,8 @@ static void sqlite3MemFree(void *pPrior){ z = (char*)pBt; z -= pHdr->nTitle; adjustStats(pHdr->iSize, -1); - memset(z, 0x2b, sizeof(void*)*pHdr->nBacktraceSlots + sizeof(*pHdr) + - pHdr->iSize + sizeof(int) + pHdr->nTitle); + randomFill(z, sizeof(void*)*pHdr->nBacktraceSlots + sizeof(*pHdr) + + pHdr->iSize + sizeof(int) + pHdr->nTitle); free(z); sqlite3_mutex_leave(mem.mutex); } @@ -13014,7 +12964,7 @@ static void *sqlite3MemRealloc(void *pPrior, int nByte){ if( pNew ){ memcpy(pNew, pPrior, nByteiSize ? nByte : pOldHdr->iSize); if( nByte>pOldHdr->iSize ){ - memset(&((char*)pNew)[pOldHdr->iSize], 0x2b, nByte - pOldHdr->iSize); + randomFill(&((char*)pNew)[pOldHdr->iSize], nByte - pOldHdr->iSize); } sqlite3MemFree(pPrior); } @@ -13161,8 +13111,6 @@ SQLITE_PRIVATE int sqlite3MemdebugMallocCount(){ ** ** This version of the memory allocation subsystem is included ** in the build only if SQLITE_ENABLE_MEMSYS3 is defined. -** -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ /* @@ -14420,9 +14368,6 @@ SQLITE_PRIVATE const sqlite3_mem_methods *sqlite3MemGetMemsys5(void){ ** This file contains the C functions that implement mutexes. ** ** This file contains code that is common across all mutex implementations. - -** -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ #if defined(SQLITE_DEBUG) && !defined(SQLITE_MUTEX_OMIT) @@ -14587,8 +14532,6 @@ SQLITE_API int sqlite3_mutex_notheld(sqlite3_mutex *p){ ** If compiled with SQLITE_DEBUG, then additional logic is inserted ** that does error checking on mutexes to make sure they are being ** called correctly. -** -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ @@ -14761,8 +14704,6 @@ SQLITE_PRIVATE sqlite3_mutex_methods *sqlite3DefaultMutex(void){ ** ************************************************************************* ** This file contains the C functions that implement mutexes for OS/2 -** -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ /* @@ -14910,66 +14851,6 @@ static void os2MutexFree(sqlite3_mutex *p){ sqlite3_free( p ); } -/* -** The sqlite3_mutex_enter() and sqlite3_mutex_try() routines attempt -** to enter a mutex. If another thread is already within the mutex, -** sqlite3_mutex_enter() will block and sqlite3_mutex_try() will return -** SQLITE_BUSY. The sqlite3_mutex_try() interface returns SQLITE_OK -** upon successful entry. Mutexes created using SQLITE_MUTEX_RECURSIVE can -** be entered multiple times by the same thread. In such cases the, -** mutex must be exited an equal number of times before another thread -** can enter. If the same thread tries to enter any other kind of mutex -** more than once, the behavior is undefined. -*/ -static void os2MutexEnter(sqlite3_mutex *p){ - TID tid; - PID holder1; - ULONG holder2; - if( p==0 ) return; - assert( p->id==SQLITE_MUTEX_RECURSIVE || os2MutexNotheld(p) ); - DosRequestMutexSem(p->mutex, SEM_INDEFINITE_WAIT); - DosQueryMutexSem(p->mutex, &holder1, &tid, &holder2); - p->owner = tid; - p->nRef++; -} -static int os2MutexTry(sqlite3_mutex *p){ - int rc; - TID tid; - PID holder1; - ULONG holder2; - if( p==0 ) return SQLITE_OK; - assert( p->id==SQLITE_MUTEX_RECURSIVE || os2MutexNotheld(p) ); - if( DosRequestMutexSem(p->mutex, SEM_IMMEDIATE_RETURN) == NO_ERROR) { - DosQueryMutexSem(p->mutex, &holder1, &tid, &holder2); - p->owner = tid; - p->nRef++; - rc = SQLITE_OK; - } else { - rc = SQLITE_BUSY; - } - - return rc; -} - -/* -** The sqlite3_mutex_leave() routine exits a mutex that was -** previously entered by the same thread. The behavior -** is undefined if the mutex is not currently entered or -** is not currently allocated. SQLite will never do either. -*/ -static void os2MutexLeave(sqlite3_mutex *p){ - TID tid; - PID holder1; - ULONG holder2; - if( p==0 ) return; - assert( p->nRef>0 ); - DosQueryMutexSem(p->mutex, &holder1, &tid, &holder2); - assert( p->owner==tid ); - p->nRef--; - assert( p->nRef==0 || p->id==SQLITE_MUTEX_RECURSIVE ); - DosReleaseMutexSem(p->mutex); -} - #ifdef SQLITE_DEBUG /* ** The sqlite3_mutex_held() and sqlite3_mutex_notheld() routine are @@ -15003,6 +14884,66 @@ static int os2MutexNotheld(sqlite3_mutex *p){ } #endif +/* +** The sqlite3_mutex_enter() and sqlite3_mutex_try() routines attempt +** to enter a mutex. If another thread is already within the mutex, +** sqlite3_mutex_enter() will block and sqlite3_mutex_try() will return +** SQLITE_BUSY. The sqlite3_mutex_try() interface returns SQLITE_OK +** upon successful entry. Mutexes created using SQLITE_MUTEX_RECURSIVE can +** be entered multiple times by the same thread. In such cases the, +** mutex must be exited an equal number of times before another thread +** can enter. If the same thread tries to enter any other kind of mutex +** more than once, the behavior is undefined. +*/ +static void os2MutexEnter(sqlite3_mutex *p){ + TID tid; + PID holder1; + ULONG holder2; + if( p==0 ) return; + assert( p->id==SQLITE_MUTEX_RECURSIVE || os2MutexNotheld(p) ); + DosRequestMutexSem(p->mutex, SEM_INDEFINITE_WAIT); + DosQueryMutexSem(p->mutex, &holder1, &tid, &holder2); + p->owner = tid; + p->nRef++; +} +static int os2MutexTry(sqlite3_mutex *p){ + int rc; + TID tid; + PID holder1; + ULONG holder2; + if( p==0 ) return SQLITE_OK; + assert( p->id==SQLITE_MUTEX_RECURSIVE || os2MutexNotheld(p) ); + if( DosRequestMutexSem(p->mutex, SEM_IMMEDIATE_RETURN) == NO_ERROR) { + DosQueryMutexSem(p->mutex, &holder1, &tid, &holder2); + p->owner = tid; + p->nRef++; + rc = SQLITE_OK; + } else { + rc = SQLITE_BUSY; + } + + return rc; +} + +/* +** The sqlite3_mutex_leave() routine exits a mutex that was +** previously entered by the same thread. The behavior +** is undefined if the mutex is not currently entered or +** is not currently allocated. SQLite will never do either. +*/ +static void os2MutexLeave(sqlite3_mutex *p){ + TID tid; + PID holder1; + ULONG holder2; + if( p==0 ) return; + assert( p->nRef>0 ); + DosQueryMutexSem(p->mutex, &holder1, &tid, &holder2); + assert( p->owner==tid ); + p->nRef--; + assert( p->nRef==0 || p->id==SQLITE_MUTEX_RECURSIVE ); + DosReleaseMutexSem(p->mutex); +} + SQLITE_PRIVATE sqlite3_mutex_methods *sqlite3DefaultMutex(void){ static sqlite3_mutex_methods sMutex = { os2MutexInit, @@ -15036,8 +14977,6 @@ SQLITE_PRIVATE sqlite3_mutex_methods *sqlite3DefaultMutex(void){ ** ************************************************************************* ** This file contains the C functions that implement mutexes for pthreads -** -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ /* @@ -15367,8 +15306,6 @@ SQLITE_PRIVATE sqlite3_mutex_methods *sqlite3DefaultMutex(void){ ** ************************************************************************* ** This file contains the C functions that implement mutexes for win32 -** -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ /* @@ -15654,8 +15591,6 @@ SQLITE_PRIVATE sqlite3_mutex_methods *sqlite3DefaultMutex(void){ ************************************************************************* ** ** Memory allocation functions used throughout sqlite. -** -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ /* @@ -15706,9 +15641,6 @@ SQLITE_API void sqlite3_soft_heap_limit(int n){ SQLITE_API int sqlite3_release_memory(int n){ #ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT int nRet = 0; -#if 0 - nRet += sqlite3VdbeReleaseMemory(n); -#endif nRet += sqlite3PcacheReleaseMemory(n-nRet); return nRet; #else @@ -16364,8 +16296,6 @@ SQLITE_PRIVATE int sqlite3ApiExit(sqlite3* db, int rc){ ** an historical reference. Most of the "enhancements" have been backed ** out so that the functionality is now the same as standard printf(). ** -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ -** ************************************************************************** ** ** The following modules is an enhanced replacement for the "printf" subroutines @@ -17005,14 +16935,15 @@ SQLITE_PRIVATE void sqlite3VXPrintf( case etSQLESCAPE: case etSQLESCAPE2: case etSQLESCAPE3: { - int i, j, n, isnull; + int i, j, k, n, isnull; int needQuote; char ch; char q = ((xtype==etSQLESCAPE3)?'"':'\''); /* Quote character */ char *escarg = va_arg(ap,char*); isnull = escarg==0; if( isnull ) escarg = (xtype==etSQLESCAPE2 ? "NULL" : "(NULL)"); - for(i=n=0; (ch=escarg[i])!=0; i++){ + k = precision; + for(i=n=0; (ch=escarg[i])!=0 && k!=0; i++, k--){ if( ch==q ) n++; } needQuote = !isnull && xtype==etSQLESCAPE2; @@ -17028,15 +16959,17 @@ SQLITE_PRIVATE void sqlite3VXPrintf( } j = 0; if( needQuote ) bufpt[j++] = q; - for(i=0; (ch=escarg[i])!=0; i++){ - bufpt[j++] = ch; + k = i; + for(i=0; i=0 && precision=0 && precision=0xD800 && c<0xE000 ){ \ + if( c>=0xD800 && c<0xE000 && TERM ){ \ int c2 = (*zIn++); \ c2 += ((*zIn++)<<8); \ c = (c2&0x03FF) + ((c&0x003F)<<10) + (((c&0x03C0)+0x0040)<<10); \ } \ } -#define READ_UTF16BE(zIn, c){ \ +#define READ_UTF16BE(zIn, TERM, c){ \ c = ((*zIn++)<<8); \ c += (*zIn++); \ - if( c>=0xD800 && c<0xE000 ){ \ + if( c>=0xD800 && c<0xE000 && TERM ){ \ int c2 = ((*zIn++)<<8); \ c2 += (*zIn++); \ c = (c2&0x03FF) + ((c&0x003F)<<10) + (((c&0x03C0)+0x0040)<<10); \ @@ -18192,13 +18129,13 @@ SQLITE_PRIVATE int sqlite3VdbeMemTranslate(Mem *pMem, u8 desiredEnc){ if( pMem->enc==SQLITE_UTF16LE ){ /* UTF-16 Little-endian -> UTF-8 */ while( zIn UTF-8 */ while( zIn0 && n<=4 ); z[0] = 0; z = zBuf; - READ_UTF16LE(z, c); + READ_UTF16LE(z, 1, c); assert( c==i ); assert( (z-zBuf)==n ); } @@ -18446,7 +18375,7 @@ SQLITE_PRIVATE void sqlite3UtfSelfTest(void){ assert( n>0 && n<=4 ); z[0] = 0; z = zBuf; - READ_UTF16BE(z, c); + READ_UTF16BE(z, 1, c); assert( c==i ); assert( (z-zBuf)==n ); } @@ -19564,8 +19493,6 @@ SQLITE_PRIVATE int sqlite3SafetyCheckSickOrOk(sqlite3 *db){ ************************************************************************* ** This is the implementation of generic hash-tables ** used in SQLite. -** -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ /* Turn bulk memory into a hash table object by initializing the @@ -19836,78 +19763,78 @@ SQLITE_PRIVATE void *sqlite3HashInsert(Hash *pH, const char *pKey, int nKey, voi #if !defined(SQLITE_OMIT_EXPLAIN) || !defined(NDEBUG) || defined(VDBE_PROFILE) || defined(SQLITE_DEBUG) SQLITE_PRIVATE const char *sqlite3OpcodeName(int i){ static const char *const azName[] = { "?", - /* 1 */ "VNext", - /* 2 */ "Affinity", - /* 3 */ "Column", - /* 4 */ "SetCookie", - /* 5 */ "Seek", - /* 6 */ "Sequence", - /* 7 */ "Savepoint", - /* 8 */ "RowKey", - /* 9 */ "SCopy", - /* 10 */ "OpenWrite", - /* 11 */ "If", - /* 12 */ "CollSeq", - /* 13 */ "OpenRead", - /* 14 */ "Expire", - /* 15 */ "AutoCommit", - /* 16 */ "Pagecount", - /* 17 */ "IntegrityCk", - /* 18 */ "Sort", + /* 1 */ "Goto", + /* 2 */ "Gosub", + /* 3 */ "Return", + /* 4 */ "Yield", + /* 5 */ "HaltIfNull", + /* 6 */ "Halt", + /* 7 */ "Integer", + /* 8 */ "Int64", + /* 9 */ "String", + /* 10 */ "Null", + /* 11 */ "Blob", + /* 12 */ "Variable", + /* 13 */ "Move", + /* 14 */ "Copy", + /* 15 */ "SCopy", + /* 16 */ "ResultRow", + /* 17 */ "CollSeq", + /* 18 */ "Function", /* 19 */ "Not", - /* 20 */ "Copy", - /* 21 */ "Trace", - /* 22 */ "Function", - /* 23 */ "IfNeg", - /* 24 */ "Noop", - /* 25 */ "Program", - /* 26 */ "Return", - /* 27 */ "NewRowid", - /* 28 */ "FkCounter", - /* 29 */ "Variable", - /* 30 */ "String", - /* 31 */ "RealAffinity", - /* 32 */ "VRename", - /* 33 */ "ParseSchema", - /* 34 */ "VOpen", - /* 35 */ "Close", - /* 36 */ "CreateIndex", - /* 37 */ "IsUnique", - /* 38 */ "NotFound", - /* 39 */ "Int64", - /* 40 */ "MustBeInt", - /* 41 */ "Halt", - /* 42 */ "Rowid", - /* 43 */ "IdxLT", - /* 44 */ "AddImm", - /* 45 */ "RowData", - /* 46 */ "MemMax", - /* 47 */ "NotExists", - /* 48 */ "Gosub", - /* 49 */ "Integer", - /* 50 */ "Prev", - /* 51 */ "RowSetRead", - /* 52 */ "RowSetAdd", - /* 53 */ "VColumn", - /* 54 */ "CreateTable", - /* 55 */ "Last", - /* 56 */ "SeekLe", - /* 57 */ "IncrVacuum", - /* 58 */ "IdxRowid", - /* 59 */ "ResetCount", - /* 60 */ "Yield", - /* 61 */ "DropTrigger", - /* 62 */ "DropIndex", - /* 63 */ "Param", - /* 64 */ "IdxGE", - /* 65 */ "IdxDelete", - /* 66 */ "Vacuum", - /* 67 */ "IfNot", + /* 20 */ "AddImm", + /* 21 */ "MustBeInt", + /* 22 */ "RealAffinity", + /* 23 */ "Permutation", + /* 24 */ "Compare", + /* 25 */ "Jump", + /* 26 */ "If", + /* 27 */ "IfNot", + /* 28 */ "Column", + /* 29 */ "Affinity", + /* 30 */ "MakeRecord", + /* 31 */ "Count", + /* 32 */ "Savepoint", + /* 33 */ "AutoCommit", + /* 34 */ "Transaction", + /* 35 */ "ReadCookie", + /* 36 */ "SetCookie", + /* 37 */ "VerifyCookie", + /* 38 */ "OpenRead", + /* 39 */ "OpenWrite", + /* 40 */ "OpenEphemeral", + /* 41 */ "OpenPseudo", + /* 42 */ "Close", + /* 43 */ "SeekLt", + /* 44 */ "SeekLe", + /* 45 */ "SeekGe", + /* 46 */ "SeekGt", + /* 47 */ "Seek", + /* 48 */ "NotFound", + /* 49 */ "Found", + /* 50 */ "IsUnique", + /* 51 */ "NotExists", + /* 52 */ "Sequence", + /* 53 */ "NewRowid", + /* 54 */ "Insert", + /* 55 */ "InsertInt", + /* 56 */ "Delete", + /* 57 */ "ResetCount", + /* 58 */ "RowKey", + /* 59 */ "RowData", + /* 60 */ "Rowid", + /* 61 */ "NullRow", + /* 62 */ "Last", + /* 63 */ "Sort", + /* 64 */ "Rewind", + /* 65 */ "Prev", + /* 66 */ "Next", + /* 67 */ "IdxInsert", /* 68 */ "Or", /* 69 */ "And", - /* 70 */ "DropTable", - /* 71 */ "SeekLt", - /* 72 */ "MakeRecord", + /* 70 */ "IdxDelete", + /* 71 */ "IdxRowid", + /* 72 */ "IdxLT", /* 73 */ "IsNull", /* 74 */ "NotNull", /* 75 */ "Ne", @@ -19916,7 +19843,7 @@ SQLITE_PRIVATE const char *sqlite3OpcodeName(int i){ /* 78 */ "Le", /* 79 */ "Lt", /* 80 */ "Ge", - /* 81 */ "ResultRow", + /* 81 */ "IdxGE", /* 82 */ "BitAnd", /* 83 */ "BitOr", /* 84 */ "ShiftLeft", @@ -19927,49 +19854,49 @@ SQLITE_PRIVATE const char *sqlite3OpcodeName(int i){ /* 89 */ "Divide", /* 90 */ "Remainder", /* 91 */ "Concat", - /* 92 */ "Delete", + /* 92 */ "Destroy", /* 93 */ "BitNot", /* 94 */ "String8", - /* 95 */ "AggFinal", - /* 96 */ "Compare", - /* 97 */ "Goto", - /* 98 */ "TableLock", - /* 99 */ "Clear", - /* 100 */ "VerifyCookie", - /* 101 */ "AggStep", - /* 102 */ "Transaction", - /* 103 */ "VFilter", - /* 104 */ "VDestroy", - /* 105 */ "Next", - /* 106 */ "Count", - /* 107 */ "IdxInsert", - /* 108 */ "FkIfZero", - /* 109 */ "SeekGe", - /* 110 */ "Insert", - /* 111 */ "Destroy", - /* 112 */ "ReadCookie", - /* 113 */ "RowSetTest", - /* 114 */ "LoadAnalysis", - /* 115 */ "Explain", - /* 116 */ "HaltIfNull", - /* 117 */ "OpenPseudo", - /* 118 */ "OpenEphemeral", - /* 119 */ "Null", - /* 120 */ "Move", - /* 121 */ "Blob", - /* 122 */ "Rewind", - /* 123 */ "SeekGt", - /* 124 */ "VBegin", - /* 125 */ "VUpdate", - /* 126 */ "IfZero", - /* 127 */ "VCreate", - /* 128 */ "Found", - /* 129 */ "IfPos", + /* 95 */ "Clear", + /* 96 */ "CreateIndex", + /* 97 */ "CreateTable", + /* 98 */ "ParseSchema", + /* 99 */ "LoadAnalysis", + /* 100 */ "DropTable", + /* 101 */ "DropIndex", + /* 102 */ "DropTrigger", + /* 103 */ "IntegrityCk", + /* 104 */ "RowSetAdd", + /* 105 */ "RowSetRead", + /* 106 */ "RowSetTest", + /* 107 */ "Program", + /* 108 */ "Param", + /* 109 */ "FkCounter", + /* 110 */ "FkIfZero", + /* 111 */ "MemMax", + /* 112 */ "IfPos", + /* 113 */ "IfNeg", + /* 114 */ "IfZero", + /* 115 */ "AggStep", + /* 116 */ "AggFinal", + /* 117 */ "Vacuum", + /* 118 */ "IncrVacuum", + /* 119 */ "Expire", + /* 120 */ "TableLock", + /* 121 */ "VBegin", + /* 122 */ "VCreate", + /* 123 */ "VDestroy", + /* 124 */ "VOpen", + /* 125 */ "VFilter", + /* 126 */ "VColumn", + /* 127 */ "VNext", + /* 128 */ "VRename", + /* 129 */ "VUpdate", /* 130 */ "Real", - /* 131 */ "NullRow", - /* 132 */ "Jump", - /* 133 */ "Permutation", - /* 134 */ "NotUsed_134", + /* 131 */ "Pagecount", + /* 132 */ "Trace", + /* 133 */ "Noop", + /* 134 */ "Explain", /* 135 */ "NotUsed_135", /* 136 */ "NotUsed_136", /* 137 */ "NotUsed_137", @@ -20001,8 +19928,6 @@ SQLITE_PRIVATE const char *sqlite3OpcodeName(int i){ ****************************************************************************** ** ** This file contains code that is specific to OS/2. -** -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ @@ -20064,8 +19989,6 @@ SQLITE_PRIVATE const char *sqlite3OpcodeName(int i){ ** ** This file should be #included by the os_*.c files only. It is not a ** general purpose header file. -** -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ #ifndef _OS_COMMON_H_ #define _OS_COMMON_H_ @@ -20126,8 +20049,6 @@ SQLITE_PRIVATE int sqlite3OSTrace = 0; ** ** This file contains inline asm code for retrieving "high-performance" ** counters for x86 class CPUs. -** -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ #ifndef _HWTIME_H_ #define _HWTIME_H_ @@ -21593,8 +21514,6 @@ struct unixFile { ** ** This file should be #included by the os_*.c files only. It is not a ** general purpose header file. -** -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ #ifndef _OS_COMMON_H_ #define _OS_COMMON_H_ @@ -21655,8 +21574,6 @@ SQLITE_PRIVATE int sqlite3OSTrace = 0; ** ** This file contains inline asm code for retrieving "high-performance" ** counters for x86 class CPUs. -** -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ #ifndef _HWTIME_H_ #define _HWTIME_H_ @@ -22721,7 +22638,7 @@ static int unixCheckReservedLock(sqlite3_file *id, int *pResOut){ #endif unixLeaveMutex(); - OSTRACE4("TEST WR-LOCK %d %d %d\n", pFile->h, rc, reserved); + OSTRACE4("TEST WR-LOCK %d %d %d (unix)\n", pFile->h, rc, reserved); *pResOut = reserved; return rc; @@ -22854,7 +22771,7 @@ static int unixLock(sqlite3_file *id, int locktype){ int tErrno; assert( pFile ); - OSTRACE7("LOCK %d %s was %s(%s,%d) pid=%d\n", pFile->h, + OSTRACE7("LOCK %d %s was %s(%s,%d) pid=%d (unix)\n", pFile->h, locktypeName(locktype), locktypeName(pFile->locktype), locktypeName(pLock->locktype), pLock->cnt , getpid()); @@ -22863,7 +22780,7 @@ static int unixLock(sqlite3_file *id, int locktype){ ** unixEnterMutex() hasn't been called yet. */ if( pFile->locktype>=locktype ){ - OSTRACE3("LOCK %d %s ok (already held)\n", pFile->h, + OSTRACE3("LOCK %d %s ok (already held) (unix)\n", pFile->h, locktypeName(locktype)); return SQLITE_OK; } @@ -23033,7 +22950,7 @@ static int unixLock(sqlite3_file *id, int locktype){ end_lock: unixLeaveMutex(); - OSTRACE4("LOCK %d %s %s\n", pFile->h, locktypeName(locktype), + OSTRACE4("LOCK %d %s %s (unix)\n", pFile->h, locktypeName(locktype), rc==SQLITE_OK ? "ok" : "failed"); return rc; } @@ -23097,7 +23014,7 @@ static int unixUnlock(sqlite3_file *id, int locktype){ int tErrno; /* Error code from system call errors */ assert( pFile ); - OSTRACE7("UNLOCK %d %d was %d(%d,%d) pid=%d\n", pFile->h, locktype, + OSTRACE7("UNLOCK %d %d was %d(%d,%d) pid=%d (unix)\n", pFile->h, locktype, pFile->locktype, pFile->pLock->locktype, pFile->pLock->cnt, getpid()); assert( locktype<=SHARED_LOCK ); @@ -23378,7 +23295,7 @@ static int dotlockCheckReservedLock(sqlite3_file *id, int *pResOut) { const char *zLockFile = (const char*)pFile->lockingContext; reserved = access(zLockFile, 0)==0; } - OSTRACE4("TEST WR-LOCK %d %d %d\n", pFile->h, rc, reserved); + OSTRACE4("TEST WR-LOCK %d %d %d (dotlock)\n", pFile->h, rc, reserved); *pResOut = reserved; return rc; } @@ -23468,7 +23385,7 @@ static int dotlockUnlock(sqlite3_file *id, int locktype) { char *zLockFile = (char *)pFile->lockingContext; assert( pFile ); - OSTRACE5("UNLOCK %d %d was %d pid=%d\n", pFile->h, locktype, + OSTRACE5("UNLOCK %d %d was %d pid=%d (dotlock)\n", pFile->h, locktype, pFile->locktype, getpid()); assert( locktype<=SHARED_LOCK ); @@ -23582,7 +23499,7 @@ static int flockCheckReservedLock(sqlite3_file *id, int *pResOut){ } } } - OSTRACE4("TEST WR-LOCK %d %d %d\n", pFile->h, rc, reserved); + OSTRACE4("TEST WR-LOCK %d %d %d (flock)\n", pFile->h, rc, reserved); #ifdef SQLITE_IGNORE_FLOCK_LOCK_ERRORS if( (rc & SQLITE_IOERR) == SQLITE_IOERR ){ @@ -23649,7 +23566,7 @@ static int flockLock(sqlite3_file *id, int locktype) { /* got it, set the type and return ok */ pFile->locktype = locktype; } - OSTRACE4("LOCK %d %s %s\n", pFile->h, locktypeName(locktype), + OSTRACE4("LOCK %d %s %s (flock)\n", pFile->h, locktypeName(locktype), rc==SQLITE_OK ? "ok" : "failed"); #ifdef SQLITE_IGNORE_FLOCK_LOCK_ERRORS if( (rc & SQLITE_IOERR) == SQLITE_IOERR ){ @@ -23671,7 +23588,7 @@ static int flockUnlock(sqlite3_file *id, int locktype) { unixFile *pFile = (unixFile*)id; assert( pFile ); - OSTRACE5("UNLOCK %d %d was %d pid=%d\n", pFile->h, locktype, + OSTRACE5("UNLOCK %d %d was %d pid=%d (flock)\n", pFile->h, locktype, pFile->locktype, getpid()); assert( locktype<=SHARED_LOCK ); @@ -23773,7 +23690,7 @@ static int semCheckReservedLock(sqlite3_file *id, int *pResOut) { sem_post(pSem); } } - OSTRACE4("TEST WR-LOCK %d %d %d\n", pFile->h, rc, reserved); + OSTRACE4("TEST WR-LOCK %d %d %d (sem)\n", pFile->h, rc, reserved); *pResOut = reserved; return rc; @@ -23848,7 +23765,7 @@ static int semUnlock(sqlite3_file *id, int locktype) { assert( pFile ); assert( pSem ); - OSTRACE5("UNLOCK %d %d was %d pid=%d\n", pFile->h, locktype, + OSTRACE5("UNLOCK %d %d was %d pid=%d (sem)\n", pFile->h, locktype, pFile->locktype, getpid()); assert( locktype<=SHARED_LOCK ); @@ -24018,7 +23935,7 @@ static int afpCheckReservedLock(sqlite3_file *id, int *pResOut){ } } - OSTRACE4("TEST WR-LOCK %d %d %d\n", pFile->h, rc, reserved); + OSTRACE4("TEST WR-LOCK %d %d %d (afp)\n", pFile->h, rc, reserved); *pResOut = reserved; return rc; @@ -24054,7 +23971,7 @@ static int afpLock(sqlite3_file *id, int locktype){ afpLockingContext *context = (afpLockingContext *) pFile->lockingContext; assert( pFile ); - OSTRACE5("LOCK %d %s was %s pid=%d\n", pFile->h, + OSTRACE5("LOCK %d %s was %s pid=%d (afp)\n", pFile->h, locktypeName(locktype), locktypeName(pFile->locktype), getpid()); /* If there is already a lock of this type or more restrictive on the @@ -24062,7 +23979,7 @@ static int afpLock(sqlite3_file *id, int locktype){ ** unixEnterMutex() hasn't been called yet. */ if( pFile->locktype>=locktype ){ - OSTRACE3("LOCK %d %s ok (already held)\n", pFile->h, + OSTRACE3("LOCK %d %s ok (already held) (afp)\n", pFile->h, locktypeName(locktype)); return SQLITE_OK; } @@ -24104,7 +24021,8 @@ static int afpLock(sqlite3_file *id, int locktype){ ** operating system calls for the specified lock. */ if( locktype==SHARED_LOCK ){ - int lk, lrc1, lrc2, lrc1Errno; + int lk, lrc1, lrc2; + int lrc1Errno = 0; /* Now get the read-lock SHARED_LOCK */ /* note that the quality of the randomness doesn't matter that much */ @@ -24180,7 +24098,7 @@ static int afpLock(sqlite3_file *id, int locktype){ afp_end_lock: unixLeaveMutex(); - OSTRACE4("LOCK %d %s %s\n", pFile->h, locktypeName(locktype), + OSTRACE4("LOCK %d %s %s (afp)\n", pFile->h, locktypeName(locktype), rc==SQLITE_OK ? "ok" : "failed"); return rc; } @@ -24198,7 +24116,7 @@ static int afpUnlock(sqlite3_file *id, int locktype) { afpLockingContext *pCtx = (afpLockingContext *) pFile->lockingContext; assert( pFile ); - OSTRACE5("UNLOCK %d %d was %d pid=%d\n", pFile->h, locktype, + OSTRACE5("UNLOCK %d %d was %d pid=%d (afp)\n", pFile->h, locktype, pFile->locktype, getpid()); assert( locktype<=SHARED_LOCK ); @@ -24674,6 +24592,19 @@ static int unixTruncate(sqlite3_file *id, i64 nByte){ ((unixFile*)id)->lastErrno = errno; return SQLITE_IOERR_TRUNCATE; }else{ +#ifndef NDEBUG + /* If we are doing a normal write to a database file (as opposed to + ** doing a hot-journal rollback or a write to some file other than a + ** normal database file) and we truncate the file to zero length, + ** that effectively updates the change counter. This might happen + ** when restoring a database using the backup API from a zero-length + ** source. + */ + if( ((unixFile*)id)->inNormalWrite && nByte==0 ){ + ((unixFile*)id)->transCntrChng = 1; + } +#endif + return SQLITE_OK; } } @@ -25352,16 +25283,17 @@ static UnixUnusedFd *findReusableFd(const char *zPath, int flags){ ** Even if a subsequent open() call does succeed, the consequences of ** not searching for a resusable file descriptor are not dire. */ if( 0==stat(zPath, &sStat) ){ - struct unixOpenCnt *pO; - struct unixFileId id; - id.dev = sStat.st_dev; - id.ino = sStat.st_ino; + struct unixOpenCnt *pOpen; unixEnterMutex(); - for(pO=openList; pO && memcmp(&id, &pO->fileId, sizeof(id)); pO=pO->pNext); - if( pO ){ + pOpen = openList; + while( pOpen && (pOpen->fileId.dev!=sStat.st_dev + || pOpen->fileId.ino!=sStat.st_ino) ){ + pOpen = pOpen->pNext; + } + if( pOpen ){ UnixUnusedFd **pp; - for(pp=&pO->pUnused; *pp && (*pp)->flags!=flags; pp=&((*pp)->pNext)); + for(pp=&pOpen->pUnused; *pp && (*pp)->flags!=flags; pp=&((*pp)->pNext)); pUnused = *pp; if( pUnused ){ *pp = pUnused->pNext; @@ -26221,7 +26153,7 @@ static int proxyGetLockPath(const char *dbPath, char *lPath, size_t maxLen){ # ifdef _CS_DARWIN_USER_TEMP_DIR { confstr(_CS_DARWIN_USER_TEMP_DIR, lPath, maxLen); - len = strlcat(lPath, "sqliteplocks", maxLen); + len = strlcat(lPath, "sqliteplocks", maxLen); if( mkdir(lPath, SQLITE_DEFAULT_PROXYDIR_PERMISSIONS) ){ /* if mkdir fails, handle as lock file creation failure */ # ifdef SQLITE_DEBUG @@ -27031,8 +26963,6 @@ SQLITE_API int sqlite3_os_end(void){ ** ** This file should be #included by the os_*.c files only. It is not a ** general purpose header file. -** -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ #ifndef _OS_COMMON_H_ #define _OS_COMMON_H_ @@ -27093,8 +27023,6 @@ SQLITE_PRIVATE int sqlite3OSTrace = 0; ** ** This file contains inline asm code for retrieving "high-performance" ** counters for x86 class CPUs. -** -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ #ifndef _HWTIME_H_ #define _HWTIME_H_ @@ -27249,7 +27177,7 @@ SQLITE_API int sqlite3_open_file_count = 0; */ #if SQLITE_OS_WINCE # define AreFileApisANSI() 1 -# define GetDiskFreeSpaceW() 0 +# define FormatMessageW(a,b,c,d,e,f,g) 0 #endif /* @@ -28423,27 +28351,59 @@ static int getTempname(int nBuf, char *zBuf){ ** otherwise (if the message was truncated). */ static int getLastErrorMsg(int nBuf, char *zBuf){ - DWORD error = GetLastError(); - -#if SQLITE_OS_WINCE - sqlite3_snprintf(nBuf, zBuf, "OsError 0x%x (%u)", error, error); -#else /* FormatMessage returns 0 on failure. Otherwise it ** returns the number of TCHARs written to the output ** buffer, excluding the terminating null char. */ - if (!FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, - NULL, - error, - 0, - zBuf, - nBuf-1, - 0)) - { + DWORD error = GetLastError(); + DWORD dwLen = 0; + char *zOut = 0; + + if( isNT() ){ + WCHAR *zTempWide = NULL; + dwLen = FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + error, + 0, + (LPWSTR) &zTempWide, + 0, + 0); + if( dwLen > 0 ){ + /* allocate a buffer and convert to UTF8 */ + zOut = unicodeToUtf8(zTempWide); + /* free the system buffer allocated by FormatMessage */ + LocalFree(zTempWide); + } +/* isNT() is 1 if SQLITE_OS_WINCE==1, so this else is never executed. +** Since the ASCII version of these Windows API do not exist for WINCE, +** it's important to not reference them for WINCE builds. +*/ +#if SQLITE_OS_WINCE==0 + }else{ + char *zTemp = NULL; + dwLen = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + error, + 0, + (LPSTR) &zTemp, + 0, + 0); + if( dwLen > 0 ){ + /* allocate a buffer and convert to UTF8 */ + zOut = sqlite3_win32_mbcs_to_utf8(zTemp); + /* free the system buffer allocated by FormatMessage */ + LocalFree(zTemp); + } +#endif + } + if( 0 == dwLen ){ sqlite3_snprintf(nBuf, zBuf, "OsError 0x%x (%u)", error, error); + }else{ + /* copy a maximum of nBuf chars to output buffer */ + sqlite3_snprintf(nBuf, zBuf, "%s", zOut); + /* free the UTF8 buffer */ + free(zOut); } -#endif - return 0; } @@ -28811,14 +28771,14 @@ static int getSectorSize( &dwDummy); }else{ /* trim path to just drive reference */ - CHAR *p = (CHAR *)zConverted; + char *p = (char *)zConverted; for(;*p;p++){ if( *p == '\\' ){ *p = '\0'; break; } } - dwRet = GetDiskFreeSpaceA((CHAR*)zConverted, + dwRet = GetDiskFreeSpaceA((char*)zConverted, &dwDummy, &bytesPerSector, &dwDummy, @@ -29104,8 +29064,6 @@ SQLITE_API int sqlite3_os_end(void){ ** Bitvec object is the number of pages in the database file at the ** start of a transaction, and is thus usually less than a few thousand, ** but can be as large as 2 billion for a really big database. -** -** @(#) $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ /* Size of the Bitvec structure in bytes. */ @@ -29493,8 +29451,6 @@ bitvec_end: ** ************************************************************************* ** This file implements that page cache. -** -** @(#) $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ /* @@ -30076,8 +30032,6 @@ SQLITE_PRIVATE void sqlite3PcacheIterateDirty(PCache *pCache, void (*xIter)(PgHd ** of the SQLITE_CONFIG_PAGECACHE and sqlite3_release_memory() features. ** If the default page cache implementation is overriden, then neither of ** these two features are available. -** -** @(#) $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ @@ -30727,15 +30681,7 @@ static void pcache1Rekey( pPage->iKey = iNew; pPage->pNext = pCache->apHash[h]; pCache->apHash[h] = pPage; - - /* The xRekey() interface is only used to move pages earlier in the - ** database file (in order to move all free pages to the end of the - ** file where they can be truncated off.) Hence, it is not possible - ** for the new page number to be greater than the largest previously - ** fetched page. But we retain the following test in case xRekey() - ** begins to be used in different ways in the future. - */ - if( NEVER(iNew>pCache->iMaxKey) ){ + if( iNew>pCache->iMaxKey ){ pCache->iMaxKey = iNew; } @@ -30911,8 +30857,6 @@ SQLITE_PRIVATE void sqlite3PcacheStats( ** ** There is an added cost of O(N) when switching between TEST and ** SMALLEST primitives. -** -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ @@ -31295,8 +31239,6 @@ SQLITE_PRIVATE int sqlite3RowSetTest(RowSet *pRowSet, u8 iBatch, sqlite3_int64 i ** locking to prevent two processes from writing the same database ** file simultaneously, or one process from reading the database while ** another is writing. -** -** @(#) $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ #ifndef SQLITE_OMIT_DISKIO @@ -32190,10 +32132,10 @@ static int readJournalHdr( /* Check that the values read from the page-size and sector-size fields ** are within range. To be 'in range', both values need to be a power - ** of two greater than or equal to 512, and not greater than their + ** of two greater than or equal to 512 or 32, and not greater than their ** respective compile time maximum limits. */ - if( iPageSize<512 || iSectorSize<512 + if( iPageSize<512 || iSectorSize<32 || iPageSize>SQLITE_MAX_PAGE_SIZE || iSectorSize>MAX_SECTOR_SIZE || ((iPageSize-1)&iPageSize)!=0 || ((iSectorSize-1)&iSectorSize)!=0 ){ @@ -32426,6 +32368,7 @@ static void pager_unlock(Pager *pPager){ pPager->changeCountDone = 0; pPager->state = PAGER_UNLOCK; + pPager->dbModified = 0; } } @@ -32700,7 +32643,7 @@ static int pager_playback_one_page( PgHdr *pPg; /* An existing page in the cache */ Pgno pgno; /* The page number of a page in journal */ u32 cksum; /* Checksum used for sanity checking */ - u8 *aData; /* Temporary storage for the page */ + char *aData; /* Temporary storage for the page */ sqlite3_file *jfd; /* The file descriptor for the journal file */ assert( (isMainJrnl&~1)==0 ); /* isMainJrnl is 0 or 1 */ @@ -32708,7 +32651,7 @@ static int pager_playback_one_page( assert( isMainJrnl || pDone ); /* pDone always used on sub-journals */ assert( isSavepnt || pDone==0 ); /* pDone never used on non-savepoint */ - aData = (u8*)pPager->pTmpSpace; + aData = pPager->pTmpSpace; assert( aData ); /* Temp storage must have already been allocated */ /* Read the page number and page data from the journal or sub-journal @@ -32717,7 +32660,7 @@ static int pager_playback_one_page( jfd = isMainJrnl ? pPager->jfd : pPager->sjfd; rc = read32bits(jfd, *pOffset, &pgno); if( rc!=SQLITE_OK ) return rc; - rc = sqlite3OsRead(jfd, aData, pPager->pageSize, (*pOffset)+4); + rc = sqlite3OsRead(jfd, (u8*)aData, pPager->pageSize, (*pOffset)+4); if( rc!=SQLITE_OK ) return rc; *pOffset += pPager->pageSize + 4 + isMainJrnl*4; @@ -32736,7 +32679,7 @@ static int pager_playback_one_page( if( isMainJrnl ){ rc = read32bits(jfd, (*pOffset)-4, &cksum); if( rc ) return rc; - if( !isSavepnt && pager_cksum(pPager, aData)!=cksum ){ + if( !isSavepnt && pager_cksum(pPager, (u8*)aData)!=cksum ){ return SQLITE_DONE; } } @@ -32782,8 +32725,8 @@ static int pager_playback_one_page( pPg = pager_lookup(pPager, pgno); assert( pPg || !MEMDB ); PAGERTRACE(("PLAYBACK %d page %d hash(%08x) %s\n", - PAGERID(pPager), pgno, pager_datahash(pPager->pageSize, aData), - (isMainJrnl?"main-journal":"sub-journal") + PAGERID(pPager), pgno, pager_datahash(pPager->pageSize, (u8*)aData), + (isMainJrnl?"main-journal":"sub-journal") )); if( (pPager->state>=PAGER_EXCLUSIVE) && (pPg==0 || 0==(pPg->flags&PGHDR_NEED_SYNC)) @@ -32791,14 +32734,14 @@ static int pager_playback_one_page( && !isUnsync ){ i64 ofst = (pgno-1)*(i64)pPager->pageSize; - rc = sqlite3OsWrite(pPager->fd, aData, pPager->pageSize, ofst); + rc = sqlite3OsWrite(pPager->fd, (u8*)aData, pPager->pageSize, ofst); if( pgno>pPager->dbFileSize ){ pPager->dbFileSize = pgno; } if( pPager->pBackup ){ CODEC1(pPager, aData, pgno, 3, rc=SQLITE_NOMEM); - sqlite3BackupUpdate(pPager->pBackup, pgno, aData); - CODEC1(pPager, aData, pgno, 0, rc=SQLITE_NOMEM); + sqlite3BackupUpdate(pPager->pBackup, pgno, (u8*)aData); + CODEC2(pPager, aData, pgno, 7, rc=SQLITE_NOMEM, aData); } }else if( !isMainJrnl && pPg==0 ){ /* If this is a rollback of a savepoint and data was not written to @@ -32833,7 +32776,7 @@ static int pager_playback_one_page( */ void *pData; pData = pPg->pData; - memcpy(pData, aData, pPager->pageSize); + memcpy(pData, (u8*)aData, pPager->pageSize); pPager->xReiniter(pPg); if( isMainJrnl && (!isSavepnt || *pOffset<=pPager->journalHdr) ){ /* If the contents of this page were just restored from the main @@ -33058,8 +33001,8 @@ static int pager_truncate(Pager *pPager, Pgno nPage){ ** For temporary files the effective sector size is always 512 bytes. ** ** Otherwise, for non-temporary files, the effective sector size is -** the value returned by the xSectorSize() method rounded up to 512 if -** it is less than 512, or rounded down to MAX_SECTOR_SIZE if it +** the value returned by the xSectorSize() method rounded up to 32 if +** it is less than 32, or rounded down to MAX_SECTOR_SIZE if it ** is greater than MAX_SECTOR_SIZE. */ static void setSectorSize(Pager *pPager){ @@ -33072,7 +33015,7 @@ static void setSectorSize(Pager *pPager){ */ pPager->sectorSize = sqlite3OsSectorSize(pPager->fd); } - if( pPager->sectorSize<512 ){ + if( pPager->sectorSize<32 ){ pPager->sectorSize = 512; } if( pPager->sectorSize>MAX_SECTOR_SIZE ){ @@ -33097,21 +33040,15 @@ static void setSectorSize(Pager *pPager){ ** database to during a rollback. ** (5) 4 byte big-endian integer which is the sector size. The header ** is this many bytes in size. -** (6) 4 byte big-endian integer which is the page case. -** (7) 4 byte integer which is the number of bytes in the master journal -** name. The value may be zero (indicate that there is no master -** journal.) -** (8) N bytes of the master journal name. The name will be nul-terminated -** and might be shorter than the value read from (5). If the first byte -** of the name is \000 then there is no master journal. The master -** journal name is stored in UTF-8. -** (9) Zero or more pages instances, each as follows: +** (6) 4 byte big-endian integer which is the page size. +** (7) zero padding out to the next sector size. +** (8) Zero or more pages instances, each as follows: ** + 4 byte page number. ** + pPager->pageSize bytes of data. ** + 4 byte checksum ** -** When we speak of the journal header, we mean the first 8 items above. -** Each entry in the journal is an instance of the 9th item. +** When we speak of the journal header, we mean the first 7 items above. +** Each entry in the journal is an instance of the 8th item. ** ** Call the value from the second bullet "nRec". nRec is the number of ** valid page entries in the journal. In most cases, you can compute the @@ -33808,8 +33745,11 @@ static int pager_wait_on_lock(Pager *pPager, int locktype){ assert( PAGER_RESERVED==RESERVED_LOCK ); assert( PAGER_EXCLUSIVE==EXCLUSIVE_LOCK ); - /* If the file is currently unlocked then the size must be unknown */ + /* If the file is currently unlocked then the size must be unknown. It + ** must not have been modified at this point. + */ assert( pPager->state>=PAGER_SHARED || pPager->dbSizeValid==0 ); + assert( pPager->state>=PAGER_SHARED || pPager->dbModified==0 ); /* Check that this is either a no-op (because the requested lock is ** already held, or one of the transistions that the busy-handler @@ -34156,7 +34096,9 @@ static int pager_write_pagelist(PgHdr *pList){ ** any such pages to the file. ** ** Also, do not write out any page that has the PGHDR_DONT_WRITE flag - ** set (set by sqlite3PagerDontWrite()). + ** set (set by sqlite3PagerDontWrite()). Note that if compiled with + ** SQLITE_SECURE_DELETE the PGHDR_DONT_WRITE bit is never set and so + ** the second test is always true. */ if( pgno<=pPager->dbSize && 0==(pList->flags&PGHDR_DONT_WRITE) ){ i64 offset = (pgno-1)*(i64)pPager->pageSize; /* Offset to write */ @@ -35121,7 +35063,7 @@ SQLITE_PRIVATE int sqlite3PagerAcquire( goto pager_acquire_err; } - if( nMax<(int)pgno || MEMDB || noContent ){ + if( MEMDB || nMax<(int)pgno || noContent ){ if( pgno>pPager->mxPgno ){ rc = SQLITE_FULL; goto pager_acquire_err; @@ -35141,9 +35083,8 @@ SQLITE_PRIVATE int sqlite3PagerAcquire( TESTONLY( rc = ) addToSavepointBitvecs(pPager, pgno); testcase( rc==SQLITE_NOMEM ); sqlite3EndBenignMalloc(); - }else{ - memset(pPg->pData, 0, pPager->pageSize); } + memset(pPg->pData, 0, pPager->pageSize); IOTRACE(("ZERO %p %d\n", pPager, pgno)); }else{ assert( pPg->pPager==pPager ); @@ -35665,6 +35606,7 @@ SQLITE_PRIVATE int sqlite3PagerIswriteable(DbPage *pPg){ } #endif +#ifndef SQLITE_SECURE_DELETE /* ** A call to this routine tells the pager that it is not necessary to ** write the information on page pPg back to the disk, even though @@ -35690,6 +35632,7 @@ SQLITE_PRIVATE void sqlite3PagerDontWrite(PgHdr *pPg){ #endif } } +#endif /* !defined(SQLITE_SECURE_DELETE) */ /* ** This routine is called to increment the value of the database file @@ -35729,7 +35672,7 @@ static int pager_incr_changecounter(Pager *pPager, int isDirectMode){ #endif assert( pPager->state>=PAGER_RESERVED ); - if( !pPager->changeCountDone && ALWAYS(pPager->dbSize>0) ){ + if( !pPager->changeCountDone && pPager->dbSize>0 ){ PgHdr *pPgHdr; /* Reference to page 1 */ u32 change_counter; /* Initial value of change-counter field */ @@ -36337,7 +36280,7 @@ static void sqlite3PagerSetCodec( void *pCodec ){ if( pPager->xCodecFree ) pPager->xCodecFree(pPager->pCodec); - pPager->xCodec = xCodec; + pPager->xCodec = pPager->memDb ? 0 : xCodec; pPager->xCodecSizeChng = xCodecSizeChng; pPager->xCodecFree = xCodecFree; pPager->pCodec = pCodec; @@ -36382,6 +36325,14 @@ SQLITE_PRIVATE int sqlite3PagerMovepage(Pager *pPager, DbPage *pPg, Pgno pgno, i assert( pPg->nRef>0 ); + /* In order to be able to rollback, an in-memory database must journal + ** the page we are moving from. + */ + if( MEMDB ){ + rc = sqlite3PagerWrite(pPg); + if( rc ) return rc; + } + /* If the page being moved is dirty and has not been saved by the latest ** savepoint, then save the current contents of the page into the ** sub-journal now. This is required to handle the following scenario: @@ -36400,7 +36351,7 @@ SQLITE_PRIVATE int sqlite3PagerMovepage(Pager *pPager, DbPage *pPg, Pgno pgno, i ** one or more savepoint bitvecs. This is the reason this function ** may return SQLITE_NOMEM. */ - if( pPg->flags&PGHDR_DIRTY + if( pPg->flags&PGHDR_DIRTY && subjRequiresPage(pPg) && SQLITE_OK!=(rc = subjournalPage(pPg)) ){ @@ -36435,7 +36386,14 @@ SQLITE_PRIVATE int sqlite3PagerMovepage(Pager *pPager, DbPage *pPg, Pgno pgno, i assert( !pPgOld || pPgOld->nRef==1 ); if( pPgOld ){ pPg->flags |= (pPgOld->flags&PGHDR_NEED_SYNC); - sqlite3PcacheDrop(pPgOld); + if( MEMDB ){ + /* Do not discard pages from an in-memory database since we might + ** need to rollback later. Just move the page out of the way. */ + assert( pPager->dbSizeValid ); + sqlite3PcacheMove(pPgOld, pPager->dbSize+1); + }else{ + sqlite3PcacheDrop(pPgOld); + } } origPgno = pPg->pgno; @@ -36480,18 +36438,12 @@ SQLITE_PRIVATE int sqlite3PagerMovepage(Pager *pPager, DbPage *pPg, Pgno pgno, i /* ** For an in-memory database, make sure the original page continues - ** to exist, in case the transaction needs to roll back. We allocate - ** the page now, instead of at rollback, because we can better deal - ** with an out-of-memory error now. Ticket #3761. + ** to exist, in case the transaction needs to roll back. Use pPgOld + ** as the original page since it has already been allocated. */ if( MEMDB ){ - DbPage *pNew; - rc = sqlite3PagerAcquire(pPager, origPgno, &pNew, 1); - if( rc!=SQLITE_OK ){ - sqlite3PcacheMove(pPg, origPgno); - return rc; - } - sqlite3PagerUnref(pNew); + sqlite3PcacheMove(pPgOld, origPgno); + sqlite3PagerUnref(pPgOld); } return SQLITE_OK; @@ -36618,8 +36570,6 @@ SQLITE_PRIVATE sqlite3_backup **sqlite3PagerBackupPtr(Pager *pPager){ ** ************************************************************************* ** -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ -** ** This file contains code used to implement mutexes on Btree objects. ** This code really belongs in btree.c. But btree.c is getting too ** big and we want to break it down some. This packaged seemed like @@ -36638,8 +36588,6 @@ SQLITE_PRIVATE sqlite3_backup **sqlite3PagerBackupPtr(Pager *pPager){ ** May you share freely, never taking more than you give. ** ************************************************************************* -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ -** ** This file implements a external (disk-based) database using BTrees. ** For a detailed discussion of BTrees, refer to ** @@ -36677,9 +36625,9 @@ SQLITE_PRIVATE sqlite3_backup **sqlite3PagerBackupPtr(Pager *pPager){ ** ** The file is divided into pages. The first page is called page 1, ** the second is page 2, and so forth. A page number of zero indicates -** "no such page". The page size can be anything between 512 and 65536. -** Each page can be either a btree page, a freelist page or an overflow -** page. +** "no such page". The page size can be any power of 2 between 512 and 32768. +** Each page can be either a btree page, a freelist page, an overflow +** page, or a pointer-map page. ** ** The first page is always a btree page. The first 100 bytes of the first ** page contain a special header (the "file header") that describes the file. @@ -36957,8 +36905,8 @@ struct BtLock { ** this structure. ** ** For some database files, the same underlying database cache might be -** shared between multiple connections. In that case, each contection -** has it own pointer to this object. But each instance of this object +** shared between multiple connections. In that case, each connection +** has it own instance of this object. But each instance of this object ** points to the same BtShared object. The database cache and the ** schema associated with the database file are all contained within ** the BtShared object. @@ -37099,7 +37047,7 @@ struct CellInfo { ** The entry is identified by its MemPage and the index in ** MemPage.aCell[] of the entry. ** -** When a single database file can shared by two more database connections, +** A single database file can shared by two more database connections, ** but cursors cannot be shared. Each cursor is associated with a ** particular database connection identified BtCursor.pBtree.db. ** @@ -37623,8 +37571,6 @@ SQLITE_PRIVATE void sqlite3BtreeEnterAll(sqlite3 *db){ ** May you share freely, never taking more than you give. ** ************************************************************************* -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ -** ** This file implements a external (disk-based) database using BTrees. ** See the header comment on "btreeInt.h" for additional information. ** Including a description of file format and an overview of operation. @@ -37703,22 +37649,24 @@ SQLITE_API int sqlite3_enable_shared_cache(int enable){ #ifdef SQLITE_DEBUG /* -** This function is only used as part of an assert() statement. It checks -** that connection p holds the required locks to read or write to the -** b-tree with root page iRoot. If so, true is returned. Otherwise, false. -** For example, when writing to a table b-tree with root-page iRoot via +**** This function is only used as part of an assert() statement. *** +** +** Check to see if pBtree holds the required locks to read or write to the +** table with root page iRoot. Return 1 if it does and 0 if not. +** +** For example, when writing to a table with root-page iRoot via ** Btree connection pBtree: ** ** assert( hasSharedCacheTableLock(pBtree, iRoot, 0, WRITE_LOCK) ); ** -** When writing to an index b-tree that resides in a sharable database, the +** When writing to an index that resides in a sharable database, the ** caller should have first obtained a lock specifying the root page of -** the corresponding table b-tree. This makes things a bit more complicated, -** as this module treats each b-tree as a separate structure. To determine -** the table b-tree corresponding to the index b-tree being written, this +** the corresponding table. This makes things a bit more complicated, +** as this module treats each table as a separate structure. To determine +** the table corresponding to the index being written, this ** function has to search through the database schema. ** -** Instead of a lock on the b-tree rooted at page iRoot, the caller may +** Instead of a lock on the table/index rooted at page iRoot, the caller may ** hold a write-lock on the schema table (root page 1). This is also ** acceptable. */ @@ -37732,20 +37680,25 @@ static int hasSharedCacheTableLock( Pgno iTab = 0; BtLock *pLock; - /* If this b-tree database is not shareable, or if the client is reading + /* If this database is not shareable, or if the client is reading ** and has the read-uncommitted flag set, then no lock is required. - ** In these cases return true immediately. If the client is reading - ** or writing an index b-tree, but the schema is not loaded, then return - ** true also. In this case the lock is required, but it is too difficult - ** to check if the client actually holds it. This doesn't happen very - ** often. */ + ** Return true immediately. + */ if( (pBtree->sharable==0) || (eLockType==READ_LOCK && (pBtree->db->flags & SQLITE_ReadUncommitted)) - || (isIndex && (!pSchema || (pSchema->flags&DB_SchemaLoaded)==0 )) ){ return 1; } + /* If the client is reading or writing an index and the schema is + ** not loaded, then it is too difficult to actually check to see if + ** the correct locks are held. So do not bother - just return true. + ** This case does not come up very often anyhow. + */ + if( isIndex && (!pSchema || (pSchema->flags&DB_SchemaLoaded)==0) ){ + return 1; + } + /* Figure out the root-page that the lock should be held on. For table ** b-trees, this is just the root page of the b-tree being read or ** written. For index b-trees, it is the root page of the associated @@ -37777,14 +37730,24 @@ static int hasSharedCacheTableLock( /* Failed to find the required lock. */ return 0; } +#endif /* SQLITE_DEBUG */ +#ifdef SQLITE_DEBUG /* -** This function is also used as part of assert() statements only. It -** returns true if there exist one or more cursors open on the table -** with root page iRoot that do not belong to either connection pBtree -** or some other connection that has the read-uncommitted flag set. +**** This function may be used as part of assert() statements only. **** +** +** Return true if it would be illegal for pBtree to write into the +** table or index rooted at iRoot because other shared connections are +** simultaneously reading that same table or index. ** -** For example, before writing to page iRoot: +** It is illegal for pBtree to write if some other Btree object that +** shares the same BtShared object is currently reading or writing +** the iRoot table. Except, if the other Btree object has the +** read-uncommitted flag set, then it is OK for the other object to +** have a read cursor. +** +** For example, before writing to any part of the table or index +** rooted at page iRoot, one should call: ** ** assert( !hasReadConflicts(pBtree, iRoot) ); */ @@ -37803,7 +37766,7 @@ static int hasReadConflicts(Btree *pBtree, Pgno iRoot){ #endif /* #ifdef SQLITE_DEBUG */ /* -** Query to see if btree handle p may obtain a lock of type eLock +** Query to see if Btree handle p may obtain a lock of type eLock ** (READ_LOCK or WRITE_LOCK) on the table with root-page iTab. Return ** SQLITE_OK if the lock may be obtained (by calling ** setSharedCacheTableLock()), or SQLITE_LOCKED if not. @@ -37824,7 +37787,7 @@ static int querySharedCacheTableLock(Btree *p, Pgno iTab, u8 eLock){ assert( eLock==READ_LOCK || (p==pBt->pWriter && p->inTrans==TRANS_WRITE) ); assert( eLock==READ_LOCK || pBt->inTransaction==TRANS_WRITE ); - /* This is a no-op if the shared-cache is not enabled */ + /* This routine is a no-op if the shared-cache is not enabled */ if( !p->sharable ){ return SQLITE_OK; } @@ -37870,10 +37833,10 @@ static int querySharedCacheTableLock(Btree *p, Pgno iTab, u8 eLock){ ** ** This function assumes the following: ** -** (a) The specified b-tree connection handle is connected to a sharable -** b-tree database (one with the BtShared.sharable) flag set, and +** (a) The specified Btree object p is connected to a sharable +** database (one with the BtShared.sharable flag set), and ** -** (b) No other b-tree connection handle holds a lock that conflicts +** (b) No other Btree objects hold a lock that conflicts ** with the requested lock (i.e. querySharedCacheTableLock() has ** already been called and returned SQLITE_OK). ** @@ -37938,9 +37901,9 @@ static int setSharedCacheTableLock(Btree *p, Pgno iTable, u8 eLock){ #ifndef SQLITE_OMIT_SHARED_CACHE /* ** Release all the table locks (locks obtained via calls to -** the setSharedCacheTableLock() procedure) held by Btree handle p. +** the setSharedCacheTableLock() procedure) held by Btree object p. ** -** This function assumes that handle p has an open read or write +** This function assumes that Btree p has an open read or write ** transaction. If it does not, then the BtShared.isPending variable ** may be incorrectly cleared. */ @@ -37973,7 +37936,7 @@ static void clearAllSharedCacheTableLocks(Btree *p){ pBt->isExclusive = 0; pBt->isPending = 0; }else if( pBt->nTransaction==2 ){ - /* This function is called when connection p is concluding its + /* This function is called when Btree p is concluding its ** transaction. If there currently exists a writer, and p is not ** that writer, then the number of locks held by connections other ** than the writer must be about to drop to zero. In this case @@ -37987,7 +37950,7 @@ static void clearAllSharedCacheTableLocks(Btree *p){ } /* -** This function changes all write-locks held by connection p to read-locks. +** This function changes all write-locks held by Btree p into read-locks. */ static void downgradeAllSharedCacheTableLocks(Btree *p){ BtShared *pBt = p->pBt; @@ -38008,9 +37971,11 @@ static void downgradeAllSharedCacheTableLocks(Btree *p){ static void releasePage(MemPage *pPage); /* Forward reference */ /* -** Verify that the cursor holds a mutex on the BtShared +***** This routine is used inside of assert() only **** +** +** Verify that the cursor holds the mutex on its BtShared */ -#ifndef NDEBUG +#ifdef SQLITE_DEBUG static int cursorHoldsMutex(BtCursor *p){ return sqlite3_mutex_held(p->pBt->mutex); } @@ -38041,7 +38006,7 @@ static void invalidateAllOverflowCache(BtShared *pBt){ /* ** This function is called before modifying the contents of a table -** b-tree to invalidate any incrblob cursors that are open on the +** to invalidate any incrblob cursors that are open on the ** row or one of the rows being modified. ** ** If argument isClearTable is true, then the entire contents of the @@ -38050,7 +38015,7 @@ static void invalidateAllOverflowCache(BtShared *pBt){ ** ** Otherwise, if argument isClearTable is false, then the row with ** rowid iRow is being replaced or deleted. In this case invalidate -** only those incrblob cursors open on this specific row. +** only those incrblob cursors open on that specific row. */ static void invalidateIncrblobCursors( Btree *pBtree, /* The database file to check */ @@ -38068,10 +38033,11 @@ static void invalidateIncrblobCursors( } #else + /* Stub functions when INCRBLOB is omitted */ #define invalidateOverflowCache(x) #define invalidateAllOverflowCache(x) #define invalidateIncrblobCursors(x,y,z) -#endif +#endif /* SQLITE_OMIT_INCRBLOB */ /* ** Set bit pgno of the BtShared.pHasContent bitvec. This is called @@ -38104,7 +38070,7 @@ static void invalidateIncrblobCursors( ** The solution is the BtShared.pHasContent bitvec. Whenever a page is ** moved to become a free-list leaf page, the corresponding bit is ** set in the bitvec. Whenever a leaf page is extracted from the free-list, -** optimization 2 above is ommitted if the corresponding bit is already +** optimization 2 above is omitted if the corresponding bit is already ** set in BtShared.pHasContent. The contents of the bitvec are cleared ** at the end of every transaction. */ @@ -38200,8 +38166,8 @@ static int saveCursorPosition(BtCursor *pCur){ } /* -** Save the positions of all cursors except pExcept open on the table -** with root-page iRoot. Usually, this is called just before cursor +** Save the positions of all cursors (except pExcept) that are open on +** the table with root-page iRoot. Usually, this is called just before cursor ** pExcept is used to modify the table (BtreeDelete() or BtreeInsert()). */ static int saveAllCursors(BtShared *pBt, Pgno iRoot, BtCursor *pExcept){ @@ -38606,7 +38572,10 @@ static u16 cellSizePtr(MemPage *pPage, u8 *pCell){ assert( nSize==debuginfo.nSize ); return (u16)nSize; } -#ifndef NDEBUG + +#ifdef SQLITE_DEBUG +/* This variation on cellSizePtr() is used inside of assert() statements +** only. */ static u16 cellSize(MemPage *pPage, int iCell){ return cellSizePtr(pPage, findCell(pPage, iCell)); } @@ -38735,6 +38704,7 @@ static int allocateSpace(MemPage *pPage, int nByte, int *pIdx){ int top; /* First byte of cell content area */ int gap; /* First byte of gap between cell pointers and cell content */ int rc; /* Integer return code */ + int usableSize; /* Usable size of the page */ assert( sqlite3PagerIswriteable(pPage->pDbPage) ); assert( pPage->pBt ); @@ -38742,7 +38712,8 @@ static int allocateSpace(MemPage *pPage, int nByte, int *pIdx){ assert( nByte>=0 ); /* Minimum cell size is 4 */ assert( pPage->nFree>=nByte ); assert( pPage->nOverflow==0 ); - assert( nBytepBt->usableSize-8 ); + usableSize = pPage->pBt->usableSize; + assert( nByte < usableSize-8 ); nFrag = data[hdr+7]; assert( pPage->cellOffset == hdr + 12 - 4*pPage->leaf ); @@ -38765,7 +38736,11 @@ static int allocateSpace(MemPage *pPage, int nByte, int *pIdx){ */ int pc, addr; for(addr=hdr+1; (pc = get2byte(&data[addr]))>0; addr=pc){ - int size = get2byte(&data[pc+2]); /* Size of free slot */ + int size; /* Size of the free slot */ + if( pc>usableSize-4 || pc=nByte ){ int x = size - nByte; testcase( x==4 ); @@ -38775,6 +38750,8 @@ static int allocateSpace(MemPage *pPage, int nByte, int *pIdx){ ** fragmented bytes within the page. */ memcpy(&data[addr], &data[pc], 2); data[hdr+7] = (u8)(nFrag + x); + }else if( size+pc > usableSize ){ + return SQLITE_CORRUPT_BKPT; }else{ /* The slot remains on the free-list. Reduce its size to account ** for the portion used by the new allocation. */ @@ -39067,7 +39044,9 @@ static void zeroPage(MemPage *pPage, int flags){ assert( sqlite3PagerGetData(pPage->pDbPage) == data ); assert( sqlite3PagerIswriteable(pPage->pDbPage) ); assert( sqlite3_mutex_held(pBt->mutex) ); - /*memset(&data[hdr], 0, pBt->usableSize - hdr);*/ +#ifdef SQLITE_SECURE_DELETE + memset(&data[hdr], 0, pBt->usableSize - hdr); +#endif data[hdr] = (char)flags; first = hdr + 8 + 4*((flags&PTF_LEAF)==0 ?1:0); memset(&data[hdr+1], 0, 4); @@ -39196,7 +39175,6 @@ static int getAndInitPage( */ static void releasePage(MemPage *pPage){ if( pPage ){ - assert( pPage->nOverflow==0 || sqlite3PagerPageRefcount(pPage->pDbPage)>1 ); assert( pPage->aData ); assert( pPage->pBt ); assert( sqlite3PagerGetExtra(pPage->pDbPage) == (void*)pPage ); @@ -39936,11 +39914,8 @@ static int newDatabase(BtShared *pBt){ int nPage; assert( sqlite3_mutex_held(pBt->mutex) ); - /* The database size has already been measured and cached, so failure - ** is impossible here. If the original size measurement failed, then - ** processing aborts before entering this routine. */ rc = sqlite3PagerPagecount(pBt->pPager, &nPage); - if( NEVER(rc!=SQLITE_OK) || nPage>0 ){ + if( rc!=SQLITE_OK || nPage>0 ){ return rc; } pP1 = pBt->pPage1; @@ -40578,18 +40553,13 @@ SQLITE_PRIVATE int sqlite3BtreeCommitPhaseOne(Btree *p, const char *zMaster){ */ static void btreeEndTransaction(Btree *p){ BtShared *pBt = p->pBt; - BtCursor *pCsr; assert( sqlite3BtreeHoldsMutex(p) ); - /* Search for a cursor held open by this b-tree connection. If one exists, - ** then the transaction will be downgraded to a read-only transaction - ** instead of actually concluded. A subsequent call to CommitPhaseTwo() - ** or Rollback() will finish the transaction and unlock the database. */ - for(pCsr=pBt->pCursor; pCsr && pCsr->pBtree!=p; pCsr=pCsr->pNext); - assert( pCsr==0 || p->inTrans>TRANS_NONE ); - btreeClearHasContent(pBt); - if( pCsr ){ + if( p->inTrans>TRANS_NONE && p->db->activeVdbeCnt>1 ){ + /* If there are other active statements that belong to this database + ** handle, downgrade to a read-only transaction. The other statements + ** may still be reading from the database. */ downgradeAllSharedCacheTableLocks(p); p->inTrans = TRANS_READ; }else{ @@ -40875,8 +40845,8 @@ SQLITE_PRIVATE int sqlite3BtreeSavepoint(Btree *p, int op, int iSavepoint){ ** root page of a b-tree. If it is not, then the cursor acquired ** will not work correctly. ** -** It is assumed that the sqlite3BtreeCursorSize() bytes of memory -** pointed to by pCur have been zeroed by the caller. +** It is assumed that the sqlite3BtreeCursorZero() has been called +** on pCur to initialize the memory space prior to invoking this routine. */ static int btreeCursor( Btree *p, /* The btree */ @@ -40949,7 +40919,19 @@ SQLITE_PRIVATE int sqlite3BtreeCursor( ** this routine. */ SQLITE_PRIVATE int sqlite3BtreeCursorSize(void){ - return sizeof(BtCursor); + return ROUND8(sizeof(BtCursor)); +} + +/* +** Initialize memory that will be converted into a BtCursor object. +** +** The simple approach here would be to memset() the entire object +** to zero. But it turns out that the apPage[] and aiIdx[] arrays +** do not need to be zeroed and they are large, so we can save a lot +** of run-time by skipping the initialization of those elements. +*/ +SQLITE_PRIVATE void sqlite3BtreeCursorZero(BtCursor *p){ + memset(p, 0, offsetof(BtCursor, iPage)); } /* @@ -42881,8 +42863,13 @@ static void insertCell( assert( i>=0 && i<=pPage->nCell+pPage->nOverflow ); assert( pPage->nCell<=MX_CELL(pPage->pBt) && MX_CELL(pPage->pBt)<=5460 ); assert( pPage->nOverflow<=ArraySize(pPage->aOvfl) ); - assert( sz==cellSizePtr(pPage, pCell) ); assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + /* The cell should normally be sized correctly. However, when moving a + ** malformed cell from a leaf page to an interior page, if the cell size + ** wanted to be less than 4 but got rounded up to 4 on the leaf, then size + ** might be less than 8 (leaf-size + pointer) on the interior node. Hence + ** the term after the || in the following assert(). */ + assert( sz==cellSizePtr(pPage, pCell) || (sz==8 && iChild>0) ); if( pPage->nOverflow || sz+2>pPage->nFree ){ if( pTemp ){ memcpy(pTemp+nSkip, pCell+nSkip, sz-nSkip); @@ -43161,7 +43148,7 @@ static void copyNodeContent(MemPage *pFrom, MemPage *pTo, int *pRC){ u8 * const aTo = pTo->aData; int const iFromHdr = pFrom->hdrOffset; int const iToHdr = ((pTo->pgno==1) ? 100 : 0); - TESTONLY(int rc;) + int rc; int iData; @@ -43175,11 +43162,16 @@ static void copyNodeContent(MemPage *pFrom, MemPage *pTo, int *pRC){ memcpy(&aTo[iToHdr], &aFrom[iFromHdr], pFrom->cellOffset + 2*pFrom->nCell); /* Reinitialize page pTo so that the contents of the MemPage structure - ** match the new data. The initialization of pTo "cannot" fail, as the - ** data copied from pFrom is known to be valid. */ + ** match the new data. The initialization of pTo can actually fail under + ** fairly obscure circumstances, even though it is a copy of initialized + ** page pFrom. + */ pTo->isInit = 0; - TESTONLY(rc = ) btreeInitPage(pTo); - assert( rc==SQLITE_OK ); + rc = btreeInitPage(pTo); + if( rc!=SQLITE_OK ){ + *pRC = rc; + return; + } /* If this is an auto-vacuum database, update the pointer-map entries ** for any b-tree or overflow pages that pTo now contains the pointers to. @@ -44049,7 +44041,7 @@ SQLITE_PRIVATE int sqlite3BtreeInsert( ){ int rc; int loc = seekResult; /* -1: before desired location +1: after */ - int szNew; + int szNew = 0; int idx; MemPage *pPage; Btree *p = pCur->pBtree; @@ -44440,9 +44432,9 @@ SQLITE_PRIVATE int sqlite3BtreeCreateTable(Btree *p, int *piTable, int flags){ */ static int clearDatabasePage( BtShared *pBt, /* The BTree that contains the table */ - Pgno pgno, /* Page number to clear */ - int freePageFlag, /* Deallocate page if true */ - int *pnChange + Pgno pgno, /* Page number to clear */ + int freePageFlag, /* Deallocate page if true */ + int *pnChange /* Add number of Cells freed to this counter */ ){ MemPage *pPage; int rc; @@ -45434,8 +45426,6 @@ SQLITE_PRIVATE void sqlite3BtreeCacheOverflow(BtCursor *pCur){ ************************************************************************* ** This file contains the implementation of the sqlite3_backup_XXX() ** API functions and the related features. -** -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ /* Macro to find the minimum of two numeric values. @@ -46068,8 +46058,6 @@ SQLITE_PRIVATE int sqlite3BtreeCopyFile(Btree *pTo, Btree *pFrom){ ** stores a single value in the VDBE. Mem is an opaque structure visible ** only within the VDBE. Interface routines refer to a Mem using the ** name sqlite_value -** -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ /* @@ -46808,9 +46796,6 @@ SQLITE_PRIVATE int sqlite3MemCompare(const Mem *pMem1, const Mem *pMem2, const C int f1, f2; int combined_flags; - /* Interchange pMem1 and pMem2 if the collating sequence specifies - ** DESC order. - */ f1 = pMem1->flags; f2 = pMem2->flags; combined_flags = f1|f2; @@ -47061,7 +47046,7 @@ SQLITE_PRIVATE int sqlite3ValueFromExpr( } op = pExpr->op; if( op==TK_REGISTER ){ - op = pExpr->op2; + op = pExpr->op2; /* This only happens with SQLITE_ENABLE_STAT2 */ } if( op==TK_STRING || op==TK_FLOAT || op==TK_INTEGER ){ @@ -47105,6 +47090,9 @@ SQLITE_PRIVATE int sqlite3ValueFromExpr( } #endif + if( pVal ){ + sqlite3VdbeMemStoreType(pVal); + } *ppVal = pVal; return SQLITE_OK; @@ -47171,8 +47159,6 @@ SQLITE_PRIVATE int sqlite3ValueBytes(sqlite3_value *pVal, u8 enc){ ** a VDBE (or an "sqlite3_stmt" as it is known to the outside world.) Prior ** to version 2.8.7, all this code was combined into the vdbe.c source file. ** But that file was getting too big so this subroutines were split out. -** -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ @@ -47209,13 +47195,14 @@ SQLITE_PRIVATE Vdbe *sqlite3VdbeCreate(sqlite3 *db){ ** Remember the SQL string for a prepared statement. */ SQLITE_PRIVATE void sqlite3VdbeSetSql(Vdbe *p, const char *z, int n, int isPrepareV2){ + assert( isPrepareV2==1 || isPrepareV2==0 ); if( p==0 ) return; #ifdef SQLITE_OMIT_TRACE if( !isPrepareV2 ) return; #endif assert( p->zSql==0 ); p->zSql = sqlite3DbStrNDup(p->db, z, n); - p->isPrepareV2 = isPrepareV2 ? 1 : 0; + p->isPrepareV2 = (u8)isPrepareV2; } /* @@ -47352,6 +47339,22 @@ SQLITE_PRIVATE int sqlite3VdbeAddOp4( return addr; } +/* +** Add an opcode that includes the p4 value as an integer. +*/ +SQLITE_PRIVATE int sqlite3VdbeAddOp4Int( + Vdbe *p, /* Add the opcode to this VM */ + int op, /* The new opcode */ + int p1, /* The P1 operand */ + int p2, /* The P2 operand */ + int p3, /* The P3 operand */ + int p4 /* The P4 operand as an integer */ +){ + int addr = sqlite3VdbeAddOp3(p, op, p1, p2, p3); + sqlite3VdbeChangeP4(p, addr, SQLITE_INT_TO_PTR(p4), P4_INT32); + return addr; +} + /* ** Create a new symbolic label for an instruction that has yet to be ** coded. The symbolic label is really just a negative number. The @@ -47527,6 +47530,8 @@ SQLITE_PRIVATE int sqlite3VdbeAssertMayAbort(Vdbe *v, int mayAbort){ ** Variable *pMaxFuncArgs is set to the maximum value of any P2 argument ** to an OP_Function, OP_AggStep or OP_VFilter opcode. This is used by ** sqlite3VdbeMakeReady() to size the Vdbe.apArg[] array. +** +** The Op.opflags field is set on all opcodes. */ static void resolveP2Values(Vdbe *p, int *pMaxFuncArgs){ int i; @@ -47537,15 +47542,14 @@ static void resolveP2Values(Vdbe *p, int *pMaxFuncArgs){ for(pOp=p->aOp, i=p->nOp-1; i>=0; i--, pOp++){ u8 opcode = pOp->opcode; + pOp->opflags = sqlite3OpcodeProperty[opcode]; if( opcode==OP_Function || opcode==OP_AggStep ){ if( pOp->p5>nMaxArgs ) nMaxArgs = pOp->p5; -#ifndef SQLITE_OMIT_VIRTUALTABLE - }else if( opcode==OP_VUpdate ){ - if( pOp->p2>nMaxArgs ) nMaxArgs = pOp->p2; -#endif }else if( opcode==OP_Transaction && pOp->p2!=0 ){ p->readOnly = 0; #ifndef SQLITE_OMIT_VIRTUALTABLE + }else if( opcode==OP_VUpdate ){ + if( pOp->p2>nMaxArgs ) nMaxArgs = pOp->p2; }else if( opcode==OP_VFilter ){ int n; assert( p->nOp - i >= 3 ); @@ -47555,7 +47559,7 @@ static void resolveP2Values(Vdbe *p, int *pMaxFuncArgs){ #endif } - if( sqlite3VdbeOpcodeHasProperty(opcode, OPFLG_JUMP) && pOp->p2<0 ){ + if( (pOp->opflags & OPFLG_JUMP)!=0 && pOp->p2<0 ){ assert( -1-pOp->p2nLabel ); pOp->p2 = aLabel[-1-pOp->p2]; } @@ -47617,7 +47621,7 @@ SQLITE_PRIVATE int sqlite3VdbeAddOpList(Vdbe *p, int nOp, VdbeOpList const *aOp) VdbeOp *pOut = &p->aOp[i+addr]; pOut->opcode = pIn->opcode; pOut->p1 = pIn->p1; - if( p2<0 && sqlite3VdbeOpcodeHasProperty(pOut->opcode, OPFLG_JUMP) ){ + if( p2<0 && (sqlite3OpcodeProperty[pOut->opcode] & OPFLG_JUMP)!=0 ){ pOut->p2 = addr + ADDR(p2); }else{ pOut->p2 = p2; @@ -48169,27 +48173,6 @@ SQLITE_PRIVATE void sqlite3VdbeFrameDelete(VdbeFrame *p){ sqlite3DbFree(p->v->db, p); } - -#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT -SQLITE_PRIVATE int sqlite3VdbeReleaseBuffers(Vdbe *p){ - int ii; - int nFree = 0; - assert( sqlite3_mutex_held(p->db->mutex) ); - for(ii=1; ii<=p->nMem; ii++){ - Mem *pMem = &p->aMem[ii]; - if( pMem->flags & MEM_RowSet ){ - sqlite3RowSetClear(pMem->u.pRowSet); - } - if( pMem->z && pMem->flags&MEM_Dyn ){ - assert( !pMem->xDel ); - nFree += sqlite3DbMallocSize(pMem->db, pMem->z); - sqlite3VdbeMemRelease(pMem); - } - } - return nFree; -} -#endif - #ifndef SQLITE_OMIT_EXPLAIN /* ** Give a listing of the program in the virtual machine. @@ -48202,18 +48185,21 @@ SQLITE_PRIVATE int sqlite3VdbeReleaseBuffers(Vdbe *p){ ** p->explain==2, only OP_Explain instructions are listed and these ** are shown in a different format. p->explain==2 is used to implement ** EXPLAIN QUERY PLAN. +** +** When p->explain==1, first the main program is listed, then each of +** the trigger subprograms are listed one by one. */ SQLITE_PRIVATE int sqlite3VdbeList( Vdbe *p /* The VDBE */ ){ - int nRow; /* Total number of rows to return */ + int nRow; /* Stop when row count reaches this */ int nSub = 0; /* Number of sub-vdbes seen so far */ SubProgram **apSub = 0; /* Array of sub-vdbes */ - Mem *pSub = 0; - sqlite3 *db = p->db; - int i; - int rc = SQLITE_OK; - Mem *pMem = p->pResultSet = &p->aMem[1]; + Mem *pSub = 0; /* Memory cell hold array of subprogs */ + sqlite3 *db = p->db; /* The database connection */ + int i; /* Loop counter */ + int rc = SQLITE_OK; /* Return code */ + Mem *pMem = p->pResultSet = &p->aMem[1]; /* First Mem of result set */ assert( p->explain ); assert( p->magic==VDBE_MAGIC_RUN ); @@ -48233,12 +48219,24 @@ SQLITE_PRIVATE int sqlite3VdbeList( return SQLITE_ERROR; } - /* Figure out total number of rows that will be returned by this - ** EXPLAIN program. */ + /* When the number of output rows reaches nRow, that means the + ** listing has finished and sqlite3_step() should return SQLITE_DONE. + ** nRow is the sum of the number of rows in the main program, plus + ** the sum of the number of rows in all trigger subprograms encountered + ** so far. The nRow value will increase as new trigger subprograms are + ** encountered, but p->pc will eventually catch up to nRow. + */ nRow = p->nOp; if( p->explain==1 ){ + /* The first 8 memory cells are used for the result set. So we will + ** commandeer the 9th cell to use as storage for an array of pointers + ** to trigger subprograms. The VDBE is guaranteed to have at least 9 + ** cells. */ + assert( p->nMem>9 ); pSub = &p->aMem[9]; if( pSub->flags&MEM_Blob ){ + /* On the first call to sqlite3_step(), pSub will hold a NULL. It is + ** initialized to a BLOB by the P4_SUBPROGRAM processing logic below */ nSub = pSub->n/sizeof(Vdbe*); apSub = (SubProgram **)pSub->z; } @@ -48261,8 +48259,12 @@ SQLITE_PRIVATE int sqlite3VdbeList( char *z; Op *pOp; if( inOp ){ + /* The output line number is small enough that we are still in the + ** main program. */ pOp = &p->aOp[i]; }else{ + /* We are currently listing subprograms. Figure out which one and + ** pick up the appropriate opcode. */ int j; i -= p->nOp; for(j=0; i>=apSub[j]->nOp; j++){ @@ -48284,6 +48286,11 @@ SQLITE_PRIVATE int sqlite3VdbeList( pMem->enc = SQLITE_UTF8; pMem++; + /* When an OP_Program opcode is encounter (the only opcode that has + ** a P4_SUBPROGRAM argument), expand the size of the array of subprograms + ** kept in p->aMem[9].z to hold the new program - assuming this subprogram + ** has not already been seen. + */ if( pOp->p4type==P4_SUBPROGRAM ){ int nByte = (nSub+1)*sizeof(SubProgram*); int j; @@ -48415,38 +48422,43 @@ SQLITE_PRIVATE void sqlite3VdbeIOTraceSql(Vdbe *p){ #endif /* !SQLITE_OMIT_TRACE && SQLITE_ENABLE_IOTRACE */ /* -** Allocate space from a fixed size buffer. Make *pp point to the -** allocated space. (Note: pp is a char* rather than a void** to -** work around the pointer aliasing rules of C.) *pp should initially -** be zero. If *pp is not zero, that means that the space has already -** been allocated and this routine is a noop. +** Allocate space from a fixed size buffer and return a pointer to +** that space. If insufficient space is available, return NULL. +** +** The pBuf parameter is the initial value of a pointer which will +** receive the new memory. pBuf is normally NULL. If pBuf is not +** NULL, it means that memory space has already been allocated and that +** this routine should not allocate any new memory. When pBuf is not +** NULL simply return pBuf. Only allocate new memory space when pBuf +** is NULL. ** ** nByte is the number of bytes of space needed. ** -** *ppFrom point to available space and pEnd points to the end of the -** available space. +** *ppFrom points to available space and pEnd points to the end of the +** available space. When space is allocated, *ppFrom is advanced past +** the end of the allocated space. ** ** *pnByte is a counter of the number of bytes of space that have failed ** to allocate. If there is insufficient space in *ppFrom to satisfy the ** request, then increment *pnByte by the amount of the request. */ -static void allocSpace( - char *pp, /* IN/OUT: Set *pp to point to allocated buffer */ +static void *allocSpace( + void *pBuf, /* Where return pointer will be stored */ int nByte, /* Number of bytes to allocate */ u8 **ppFrom, /* IN/OUT: Allocate from *ppFrom */ u8 *pEnd, /* Pointer to 1 byte past the end of *ppFrom buffer */ int *pnByte /* If allocation cannot be made, increment *pnByte */ ){ assert( EIGHT_BYTE_ALIGNMENT(*ppFrom) ); - if( (*(void**)pp)==0 ){ - nByte = ROUND8(nByte); - if( &(*ppFrom)[nByte] <= pEnd ){ - *(void**)pp = (void *)*ppFrom; - *ppFrom += nByte; - }else{ - *pnByte += nByte; - } + if( pBuf ) return pBuf; + nByte = ROUND8(nByte); + if( &(*ppFrom)[nByte] <= pEnd ){ + pBuf = (void*)*ppFrom; + *ppFrom += nByte; + }else{ + *pnByte += nByte; } + return pBuf; } /* @@ -48505,9 +48517,10 @@ SQLITE_PRIVATE void sqlite3VdbeMakeReady( ** being called from sqlite3_reset() to reset the virtual machine. */ if( nVar>=0 && ALWAYS(db->mallocFailed==0) ){ - u8 *zCsr = (u8 *)&p->aOp[p->nOp]; - u8 *zEnd = (u8 *)&p->aOp[p->nOpAlloc]; - int nByte; + u8 *zCsr = (u8 *)&p->aOp[p->nOp]; /* Memory avaliable for alloation */ + u8 *zEnd = (u8 *)&p->aOp[p->nOpAlloc]; /* First byte past available mem */ + int nByte; /* How much extra memory needed */ + resolveP2Values(p, &nArg); p->usesStmtJournal = (u8)usesStmtJournal; if( isExplain && nMem<10 ){ @@ -48517,15 +48530,24 @@ SQLITE_PRIVATE void sqlite3VdbeMakeReady( zCsr += (zCsr - (u8*)0)&7; assert( EIGHT_BYTE_ALIGNMENT(zCsr) ); + /* Memory for registers, parameters, cursor, etc, is allocated in two + ** passes. On the first pass, we try to reuse unused space at the + ** end of the opcode array. If we are unable to satisfy all memory + ** requirements by reusing the opcode array tail, then the second + ** pass will fill in the rest using a fresh allocation. + ** + ** This two-pass approach that reuses as much memory as possible from + ** the leftover space at the end of the opcode array can significantly + ** reduce the amount of memory held by a prepared statement. + */ do { nByte = 0; - allocSpace((char*)&p->aMem, nMem*sizeof(Mem), &zCsr, zEnd, &nByte); - allocSpace((char*)&p->aVar, nVar*sizeof(Mem), &zCsr, zEnd, &nByte); - allocSpace((char*)&p->apArg, nArg*sizeof(Mem*), &zCsr, zEnd, &nByte); - allocSpace((char*)&p->azVar, nVar*sizeof(char*), &zCsr, zEnd, &nByte); - allocSpace((char*)&p->apCsr, - nCursor*sizeof(VdbeCursor*), &zCsr, zEnd, &nByte - ); + p->aMem = allocSpace(p->aMem, nMem*sizeof(Mem), &zCsr, zEnd, &nByte); + p->aVar = allocSpace(p->aVar, nVar*sizeof(Mem), &zCsr, zEnd, &nByte); + p->apArg = allocSpace(p->apArg, nArg*sizeof(Mem*), &zCsr, zEnd, &nByte); + p->azVar = allocSpace(p->azVar, nVar*sizeof(char*), &zCsr, zEnd, &nByte); + p->apCsr = allocSpace(p->apCsr, nCursor*sizeof(VdbeCursor*), + &zCsr, zEnd, &nByte); if( nByte ){ p->pFree = sqlite3DbMallocZero(db, nByte); } @@ -48535,7 +48557,7 @@ SQLITE_PRIVATE void sqlite3VdbeMakeReady( p->nCursor = (u16)nCursor; if( p->aVar ){ - p->nVar = (u16)nVar; + p->nVar = (ynVar)nVar; for(n=0; naVar[n].flags = MEM_Null; p->aVar[n].db = db; @@ -48867,10 +48889,11 @@ static int vdbeCommit(sqlite3 *db, Vdbe *p){ */ for(i=0; inDb; i++){ Btree *pBt = db->aDb[i].pBt; - if( i==1 ) continue; /* Ignore the TEMP database */ if( sqlite3BtreeIsInTrans(pBt) ){ char const *zFile = sqlite3BtreeGetJournalname(pBt); - if( zFile[0]==0 ) continue; /* Ignore :memory: databases */ + if( zFile==0 || zFile[0]==0 ){ + continue; /* Ignore TEMP and :memory: databases */ + } if( !needSync && !sqlite3BtreeSyncDisabled(pBt) ){ needSync = 1; } @@ -49948,9 +49971,17 @@ SQLITE_PRIVATE int sqlite3VdbeRecordCompare( pKeyInfo = pPKey2->pKeyInfo; mem1.enc = pKeyInfo->enc; mem1.db = pKeyInfo->db; - mem1.flags = 0; - mem1.u.i = 0; /* not needed, here to silence compiler warning */ - mem1.zMalloc = 0; + /* mem1.flags = 0; // Will be initialized by sqlite3VdbeSerialGet() */ + VVA_ONLY( mem1.zMalloc = 0; ) /* Only needed by assert() statements */ + + /* Compilers may complain that mem1.u.i is potentially uninitialized. + ** We could initialize it, as shown here, to silence those complaints. + ** But in fact, mem1.u.i will never actually be used initialized, and doing + ** the unnecessary initialization has a measurable negative performance + ** impact, since this routine is a very high runner. And so, we choose + ** to ignore the compiler warnings and leave this variable uninitialized. + */ + /* mem1.u.i = 0; // not needed, here to silence compiler warning */ idx1 = getVarint32(aKey1, szHdr1); d1 = szHdr1; @@ -49974,47 +50005,52 @@ SQLITE_PRIVATE int sqlite3VdbeRecordCompare( rc = sqlite3MemCompare(&mem1, &pPKey2->aMem[i], iaColl[i] : 0); if( rc!=0 ){ - break; + assert( mem1.zMalloc==0 ); /* See comment below */ + + /* Invert the result if we are using DESC sort order. */ + if( pKeyInfo->aSortOrder && iaSortOrder[i] ){ + rc = -rc; + } + + /* If the PREFIX_SEARCH flag is set and all fields except the final + ** rowid field were equal, then clear the PREFIX_SEARCH flag and set + ** pPKey2->rowid to the value of the rowid field in (pKey1, nKey1). + ** This is used by the OP_IsUnique opcode. + */ + if( (pPKey2->flags & UNPACKED_PREFIX_SEARCH) && i==(pPKey2->nField-1) ){ + assert( idx1==szHdr1 && rc ); + assert( mem1.flags & MEM_Int ); + pPKey2->flags &= ~UNPACKED_PREFIX_SEARCH; + pPKey2->rowid = mem1.u.i; + } + + return rc; } i++; } - /* No memory allocation is ever used on mem1. */ - if( NEVER(mem1.zMalloc) ) sqlite3VdbeMemRelease(&mem1); - - /* If the PREFIX_SEARCH flag is set and all fields except the final - ** rowid field were equal, then clear the PREFIX_SEARCH flag and set - ** pPKey2->rowid to the value of the rowid field in (pKey1, nKey1). - ** This is used by the OP_IsUnique opcode. + /* No memory allocation is ever used on mem1. Prove this using + ** the following assert(). If the assert() fails, it indicates a + ** memory leak and a need to call sqlite3VdbeMemRelease(&mem1). */ - if( (pPKey2->flags & UNPACKED_PREFIX_SEARCH) && i==(pPKey2->nField-1) ){ - assert( idx1==szHdr1 && rc ); - assert( mem1.flags & MEM_Int ); - pPKey2->flags &= ~UNPACKED_PREFIX_SEARCH; - pPKey2->rowid = mem1.u.i; - } + assert( mem1.zMalloc==0 ); - if( rc==0 ){ - /* rc==0 here means that one of the keys ran out of fields and - ** all the fields up to that point were equal. If the UNPACKED_INCRKEY - ** flag is set, then break the tie by treating key2 as larger. - ** If the UPACKED_PREFIX_MATCH flag is set, then keys with common prefixes - ** are considered to be equal. Otherwise, the longer key is the - ** larger. As it happens, the pPKey2 will always be the longer - ** if there is a difference. - */ - if( pPKey2->flags & UNPACKED_INCRKEY ){ - rc = -1; - }else if( pPKey2->flags & UNPACKED_PREFIX_MATCH ){ - /* Leave rc==0 */ - }else if( idx1aSortOrder && inField - && pKeyInfo->aSortOrder[i] ){ - rc = -rc; + /* rc==0 here means that one of the keys ran out of fields and + ** all the fields up to that point were equal. If the UNPACKED_INCRKEY + ** flag is set, then break the tie by treating key2 as larger. + ** If the UPACKED_PREFIX_MATCH flag is set, then keys with common prefixes + ** are considered to be equal. Otherwise, the longer key is the + ** larger. As it happens, the pPKey2 will always be the longer + ** if there is a difference. + */ + assert( rc==0 ); + if( pPKey2->flags & UNPACKED_INCRKEY ){ + rc = -1; + }else if( pPKey2->flags & UNPACKED_PREFIX_MATCH ){ + /* Leave rc==0 */ + }else if( idx1db; } +/* +** Return a pointer to an sqlite3_value structure containing the value bound +** parameter iVar of VM v. Except, if the value is an SQL NULL, return +** 0 instead. Unless it is NULL, apply affinity aff (one of the SQLITE_AFF_* +** constants) to the value before returning it. +** +** The returned value must be freed by the caller using sqlite3ValueFree(). +*/ +SQLITE_PRIVATE sqlite3_value *sqlite3VdbeGetValue(Vdbe *v, int iVar, u8 aff){ + assert( iVar>0 ); + if( v ){ + Mem *pMem = &v->aVar[iVar-1]; + if( 0==(pMem->flags & MEM_Null) ){ + sqlite3_value *pRet = sqlite3ValueNew(v->db); + if( pRet ){ + sqlite3VdbeMemCopy((Mem *)pRet, pMem); + sqlite3ValueApplyAffinity(pRet, aff, SQLITE_UTF8); + sqlite3VdbeMemStoreType((Mem *)pRet); + } + return pRet; + } + } + return 0; +} + +/* +** Configure SQL variable iVar so that binding a new value to it signals +** to sqlite3_reoptimize() that re-preparing the statement may result +** in a better query plan. +*/ +SQLITE_PRIVATE void sqlite3VdbeSetVarmask(Vdbe *v, int iVar){ + assert( iVar>0 ); + if( iVar>32 ){ + v->expmask = 0xffffffff; + }else{ + v->expmask |= ((u32)1 << (iVar-1)); + } +} + /************** End of vdbeaux.c *********************************************/ /************** Begin file vdbeapi.c *****************************************/ /* @@ -50195,8 +50270,6 @@ SQLITE_PRIVATE sqlite3 *sqlite3VdbeDb(Vdbe *v){ ** ** This file contains code use to implement APIs that are part of the ** VDBE. -** -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ #ifndef SQLITE_OMIT_DEPRECATED @@ -50280,6 +50353,9 @@ SQLITE_API int sqlite3_clear_bindings(sqlite3_stmt *pStmt){ sqlite3VdbeMemRelease(&p->aVar[i]); p->aVar[i].flags = MEM_Null; } + if( p->isPrepareV2 && p->expmask ){ + p->expired = 1; + } sqlite3_mutex_leave(mutex); return rc; } @@ -50485,7 +50561,7 @@ static int sqlite3Step(Vdbe *p){ } if( p->pc<=0 && p->expired ){ - if( ALWAYS(p->rc==SQLITE_OK) ){ + if( ALWAYS(p->rc==SQLITE_OK || p->rc==SQLITE_SCHEMA) ){ p->rc = SQLITE_SCHEMA; } rc = SQLITE_ERROR; @@ -50663,8 +50739,9 @@ SQLITE_API void *sqlite3_aggregate_context(sqlite3_context *p, int nByte){ assert( p && p->pFunc && p->pFunc->xStep ); assert( sqlite3_mutex_held(p->s.db->mutex) ); pMem = p->pMem; + testcase( nByte<0 ); if( (pMem->flags & MEM_Agg)==0 ){ - if( nByte==0 ){ + if( nByte<=0 ){ sqlite3VdbeMemReleaseExternal(pMem); pMem->flags = MEM_Null; pMem->z = 0; @@ -51095,6 +51172,15 @@ static int vdbeUnbind(Vdbe *p, int i){ sqlite3VdbeMemRelease(pVar); pVar->flags = MEM_Null; sqlite3Error(p->db, SQLITE_OK, 0); + + /* If the bit corresponding to this variable in Vdbe.expmask is set, then + ** binding a new value to this variable invalidates the current query plan. + */ + if( p->isPrepareV2 && + ((i<32 && p->expmask & ((u32)1 << i)) || p->expmask==0xffffffff) + ){ + p->expired = 1; + } return SQLITE_OK; } @@ -51291,8 +51377,7 @@ SQLITE_API const char *sqlite3_bind_parameter_name(sqlite3_stmt *pStmt, int i){ ** with that name. If there is no variable with the given name, ** return 0. */ -SQLITE_API int sqlite3_bind_parameter_index(sqlite3_stmt *pStmt, const char *zName){ - Vdbe *p = (Vdbe*)pStmt; +SQLITE_PRIVATE int sqlite3VdbeParameterIndex(Vdbe *p, const char *zName, int nName){ int i; if( p==0 ){ return 0; @@ -51301,13 +51386,16 @@ SQLITE_API int sqlite3_bind_parameter_index(sqlite3_stmt *pStmt, const char *zNa if( zName ){ for(i=0; inVar; i++){ const char *z = p->azVar[i]; - if( z && strcmp(z,zName)==0 ){ + if( z && memcmp(z,zName,nName)==0 && z[nName]==0 ){ return i+1; } } } return 0; } +SQLITE_API int sqlite3_bind_parameter_index(sqlite3_stmt *pStmt, const char *zName){ + return sqlite3VdbeParameterIndex((Vdbe*)pStmt, zName, sqlite3Strlen30(zName)); +} /* ** Transfer all bindings from the first statement over to the second. @@ -51345,6 +51433,12 @@ SQLITE_API int sqlite3_transfer_bindings(sqlite3_stmt *pFromStmt, sqlite3_stmt * if( pFrom->nVar!=pTo->nVar ){ return SQLITE_ERROR; } + if( pTo->isPrepareV2 && pTo->expmask ){ + pTo->expired = 1; + } + if( pFrom->isPrepareV2 && pFrom->expmask ){ + pFrom->expired = 1; + } return sqlite3TransferBindings(pFromStmt, pToStmt); } #endif @@ -51388,6 +51482,149 @@ SQLITE_API int sqlite3_stmt_status(sqlite3_stmt *pStmt, int op, int resetFlag){ } /************** End of vdbeapi.c *********************************************/ +/************** Begin file vdbetrace.c ***************************************/ +/* +** 2009 November 25 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** +** This file contains code used to insert the values of host parameters +** (aka "wildcards") into the SQL text output by sqlite3_trace(). +*/ + +#ifndef SQLITE_OMIT_TRACE + +/* +** zSql is a zero-terminated string of UTF-8 SQL text. Return the number of +** bytes in this text up to but excluding the first character in +** a host parameter. If the text contains no host parameters, return +** the total number of bytes in the text. +*/ +static int findNextHostParameter(const char *zSql, int *pnToken){ + int tokenType; + int nTotal = 0; + int n; + + *pnToken = 0; + while( zSql[0] ){ + n = sqlite3GetToken((u8*)zSql, &tokenType); + assert( n>0 && tokenType!=TK_ILLEGAL ); + if( tokenType==TK_VARIABLE ){ + *pnToken = n; + break; + } + nTotal += n; + zSql += n; + } + return nTotal; +} + +/* +** Return a pointer to a string in memory obtained form sqlite3DbMalloc() which +** holds a copy of zRawSql but with host parameters expanded to their +** current bindings. +** +** The calling function is responsible for making sure the memory returned +** is eventually freed. +** +** ALGORITHM: Scan the input string looking for host parameters in any of +** these forms: ?, ?N, $A, @A, :A. Take care to avoid text within +** string literals, quoted identifier names, and comments. For text forms, +** the host parameter index is found by scanning the perpared +** statement for the corresponding OP_Variable opcode. Once the host +** parameter index is known, locate the value in p->aVar[]. Then render +** the value as a literal in place of the host parameter name. +*/ +SQLITE_PRIVATE char *sqlite3VdbeExpandSql( + Vdbe *p, /* The prepared statement being evaluated */ + const char *zRawSql /* Raw text of the SQL statement */ +){ + sqlite3 *db; /* The database connection */ + int idx = 0; /* Index of a host parameter */ + int nextIndex = 1; /* Index of next ? host parameter */ + int n; /* Length of a token prefix */ + int nToken; /* Length of the parameter token */ + int i; /* Loop counter */ + Mem *pVar; /* Value of a host parameter */ + StrAccum out; /* Accumulate the output here */ + char zBase[100]; /* Initial working space */ + + db = p->db; + sqlite3StrAccumInit(&out, zBase, sizeof(zBase), + db->aLimit[SQLITE_LIMIT_LENGTH]); + out.db = db; + while( zRawSql[0] ){ + n = findNextHostParameter(zRawSql, &nToken); + assert( n>0 ); + sqlite3StrAccumAppend(&out, zRawSql, n); + zRawSql += n; + assert( zRawSql[0] || nToken==0 ); + if( nToken==0 ) break; + if( zRawSql[0]=='?' ){ + if( nToken>1 ){ + assert( sqlite3Isdigit(zRawSql[1]) ); + sqlite3GetInt32(&zRawSql[1], &idx); + }else{ + idx = nextIndex; + } + }else{ + assert( zRawSql[0]==':' || zRawSql[0]=='$' || zRawSql[0]=='@' ); + testcase( zRawSql[0]==':' ); + testcase( zRawSql[0]=='$' ); + testcase( zRawSql[0]=='@' ); + idx = sqlite3VdbeParameterIndex(p, zRawSql, nToken); + assert( idx>0 ); + } + zRawSql += nToken; + nextIndex = idx + 1; + assert( idx>0 && idx<=p->nVar ); + pVar = &p->aVar[idx-1]; + if( pVar->flags & MEM_Null ){ + sqlite3StrAccumAppend(&out, "NULL", 4); + }else if( pVar->flags & MEM_Int ){ + sqlite3XPrintf(&out, "%lld", pVar->u.i); + }else if( pVar->flags & MEM_Real ){ + sqlite3XPrintf(&out, "%!.15g", pVar->r); + }else if( pVar->flags & MEM_Str ){ +#ifndef SQLITE_OMIT_UTF16 + u8 enc = ENC(db); + if( enc!=SQLITE_UTF8 ){ + Mem utf8; + memset(&utf8, 0, sizeof(utf8)); + utf8.db = db; + sqlite3VdbeMemSetStr(&utf8, pVar->z, pVar->n, enc, SQLITE_STATIC); + sqlite3VdbeChangeEncoding(&utf8, SQLITE_UTF8); + sqlite3XPrintf(&out, "'%.*q'", utf8.n, utf8.z); + sqlite3VdbeMemRelease(&utf8); + }else +#endif + { + sqlite3XPrintf(&out, "'%.*q'", pVar->n, pVar->z); + } + }else if( pVar->flags & MEM_Zero ){ + sqlite3XPrintf(&out, "zeroblob(%d)", pVar->u.nZero); + }else{ + assert( pVar->flags & MEM_Blob ); + sqlite3StrAccumAppend(&out, "x'", 2); + for(i=0; in; i++){ + sqlite3XPrintf(&out, "%02x", pVar->z[i]&0xff); + } + sqlite3StrAccumAppend(&out, "'", 1); + } + } + return sqlite3StrAccumFinish(&out); +} + +#endif /* #ifndef SQLITE_OMIT_TRACE */ + +/************** End of vdbetrace.c *******************************************/ /************** Begin file vdbe.c ********************************************/ /* ** 2001 September 15 @@ -51433,8 +51670,6 @@ SQLITE_API int sqlite3_stmt_status(sqlite3_stmt *pStmt, int op, int resetFlag){ ** of the code in this file is, therefore, important. See other comments ** in this file for details. If in doubt, do not deviate from existing ** commenting and indentation practices when changing or adding code. -** -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ /* @@ -51540,12 +51775,10 @@ SQLITE_API int sqlite3_found_count = 0; /* ** Argument pMem points at a register that will be passed to a ** user-defined function or returned to the user as the result of a query. -** The second argument, 'db_enc' is the text encoding used by the vdbe for -** register variables. This routine sets the pMem->enc and pMem->type -** variables used by the sqlite3_value_*() routines. +** This routine sets the pMem->type variable used by the sqlite3_value_*() +** routines. */ -#define storeTypeInfo(A,B) _storeTypeInfo(A) -static void _storeTypeInfo(Mem *pMem){ +SQLITE_PRIVATE void sqlite3VdbeMemStoreType(Mem *pMem){ int flags = pMem->flags; if( flags & MEM_Null ){ pMem->type = SQLITE_NULL; @@ -51563,23 +51796,6 @@ static void _storeTypeInfo(Mem *pMem){ } } -/* -** Properties of opcodes. The OPFLG_INITIALIZER macro is -** created by mkopcodeh.awk during compilation. Data is obtained -** from the comments following the "case OP_xxxx:" statements in -** this file. -*/ -static const unsigned char opcodeProperty[] = OPFLG_INITIALIZER; - -/* -** Return true if an opcode has any of the OPFLG_xxx properties -** specified by mask. -*/ -SQLITE_PRIVATE int sqlite3VdbeOpcodeHasProperty(int opcode, int mask){ - assert( opcode>0 && opcode<(int)sizeof(opcodeProperty) ); - return (opcodeProperty[opcode]&mask)!=0; -} - /* ** Allocate VdbeCursor number iCur. Return a pointer to it. Return NULL ** if we run out of memory. @@ -51614,7 +51830,7 @@ static VdbeCursor *allocateCursor( int nByte; VdbeCursor *pCx = 0; nByte = - sizeof(VdbeCursor) + + ROUND8(sizeof(VdbeCursor)) + (isBtreeCursor?sqlite3BtreeCursorSize():0) + 2*nField*sizeof(u32); @@ -51625,15 +51841,16 @@ static VdbeCursor *allocateCursor( } if( SQLITE_OK==sqlite3VdbeMemGrow(pMem, nByte, 0) ){ p->apCsr[iCur] = pCx = (VdbeCursor*)pMem->z; - memset(pMem->z, 0, nByte); + memset(pCx, 0, sizeof(VdbeCursor)); pCx->iDb = iDb; pCx->nField = nField; if( nField ){ - pCx->aType = (u32 *)&pMem->z[sizeof(VdbeCursor)]; + pCx->aType = (u32 *)&pMem->z[ROUND8(sizeof(VdbeCursor))]; } if( isBtreeCursor ){ pCx->pCursor = (BtCursor*) - &pMem->z[sizeof(VdbeCursor)+2*nField*sizeof(u32)]; + &pMem->z[ROUND8(sizeof(VdbeCursor))+2*nField*sizeof(u32)]; + sqlite3BtreeCursorZero(pCx->pCursor); } } return pCx; @@ -51716,7 +51933,7 @@ static void applyAffinity( SQLITE_API int sqlite3_value_numeric_type(sqlite3_value *pVal){ Mem *pMem = (Mem*)pVal; applyNumericAffinity(pMem); - storeTypeInfo(pMem, 0); + sqlite3VdbeMemStoreType(pMem); return pMem->type; } @@ -51875,8 +52092,6 @@ static void registerTrace(FILE *out, int iReg, Mem *p){ ** ** This file contains inline asm code for retrieving "high-performance" ** counters for x86 class CPUs. -** -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ #ifndef _HWTIME_H_ #define _HWTIME_H_ @@ -52039,23 +52254,26 @@ SQLITE_PRIVATE int sqlite3VdbeExec( Vdbe *p /* The VDBE */ ){ int pc; /* The program counter */ + Op *aOp = p->aOp; /* Copy of p->aOp */ Op *pOp; /* Current operation */ int rc = SQLITE_OK; /* Value to return */ sqlite3 *db = p->db; /* The database */ + u8 resetSchemaOnFault = 0; /* Reset schema after an error if true */ u8 encoding = ENC(db); /* The database encoding */ +#ifndef SQLITE_OMIT_PROGRESS_CALLBACK + int checkProgress; /* True if progress callbacks are enabled */ + int nProgressOps = 0; /* Opcodes executed since progress callback. */ +#endif + Mem *aMem = p->aMem; /* Copy of p->aMem */ Mem *pIn1 = 0; /* 1st input operand */ Mem *pIn2 = 0; /* 2nd input operand */ Mem *pIn3 = 0; /* 3rd input operand */ Mem *pOut = 0; /* Output operand */ - u8 opProperty; int iCompare = 0; /* Result of last OP_Compare operation */ int *aPermute = 0; /* Permutation of columns for OP_Compare */ #ifdef VDBE_PROFILE u64 start; /* CPU clock count at start of opcode */ int origPc; /* Program counter at start of opcode */ -#endif -#ifndef SQLITE_OMIT_PROGRESS_CALLBACK - int nProgressOps = 0; /* Opcodes executed since progress callback. */ #endif /******************************************************************** ** Automatically generated code @@ -52152,10 +52370,8 @@ SQLITE_PRIVATE int sqlite3VdbeExec( Mem *pReg; /* PseudoTable input register */ } am; struct OP_Affinity_stack_vars { - char *zAffinity; /* The affinity to be applied */ - Mem *pData0; /* First register to which to apply affinity */ - Mem *pLast; /* Last register to which to apply affinity */ - Mem *pRec; /* Current register */ + const char *zAffinity; /* The affinity to be applied */ + char cAff; /* A single character of affinity */ } an; struct OP_MakeRecord_stack_vars { u8 *zNewRecord; /* A buffer to hold the data for the new record */ @@ -52240,6 +52456,7 @@ SQLITE_PRIVATE int sqlite3VdbeExec( VdbeCursor *pC; int res; UnpackedRecord *pIdxKey; + UnpackedRecord r; char aTempRec[ROUND8(sizeof(UnpackedRecord)) + sizeof(Mem)*3 + 7]; } bb; struct OP_IsUnique_stack_vars { @@ -52247,7 +52464,7 @@ SQLITE_PRIVATE int sqlite3VdbeExec( VdbeCursor *pCx; BtCursor *pCrsr; u16 nField; - Mem *aMem; + Mem *aMx; UnpackedRecord r; /* B-Tree index search key */ i64 R; /* Rowid stored in register P3 */ } bc; @@ -52265,7 +52482,7 @@ SQLITE_PRIVATE int sqlite3VdbeExec( Mem *pMem; /* Register holding largest rowid for AUTOINCREMENT */ VdbeFrame *pFrame; /* Root frame of VDBE */ } be; - struct OP_Insert_stack_vars { + struct OP_InsertInt_stack_vars { Mem *pData; /* MEM cell holding data for the record to be inserted */ Mem *pKey; /* MEM cell holding key for the record */ i64 iKey; /* The integer ROWID or key for the record to be inserted */ @@ -52360,18 +52577,13 @@ SQLITE_PRIVATE int sqlite3VdbeExec( char *z; /* Text of the error report */ Mem *pnErr; /* Register keeping track of errors remaining */ } bv; - struct OP_RowSetAdd_stack_vars { - Mem *pIdx; - Mem *pVal; - } bw; struct OP_RowSetRead_stack_vars { - Mem *pIdx; i64 val; - } bx; + } bw; struct OP_RowSetTest_stack_vars { int iSet; int exists; - } by; + } bx; struct OP_Program_stack_vars { int nMem; /* Number of memory registers for sub-program */ int nByte; /* Bytes of runtime space required for sub-program */ @@ -52381,15 +52593,15 @@ SQLITE_PRIVATE int sqlite3VdbeExec( VdbeFrame *pFrame; /* New vdbe frame to execute in */ SubProgram *pProgram; /* Sub-program to execute */ void *t; /* Token identifying trigger */ - } bz; + } by; struct OP_Param_stack_vars { VdbeFrame *pFrame; Mem *pIn; - } ca; + } bz; struct OP_MemMax_stack_vars { Mem *pIn1; VdbeFrame *pFrame; - } cb; + } ca; struct OP_AggStep_stack_vars { int n; int i; @@ -52397,22 +52609,22 @@ SQLITE_PRIVATE int sqlite3VdbeExec( Mem *pRec; sqlite3_context ctx; sqlite3_value **apVal; - } cc; + } cb; struct OP_AggFinal_stack_vars { Mem *pMem; - } cd; + } cc; struct OP_IncrVacuum_stack_vars { Btree *pBt; - } ce; + } cd; struct OP_VBegin_stack_vars { VTable *pVTab; - } cf; + } ce; struct OP_VOpen_stack_vars { VdbeCursor *pCur; sqlite3_vtab_cursor *pVtabCursor; sqlite3_vtab *pVtab; sqlite3_module *pModule; - } cg; + } cf; struct OP_VFilter_stack_vars { int nArg; int iQuery; @@ -52425,23 +52637,23 @@ SQLITE_PRIVATE int sqlite3VdbeExec( int res; int i; Mem **apArg; - } ch; + } cg; struct OP_VColumn_stack_vars { sqlite3_vtab *pVtab; const sqlite3_module *pModule; Mem *pDest; sqlite3_context sContext; - } ci; + } ch; struct OP_VNext_stack_vars { sqlite3_vtab *pVtab; const sqlite3_module *pModule; int res; VdbeCursor *pCur; - } cj; + } ci; struct OP_VRename_stack_vars { sqlite3_vtab *pVtab; Mem *pName; - } ck; + } cj; struct OP_VUpdate_stack_vars { sqlite3_vtab *pVtab; sqlite3_module *pModule; @@ -52450,15 +52662,15 @@ SQLITE_PRIVATE int sqlite3VdbeExec( sqlite_int64 rowid; Mem **apArg; Mem *pX; - } cl; + } ck; struct OP_Pagecount_stack_vars { int p1; int nPage; Pager *pPager; - } cm; + } cl; struct OP_Trace_stack_vars { char *zTrace; - } cn; + } cm; } u; /* End automatically generated code ********************************************************************/ @@ -52478,6 +52690,9 @@ SQLITE_PRIVATE int sqlite3VdbeExec( db->busyHandler.nBusy = 0; CHECK_FOR_INTERRUPT; sqlite3VdbeIOTraceSql(p); +#ifndef SQLITE_OMIT_PROGRESS_CALLBACK + checkProgress = db->xProgress!=0; +#endif #ifdef SQLITE_DEBUG sqlite3BeginBenignMalloc(); if( p->pc==0 @@ -52487,7 +52702,7 @@ SQLITE_PRIVATE int sqlite3VdbeExec( printf("VDBE Program Listing:\n"); sqlite3VdbePrintSql(p); for(i=0; inOp; i++){ - sqlite3VdbePrintOp(stdout, i, &p->aOp[i]); + sqlite3VdbePrintOp(stdout, i, &aOp[i]); } } if( fileExists(db, "vdbe_trace") ){ @@ -52502,7 +52717,7 @@ SQLITE_PRIVATE int sqlite3VdbeExec( origPc = pc; start = sqlite3Hwtime(); #endif - pOp = &p->aOp[pc]; + pOp = &aOp[pc]; /* Only allow tracing if SQLITE_DEBUG is defined. */ @@ -52543,7 +52758,7 @@ SQLITE_PRIVATE int sqlite3VdbeExec( ** If the progress callback returns non-zero, exit the virtual machine with ** a return code SQLITE_ABORT. */ - if( db->xProgress ){ + if( checkProgress ){ if( db->nProgressOps==nProgressOps ){ int prc; if( sqlite3SafetyOff(db) ) goto abort_due_to_misuse; @@ -52559,66 +52774,47 @@ SQLITE_PRIVATE int sqlite3VdbeExec( } #endif - /* Do common setup processing for any opcode that is marked - ** with the "out2-prerelease" tag. Such opcodes have a single - ** output which is specified by the P2 parameter. The P2 register - ** is initialized to a NULL. + /* On any opcode with the "out2-prerelase" tag, free any + ** external allocations out of mem[p2] and set mem[p2] to be + ** an undefined integer. Opcodes will either fill in the integer + ** value or convert mem[p2] to a different type. */ - opProperty = opcodeProperty[pOp->opcode]; - if( (opProperty & OPFLG_OUT2_PRERELEASE)!=0 ){ + assert( pOp->opflags==sqlite3OpcodeProperty[pOp->opcode] ); + if( pOp->opflags & OPFLG_OUT2_PRERELEASE ){ assert( pOp->p2>0 ); assert( pOp->p2<=p->nMem ); - pOut = &p->aMem[pOp->p2]; + pOut = &aMem[pOp->p2]; sqlite3VdbeMemReleaseExternal(pOut); - pOut->flags = MEM_Null; - pOut->n = 0; - }else - - /* Do common setup for opcodes marked with one of the following - ** combinations of properties. - ** - ** in1 - ** in1 in2 - ** in1 in2 out3 - ** in1 in3 - ** - ** Variables pIn1, pIn2, and pIn3 are made to point to appropriate - ** registers for inputs. Variable pOut points to the output register. - */ - if( (opProperty & OPFLG_IN1)!=0 ){ + pOut->flags = MEM_Int; + } + + /* Sanity checking on other operands */ +#ifdef SQLITE_DEBUG + if( (pOp->opflags & OPFLG_IN1)!=0 ){ assert( pOp->p1>0 ); assert( pOp->p1<=p->nMem ); - pIn1 = &p->aMem[pOp->p1]; - REGISTER_TRACE(pOp->p1, pIn1); - if( (opProperty & OPFLG_IN2)!=0 ){ - assert( pOp->p2>0 ); - assert( pOp->p2<=p->nMem ); - pIn2 = &p->aMem[pOp->p2]; - REGISTER_TRACE(pOp->p2, pIn2); - /* As currently implemented, in2 implies out3. There is no reason - ** why this has to be, it just worked out that way. */ - assert( (opProperty & OPFLG_OUT3)!=0 ); - assert( pOp->p3>0 ); - assert( pOp->p3<=p->nMem ); - pOut = &p->aMem[pOp->p3]; - }else if( (opProperty & OPFLG_IN3)!=0 ){ - assert( pOp->p3>0 ); - assert( pOp->p3<=p->nMem ); - pIn3 = &p->aMem[pOp->p3]; - REGISTER_TRACE(pOp->p3, pIn3); - } - }else if( (opProperty & OPFLG_IN2)!=0 ){ + REGISTER_TRACE(pOp->p1, &aMem[pOp->p1]); + } + if( (pOp->opflags & OPFLG_IN2)!=0 ){ assert( pOp->p2>0 ); assert( pOp->p2<=p->nMem ); - pIn2 = &p->aMem[pOp->p2]; - REGISTER_TRACE(pOp->p2, pIn2); - }else if( (opProperty & OPFLG_IN3)!=0 ){ + REGISTER_TRACE(pOp->p2, &aMem[pOp->p2]); + } + if( (pOp->opflags & OPFLG_IN3)!=0 ){ assert( pOp->p3>0 ); assert( pOp->p3<=p->nMem ); - pIn3 = &p->aMem[pOp->p3]; - REGISTER_TRACE(pOp->p3, pIn3); + REGISTER_TRACE(pOp->p3, &aMem[pOp->p3]); } - + if( (pOp->opflags & OPFLG_OUT2)!=0 ){ + assert( pOp->p2>0 ); + assert( pOp->p2<=p->nMem ); + } + if( (pOp->opflags & OPFLG_OUT3)!=0 ){ + assert( pOp->p3>0 ); + assert( pOp->p3<=p->nMem ); + } +#endif + switch( pOp->opcode ){ /***************************************************************************** @@ -52674,10 +52870,8 @@ case OP_Goto: { /* jump */ ** Write the current address onto register P1 ** and then jump to address P2. */ -case OP_Gosub: { /* jump */ - assert( pOp->p1>0 ); - assert( pOp->p1<=p->nMem ); - pIn1 = &p->aMem[pOp->p1]; +case OP_Gosub: { /* jump, in1 */ + pIn1 = &aMem[pOp->p1]; assert( (pIn1->flags & MEM_Dyn)==0 ); pIn1->flags = MEM_Int; pIn1->u.i = pc; @@ -52691,6 +52885,7 @@ case OP_Gosub: { /* jump */ ** Jump to the next instruction after the address in register P1. */ case OP_Return: { /* in1 */ + pIn1 = &aMem[pOp->p1]; assert( pIn1->flags & MEM_Int ); pc = (int)pIn1->u.i; break; @@ -52704,6 +52899,7 @@ case OP_Yield: { /* in1 */ #if 0 /* local variables moved into u.aa */ int pcDest; #endif /* local variables moved into u.aa */ + pIn1 = &aMem[pOp->p1]; assert( (pIn1->flags & MEM_Dyn)==0 ); pIn1->flags = MEM_Int; u.aa.pcDest = (int)pIn1->u.i; @@ -52720,6 +52916,7 @@ case OP_Yield: { /* in1 */ ** value in register P3 is not NULL, then this routine is a no-op. */ case OP_HaltIfNull: { /* in3 */ + pIn3 = &aMem[pOp->p3]; if( (pIn3->flags & MEM_Null)==0 ) break; /* Fall through into OP_Halt */ } @@ -52759,6 +52956,8 @@ case OP_Halt: { ** as the p2 of the calling OP_Program. */ pc = p->aOp[pc].p2-1; } + aOp = p->aOp; + aMem = p->aMem; break; } @@ -52785,7 +52984,6 @@ case OP_Halt: { ** The 32-bit integer value P1 is written into register P2. */ case OP_Integer: { /* out2-prerelease */ - pOut->flags = MEM_Int; pOut->u.i = pOp->p1; break; } @@ -52797,7 +52995,6 @@ case OP_Integer: { /* out2-prerelease */ */ case OP_Int64: { /* out2-prerelease */ assert( pOp->p4.pI64!=0 ); - pOut->flags = MEM_Int; pOut->u.i = *pOp->p4.pI64; break; } @@ -52867,6 +53064,7 @@ case OP_String: { /* out2-prerelease */ ** Write a NULL into register P2. */ case OP_Null: { /* out2-prerelease */ + pOut->flags = MEM_Null; break; } @@ -52909,14 +53107,14 @@ case OP_Variable: { u.ab.n = pOp->p3; assert( u.ab.p1>=0 && u.ab.p1+u.ab.n<=p->nVar ); assert( u.ab.p2>=1 && u.ab.p2+u.ab.n-1<=p->nMem ); - assert( pOp->p4.z==0 || pOp->p3==1 ); + assert( pOp->p4.z==0 || pOp->p3==1 || pOp->p3==0 ); while( u.ab.n-- > 0 ){ u.ab.pVar = &p->aVar[u.ab.p1++]; if( sqlite3VdbeMemTooBig(u.ab.pVar) ){ goto too_big; } - pOut = &p->aMem[u.ab.p2++]; + pOut = &aMem[u.ab.p2++]; sqlite3VdbeMemReleaseExternal(pOut); pOut->flags = MEM_Null; sqlite3VdbeMemShallowCopy(pOut, u.ab.pVar, MEM_Static); @@ -52946,11 +53144,11 @@ case OP_Move: { assert( u.ac.n>0 && u.ac.p1>0 && u.ac.p2>0 ); assert( u.ac.p1+u.ac.n<=u.ac.p2 || u.ac.p2+u.ac.n<=u.ac.p1 ); - pIn1 = &p->aMem[u.ac.p1]; - pOut = &p->aMem[u.ac.p2]; + pIn1 = &aMem[u.ac.p1]; + pOut = &aMem[u.ac.p2]; while( u.ac.n-- ){ - assert( pOut<=&p->aMem[p->nMem] ); - assert( pIn1<=&p->aMem[p->nMem] ); + assert( pOut<=&aMem[p->nMem] ); + assert( pIn1<=&aMem[p->nMem] ); u.ac.zMalloc = pOut->zMalloc; pOut->zMalloc = 0; sqlite3VdbeMemMove(pOut, pIn1); @@ -52969,10 +53167,9 @@ case OP_Move: { ** This instruction makes a deep copy of the value. A duplicate ** is made of any string or blob constant. See also OP_SCopy. */ -case OP_Copy: { /* in1 */ - assert( pOp->p2>0 ); - assert( pOp->p2<=p->nMem ); - pOut = &p->aMem[pOp->p2]; +case OP_Copy: { /* in1, out2 */ + pIn1 = &aMem[pOp->p1]; + pOut = &aMem[pOp->p2]; assert( pOut!=pIn1 ); sqlite3VdbeMemShallowCopy(pOut, pIn1, MEM_Ephem); Deephemeralize(pOut); @@ -52992,11 +53189,9 @@ case OP_Copy: { /* in1 */ ** during the lifetime of the copy. Use OP_Copy to make a complete ** copy. */ -case OP_SCopy: { /* in1 */ - REGISTER_TRACE(pOp->p1, pIn1); - assert( pOp->p2>0 ); - assert( pOp->p2<=p->nMem ); - pOut = &p->aMem[pOp->p2]; +case OP_SCopy: { /* in1, out2 */ + pIn1 = &aMem[pOp->p1]; + pOut = &aMem[pOp->p2]; assert( pOut!=pIn1 ); sqlite3VdbeMemShallowCopy(pOut, pIn1, MEM_Ephem); REGISTER_TRACE(pOp->p2, pOut); @@ -53057,10 +53252,10 @@ case OP_ResultRow: { ** and have an assigned type. The results are de-ephemeralized as ** as side effect. */ - u.ad.pMem = p->pResultSet = &p->aMem[pOp->p1]; + u.ad.pMem = p->pResultSet = &aMem[pOp->p1]; for(u.ad.i=0; u.ad.ip2; u.ad.i++){ sqlite3VdbeMemNulTerminate(&u.ad.pMem[u.ad.i]); - storeTypeInfo(&u.ad.pMem[u.ad.i], encoding); + sqlite3VdbeMemStoreType(&u.ad.pMem[u.ad.i]); REGISTER_TRACE(pOp->p1+u.ad.i, &u.ad.pMem[u.ad.i]); } if( db->mallocFailed ) goto no_mem; @@ -53089,6 +53284,9 @@ case OP_Concat: { /* same as TK_CONCAT, in1, in2, out3 */ i64 nByte; #endif /* local variables moved into u.ae */ + pIn1 = &aMem[pOp->p1]; + pIn2 = &aMem[pOp->p2]; + pOut = &aMem[pOp->p3]; assert( pIn1!=pOut ); if( (pIn1->flags | pIn2->flags) & MEM_Null ){ sqlite3VdbeMemSetNull(pOut); @@ -53164,8 +53362,11 @@ case OP_Remainder: { /* same as TK_REM, in1, in2, out3 */ double rB; /* Real value of right operand */ #endif /* local variables moved into u.af */ + pIn1 = &aMem[pOp->p1]; applyNumericAffinity(pIn1); + pIn2 = &aMem[pOp->p2]; applyNumericAffinity(pIn2); + pOut = &aMem[pOp->p3]; u.af.flags = pIn1->flags | pIn2->flags; if( (u.af.flags & MEM_Null)!=0 ) goto arithmetic_result_is_null; if( (pIn1->flags & pIn2->flags & MEM_Int)==MEM_Int ){ @@ -53282,10 +53483,10 @@ case OP_Function: { assert( u.ag.n==0 || (pOp->p2>0 && pOp->p2+u.ag.n<=p->nMem+1) ); assert( pOp->p3p2 || pOp->p3>=pOp->p2+u.ag.n ); - u.ag.pArg = &p->aMem[pOp->p2]; + u.ag.pArg = &aMem[pOp->p2]; for(u.ag.i=0; u.ag.ip2, u.ag.pArg); } @@ -53299,7 +53500,7 @@ case OP_Function: { } assert( pOp->p3>0 && pOp->p3<=p->nMem ); - pOut = &p->aMem[pOp->p3]; + pOut = &aMem[pOp->p3]; u.ag.ctx.s.flags = MEM_Null; u.ag.ctx.s.db = db; u.ag.ctx.s.xDel = 0; @@ -53314,7 +53515,7 @@ case OP_Function: { u.ag.ctx.isError = 0; if( u.ag.ctx.pFunc->flags & SQLITE_FUNC_NEEDCOLL ){ - assert( pOp>p->aOp ); + assert( pOp>aOp ); assert( pOp[-1].p4type==P4_COLLSEQ ); assert( pOp[-1].opcode==OP_CollSeq ); u.ag.ctx.pColl = pOp[-1].p4.pColl; @@ -53400,6 +53601,9 @@ case OP_ShiftRight: { /* same as TK_RSHIFT, in1, in2, out3 */ i64 b; #endif /* local variables moved into u.ah */ + pIn1 = &aMem[pOp->p1]; + pIn2 = &aMem[pOp->p2]; + pOut = &aMem[pOp->p3]; if( (pIn1->flags | pIn2->flags) & MEM_Null ){ sqlite3VdbeMemSetNull(pOut); break; @@ -53426,6 +53630,7 @@ case OP_ShiftRight: { /* same as TK_RSHIFT, in1, in2, out3 */ ** To force any register to be an integer, just add 0. */ case OP_AddImm: { /* in1 */ + pIn1 = &aMem[pOp->p1]; sqlite3VdbeMemIntegerify(pIn1); pIn1->u.i += pOp->p2; break; @@ -53439,6 +53644,7 @@ case OP_AddImm: { /* in1 */ ** raise an SQLITE_MISMATCH exception. */ case OP_MustBeInt: { /* jump, in1 */ + pIn1 = &aMem[pOp->p1]; applyAffinity(pIn1, SQLITE_AFF_NUMERIC, encoding); if( (pIn1->flags & MEM_Int)==0 ){ if( pOp->p2==0 ){ @@ -53463,6 +53669,7 @@ case OP_MustBeInt: { /* jump, in1 */ ** to have only a real value. */ case OP_RealAffinity: { /* in1 */ + pIn1 = &aMem[pOp->p1]; if( pIn1->flags & MEM_Int ){ sqlite3VdbeMemRealify(pIn1); } @@ -53480,6 +53687,7 @@ case OP_RealAffinity: { /* in1 */ ** A NULL value is not changed by this routine. It remains NULL. */ case OP_ToText: { /* same as TK_TO_TEXT, in1 */ + pIn1 = &aMem[pOp->p1]; if( pIn1->flags & MEM_Null ) break; assert( MEM_Str==(MEM_Blob>>3) ); pIn1->flags |= (pIn1->flags&MEM_Blob)>>3; @@ -53501,6 +53709,7 @@ case OP_ToText: { /* same as TK_TO_TEXT, in1 */ ** A NULL value is not changed by this routine. It remains NULL. */ case OP_ToBlob: { /* same as TK_TO_BLOB, in1 */ + pIn1 = &aMem[pOp->p1]; if( pIn1->flags & MEM_Null ) break; if( (pIn1->flags & MEM_Blob)==0 ){ applyAffinity(pIn1, SQLITE_AFF_TEXT, encoding); @@ -53524,6 +53733,7 @@ case OP_ToBlob: { /* same as TK_TO_BLOB, in1 */ ** A NULL value is not changed by this routine. It remains NULL. */ case OP_ToNumeric: { /* same as TK_TO_NUMERIC, in1 */ + pIn1 = &aMem[pOp->p1]; if( (pIn1->flags & (MEM_Null|MEM_Int|MEM_Real))==0 ){ sqlite3VdbeMemNumerify(pIn1); } @@ -53541,6 +53751,7 @@ case OP_ToNumeric: { /* same as TK_TO_NUMERIC, in1 */ ** A NULL value is not changed by this routine. It remains NULL. */ case OP_ToInt: { /* same as TK_TO_INT, in1 */ + pIn1 = &aMem[pOp->p1]; if( (pIn1->flags & MEM_Null)==0 ){ sqlite3VdbeMemIntegerify(pIn1); } @@ -53558,6 +53769,7 @@ case OP_ToInt: { /* same as TK_TO_INT, in1 */ ** A NULL value is not changed by this routine. It remains NULL. */ case OP_ToReal: { /* same as TK_TO_REAL, in1 */ + pIn1 = &aMem[pOp->p1]; if( (pIn1->flags & MEM_Null)==0 ){ sqlite3VdbeMemRealify(pIn1); } @@ -53648,6 +53860,8 @@ case OP_Ge: { /* same as TK_GE, jump, in1, in3 */ char affinity; /* Affinity to use for comparison */ #endif /* local variables moved into u.ai */ + pIn1 = &aMem[pOp->p1]; + pIn3 = &aMem[pOp->p3]; if( (pIn1->flags | pIn3->flags)&MEM_Null ){ /* One or both operands are NULL */ if( pOp->p5 & SQLITE_NULLEQ ){ @@ -53663,7 +53877,7 @@ case OP_Ge: { /* same as TK_GE, jump, in1, in3 */ ** The jump is taken if the SQLITE_JUMPIFNULL bit is set. */ if( pOp->p5 & SQLITE_STOREP2 ){ - pOut = &p->aMem[pOp->p2]; + pOut = &aMem[pOp->p2]; MemSetTypeFlag(pOut, MEM_Null); REGISTER_TRACE(pOp->p2, pOut); }else if( pOp->p5 & SQLITE_JUMPIFNULL ){ @@ -53695,7 +53909,7 @@ case OP_Ge: { /* same as TK_GE, jump, in1, in3 */ } if( pOp->p5 & SQLITE_STOREP2 ){ - pOut = &p->aMem[pOp->p2]; + pOut = &aMem[pOp->p2]; MemSetTypeFlag(pOut, MEM_Int); pOut->u.i = u.ai.res; REGISTER_TRACE(pOp->p2, pOut); @@ -53766,12 +53980,12 @@ case OP_Compare: { #endif /* SQLITE_DEBUG */ for(u.aj.i=0; u.aj.iaMem[u.aj.p1+u.aj.idx]); - REGISTER_TRACE(u.aj.p2+u.aj.idx, &p->aMem[u.aj.p2+u.aj.idx]); + REGISTER_TRACE(u.aj.p1+u.aj.idx, &aMem[u.aj.p1+u.aj.idx]); + REGISTER_TRACE(u.aj.p2+u.aj.idx, &aMem[u.aj.p2+u.aj.idx]); assert( u.aj.inField ); u.aj.pColl = u.aj.pKeyInfo->aColl[u.aj.i]; u.aj.bRev = u.aj.pKeyInfo->aSortOrder[u.aj.i]; - iCompare = sqlite3MemCompare(&p->aMem[u.aj.p1+u.aj.idx], &p->aMem[u.aj.p2+u.aj.idx], u.aj.pColl); + iCompare = sqlite3MemCompare(&aMem[u.aj.p1+u.aj.idx], &aMem[u.aj.p2+u.aj.idx], u.aj.pColl); if( iCompare ){ if( u.aj.bRev ) iCompare = -iCompare; break; @@ -53823,11 +54037,13 @@ case OP_Or: { /* same as TK_OR, in1, in2, out3 */ int v2; /* Right operand: 0==FALSE, 1==TRUE, 2==UNKNOWN or NULL */ #endif /* local variables moved into u.ak */ + pIn1 = &aMem[pOp->p1]; if( pIn1->flags & MEM_Null ){ u.ak.v1 = 2; }else{ u.ak.v1 = sqlite3VdbeIntValue(pIn1)!=0; } + pIn2 = &aMem[pOp->p2]; if( pIn2->flags & MEM_Null ){ u.ak.v2 = 2; }else{ @@ -53840,6 +54056,7 @@ case OP_Or: { /* same as TK_OR, in1, in2, out3 */ static const unsigned char or_logic[] = { 0, 1, 2, 1, 1, 1, 2, 1, 2 }; u.ak.v1 = or_logic[u.ak.v1*3+u.ak.v2]; } + pOut = &aMem[pOp->p3]; if( u.ak.v1==2 ){ MemSetTypeFlag(pOut, MEM_Null); }else{ @@ -53855,8 +54072,9 @@ case OP_Or: { /* same as TK_OR, in1, in2, out3 */ ** boolean complement in register P2. If the value in register P1 is ** NULL, then a NULL is stored in P2. */ -case OP_Not: { /* same as TK_NOT, in1 */ - pOut = &p->aMem[pOp->p2]; +case OP_Not: { /* same as TK_NOT, in1, out2 */ + pIn1 = &aMem[pOp->p1]; + pOut = &aMem[pOp->p2]; if( pIn1->flags & MEM_Null ){ sqlite3VdbeMemSetNull(pOut); }else{ @@ -53871,8 +54089,9 @@ case OP_Not: { /* same as TK_NOT, in1 */ ** ones-complement of the P1 value into register P2. If P1 holds ** a NULL then store a NULL in P2. */ -case OP_BitNot: { /* same as TK_BITNOT, in1 */ - pOut = &p->aMem[pOp->p2]; +case OP_BitNot: { /* same as TK_BITNOT, in1, out2 */ + pIn1 = &aMem[pOp->p1]; + pOut = &aMem[pOp->p2]; if( pIn1->flags & MEM_Null ){ sqlite3VdbeMemSetNull(pOut); }else{ @@ -53898,6 +54117,7 @@ case OP_IfNot: { /* jump, in1 */ #if 0 /* local variables moved into u.al */ int c; #endif /* local variables moved into u.al */ + pIn1 = &aMem[pOp->p1]; if( pIn1->flags & MEM_Null ){ u.al.c = pOp->p3; }else{ @@ -53919,6 +54139,7 @@ case OP_IfNot: { /* jump, in1 */ ** Jump to P2 if the value in register P1 is NULL. */ case OP_IsNull: { /* same as TK_ISNULL, jump, in1 */ + pIn1 = &aMem[pOp->p1]; if( (pIn1->flags & MEM_Null)!=0 ){ pc = pOp->p2 - 1; } @@ -53930,6 +54151,7 @@ case OP_IsNull: { /* same as TK_ISNULL, jump, in1 */ ** Jump to P2 if the value in register P1 is not NULL. */ case OP_NotNull: { /* same as TK_NOTNULL, jump, in1 */ + pIn1 = &aMem[pOp->p1]; if( (pIn1->flags & MEM_Null)==0 ){ pc = pOp->p2 - 1; } @@ -53988,7 +54210,7 @@ case OP_Column: { memset(&u.am.sMem, 0, sizeof(u.am.sMem)); assert( u.am.p1nCursor ); assert( pOp->p3>0 && pOp->p3<=p->nMem ); - u.am.pDest = &p->aMem[pOp->p3]; + u.am.pDest = &aMem[pOp->p3]; MemSetTypeFlag(u.am.pDest, MEM_Null); u.am.zRec = 0; @@ -54034,7 +54256,7 @@ case OP_Column: { assert( rc==SQLITE_OK ); /* DataSize() cannot fail */ } }else if( u.am.pC->pseudoTableReg>0 ){ - u.am.pReg = &p->aMem[u.am.pC->pseudoTableReg]; + u.am.pReg = &aMem[u.am.pC->pseudoTableReg]; assert( u.am.pReg->flags & MEM_Blob ); u.am.payloadSize = u.am.pReg->n; u.am.zRec = u.am.pReg->z; @@ -54246,18 +54468,19 @@ op_column_out: */ case OP_Affinity: { #if 0 /* local variables moved into u.an */ - char *zAffinity; /* The affinity to be applied */ - Mem *pData0; /* First register to which to apply affinity */ - Mem *pLast; /* Last register to which to apply affinity */ - Mem *pRec; /* Current register */ + const char *zAffinity; /* The affinity to be applied */ + char cAff; /* A single character of affinity */ #endif /* local variables moved into u.an */ u.an.zAffinity = pOp->p4.z; - u.an.pData0 = &p->aMem[pOp->p1]; - u.an.pLast = &u.an.pData0[pOp->p2-1]; - for(u.an.pRec=u.an.pData0; u.an.pRec<=u.an.pLast; u.an.pRec++){ - ExpandBlob(u.an.pRec); - applyAffinity(u.an.pRec, u.an.zAffinity[u.an.pRec-u.an.pData0], encoding); + assert( u.an.zAffinity!=0 ); + assert( u.an.zAffinity[pOp->p2]==0 ); + pIn1 = &aMem[pOp->p1]; + while( (u.an.cAff = *(u.an.zAffinity++))!=0 ){ + assert( pIn1 <= &p->aMem[p->nMem] ); + ExpandBlob(pIn1); + applyAffinity(pIn1, u.an.cAff, encoding); + pIn1++; } break; } @@ -54321,7 +54544,7 @@ case OP_MakeRecord: { u.ao.nField = pOp->p1; u.ao.zAffinity = pOp->p4.z; assert( u.ao.nField>0 && pOp->p2>0 && pOp->p2+u.ao.nField<=p->nMem+1 ); - u.ao.pData0 = &p->aMem[u.ao.nField]; + u.ao.pData0 = &aMem[u.ao.nField]; u.ao.nField = pOp->p2; u.ao.pLast = &u.ao.pData0[u.ao.nField-1]; u.ao.file_format = p->minWriteFileFormat; @@ -54365,7 +54588,7 @@ case OP_MakeRecord: { ** sqlite3VdbeMemGrow() could clobber the value before it is used). */ assert( pOp->p3p1 || pOp->p3>=pOp->p1+pOp->p2 ); - pOut = &p->aMem[pOp->p3]; + pOut = &aMem[pOp->p3]; if( sqlite3VdbeMemGrow(pOut, (int)u.ao.nByte, 0) ){ goto no_mem; } @@ -54414,7 +54637,6 @@ case OP_Count: { /* out2-prerelease */ }else{ u.ap.nEntry = 0; } - pOut->flags = MEM_Int; pOut->u.i = u.ap.nEntry; break; } @@ -54743,7 +54965,6 @@ case OP_ReadCookie: { /* out2-prerelease */ sqlite3BtreeGetMeta(db->aDb[u.at.iDb].pBt, u.at.iCookie, (u32 *)&u.at.iMeta); pOut->u.i = u.at.iMeta; - MemSetTypeFlag(pOut, MEM_Int); break; } @@ -54766,6 +54987,7 @@ case OP_SetCookie: { /* in3 */ assert( (p->btreeMask & (1<p1))!=0 ); u.au.pDb = &db->aDb[pOp->p1]; assert( u.au.pDb->pBt!=0 ); + pIn3 = &aMem[pOp->p3]; sqlite3VdbeMemIntegerify(pIn3); /* See note about index shifting on OP_ReadCookie */ rc = sqlite3BtreeUpdateMeta(u.au.pDb->pBt, pOp->p2, (int)pIn3->u.i); @@ -54781,6 +55003,7 @@ case OP_SetCookie: { /* in3 */ /* Invalidate all prepared statements whenever the TEMP database ** schema is changed. Ticket #1644 */ sqlite3ExpirePreparedStatements(db); + p->expired = 0; } break; } @@ -54902,6 +55125,11 @@ case OP_OpenWrite: { Db *pDb; #endif /* local variables moved into u.aw */ + if( p->expired ){ + rc = SQLITE_ABORT; + break; + } + u.aw.nField = 0; u.aw.pKeyInfo = 0; u.aw.p2 = pOp->p2; @@ -54922,7 +55150,7 @@ case OP_OpenWrite: { if( pOp->p5 ){ assert( u.aw.p2>0 ); assert( u.aw.p2<=p->nMem ); - pIn2 = &p->aMem[u.aw.p2]; + pIn2 = &aMem[u.aw.p2]; sqlite3VdbeMemIntegerify(pIn2); u.aw.p2 = (int)pIn2->u.i; /* The u.aw.p2 value always comes from a prior OP_CreateTable opcode and @@ -55144,6 +55372,9 @@ case OP_SeekGt: { /* jump, in3 */ u.az.pC = p->apCsr[pOp->p1]; assert( u.az.pC!=0 ); assert( u.az.pC->pseudoTableReg==0 ); + assert( OP_SeekLe == OP_SeekLt+1 ); + assert( OP_SeekGe == OP_SeekLt+2 ); + assert( OP_SeekGt == OP_SeekLt+3 ); if( u.az.pC->pCursor!=0 ){ u.az.oc = pOp->opcode; u.az.pC->nullRow = 0; @@ -55151,6 +55382,7 @@ case OP_SeekGt: { /* jump, in3 */ /* The input value in P3 might be of any type: integer, real, string, ** blob, or NULL. But it needs to be an integer before we can do ** the seek, so covert it. */ + pIn3 = &aMem[pOp->p3]; applyNumericAffinity(pIn3); u.az.iKey = sqlite3VdbeIntValue(pIn3); u.az.pC->rowidIsValid = 0; @@ -55173,12 +55405,12 @@ case OP_SeekGt: { /* jump, in3 */ ** integer. */ u.az.res = 1; if( pIn3->r<0 ){ - if( u.az.oc==OP_SeekGt || u.az.oc==OP_SeekGe ){ + if( u.az.oc>=OP_SeekGe ){ assert( u.az.oc==OP_SeekGe || u.az.oc==OP_SeekGt ); rc = sqlite3BtreeFirst(u.az.pC->pCursor, &u.az.res); if( rc!=SQLITE_OK ) goto abort_due_to_error; } }else{ - if( u.az.oc==OP_SeekLt || u.az.oc==OP_SeekLe ){ + if( u.az.oc<=OP_SeekLe ){ assert( u.az.oc==OP_SeekLt || u.az.oc==OP_SeekLe ); rc = sqlite3BtreeLast(u.az.pC->pCursor, &u.az.res); if( rc!=SQLITE_OK ) goto abort_due_to_error; } @@ -55210,12 +55442,22 @@ case OP_SeekGt: { /* jump, in3 */ assert( u.az.nField>0 ); u.az.r.pKeyInfo = u.az.pC->pKeyInfo; u.az.r.nField = (u16)u.az.nField; - if( u.az.oc==OP_SeekGt || u.az.oc==OP_SeekLe ){ - u.az.r.flags = UNPACKED_INCRKEY; - }else{ - u.az.r.flags = 0; - } - u.az.r.aMem = &p->aMem[pOp->p3]; + + /* The next line of code computes as follows, only faster: + ** if( u.az.oc==OP_SeekGt || u.az.oc==OP_SeekLe ){ + ** u.az.r.flags = UNPACKED_INCRKEY; + ** }else{ + ** u.az.r.flags = 0; + ** } + */ + u.az.r.flags = (u16)(UNPACKED_INCRKEY * (1 & (u.az.oc - OP_SeekLt))); + assert( u.az.oc!=OP_SeekGt || u.az.r.flags==UNPACKED_INCRKEY ); + assert( u.az.oc!=OP_SeekLe || u.az.r.flags==UNPACKED_INCRKEY ); + assert( u.az.oc!=OP_SeekGe || u.az.r.flags==0 ); + assert( u.az.oc!=OP_SeekLt || u.az.r.flags==0 ); + + u.az.r.aMem = &aMem[pOp->p3]; + ExpandBlob(u.az.r.aMem); rc = sqlite3BtreeMovetoUnpacked(u.az.pC->pCursor, &u.az.r, 0, 0, &u.az.res); if( rc!=SQLITE_OK ){ goto abort_due_to_error; @@ -55227,7 +55469,7 @@ case OP_SeekGt: { /* jump, in3 */ #ifdef SQLITE_TEST sqlite3_search_count++; #endif - if( u.az.oc==OP_SeekGe || u.az.oc==OP_SeekGt ){ + if( u.az.oc>=OP_SeekGe ){ assert( u.az.oc==OP_SeekGe || u.az.oc==OP_SeekGt ); if( u.az.res<0 || (u.az.res==0 && u.az.oc==OP_SeekGt) ){ rc = sqlite3BtreeNext(u.az.pC->pCursor, &u.az.res); if( rc!=SQLITE_OK ) goto abort_due_to_error; @@ -55282,6 +55524,7 @@ case OP_Seek: { /* in2 */ if( ALWAYS(u.ba.pC->pCursor!=0) ){ assert( u.ba.pC->isTable ); u.ba.pC->nullRow = 0; + pIn2 = &aMem[pOp->p2]; u.ba.pC->movetoTarget = sqlite3VdbeIntValue(pIn2); u.ba.pC->rowidIsValid = 0; u.ba.pC->deferredMoveto = 1; @@ -55290,33 +55533,27 @@ case OP_Seek: { /* in2 */ } -/* Opcode: Found P1 P2 P3 * * -** -** Register P3 holds a blob constructed by MakeRecord. P1 is an index. -** If an entry that matches the value in register p3 exists in P1 then -** jump to P2. If the P3 value does not match any entry in P1 -** then fall thru. The P1 cursor is left pointing at the matching entry -** if it exists. -** -** This instruction is used to implement the IN operator where the -** left-hand side is a SELECT statement. P1 may be a true index, or it -** may be a temporary index that holds the results of the SELECT -** statement. This instruction is also used to implement the -** DISTINCT keyword in SELECT statements. +/* Opcode: Found P1 P2 P3 P4 * ** -** This instruction checks if index P1 contains a record for which -** the first N serialized values exactly match the N serialized values -** in the record in register P3, where N is the total number of values in -** the P3 record (the P3 record is a prefix of the P1 record). +** If P4==0 then register P3 holds a blob constructed by MakeRecord. If +** P4>0 then register P3 is the first of P4 registers that form an unpacked +** record. ** -** See also: NotFound, IsUnique, NotExists +** Cursor P1 is on an index btree. If the record identified by P3 and P4 +** is a prefix of any entry in P1 then a jump is made to P2 and +** P1 is left pointing at the matching entry. */ -/* Opcode: NotFound P1 P2 P3 * * +/* Opcode: NotFound P1 P2 P3 P4 * ** -** Register P3 holds a blob constructed by MakeRecord. P1 is -** an index. If no entry exists in P1 that matches the blob then jump -** to P2. If an entry does existing, fall through. The cursor is left -** pointing to the entry that matches. +** If P4==0 then register P3 holds a blob constructed by MakeRecord. If +** P4>0 then register P3 is the first of P4 registers that form an unpacked +** record. +** +** Cursor P1 is on an index btree. If the record identified by P3 and P4 +** is not the prefix of any entry in P1 then a jump is made to P2. If P1 +** does contain an entry whose prefix matches the P3/P4 record then control +** falls through to the next instruction and P1 is left pointing at the +** matching entry. ** ** See also: Found, NotExists, IsUnique */ @@ -55327,6 +55564,7 @@ case OP_Found: { /* jump, in3 */ VdbeCursor *pC; int res; UnpackedRecord *pIdxKey; + UnpackedRecord r; char aTempRec[ROUND8(sizeof(UnpackedRecord)) + sizeof(Mem)*3 + 7]; #endif /* local variables moved into u.bb */ @@ -55336,23 +55574,33 @@ case OP_Found: { /* jump, in3 */ u.bb.alreadyExists = 0; assert( pOp->p1>=0 && pOp->p1nCursor ); + assert( pOp->p4type==P4_INT32 ); u.bb.pC = p->apCsr[pOp->p1]; assert( u.bb.pC!=0 ); + pIn3 = &aMem[pOp->p3]; if( ALWAYS(u.bb.pC->pCursor!=0) ){ assert( u.bb.pC->isTable==0 ); - assert( pIn3->flags & MEM_Blob ); - ExpandBlob(pIn3); - u.bb.pIdxKey = sqlite3VdbeRecordUnpack(u.bb.pC->pKeyInfo, pIn3->n, pIn3->z, - u.bb.aTempRec, sizeof(u.bb.aTempRec)); - if( u.bb.pIdxKey==0 ){ - goto no_mem; - } - if( pOp->opcode==OP_Found ){ + if( pOp->p4.i>0 ){ + u.bb.r.pKeyInfo = u.bb.pC->pKeyInfo; + u.bb.r.nField = (u16)pOp->p4.i; + u.bb.r.aMem = pIn3; + u.bb.r.flags = UNPACKED_PREFIX_MATCH; + u.bb.pIdxKey = &u.bb.r; + }else{ + assert( pIn3->flags & MEM_Blob ); + ExpandBlob(pIn3); + u.bb.pIdxKey = sqlite3VdbeRecordUnpack(u.bb.pC->pKeyInfo, pIn3->n, pIn3->z, + u.bb.aTempRec, sizeof(u.bb.aTempRec)); + if( u.bb.pIdxKey==0 ){ + goto no_mem; + } u.bb.pIdxKey->flags |= UNPACKED_PREFIX_MATCH; } rc = sqlite3BtreeMovetoUnpacked(u.bb.pC->pCursor, u.bb.pIdxKey, 0, 0, &u.bb.res); - sqlite3VdbeDeleteUnpackedRecord(u.bb.pIdxKey); + if( pOp->p4.i==0 ){ + sqlite3VdbeDeleteUnpackedRecord(u.bb.pIdxKey); + } if( rc!=SQLITE_OK ){ break; } @@ -55370,9 +55618,10 @@ case OP_Found: { /* jump, in3 */ /* Opcode: IsUnique P1 P2 P3 P4 * ** -** Cursor P1 is open on an index. So it has no data and its key consists -** of a record generated by OP_MakeRecord where the last field is the -** rowid of the entry that the index refers to. +** Cursor P1 is open on an index b-tree - that is to say, a btree which +** no data and where the key are records generated by OP_MakeRecord with +** the list field being the integer ROWID of the entry that the index +** entry refers to. ** ** The P3 register contains an integer record number. Call this record ** number R. Register P4 is the first in a set of N contiguous registers @@ -55399,12 +55648,13 @@ case OP_IsUnique: { /* jump, in3 */ VdbeCursor *pCx; BtCursor *pCrsr; u16 nField; - Mem *aMem; + Mem *aMx; UnpackedRecord r; /* B-Tree index search key */ i64 R; /* Rowid stored in register P3 */ #endif /* local variables moved into u.bc */ - u.bc.aMem = &p->aMem[pOp->p4.i]; + pIn3 = &aMem[pOp->p3]; + u.bc.aMx = &aMem[pOp->p4.i]; /* Assert that the values of parameters P1 and P4 are in range. */ assert( pOp->p4type==P4_INT32 ); assert( pOp->p4.i>0 && pOp->p4.i<=p->nMem ); @@ -55420,20 +55670,20 @@ case OP_IsUnique: { /* jump, in3 */ /* If any of the values are NULL, take the jump. */ u.bc.nField = u.bc.pCx->pKeyInfo->nField; for(u.bc.ii=0; u.bc.iip2 - 1; u.bc.pCrsr = 0; break; } } - assert( (u.bc.aMem[u.bc.nField].flags & MEM_Null)==0 ); + assert( (u.bc.aMx[u.bc.nField].flags & MEM_Null)==0 ); if( u.bc.pCrsr!=0 ){ /* Populate the index search key. */ u.bc.r.pKeyInfo = u.bc.pCx->pKeyInfo; u.bc.r.nField = u.bc.nField + 1; u.bc.r.flags = UNPACKED_PREFIX_SEARCH; - u.bc.r.aMem = u.bc.aMem; + u.bc.r.aMem = u.bc.aMx; /* Extract the value of u.bc.R from register P3. */ sqlite3VdbeMemIntegerify(pIn3); @@ -55474,6 +55724,7 @@ case OP_NotExists: { /* jump, in3 */ u64 iKey; #endif /* local variables moved into u.bd */ + pIn3 = &aMem[pOp->p3]; assert( pIn3->flags & MEM_Int ); assert( pOp->p1>=0 && pOp->p1nCursor ); u.bd.pC = p->apCsr[pOp->p1]; @@ -55517,7 +55768,6 @@ case OP_Sequence: { /* out2-prerelease */ assert( pOp->p1>=0 && pOp->p1nCursor ); assert( p->apCsr[pOp->p1]!=0 ); pOut->u.i = p->apCsr[pOp->p1]->seqCount++; - MemSetTypeFlag(pOut, MEM_Int); break; } @@ -55588,7 +55838,7 @@ case OP_NewRowid: { /* out2-prerelease */ goto abort_due_to_error; } if( u.be.res ){ - u.be.v = 1; + u.be.v = 1; /* IMP: R-61914-48074 */ }else{ assert( sqlite3BtreeCursorIsValid(u.be.pC->pCursor) ); rc = sqlite3BtreeKeySize(u.be.pC->pCursor, &u.be.v); @@ -55596,7 +55846,7 @@ case OP_NewRowid: { /* out2-prerelease */ if( u.be.v==MAX_ROWID ){ u.be.pC->useRandomRowid = 1; }else{ - u.be.v++; + u.be.v++; /* IMP: R-29538-34987 */ } } } @@ -55613,14 +55863,14 @@ case OP_NewRowid: { /* out2-prerelease */ }else{ /* Assert that P3 is a valid memory cell. */ assert( pOp->p3<=p->nMem ); - u.be.pMem = &p->aMem[pOp->p3]; + u.be.pMem = &aMem[pOp->p3]; } REGISTER_TRACE(pOp->p3, u.be.pMem); sqlite3VdbeMemIntegerify(u.be.pMem); assert( (u.be.pMem->flags & MEM_Int)!=0 ); /* mem(P3) holds an integer */ if( u.be.pMem->u.i==MAX_ROWID || u.be.pC->useRandomRowid ){ - rc = SQLITE_FULL; + rc = SQLITE_FULL; /* IMP: R-12275-61338 */ goto abort_due_to_error; } if( u.be.vu.i+1 ){ @@ -55633,6 +55883,11 @@ case OP_NewRowid: { /* out2-prerelease */ sqlite3BtreeSetCachedRowid(u.be.pC->pCursor, u.be.vuseRandomRowid ){ + /* IMPLEMENTATION-OF: R-48598-02938 If the largest ROWID is equal to the + ** largest possible integer (9223372036854775807) then the database + ** engine starts picking candidate ROWIDs at random until it finds one + ** that is not previously used. + */ assert( pOp->p3==0 ); /* We cannot be in random rowid mode if this is ** an AUTOINCREMENT table. */ u.be.v = db->lastRowid; @@ -55648,7 +55903,7 @@ case OP_NewRowid: { /* out2-prerelease */ u.be.cnt++; }while( u.be.cnt<100 && rc==SQLITE_OK && u.be.res==0 ); if( rc==SQLITE_OK && u.be.res==0 ){ - rc = SQLITE_FULL; + rc = SQLITE_FULL; /* IMP: R-38219-53002 */ goto abort_due_to_error; } } @@ -55656,7 +55911,6 @@ case OP_NewRowid: { /* out2-prerelease */ u.be.pC->deferredMoveto = 0; u.be.pC->cacheStatus = CACHE_STALE; } - MemSetTypeFlag(pOut, MEM_Int); pOut->u.i = u.be.v; break; } @@ -55700,7 +55954,13 @@ case OP_NewRowid: { /* out2-prerelease */ ** This instruction only works on tables. The equivalent instruction ** for indices is OP_IdxInsert. */ -case OP_Insert: { +/* Opcode: InsertInt P1 P2 P3 P4 P5 +** +** This works exactly like OP_Insert except that the key is the +** integer value P3, not the value of the integer stored in register P3. +*/ +case OP_Insert: +case OP_InsertInt: { #if 0 /* local variables moved into u.bf */ Mem *pData; /* MEM cell holding data for the record to be inserted */ Mem *pKey; /* MEM cell holding key for the record */ @@ -55713,21 +55973,27 @@ case OP_Insert: { int op; /* Opcode for update hook: SQLITE_UPDATE or SQLITE_INSERT */ #endif /* local variables moved into u.bf */ - u.bf.pData = &p->aMem[pOp->p2]; - u.bf.pKey = &p->aMem[pOp->p3]; + u.bf.pData = &aMem[pOp->p2]; assert( pOp->p1>=0 && pOp->p1nCursor ); u.bf.pC = p->apCsr[pOp->p1]; assert( u.bf.pC!=0 ); assert( u.bf.pC->pCursor!=0 ); assert( u.bf.pC->pseudoTableReg==0 ); - assert( u.bf.pKey->flags & MEM_Int ); assert( u.bf.pC->isTable ); REGISTER_TRACE(pOp->p2, u.bf.pData); - REGISTER_TRACE(pOp->p3, u.bf.pKey); - u.bf.iKey = u.bf.pKey->u.i; + if( pOp->opcode==OP_Insert ){ + u.bf.pKey = &aMem[pOp->p3]; + assert( u.bf.pKey->flags & MEM_Int ); + REGISTER_TRACE(pOp->p3, u.bf.pKey); + u.bf.iKey = u.bf.pKey->u.i; + }else{ + assert( pOp->opcode==OP_InsertInt ); + u.bf.iKey = pOp->p3; + } + if( pOp->p5 & OPFLAG_NCHANGE ) p->nChange++; - if( pOp->p5 & OPFLAG_LASTROWID ) db->lastRowid = u.bf.pKey->u.i; + if( pOp->p5 & OPFLAG_LASTROWID ) db->lastRowid = u.bf.iKey; if( u.bf.pData->flags & MEM_Null ){ u.bf.pData->z = 0; u.bf.pData->n = 0; @@ -55869,7 +56135,7 @@ case OP_RowData: { i64 n64; #endif /* local variables moved into u.bh */ - pOut = &p->aMem[pOp->p2]; + pOut = &aMem[pOp->p2]; /* Note that RowKey and RowData are really exactly the same instruction */ assert( pOp->p1>=0 && pOp->p1nCursor ); @@ -55944,7 +56210,7 @@ case OP_Rowid: { /* out2-prerelease */ assert( u.bi.pC!=0 ); assert( u.bi.pC->pseudoTableReg==0 ); if( u.bi.pC->nullRow ){ - /* Do nothing so that reg[P2] remains NULL */ + pOut->flags = MEM_Null; break; }else if( u.bi.pC->deferredMoveto ){ u.bi.v = u.bi.pC->movetoTarget; @@ -55972,7 +56238,6 @@ case OP_Rowid: { /* out2-prerelease */ } } pOut->u.i = u.bi.v; - MemSetTypeFlag(pOut, MEM_Int); break; } @@ -56167,6 +56432,7 @@ case OP_IdxInsert: { /* in2 */ assert( pOp->p1>=0 && pOp->p1nCursor ); u.bn.pC = p->apCsr[pOp->p1]; assert( u.bn.pC!=0 ); + pIn2 = &aMem[pOp->p2]; assert( pIn2->flags & MEM_Blob ); u.bn.pCrsr = u.bn.pC->pCursor; if( ALWAYS(u.bn.pCrsr!=0) ){ @@ -56209,7 +56475,7 @@ case OP_IdxDelete: { u.bo.r.pKeyInfo = u.bo.pC->pKeyInfo; u.bo.r.nField = (u16)pOp->p3; u.bo.r.flags = 0; - u.bo.r.aMem = &p->aMem[pOp->p2]; + u.bo.r.aMem = &aMem[pOp->p2]; rc = sqlite3BtreeMovetoUnpacked(u.bo.pCrsr, &u.bo.r, 0, 0, &u.bo.res); if( rc==SQLITE_OK && u.bo.res==0 ){ rc = sqlite3BtreeDelete(u.bo.pCrsr); @@ -56239,6 +56505,7 @@ case OP_IdxRowid: { /* out2-prerelease */ u.bp.pC = p->apCsr[pOp->p1]; assert( u.bp.pC!=0 ); u.bp.pCrsr = u.bp.pC->pCursor; + pOut->flags = MEM_Null; if( ALWAYS(u.bp.pCrsr!=0) ){ rc = sqlite3VdbeCursorMoveto(u.bp.pC); if( NEVER(rc) ) goto abort_due_to_error; @@ -56249,8 +56516,8 @@ case OP_IdxRowid: { /* out2-prerelease */ if( rc!=SQLITE_OK ){ goto abort_due_to_error; } - MemSetTypeFlag(pOut, MEM_Int); pOut->u.i = u.bp.rowid; + pOut->flags = MEM_Int; } } break; @@ -56282,8 +56549,8 @@ case OP_IdxRowid: { /* out2-prerelease */ ** If P5 is non-zero then the key value is increased by an epsilon prior ** to the comparison. This makes the opcode work like IdxLE. */ -case OP_IdxLT: /* jump, in3 */ -case OP_IdxGE: { /* jump, in3 */ +case OP_IdxLT: /* jump */ +case OP_IdxGE: { /* jump */ #if 0 /* local variables moved into u.bq */ VdbeCursor *pC; int res; @@ -56304,7 +56571,7 @@ case OP_IdxGE: { /* jump, in3 */ }else{ u.bq.r.flags = UNPACKED_IGNORE_ROWID; } - u.bq.r.aMem = &p->aMem[pOp->p3]; + u.bq.r.aMem = &aMem[pOp->p3]; rc = sqlite3VdbeIdxKeyCompare(u.bq.pC, &u.bq.r, &u.bq.res); if( pOp->opcode==OP_IdxLT ){ u.bq.res = -u.bq.res; @@ -56356,6 +56623,7 @@ case OP_Destroy: { /* out2-prerelease */ #else u.br.iCnt = db->activeVdbeCnt; #endif + pOut->flags = MEM_Null; if( u.br.iCnt>1 ){ rc = SQLITE_LOCKED; p->errorAction = OE_Abort; @@ -56364,11 +56632,12 @@ case OP_Destroy: { /* out2-prerelease */ assert( u.br.iCnt==1 ); assert( (p->btreeMask & (1<aDb[u.br.iDb].pBt, pOp->p1, &u.br.iMoved); - MemSetTypeFlag(pOut, MEM_Int); + pOut->flags = MEM_Int; pOut->u.i = u.br.iMoved; #ifndef SQLITE_OMIT_AUTOVACUUM if( rc==SQLITE_OK && u.br.iMoved!=0 ){ sqlite3RootPageMoved(&db->aDb[u.br.iDb], u.br.iMoved, pOp->p1); + resetSchemaOnFault = 1; } #endif } @@ -56406,7 +56675,7 @@ case OP_Clear: { if( pOp->p3 ){ p->nChange += u.bs.nChange; if( pOp->p3>0 ){ - p->aMem[pOp->p3].u.i += u.bs.nChange; + aMem[pOp->p3].u.i += u.bs.nChange; } } break; @@ -56455,7 +56724,6 @@ case OP_CreateTable: { /* out2-prerelease */ } rc = sqlite3BtreeCreateTable(u.bt.pDb->pBt, &u.bt.pgno, u.bt.flags); pOut->u.i = u.bt.pgno; - MemSetTypeFlag(pOut, MEM_Int); break; } @@ -56622,10 +56890,10 @@ case OP_IntegrityCk: { u.bv.aRoot = sqlite3DbMallocRaw(db, sizeof(int)*(u.bv.nRoot+1) ); if( u.bv.aRoot==0 ) goto no_mem; assert( pOp->p3>0 && pOp->p3<=p->nMem ); - u.bv.pnErr = &p->aMem[pOp->p3]; + u.bv.pnErr = &aMem[pOp->p3]; assert( (u.bv.pnErr->flags & MEM_Int)!=0 ); assert( (u.bv.pnErr->flags & (MEM_Str|MEM_Blob))==0 ); - pIn1 = &p->aMem[pOp->p1]; + pIn1 = &aMem[pOp->p1]; for(u.bv.j=0; u.bv.jp1>0 && pOp->p1<=p->nMem ); - u.bw.pIdx = &p->aMem[pOp->p1]; - assert( pOp->p2>0 && pOp->p2<=p->nMem ); - u.bw.pVal = &p->aMem[pOp->p2]; - assert( (u.bw.pVal->flags & MEM_Int)!=0 ); - if( (u.bw.pIdx->flags & MEM_RowSet)==0 ){ - sqlite3VdbeMemSetRowSet(u.bw.pIdx); - if( (u.bw.pIdx->flags & MEM_RowSet)==0 ) goto no_mem; - } - sqlite3RowSetInsert(u.bw.pIdx->u.pRowSet, u.bw.pVal->u.i); +case OP_RowSetAdd: { /* in1, in2 */ + pIn1 = &aMem[pOp->p1]; + pIn2 = &aMem[pOp->p2]; + assert( (pIn2->flags & MEM_Int)!=0 ); + if( (pIn1->flags & MEM_RowSet)==0 ){ + sqlite3VdbeMemSetRowSet(pIn1); + if( (pIn1->flags & MEM_RowSet)==0 ) goto no_mem; + } + sqlite3RowSetInsert(pIn1->u.pRowSet, pIn2->u.i); break; } @@ -56681,25 +56943,21 @@ case OP_RowSetAdd: { /* in2 */ ** register P3. Or, if boolean index P1 is initially empty, leave P3 ** unchanged and jump to instruction P2. */ -case OP_RowSetRead: { /* jump, out3 */ -#if 0 /* local variables moved into u.bx */ - Mem *pIdx; +case OP_RowSetRead: { /* jump, in1, out3 */ +#if 0 /* local variables moved into u.bw */ i64 val; -#endif /* local variables moved into u.bx */ - assert( pOp->p1>0 && pOp->p1<=p->nMem ); +#endif /* local variables moved into u.bw */ CHECK_FOR_INTERRUPT; - u.bx.pIdx = &p->aMem[pOp->p1]; - pOut = &p->aMem[pOp->p3]; - if( (u.bx.pIdx->flags & MEM_RowSet)==0 - || sqlite3RowSetNext(u.bx.pIdx->u.pRowSet, &u.bx.val)==0 + pIn1 = &aMem[pOp->p1]; + if( (pIn1->flags & MEM_RowSet)==0 + || sqlite3RowSetNext(pIn1->u.pRowSet, &u.bw.val)==0 ){ /* The boolean index is empty */ - sqlite3VdbeMemSetNull(u.bx.pIdx); + sqlite3VdbeMemSetNull(pIn1); pc = pOp->p2 - 1; }else{ /* A value was pulled from the index */ - assert( pOp->p3>0 && pOp->p3<=p->nMem ); - sqlite3VdbeMemSetInt64(pOut, u.bx.val); + sqlite3VdbeMemSetInt64(&aMem[pOp->p3], u.bw.val); } break; } @@ -56728,12 +56986,14 @@ case OP_RowSetRead: { /* jump, out3 */ ** inserted as part of some other set). */ case OP_RowSetTest: { /* jump, in1, in3 */ -#if 0 /* local variables moved into u.by */ +#if 0 /* local variables moved into u.bx */ int iSet; int exists; -#endif /* local variables moved into u.by */ +#endif /* local variables moved into u.bx */ - u.by.iSet = pOp->p4.i; + pIn1 = &aMem[pOp->p1]; + pIn3 = &aMem[pOp->p3]; + u.bx.iSet = pOp->p4.i; assert( pIn3->flags&MEM_Int ); /* If there is anything other than a rowset object in memory cell P1, @@ -56745,17 +57005,17 @@ case OP_RowSetTest: { /* jump, in1, in3 */ } assert( pOp->p4type==P4_INT32 ); - assert( u.by.iSet==-1 || u.by.iSet>=0 ); - if( u.by.iSet ){ - u.by.exists = sqlite3RowSetTest(pIn1->u.pRowSet, - (u8)(u.by.iSet>=0 ? u.by.iSet & 0xf : 0xff), + assert( u.bx.iSet==-1 || u.bx.iSet>=0 ); + if( u.bx.iSet ){ + u.bx.exists = sqlite3RowSetTest(pIn1->u.pRowSet, + (u8)(u.bx.iSet>=0 ? u.bx.iSet & 0xf : 0xff), pIn3->u.i); - if( u.by.exists ){ + if( u.bx.exists ){ pc = pOp->p2 - 1; break; } } - if( u.by.iSet>=0 ){ + if( u.bx.iSet>=0 ){ sqlite3RowSetInsert(pIn1->u.pRowSet, pIn3->u.i); } break; @@ -56778,7 +57038,7 @@ case OP_RowSetTest: { /* jump, in1, in3 */ ** P4 is a pointer to the VM containing the trigger program. */ case OP_Program: { /* jump */ -#if 0 /* local variables moved into u.bz */ +#if 0 /* local variables moved into u.by */ int nMem; /* Number of memory registers for sub-program */ int nByte; /* Bytes of runtime space required for sub-program */ Mem *pRt; /* Register to allocate runtime space */ @@ -56787,11 +57047,11 @@ case OP_Program: { /* jump */ VdbeFrame *pFrame; /* New vdbe frame to execute in */ SubProgram *pProgram; /* Sub-program to execute */ void *t; /* Token identifying trigger */ -#endif /* local variables moved into u.bz */ +#endif /* local variables moved into u.by */ - u.bz.pProgram = pOp->p4.pProgram; - u.bz.pRt = &p->aMem[pOp->p3]; - assert( u.bz.pProgram->nOp>0 ); + u.by.pProgram = pOp->p4.pProgram; + u.by.pRt = &aMem[pOp->p3]; + assert( u.by.pProgram->nOp>0 ); /* If the p5 flag is clear, then recursive invocation of triggers is ** disabled for backwards compatibility (p5 is set if this sub-program @@ -56805,9 +57065,9 @@ case OP_Program: { /* jump */ ** single trigger all have the same value for the SubProgram.token ** variable. */ if( pOp->p5 ){ - u.bz.t = u.bz.pProgram->token; - for(u.bz.pFrame=p->pFrame; u.bz.pFrame && u.bz.pFrame->token!=u.bz.t; u.bz.pFrame=u.bz.pFrame->pParent); - if( u.bz.pFrame ) break; + u.by.t = u.by.pProgram->token; + for(u.by.pFrame=p->pFrame; u.by.pFrame && u.by.pFrame->token!=u.by.t; u.by.pFrame=u.by.pFrame->pParent); + if( u.by.pFrame ) break; } if( p->nFrame>=db->aLimit[SQLITE_LIMIT_TRIGGER_DEPTH] ){ @@ -56816,64 +57076,64 @@ case OP_Program: { /* jump */ break; } - /* Register u.bz.pRt is used to store the memory required to save the state + /* Register u.by.pRt is used to store the memory required to save the state ** of the current program, and the memory required at runtime to execute - ** the trigger program. If this trigger has been fired before, then u.bz.pRt + ** the trigger program. If this trigger has been fired before, then u.by.pRt ** is already allocated. Otherwise, it must be initialized. */ - if( (u.bz.pRt->flags&MEM_Frame)==0 ){ + if( (u.by.pRt->flags&MEM_Frame)==0 ){ /* SubProgram.nMem is set to the number of memory cells used by the ** program stored in SubProgram.aOp. As well as these, one memory ** cell is required for each cursor used by the program. Set local - ** variable u.bz.nMem (and later, VdbeFrame.nChildMem) to this value. + ** variable u.by.nMem (and later, VdbeFrame.nChildMem) to this value. */ - u.bz.nMem = u.bz.pProgram->nMem + u.bz.pProgram->nCsr; - u.bz.nByte = ROUND8(sizeof(VdbeFrame)) - + u.bz.nMem * sizeof(Mem) - + u.bz.pProgram->nCsr * sizeof(VdbeCursor *); - u.bz.pFrame = sqlite3DbMallocZero(db, u.bz.nByte); - if( !u.bz.pFrame ){ + u.by.nMem = u.by.pProgram->nMem + u.by.pProgram->nCsr; + u.by.nByte = ROUND8(sizeof(VdbeFrame)) + + u.by.nMem * sizeof(Mem) + + u.by.pProgram->nCsr * sizeof(VdbeCursor *); + u.by.pFrame = sqlite3DbMallocZero(db, u.by.nByte); + if( !u.by.pFrame ){ goto no_mem; } - sqlite3VdbeMemRelease(u.bz.pRt); - u.bz.pRt->flags = MEM_Frame; - u.bz.pRt->u.pFrame = u.bz.pFrame; - - u.bz.pFrame->v = p; - u.bz.pFrame->nChildMem = u.bz.nMem; - u.bz.pFrame->nChildCsr = u.bz.pProgram->nCsr; - u.bz.pFrame->pc = pc; - u.bz.pFrame->aMem = p->aMem; - u.bz.pFrame->nMem = p->nMem; - u.bz.pFrame->apCsr = p->apCsr; - u.bz.pFrame->nCursor = p->nCursor; - u.bz.pFrame->aOp = p->aOp; - u.bz.pFrame->nOp = p->nOp; - u.bz.pFrame->token = u.bz.pProgram->token; - - u.bz.pEnd = &VdbeFrameMem(u.bz.pFrame)[u.bz.pFrame->nChildMem]; - for(u.bz.pMem=VdbeFrameMem(u.bz.pFrame); u.bz.pMem!=u.bz.pEnd; u.bz.pMem++){ - u.bz.pMem->flags = MEM_Null; - u.bz.pMem->db = db; + sqlite3VdbeMemRelease(u.by.pRt); + u.by.pRt->flags = MEM_Frame; + u.by.pRt->u.pFrame = u.by.pFrame; + + u.by.pFrame->v = p; + u.by.pFrame->nChildMem = u.by.nMem; + u.by.pFrame->nChildCsr = u.by.pProgram->nCsr; + u.by.pFrame->pc = pc; + u.by.pFrame->aMem = p->aMem; + u.by.pFrame->nMem = p->nMem; + u.by.pFrame->apCsr = p->apCsr; + u.by.pFrame->nCursor = p->nCursor; + u.by.pFrame->aOp = p->aOp; + u.by.pFrame->nOp = p->nOp; + u.by.pFrame->token = u.by.pProgram->token; + + u.by.pEnd = &VdbeFrameMem(u.by.pFrame)[u.by.pFrame->nChildMem]; + for(u.by.pMem=VdbeFrameMem(u.by.pFrame); u.by.pMem!=u.by.pEnd; u.by.pMem++){ + u.by.pMem->flags = MEM_Null; + u.by.pMem->db = db; } }else{ - u.bz.pFrame = u.bz.pRt->u.pFrame; - assert( u.bz.pProgram->nMem+u.bz.pProgram->nCsr==u.bz.pFrame->nChildMem ); - assert( u.bz.pProgram->nCsr==u.bz.pFrame->nChildCsr ); - assert( pc==u.bz.pFrame->pc ); + u.by.pFrame = u.by.pRt->u.pFrame; + assert( u.by.pProgram->nMem+u.by.pProgram->nCsr==u.by.pFrame->nChildMem ); + assert( u.by.pProgram->nCsr==u.by.pFrame->nChildCsr ); + assert( pc==u.by.pFrame->pc ); } p->nFrame++; - u.bz.pFrame->pParent = p->pFrame; - u.bz.pFrame->lastRowid = db->lastRowid; - u.bz.pFrame->nChange = p->nChange; + u.by.pFrame->pParent = p->pFrame; + u.by.pFrame->lastRowid = db->lastRowid; + u.by.pFrame->nChange = p->nChange; p->nChange = 0; - p->pFrame = u.bz.pFrame; - p->aMem = &VdbeFrameMem(u.bz.pFrame)[-1]; - p->nMem = u.bz.pFrame->nChildMem; - p->nCursor = (u16)u.bz.pFrame->nChildCsr; - p->apCsr = (VdbeCursor **)&p->aMem[p->nMem+1]; - p->aOp = u.bz.pProgram->aOp; - p->nOp = u.bz.pProgram->nOp; + p->pFrame = u.by.pFrame; + p->aMem = aMem = &VdbeFrameMem(u.by.pFrame)[-1]; + p->nMem = u.by.pFrame->nChildMem; + p->nCursor = (u16)u.by.pFrame->nChildCsr; + p->apCsr = (VdbeCursor **)&aMem[p->nMem+1]; + p->aOp = aOp = u.by.pProgram->aOp; + p->nOp = u.by.pProgram->nOp; pc = -1; break; @@ -56892,13 +57152,13 @@ case OP_Program: { /* jump */ ** calling OP_Program instruction. */ case OP_Param: { /* out2-prerelease */ -#if 0 /* local variables moved into u.ca */ +#if 0 /* local variables moved into u.bz */ VdbeFrame *pFrame; Mem *pIn; -#endif /* local variables moved into u.ca */ - u.ca.pFrame = p->pFrame; - u.ca.pIn = &u.ca.pFrame->aMem[pOp->p1 + u.ca.pFrame->aOp[u.ca.pFrame->pc].p1]; - sqlite3VdbeMemShallowCopy(pOut, u.ca.pIn, MEM_Ephem); +#endif /* local variables moved into u.bz */ + u.bz.pFrame = p->pFrame; + u.bz.pIn = &u.bz.pFrame->aMem[pOp->p1 + u.bz.pFrame->aOp[u.bz.pFrame->pc].p1]; + sqlite3VdbeMemShallowCopy(pOut, u.bz.pIn, MEM_Ephem); break; } @@ -56954,20 +57214,21 @@ case OP_FkIfZero: { /* jump */ ** an integer. */ case OP_MemMax: { /* in2 */ -#if 0 /* local variables moved into u.cb */ +#if 0 /* local variables moved into u.ca */ Mem *pIn1; VdbeFrame *pFrame; -#endif /* local variables moved into u.cb */ +#endif /* local variables moved into u.ca */ if( p->pFrame ){ - for(u.cb.pFrame=p->pFrame; u.cb.pFrame->pParent; u.cb.pFrame=u.cb.pFrame->pParent); - u.cb.pIn1 = &u.cb.pFrame->aMem[pOp->p1]; + for(u.ca.pFrame=p->pFrame; u.ca.pFrame->pParent; u.ca.pFrame=u.ca.pFrame->pParent); + u.ca.pIn1 = &u.ca.pFrame->aMem[pOp->p1]; }else{ - u.cb.pIn1 = &p->aMem[pOp->p1]; + u.ca.pIn1 = &aMem[pOp->p1]; } - sqlite3VdbeMemIntegerify(u.cb.pIn1); + sqlite3VdbeMemIntegerify(u.ca.pIn1); + pIn2 = &aMem[pOp->p2]; sqlite3VdbeMemIntegerify(pIn2); - if( u.cb.pIn1->u.iu.i){ - u.cb.pIn1->u.i = pIn2->u.i; + if( u.ca.pIn1->u.iu.i){ + u.ca.pIn1->u.i = pIn2->u.i; } break; } @@ -56981,6 +57242,7 @@ case OP_MemMax: { /* in2 */ ** not contain an integer. An assertion fault will result if you try. */ case OP_IfPos: { /* jump, in1 */ + pIn1 = &aMem[pOp->p1]; assert( pIn1->flags&MEM_Int ); if( pIn1->u.i>0 ){ pc = pOp->p2 - 1; @@ -56996,6 +57258,7 @@ case OP_IfPos: { /* jump, in1 */ ** not contain an integer. An assertion fault will result if you try. */ case OP_IfNeg: { /* jump, in1 */ + pIn1 = &aMem[pOp->p1]; assert( pIn1->flags&MEM_Int ); if( pIn1->u.i<0 ){ pc = pOp->p2 - 1; @@ -57003,15 +57266,18 @@ case OP_IfNeg: { /* jump, in1 */ break; } -/* Opcode: IfZero P1 P2 * * * +/* Opcode: IfZero P1 P2 P3 * * ** -** If the value of register P1 is exactly 0, jump to P2. +** The register P1 must contain an integer. Add literal P3 to the +** value in register P1. If the result is exactly 0, jump to P2. ** ** It is illegal to use this instruction on a register that does ** not contain an integer. An assertion fault will result if you try. */ case OP_IfZero: { /* jump, in1 */ + pIn1 = &aMem[pOp->p1]; assert( pIn1->flags&MEM_Int ); + pIn1->u.i += pOp->p3; if( pIn1->u.i==0 ){ pc = pOp->p2 - 1; } @@ -57029,47 +57295,47 @@ case OP_IfZero: { /* jump, in1 */ ** successors. */ case OP_AggStep: { -#if 0 /* local variables moved into u.cc */ +#if 0 /* local variables moved into u.cb */ int n; int i; Mem *pMem; Mem *pRec; sqlite3_context ctx; sqlite3_value **apVal; -#endif /* local variables moved into u.cc */ +#endif /* local variables moved into u.cb */ - u.cc.n = pOp->p5; - assert( u.cc.n>=0 ); - u.cc.pRec = &p->aMem[pOp->p2]; - u.cc.apVal = p->apArg; - assert( u.cc.apVal || u.cc.n==0 ); - for(u.cc.i=0; u.cc.ip5; + assert( u.cb.n>=0 ); + u.cb.pRec = &aMem[pOp->p2]; + u.cb.apVal = p->apArg; + assert( u.cb.apVal || u.cb.n==0 ); + for(u.cb.i=0; u.cb.ip4.pFunc; + u.cb.ctx.pFunc = pOp->p4.pFunc; assert( pOp->p3>0 && pOp->p3<=p->nMem ); - u.cc.ctx.pMem = u.cc.pMem = &p->aMem[pOp->p3]; - u.cc.pMem->n++; - u.cc.ctx.s.flags = MEM_Null; - u.cc.ctx.s.z = 0; - u.cc.ctx.s.zMalloc = 0; - u.cc.ctx.s.xDel = 0; - u.cc.ctx.s.db = db; - u.cc.ctx.isError = 0; - u.cc.ctx.pColl = 0; - if( u.cc.ctx.pFunc->flags & SQLITE_FUNC_NEEDCOLL ){ + u.cb.ctx.pMem = u.cb.pMem = &aMem[pOp->p3]; + u.cb.pMem->n++; + u.cb.ctx.s.flags = MEM_Null; + u.cb.ctx.s.z = 0; + u.cb.ctx.s.zMalloc = 0; + u.cb.ctx.s.xDel = 0; + u.cb.ctx.s.db = db; + u.cb.ctx.isError = 0; + u.cb.ctx.pColl = 0; + if( u.cb.ctx.pFunc->flags & SQLITE_FUNC_NEEDCOLL ){ assert( pOp>p->aOp ); assert( pOp[-1].p4type==P4_COLLSEQ ); assert( pOp[-1].opcode==OP_CollSeq ); - u.cc.ctx.pColl = pOp[-1].p4.pColl; + u.cb.ctx.pColl = pOp[-1].p4.pColl; } - (u.cc.ctx.pFunc->xStep)(&u.cc.ctx, u.cc.n, u.cc.apVal); - if( u.cc.ctx.isError ){ - sqlite3SetString(&p->zErrMsg, db, "%s", sqlite3_value_text(&u.cc.ctx.s)); - rc = u.cc.ctx.isError; + (u.cb.ctx.pFunc->xStep)(&u.cb.ctx, u.cb.n, u.cb.apVal); + if( u.cb.ctx.isError ){ + sqlite3SetString(&p->zErrMsg, db, "%s", sqlite3_value_text(&u.cb.ctx.s)); + rc = u.cb.ctx.isError; } - sqlite3VdbeMemRelease(&u.cc.ctx.s); + sqlite3VdbeMemRelease(&u.cb.ctx.s); break; } @@ -57086,19 +57352,19 @@ case OP_AggStep: { ** the step function was not previously called. */ case OP_AggFinal: { -#if 0 /* local variables moved into u.cd */ +#if 0 /* local variables moved into u.cc */ Mem *pMem; -#endif /* local variables moved into u.cd */ +#endif /* local variables moved into u.cc */ assert( pOp->p1>0 && pOp->p1<=p->nMem ); - u.cd.pMem = &p->aMem[pOp->p1]; - assert( (u.cd.pMem->flags & ~(MEM_Null|MEM_Agg))==0 ); - rc = sqlite3VdbeMemFinalize(u.cd.pMem, pOp->p4.pFunc); + u.cc.pMem = &aMem[pOp->p1]; + assert( (u.cc.pMem->flags & ~(MEM_Null|MEM_Agg))==0 ); + rc = sqlite3VdbeMemFinalize(u.cc.pMem, pOp->p4.pFunc); if( rc ){ - sqlite3SetString(&p->zErrMsg, db, "%s", sqlite3_value_text(u.cd.pMem)); + sqlite3SetString(&p->zErrMsg, db, "%s", sqlite3_value_text(u.cc.pMem)); } - sqlite3VdbeChangeEncoding(u.cd.pMem, encoding); - UPDATE_MAX_BLOBSIZE(u.cd.pMem); - if( sqlite3VdbeMemTooBig(u.cd.pMem) ){ + sqlite3VdbeChangeEncoding(u.cc.pMem, encoding); + UPDATE_MAX_BLOBSIZE(u.cc.pMem); + if( sqlite3VdbeMemTooBig(u.cc.pMem) ){ goto too_big; } break; @@ -57128,14 +57394,14 @@ case OP_Vacuum: { ** P2. Otherwise, fall through to the next instruction. */ case OP_IncrVacuum: { /* jump */ -#if 0 /* local variables moved into u.ce */ +#if 0 /* local variables moved into u.cd */ Btree *pBt; -#endif /* local variables moved into u.ce */ +#endif /* local variables moved into u.cd */ assert( pOp->p1>=0 && pOp->p1nDb ); assert( (p->btreeMask & (1<p1))!=0 ); - u.ce.pBt = db->aDb[pOp->p1].pBt; - rc = sqlite3BtreeIncrVacuum(u.ce.pBt); + u.cd.pBt = db->aDb[pOp->p1].pBt; + rc = sqlite3BtreeIncrVacuum(u.cd.pBt); if( rc==SQLITE_DONE ){ pc = pOp->p2 - 1; rc = SQLITE_OK; @@ -57205,15 +57471,15 @@ case OP_TableLock: { ** code will be set to SQLITE_LOCKED. */ case OP_VBegin: { -#if 0 /* local variables moved into u.cf */ +#if 0 /* local variables moved into u.ce */ VTable *pVTab; -#endif /* local variables moved into u.cf */ - u.cf.pVTab = pOp->p4.pVtab; - rc = sqlite3VtabBegin(db, u.cf.pVTab); - if( u.cf.pVTab ){ +#endif /* local variables moved into u.ce */ + u.ce.pVTab = pOp->p4.pVtab; + rc = sqlite3VtabBegin(db, u.ce.pVTab); + if( u.ce.pVTab ){ sqlite3DbFree(db, p->zErrMsg); - p->zErrMsg = u.cf.pVTab->pVtab->zErrMsg; - u.cf.pVTab->pVtab->zErrMsg = 0; + p->zErrMsg = u.ce.pVTab->pVtab->zErrMsg; + u.ce.pVTab->pVtab->zErrMsg = 0; } break; } @@ -57253,36 +57519,36 @@ case OP_VDestroy: { ** table and stores that cursor in P1. */ case OP_VOpen: { -#if 0 /* local variables moved into u.cg */ +#if 0 /* local variables moved into u.cf */ VdbeCursor *pCur; sqlite3_vtab_cursor *pVtabCursor; sqlite3_vtab *pVtab; sqlite3_module *pModule; -#endif /* local variables moved into u.cg */ +#endif /* local variables moved into u.cf */ - u.cg.pCur = 0; - u.cg.pVtabCursor = 0; - u.cg.pVtab = pOp->p4.pVtab->pVtab; - u.cg.pModule = (sqlite3_module *)u.cg.pVtab->pModule; - assert(u.cg.pVtab && u.cg.pModule); + u.cf.pCur = 0; + u.cf.pVtabCursor = 0; + u.cf.pVtab = pOp->p4.pVtab->pVtab; + u.cf.pModule = (sqlite3_module *)u.cf.pVtab->pModule; + assert(u.cf.pVtab && u.cf.pModule); if( sqlite3SafetyOff(db) ) goto abort_due_to_misuse; - rc = u.cg.pModule->xOpen(u.cg.pVtab, &u.cg.pVtabCursor); + rc = u.cf.pModule->xOpen(u.cf.pVtab, &u.cf.pVtabCursor); sqlite3DbFree(db, p->zErrMsg); - p->zErrMsg = u.cg.pVtab->zErrMsg; - u.cg.pVtab->zErrMsg = 0; + p->zErrMsg = u.cf.pVtab->zErrMsg; + u.cf.pVtab->zErrMsg = 0; if( sqlite3SafetyOn(db) ) goto abort_due_to_misuse; if( SQLITE_OK==rc ){ /* Initialize sqlite3_vtab_cursor base class */ - u.cg.pVtabCursor->pVtab = u.cg.pVtab; + u.cf.pVtabCursor->pVtab = u.cf.pVtab; /* Initialise vdbe cursor object */ - u.cg.pCur = allocateCursor(p, pOp->p1, 0, -1, 0); - if( u.cg.pCur ){ - u.cg.pCur->pVtabCursor = u.cg.pVtabCursor; - u.cg.pCur->pModule = u.cg.pVtabCursor->pVtab->pModule; + u.cf.pCur = allocateCursor(p, pOp->p1, 0, -1, 0); + if( u.cf.pCur ){ + u.cf.pCur->pVtabCursor = u.cf.pVtabCursor; + u.cf.pCur->pModule = u.cf.pVtabCursor->pVtab->pModule; }else{ db->mallocFailed = 1; - u.cg.pModule->xClose(u.cg.pVtabCursor); + u.cf.pModule->xClose(u.cf.pVtabCursor); } } break; @@ -57309,7 +57575,7 @@ case OP_VOpen: { ** A jump is made to P2 if the result set after filtering would be empty. */ case OP_VFilter: { /* jump */ -#if 0 /* local variables moved into u.ch */ +#if 0 /* local variables moved into u.cg */ int nArg; int iQuery; const sqlite3_module *pModule; @@ -57321,48 +57587,48 @@ case OP_VFilter: { /* jump */ int res; int i; Mem **apArg; -#endif /* local variables moved into u.ch */ +#endif /* local variables moved into u.cg */ - u.ch.pQuery = &p->aMem[pOp->p3]; - u.ch.pArgc = &u.ch.pQuery[1]; - u.ch.pCur = p->apCsr[pOp->p1]; - REGISTER_TRACE(pOp->p3, u.ch.pQuery); - assert( u.ch.pCur->pVtabCursor ); - u.ch.pVtabCursor = u.ch.pCur->pVtabCursor; - u.ch.pVtab = u.ch.pVtabCursor->pVtab; - u.ch.pModule = u.ch.pVtab->pModule; + u.cg.pQuery = &aMem[pOp->p3]; + u.cg.pArgc = &u.cg.pQuery[1]; + u.cg.pCur = p->apCsr[pOp->p1]; + REGISTER_TRACE(pOp->p3, u.cg.pQuery); + assert( u.cg.pCur->pVtabCursor ); + u.cg.pVtabCursor = u.cg.pCur->pVtabCursor; + u.cg.pVtab = u.cg.pVtabCursor->pVtab; + u.cg.pModule = u.cg.pVtab->pModule; /* Grab the index number and argc parameters */ - assert( (u.ch.pQuery->flags&MEM_Int)!=0 && u.ch.pArgc->flags==MEM_Int ); - u.ch.nArg = (int)u.ch.pArgc->u.i; - u.ch.iQuery = (int)u.ch.pQuery->u.i; + assert( (u.cg.pQuery->flags&MEM_Int)!=0 && u.cg.pArgc->flags==MEM_Int ); + u.cg.nArg = (int)u.cg.pArgc->u.i; + u.cg.iQuery = (int)u.cg.pQuery->u.i; /* Invoke the xFilter method */ { - u.ch.res = 0; - u.ch.apArg = p->apArg; - for(u.ch.i = 0; u.ch.iapArg; + for(u.cg.i = 0; u.cg.iinVtabMethod = 1; - rc = u.ch.pModule->xFilter(u.ch.pVtabCursor, u.ch.iQuery, pOp->p4.z, u.ch.nArg, u.ch.apArg); + rc = u.cg.pModule->xFilter(u.cg.pVtabCursor, u.cg.iQuery, pOp->p4.z, u.cg.nArg, u.cg.apArg); p->inVtabMethod = 0; sqlite3DbFree(db, p->zErrMsg); - p->zErrMsg = u.ch.pVtab->zErrMsg; - u.ch.pVtab->zErrMsg = 0; + p->zErrMsg = u.cg.pVtab->zErrMsg; + u.cg.pVtab->zErrMsg = 0; if( rc==SQLITE_OK ){ - u.ch.res = u.ch.pModule->xEof(u.ch.pVtabCursor); + u.cg.res = u.cg.pModule->xEof(u.cg.pVtabCursor); } if( sqlite3SafetyOn(db) ) goto abort_due_to_misuse; - if( u.ch.res ){ + if( u.cg.res ){ pc = pOp->p2 - 1; } } - u.ch.pCur->nullRow = 0; + u.cg.pCur->nullRow = 0; break; } @@ -57376,56 +57642,56 @@ case OP_VFilter: { /* jump */ ** P1 cursor is pointing to into register P3. */ case OP_VColumn: { -#if 0 /* local variables moved into u.ci */ +#if 0 /* local variables moved into u.ch */ sqlite3_vtab *pVtab; const sqlite3_module *pModule; Mem *pDest; sqlite3_context sContext; -#endif /* local variables moved into u.ci */ +#endif /* local variables moved into u.ch */ VdbeCursor *pCur = p->apCsr[pOp->p1]; assert( pCur->pVtabCursor ); assert( pOp->p3>0 && pOp->p3<=p->nMem ); - u.ci.pDest = &p->aMem[pOp->p3]; + u.ch.pDest = &aMem[pOp->p3]; if( pCur->nullRow ){ - sqlite3VdbeMemSetNull(u.ci.pDest); + sqlite3VdbeMemSetNull(u.ch.pDest); break; } - u.ci.pVtab = pCur->pVtabCursor->pVtab; - u.ci.pModule = u.ci.pVtab->pModule; - assert( u.ci.pModule->xColumn ); - memset(&u.ci.sContext, 0, sizeof(u.ci.sContext)); + u.ch.pVtab = pCur->pVtabCursor->pVtab; + u.ch.pModule = u.ch.pVtab->pModule; + assert( u.ch.pModule->xColumn ); + memset(&u.ch.sContext, 0, sizeof(u.ch.sContext)); /* The output cell may already have a buffer allocated. Move - ** the current contents to u.ci.sContext.s so in case the user-function + ** the current contents to u.ch.sContext.s so in case the user-function ** can use the already allocated buffer instead of allocating a ** new one. */ - sqlite3VdbeMemMove(&u.ci.sContext.s, u.ci.pDest); - MemSetTypeFlag(&u.ci.sContext.s, MEM_Null); + sqlite3VdbeMemMove(&u.ch.sContext.s, u.ch.pDest); + MemSetTypeFlag(&u.ch.sContext.s, MEM_Null); if( sqlite3SafetyOff(db) ) goto abort_due_to_misuse; - rc = u.ci.pModule->xColumn(pCur->pVtabCursor, &u.ci.sContext, pOp->p2); + rc = u.ch.pModule->xColumn(pCur->pVtabCursor, &u.ch.sContext, pOp->p2); sqlite3DbFree(db, p->zErrMsg); - p->zErrMsg = u.ci.pVtab->zErrMsg; - u.ci.pVtab->zErrMsg = 0; - if( u.ci.sContext.isError ){ - rc = u.ci.sContext.isError; + p->zErrMsg = u.ch.pVtab->zErrMsg; + u.ch.pVtab->zErrMsg = 0; + if( u.ch.sContext.isError ){ + rc = u.ch.sContext.isError; } /* Copy the result of the function to the P3 register. We ** do this regardless of whether or not an error occurred to ensure any - ** dynamic allocation in u.ci.sContext.s (a Mem struct) is released. + ** dynamic allocation in u.ch.sContext.s (a Mem struct) is released. */ - sqlite3VdbeChangeEncoding(&u.ci.sContext.s, encoding); - REGISTER_TRACE(pOp->p3, u.ci.pDest); - sqlite3VdbeMemMove(u.ci.pDest, &u.ci.sContext.s); - UPDATE_MAX_BLOBSIZE(u.ci.pDest); + sqlite3VdbeChangeEncoding(&u.ch.sContext.s, encoding); + sqlite3VdbeMemMove(u.ch.pDest, &u.ch.sContext.s); + REGISTER_TRACE(pOp->p3, u.ch.pDest); + UPDATE_MAX_BLOBSIZE(u.ch.pDest); if( sqlite3SafetyOn(db) ){ goto abort_due_to_misuse; } - if( sqlite3VdbeMemTooBig(u.ci.pDest) ){ + if( sqlite3VdbeMemTooBig(u.ch.pDest) ){ goto too_big; } break; @@ -57440,22 +57706,22 @@ case OP_VColumn: { ** the end of its result set, then fall through to the next instruction. */ case OP_VNext: { /* jump */ -#if 0 /* local variables moved into u.cj */ +#if 0 /* local variables moved into u.ci */ sqlite3_vtab *pVtab; const sqlite3_module *pModule; int res; VdbeCursor *pCur; -#endif /* local variables moved into u.cj */ +#endif /* local variables moved into u.ci */ - u.cj.res = 0; - u.cj.pCur = p->apCsr[pOp->p1]; - assert( u.cj.pCur->pVtabCursor ); - if( u.cj.pCur->nullRow ){ + u.ci.res = 0; + u.ci.pCur = p->apCsr[pOp->p1]; + assert( u.ci.pCur->pVtabCursor ); + if( u.ci.pCur->nullRow ){ break; } - u.cj.pVtab = u.cj.pCur->pVtabCursor->pVtab; - u.cj.pModule = u.cj.pVtab->pModule; - assert( u.cj.pModule->xNext ); + u.ci.pVtab = u.ci.pCur->pVtabCursor->pVtab; + u.ci.pModule = u.ci.pVtab->pModule; + assert( u.ci.pModule->xNext ); /* Invoke the xNext() method of the module. There is no way for the ** underlying implementation to return an error if one occurs during @@ -57465,17 +57731,17 @@ case OP_VNext: { /* jump */ */ if( sqlite3SafetyOff(db) ) goto abort_due_to_misuse; p->inVtabMethod = 1; - rc = u.cj.pModule->xNext(u.cj.pCur->pVtabCursor); + rc = u.ci.pModule->xNext(u.ci.pCur->pVtabCursor); p->inVtabMethod = 0; sqlite3DbFree(db, p->zErrMsg); - p->zErrMsg = u.cj.pVtab->zErrMsg; - u.cj.pVtab->zErrMsg = 0; + p->zErrMsg = u.ci.pVtab->zErrMsg; + u.ci.pVtab->zErrMsg = 0; if( rc==SQLITE_OK ){ - u.cj.res = u.cj.pModule->xEof(u.cj.pCur->pVtabCursor); + u.ci.res = u.ci.pModule->xEof(u.ci.pCur->pVtabCursor); } if( sqlite3SafetyOn(db) ) goto abort_due_to_misuse; - if( !u.cj.res ){ + if( !u.ci.res ){ /* If there is data, jump to P2 */ pc = pOp->p2 - 1; } @@ -57491,21 +57757,21 @@ case OP_VNext: { /* jump */ ** in register P1 is passed as the zName argument to the xRename method. */ case OP_VRename: { -#if 0 /* local variables moved into u.ck */ +#if 0 /* local variables moved into u.cj */ sqlite3_vtab *pVtab; Mem *pName; -#endif /* local variables moved into u.ck */ +#endif /* local variables moved into u.cj */ - u.ck.pVtab = pOp->p4.pVtab->pVtab; - u.ck.pName = &p->aMem[pOp->p1]; - assert( u.ck.pVtab->pModule->xRename ); - REGISTER_TRACE(pOp->p1, u.ck.pName); - assert( u.ck.pName->flags & MEM_Str ); + u.cj.pVtab = pOp->p4.pVtab->pVtab; + u.cj.pName = &aMem[pOp->p1]; + assert( u.cj.pVtab->pModule->xRename ); + REGISTER_TRACE(pOp->p1, u.cj.pName); + assert( u.cj.pName->flags & MEM_Str ); if( sqlite3SafetyOff(db) ) goto abort_due_to_misuse; - rc = u.ck.pVtab->pModule->xRename(u.ck.pVtab, u.ck.pName->z); + rc = u.cj.pVtab->pModule->xRename(u.cj.pVtab, u.cj.pName->z); sqlite3DbFree(db, p->zErrMsg); - p->zErrMsg = u.ck.pVtab->zErrMsg; - u.ck.pVtab->zErrMsg = 0; + p->zErrMsg = u.cj.pVtab->zErrMsg; + u.cj.pVtab->zErrMsg = 0; if( sqlite3SafetyOn(db) ) goto abort_due_to_misuse; break; @@ -57537,7 +57803,7 @@ case OP_VRename: { ** is set to the value of the rowid for the row just inserted. */ case OP_VUpdate: { -#if 0 /* local variables moved into u.cl */ +#if 0 /* local variables moved into u.ck */ sqlite3_vtab *pVtab; sqlite3_module *pModule; int nArg; @@ -57545,29 +57811,29 @@ case OP_VUpdate: { sqlite_int64 rowid; Mem **apArg; Mem *pX; -#endif /* local variables moved into u.cl */ +#endif /* local variables moved into u.ck */ - u.cl.pVtab = pOp->p4.pVtab->pVtab; - u.cl.pModule = (sqlite3_module *)u.cl.pVtab->pModule; - u.cl.nArg = pOp->p2; + u.ck.pVtab = pOp->p4.pVtab->pVtab; + u.ck.pModule = (sqlite3_module *)u.ck.pVtab->pModule; + u.ck.nArg = pOp->p2; assert( pOp->p4type==P4_VTAB ); - if( ALWAYS(u.cl.pModule->xUpdate) ){ - u.cl.apArg = p->apArg; - u.cl.pX = &p->aMem[pOp->p3]; - for(u.cl.i=0; u.cl.ixUpdate) ){ + u.ck.apArg = p->apArg; + u.ck.pX = &aMem[pOp->p3]; + for(u.ck.i=0; u.ck.ixUpdate(u.cl.pVtab, u.cl.nArg, u.cl.apArg, &u.cl.rowid); + rc = u.ck.pModule->xUpdate(u.ck.pVtab, u.ck.nArg, u.ck.apArg, &u.ck.rowid); sqlite3DbFree(db, p->zErrMsg); - p->zErrMsg = u.cl.pVtab->zErrMsg; - u.cl.pVtab->zErrMsg = 0; + p->zErrMsg = u.ck.pVtab->zErrMsg; + u.ck.pVtab->zErrMsg = 0; if( sqlite3SafetyOn(db) ) goto abort_due_to_misuse; if( rc==SQLITE_OK && pOp->p1 ){ - assert( u.cl.nArg>1 && u.cl.apArg[0] && (u.cl.apArg[0]->flags&MEM_Null) ); - db->lastRowid = u.cl.rowid; + assert( u.ck.nArg>1 && u.ck.apArg[0] && (u.ck.apArg[0]->flags&MEM_Null) ); + db->lastRowid = u.ck.rowid; } p->nChange++; } @@ -57581,21 +57847,20 @@ case OP_VUpdate: { ** Write the current number of pages in database P1 to memory cell P2. */ case OP_Pagecount: { /* out2-prerelease */ -#if 0 /* local variables moved into u.cm */ +#if 0 /* local variables moved into u.cl */ int p1; int nPage; Pager *pPager; -#endif /* local variables moved into u.cm */ +#endif /* local variables moved into u.cl */ - u.cm.p1 = pOp->p1; - u.cm.pPager = sqlite3BtreePager(db->aDb[u.cm.p1].pBt); - rc = sqlite3PagerPagecount(u.cm.pPager, &u.cm.nPage); + u.cl.p1 = pOp->p1; + u.cl.pPager = sqlite3BtreePager(db->aDb[u.cl.p1].pBt); + rc = sqlite3PagerPagecount(u.cl.pPager, &u.cl.nPage); /* OP_Pagecount is always called from within a read transaction. The ** page count has already been successfully read and cached. So the ** sqlite3PagerPagecount() call above cannot fail. */ if( ALWAYS(rc==SQLITE_OK) ){ - pOut->flags = MEM_Int; - pOut->u.i = u.cm.nPage; + pOut->u.i = u.cl.nPage; } break; } @@ -57608,18 +57873,20 @@ case OP_Pagecount: { /* out2-prerelease */ ** the UTF-8 string contained in P4 is emitted on the trace callback. */ case OP_Trace: { -#if 0 /* local variables moved into u.cn */ +#if 0 /* local variables moved into u.cm */ char *zTrace; -#endif /* local variables moved into u.cn */ +#endif /* local variables moved into u.cm */ - u.cn.zTrace = (pOp->p4.z ? pOp->p4.z : p->zSql); - if( u.cn.zTrace ){ + u.cm.zTrace = (pOp->p4.z ? pOp->p4.z : p->zSql); + if( u.cm.zTrace ){ if( db->xTrace ){ - db->xTrace(db->pTraceArg, u.cn.zTrace); + char *z = sqlite3VdbeExpandSql(p, u.cm.zTrace); + db->xTrace(db->pTraceArg, z); + sqlite3DbFree(db, z); } #ifdef SQLITE_DEBUG if( (db->flags & SQLITE_SqlTrace)!=0 ){ - sqlite3DebugPrintf("SQL-trace: %s\n", u.cn.zTrace); + sqlite3DebugPrintf("SQL-trace: %s\n", u.cm.zTrace); } #endif /* SQLITE_DEBUG */ } @@ -57658,7 +57925,7 @@ default: { /* This is really OP_Noop and OP_Explain */ pOp->cnt++; #if 0 fprintf(stdout, "%10llu ", elapsed); - sqlite3VdbePrintOp(stdout, origPc, &p->aOp[origPc]); + sqlite3VdbePrintOp(stdout, origPc, &aOp[origPc]); #endif } #endif @@ -57674,11 +57941,11 @@ default: { /* This is really OP_Noop and OP_Explain */ #ifdef SQLITE_DEBUG if( p->trace ){ if( rc!=0 ) fprintf(p->trace,"rc=%d\n",rc); - if( opProperty & OPFLG_OUT2_PRERELEASE ){ - registerTrace(p->trace, pOp->p2, pOut); + if( pOp->opflags & (OPFLG_OUT2_PRERELEASE|OPFLG_OUT2) ){ + registerTrace(p->trace, pOp->p2, &aMem[pOp->p2]); } - if( opProperty & OPFLG_OUT3 ){ - registerTrace(p->trace, pOp->p3, pOut); + if( pOp->opflags & OPFLG_OUT3 ){ + registerTrace(p->trace, pOp->p3, &aMem[pOp->p3]); } } #endif /* SQLITE_DEBUG */ @@ -57694,6 +57961,7 @@ vdbe_error_halt: sqlite3VdbeHalt(p); if( rc==SQLITE_IOERR_NOMEM ) db->mallocFailed = 1; rc = SQLITE_ERROR; + if( resetSchemaOnFault ) sqlite3ResetInternalSchema(db, 0); /* This is the only way out of this procedure. We have to ** release the mutexes on btrees that were acquired at the @@ -57761,8 +58029,6 @@ abort_due_to_interrupt: ************************************************************************* ** ** This file contains code used to implement incremental BLOB I/O. -** -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ @@ -58155,12 +58421,6 @@ SQLITE_API int sqlite3_blob_bytes(sqlite3_blob *pBlob){ ** ************************************************************************* ** -** @(#) $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ -*/ - -#ifdef SQLITE_ENABLE_ATOMIC_WRITE - -/* ** This file implements a special kind of sqlite3_file object used ** by SQLite to create journal files if the atomic-write optimization ** is enabled. @@ -58175,7 +58435,7 @@ SQLITE_API int sqlite3_blob_bytes(sqlite3_blob *pBlob){ ** buffer, or ** 2) The sqlite3JournalCreate() function is called. */ - +#ifdef SQLITE_ENABLE_ATOMIC_WRITE /* @@ -58400,8 +58660,6 @@ SQLITE_PRIVATE int sqlite3JournalSize(sqlite3_vfs *pVfs){ ** This file contains code use to implement an in-memory rollback journal. ** The in-memory rollback journal is used to journal transactions for ** ":memory:" databases and when the journal_mode=MEMORY pragma is used. -** -** @(#) $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ /* Forward references to internal structures */ @@ -58659,8 +58917,6 @@ SQLITE_PRIVATE int sqlite3MemJournalSize(void){ ************************************************************************* ** This file contains routines used for walking the parser tree for ** an SQL statement. -** -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ @@ -58799,8 +59055,6 @@ SQLITE_PRIVATE int sqlite3WalkSelect(Walker *pWalker, Select *p){ ** This file contains routines used for walking the parser tree and ** resolve all identifiers by associating them with a particular ** table and column. -** -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ /* @@ -58872,7 +59126,13 @@ static void resolveAlias( pDup->pColl = pExpr->pColl; pDup->flags |= EP_ExpCollate; } - sqlite3ExprClear(db, pExpr); + + /* Before calling sqlite3ExprDelete(), set the EP_Static flag. This + ** prevents ExprDelete() from deleting the Expr structure itself, + ** allowing it to be repopulated by the memcpy() on the following line. + */ + ExprSetProperty(pExpr, EP_Static); + sqlite3ExprDelete(db, pExpr); memcpy(pExpr, pDup, sizeof(*pExpr)); sqlite3DbFree(db, pDup); } @@ -59022,19 +59282,18 @@ static int lookupName( int iCol; pSchema = pTab->pSchema; cntTab++; - if( sqlite3IsRowid(zCol) ){ - iCol = -1; - }else{ - for(iCol=0; iColnCol; iCol++){ - Column *pCol = &pTab->aCol[iCol]; - if( sqlite3StrICmp(pCol->zName, zCol)==0 ){ - if( iCol==pTab->iPKey ){ - iCol = -1; - } - break; + for(iCol=0; iColnCol; iCol++){ + Column *pCol = &pTab->aCol[iCol]; + if( sqlite3StrICmp(pCol->zName, zCol)==0 ){ + if( iCol==pTab->iPKey ){ + iCol = -1; } + break; } } + if( iCol>=pTab->nCol && sqlite3IsRowid(zCol) ){ + iCol = -1; /* IMP: R-44911-55124 */ + } if( iColnCol ){ cnt++; if( iCol<0 ){ @@ -59043,6 +59302,10 @@ static int lookupName( testcase( iCol==31 ); testcase( iCol==32 ); pParse->oldmask |= (iCol>=32 ? 0xffffffff : (((u32)1)<newmask |= (iCol>=32 ? 0xffffffff : (((u32)1)<iColumn = (i16)iCol; pExpr->pTab = pTab; @@ -59057,7 +59320,7 @@ static int lookupName( */ if( cnt==0 && cntTab==1 && sqlite3IsRowid(zCol) ){ cnt = 1; - pExpr->iColumn = -1; + pExpr->iColumn = -1; /* IMP: R-44911-55124 */ pExpr->affinity = SQLITE_AFF_INTEGER; } @@ -59177,6 +59440,27 @@ lookupname_end: } } +/* +** Allocate and return a pointer to an expression to load the column iCol +** from datasource iSrc datasource in SrcList pSrc. +*/ +SQLITE_PRIVATE Expr *sqlite3CreateColumnExpr(sqlite3 *db, SrcList *pSrc, int iSrc, int iCol){ + Expr *p = sqlite3ExprAlloc(db, TK_COLUMN, 0, 0); + if( p ){ + struct SrcList_item *pItem = &pSrc->a[iSrc]; + p->pTab = pItem->pTab; + p->iTable = pItem->iCursor; + if( p->pTab->iPKey==iCol ){ + p->iColumn = -1; + }else{ + p->iColumn = (ynVar)iCol; + pItem->colUsed |= ((Bitmask)1)<<(iCol>=BMS ? BMS-1 : iCol); + } + ExprSetProperty(p, EP_Resolved); + } + return p; +} + /* ** This routine is callback for sqlite3WalkExpr(). ** @@ -60180,30 +60464,6 @@ SQLITE_PRIVATE CollSeq *sqlite3BinaryCompareCollSeq( return pColl; } -/* -** Generate the operands for a comparison operation. Before -** generating the code for each operand, set the EP_AnyAff -** flag on the expression so that it will be able to used a -** cached column value that has previously undergone an -** affinity change. -*/ -static void codeCompareOperands( - Parse *pParse, /* Parsing and code generating context */ - Expr *pLeft, /* The left operand */ - int *pRegLeft, /* Register where left operand is stored */ - int *pFreeLeft, /* Free this register when done */ - Expr *pRight, /* The right operand */ - int *pRegRight, /* Register where right operand is stored */ - int *pFreeRight /* Write temp register for right operand there */ -){ - while( pLeft->op==TK_UPLUS ) pLeft = pLeft->pLeft; - pLeft->flags |= EP_AnyAff; - *pRegLeft = sqlite3ExprCodeTemp(pParse, pLeft, pFreeLeft); - while( pRight->op==TK_UPLUS ) pRight = pRight->pLeft; - pRight->flags |= EP_AnyAff; - *pRegRight = sqlite3ExprCodeTemp(pParse, pRight, pFreeRight); -} - /* ** Generate code for a comparison operator. */ @@ -60524,12 +60784,12 @@ SQLITE_PRIVATE void sqlite3ExprAssignVarNumber(Parse *pParse, Expr *pExpr){ if( z[1]==0 ){ /* Wildcard of the form "?". Assign the next variable number */ assert( z[0]=='?' ); - pExpr->iTable = ++pParse->nVar; + pExpr->iColumn = (ynVar)(++pParse->nVar); }else if( z[0]=='?' ){ /* Wildcard of the form "?nnn". Convert "nnn" to an integer and ** use it as the variable number */ - int i; - pExpr->iTable = i = atoi((char*)&z[1]); + int i = atoi((char*)&z[1]); + pExpr->iColumn = (ynVar)i; testcase( i==0 ); testcase( i==1 ); testcase( i==db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER]-1 ); @@ -60553,12 +60813,12 @@ SQLITE_PRIVATE void sqlite3ExprAssignVarNumber(Parse *pParse, Expr *pExpr){ Expr *pE = pParse->apVarExpr[i]; assert( pE!=0 ); if( memcmp(pE->u.zToken, z, n)==0 && pE->u.zToken[n]==0 ){ - pExpr->iTable = pE->iTable; + pExpr->iColumn = pE->iColumn; break; } } if( i>=pParse->nVarExpr ){ - pExpr->iTable = ++pParse->nVar; + pExpr->iColumn = (ynVar)(++pParse->nVar); if( pParse->nVarExpr>=pParse->nVarExprAlloc-1 ){ pParse->nVarExprAlloc += pParse->nVarExprAlloc + 10; pParse->apVarExpr = @@ -60580,11 +60840,10 @@ SQLITE_PRIVATE void sqlite3ExprAssignVarNumber(Parse *pParse, Expr *pExpr){ } /* -** Clear an expression structure without deleting the structure itself. -** Substructure is deleted. +** Recursively delete an expression tree. */ -SQLITE_PRIVATE void sqlite3ExprClear(sqlite3 *db, Expr *p){ - assert( p!=0 ); +SQLITE_PRIVATE void sqlite3ExprDelete(sqlite3 *db, Expr *p){ + if( p==0 ) return; if( !ExprHasAnyProperty(p, EP_TokenOnly) ){ sqlite3ExprDelete(db, p->pLeft); sqlite3ExprDelete(db, p->pRight); @@ -60597,14 +60856,6 @@ SQLITE_PRIVATE void sqlite3ExprClear(sqlite3 *db, Expr *p){ sqlite3ExprListDelete(db, p->x.pList); } } -} - -/* -** Recursively delete an expression tree. -*/ -SQLITE_PRIVATE void sqlite3ExprDelete(sqlite3 *db, Expr *p){ - if( p==0 ) return; - sqlite3ExprClear(db, p); if( !ExprHasProperty(p, EP_Static) ){ sqlite3DbFree(db, p); } @@ -61211,6 +61462,94 @@ SQLITE_PRIVATE int sqlite3ExprIsInteger(Expr *p, int *pValue){ return rc; } +/* +** Return FALSE if there is no chance that the expression can be NULL. +** +** If the expression might be NULL or if the expression is too complex +** to tell return TRUE. +** +** This routine is used as an optimization, to skip OP_IsNull opcodes +** when we know that a value cannot be NULL. Hence, a false positive +** (returning TRUE when in fact the expression can never be NULL) might +** be a small performance hit but is otherwise harmless. On the other +** hand, a false negative (returning FALSE when the result could be NULL) +** will likely result in an incorrect answer. So when in doubt, return +** TRUE. +*/ +SQLITE_PRIVATE int sqlite3ExprCanBeNull(const Expr *p){ + u8 op; + while( p->op==TK_UPLUS || p->op==TK_UMINUS ){ p = p->pLeft; } + op = p->op; + if( op==TK_REGISTER ) op = p->op2; + switch( op ){ + case TK_INTEGER: + case TK_STRING: + case TK_FLOAT: + case TK_BLOB: + return 0; + default: + return 1; + } +} + +/* +** Generate an OP_IsNull instruction that tests register iReg and jumps +** to location iDest if the value in iReg is NULL. The value in iReg +** was computed by pExpr. If we can look at pExpr at compile-time and +** determine that it can never generate a NULL, then the OP_IsNull operation +** can be omitted. +*/ +SQLITE_PRIVATE void sqlite3ExprCodeIsNullJump( + Vdbe *v, /* The VDBE under construction */ + const Expr *pExpr, /* Only generate OP_IsNull if this expr can be NULL */ + int iReg, /* Test the value in this register for NULL */ + int iDest /* Jump here if the value is null */ +){ + if( sqlite3ExprCanBeNull(pExpr) ){ + sqlite3VdbeAddOp2(v, OP_IsNull, iReg, iDest); + } +} + +/* +** Return TRUE if the given expression is a constant which would be +** unchanged by OP_Affinity with the affinity given in the second +** argument. +** +** This routine is used to determine if the OP_Affinity operation +** can be omitted. When in doubt return FALSE. A false negative +** is harmless. A false positive, however, can result in the wrong +** answer. +*/ +SQLITE_PRIVATE int sqlite3ExprNeedsNoAffinityChange(const Expr *p, char aff){ + u8 op; + if( aff==SQLITE_AFF_NONE ) return 1; + while( p->op==TK_UPLUS || p->op==TK_UMINUS ){ p = p->pLeft; } + op = p->op; + if( op==TK_REGISTER ) op = p->op2; + switch( op ){ + case TK_INTEGER: { + return aff==SQLITE_AFF_INTEGER || aff==SQLITE_AFF_NUMERIC; + } + case TK_FLOAT: { + return aff==SQLITE_AFF_REAL || aff==SQLITE_AFF_NUMERIC; + } + case TK_STRING: { + return aff==SQLITE_AFF_TEXT; + } + case TK_BLOB: { + return 1; + } + case TK_COLUMN: { + assert( p->iTable>=0 ); /* p cannot be part of a CHECK constraint */ + return p->iColumn<0 + && (aff==SQLITE_AFF_INTEGER || aff==SQLITE_AFF_NUMERIC); + } + default: { + return 0; + } + } +} + /* ** Return TRUE if the given string is a row-id column name. */ @@ -61298,16 +61637,16 @@ static int isCandidateForInOpt(Select *p){ ** When the b-tree is being used for membership tests, the calling function ** needs to know whether or not the structure contains an SQL NULL ** value in order to correctly evaluate expressions like "X IN (Y, Z)". -** If there is a chance that the b-tree might contain a NULL value at +** If there is any chance that the (...) might contain a NULL value at ** runtime, then a register is allocated and the register number written -** to *prNotFound. If there is no chance that the b-tree contains a +** to *prNotFound. If there is no chance that the (...) contains a ** NULL value, then *prNotFound is left unchanged. ** ** If a register is allocated and its location stored in *prNotFound, then -** its initial value is NULL. If the b-tree does not remain constant -** for the duration of the query (i.e. the SELECT that generates the b-tree +** its initial value is NULL. If the (...) does not remain constant +** for the duration of the query (i.e. the SELECT within the (...) ** is a correlated subquery) then the value of the allocated register is -** reset to NULL each time the b-tree is repopulated. This allows the +** reset to NULL each time the subquery is rerun. This allows the ** caller to use vdbe code equivalent to the following: ** ** if( register==NULL ){ @@ -61325,6 +61664,8 @@ SQLITE_PRIVATE int sqlite3FindInIndex(Parse *pParse, Expr *pX, int *prNotFound){ int iTab = pParse->nTab++; /* Cursor of the RHS table */ int mustBeUnique = (prNotFound==0); /* True if RHS must be unique */ + assert( pX->op==TK_IN ); + /* Check to see if an existing table or index can be used to ** satisfy the query. This is preferable to generating a new ** ephemeral table. @@ -61402,7 +61743,7 @@ SQLITE_PRIVATE int sqlite3FindInIndex(Parse *pParse, Expr *pX, int *prNotFound){ } if( eType==0 ){ - /* Could not found an existing able or index to use as the RHS b-tree. + /* Could not found an existing table or index to use as the RHS b-tree. ** We will have to generate an ephemeral table to do the job. */ int rMayHaveNull = 0; @@ -61449,17 +61790,21 @@ SQLITE_PRIVATE int sqlite3FindInIndex(Parse *pParse, Expr *pX, int *prNotFound){ ** If rMayHaveNull is zero, that means that the subquery is being used ** for membership testing only. There is no need to initialize any ** registers to indicate the presense or absence of NULLs on the RHS. +** +** For a SELECT or EXISTS operator, return the register that holds the +** result. For IN operators or if an error occurs, the return value is 0. */ #ifndef SQLITE_OMIT_SUBQUERY -SQLITE_PRIVATE void sqlite3CodeSubselect( +SQLITE_PRIVATE int sqlite3CodeSubselect( Parse *pParse, /* Parsing context */ Expr *pExpr, /* The IN, SELECT, or EXISTS operator */ int rMayHaveNull, /* Register that records whether NULLs exist in RHS */ int isRowid /* If true, LHS of IN operator is a rowid */ ){ int testAddr = 0; /* One-time test address */ + int rReg = 0; /* Register storing resulting */ Vdbe *v = sqlite3GetVdbe(pParse); - if( NEVER(v==0) ) return; + if( NEVER(v==0) ) return 0; sqlite3ExprCachePush(pParse); /* This code must be run in its entirety every time it is encountered @@ -61493,7 +61838,7 @@ SQLITE_PRIVATE void sqlite3CodeSubselect( affinity = sqlite3ExprAffinity(pLeft); /* Whether this is an 'x IN(SELECT...)' or an 'x IN()' - ** expression it is handled the same way. A virtual table is + ** expression it is handled the same way. An ephemeral table is ** filled with single-field index keys representing the results ** from the SELECT or the . ** @@ -61524,7 +61869,7 @@ SQLITE_PRIVATE void sqlite3CodeSubselect( dest.affinity = (u8)affinity; assert( (pExpr->iTable&0x0000FFFF)==pExpr->iTable ); if( sqlite3Select(pParse, pExpr->x.pSelect, &dest) ){ - return; + return 0; } pEList = pExpr->x.pSelect->pEList; if( ALWAYS(pEList!=0 && pEList->nExpr>0) ){ @@ -61555,6 +61900,7 @@ SQLITE_PRIVATE void sqlite3CodeSubselect( sqlite3VdbeAddOp2(v, OP_Null, 0, r2); for(i=pList->nExpr, pItem=pList->a; i>0; i--, pItem++){ Expr *pE2 = pItem->pExpr; + int iValToIns; /* If the expression is not constant then we will need to ** disable the test that was generated above that makes sure @@ -61567,14 +61913,19 @@ SQLITE_PRIVATE void sqlite3CodeSubselect( } /* Evaluate the expression and insert it into the temp table */ - r3 = sqlite3ExprCodeTarget(pParse, pE2, r1); - if( isRowid ){ - sqlite3VdbeAddOp2(v, OP_MustBeInt, r3, sqlite3VdbeCurrentAddr(v)+2); - sqlite3VdbeAddOp3(v, OP_Insert, pExpr->iTable, r2, r3); + if( isRowid && sqlite3ExprIsInteger(pE2, &iValToIns) ){ + sqlite3VdbeAddOp3(v, OP_InsertInt, pExpr->iTable, r2, iValToIns); }else{ - sqlite3VdbeAddOp4(v, OP_MakeRecord, r3, 1, r2, &affinity, 1); - sqlite3ExprCacheAffinityChange(pParse, r3, 1); - sqlite3VdbeAddOp2(v, OP_IdxInsert, pExpr->iTable, r2); + r3 = sqlite3ExprCodeTarget(pParse, pE2, r1); + if( isRowid ){ + sqlite3VdbeAddOp2(v, OP_MustBeInt, r3, + sqlite3VdbeCurrentAddr(v)+2); + sqlite3VdbeAddOp3(v, OP_Insert, pExpr->iTable, r2, r3); + }else{ + sqlite3VdbeAddOp4(v, OP_MakeRecord, r3, 1, r2, &affinity, 1); + sqlite3ExprCacheAffinityChange(pParse, r3, 1); + sqlite3VdbeAddOp2(v, OP_IdxInsert, pExpr->iTable, r2); + } } } sqlite3ReleaseTempReg(pParse, r1); @@ -61618,9 +61969,9 @@ SQLITE_PRIVATE void sqlite3CodeSubselect( sqlite3ExprDelete(pParse->db, pSel->pLimit); pSel->pLimit = sqlite3PExpr(pParse, TK_INTEGER, 0, 0, &one); if( sqlite3Select(pParse, pSel, &dest) ){ - return; + return 0; } - pExpr->iColumn = (i16)dest.iParm; + rReg = dest.iParm; ExprSetIrreducible(pExpr); break; } @@ -61631,7 +61982,129 @@ SQLITE_PRIVATE void sqlite3CodeSubselect( } sqlite3ExprCachePop(pParse, 1); - return; + return rReg; +} +#endif /* SQLITE_OMIT_SUBQUERY */ + +#ifndef SQLITE_OMIT_SUBQUERY +/* +** Generate code for an IN expression. +** +** x IN (SELECT ...) +** x IN (value, value, ...) +** +** The left-hand side (LHS) is a scalar expression. The right-hand side (RHS) +** is an array of zero or more values. The expression is true if the LHS is +** contained within the RHS. The value of the expression is unknown (NULL) +** if the LHS is NULL or if the LHS is not contained within the RHS and the +** RHS contains one or more NULL values. +** +** This routine generates code will jump to destIfFalse if the LHS is not +** contained within the RHS. If due to NULLs we cannot determine if the LHS +** is contained in the RHS then jump to destIfNull. If the LHS is contained +** within the RHS then fall through. +*/ +static void sqlite3ExprCodeIN( + Parse *pParse, /* Parsing and code generating context */ + Expr *pExpr, /* The IN expression */ + int destIfFalse, /* Jump here if LHS is not contained in the RHS */ + int destIfNull /* Jump here if the results are unknown due to NULLs */ +){ + int rRhsHasNull = 0; /* Register that is true if RHS contains NULL values */ + char affinity; /* Comparison affinity to use */ + int eType; /* Type of the RHS */ + int r1; /* Temporary use register */ + Vdbe *v; /* Statement under construction */ + + /* Compute the RHS. After this step, the table with cursor + ** pExpr->iTable will contains the values that make up the RHS. + */ + v = pParse->pVdbe; + assert( v!=0 ); /* OOM detected prior to this routine */ + VdbeNoopComment((v, "begin IN expr")); + eType = sqlite3FindInIndex(pParse, pExpr, &rRhsHasNull); + + /* Figure out the affinity to use to create a key from the results + ** of the expression. affinityStr stores a static string suitable for + ** P4 of OP_MakeRecord. + */ + affinity = comparisonAffinity(pExpr); + + /* Code the LHS, the from " IN (...)". + */ + sqlite3ExprCachePush(pParse); + r1 = sqlite3GetTempReg(pParse); + sqlite3ExprCode(pParse, pExpr->pLeft, r1); + sqlite3VdbeAddOp2(v, OP_IsNull, r1, destIfNull); + + + if( eType==IN_INDEX_ROWID ){ + /* In this case, the RHS is the ROWID of table b-tree + */ + sqlite3VdbeAddOp2(v, OP_MustBeInt, r1, destIfFalse); + sqlite3VdbeAddOp3(v, OP_NotExists, pExpr->iTable, destIfFalse, r1); + }else{ + /* In this case, the RHS is an index b-tree. + */ + sqlite3VdbeAddOp4(v, OP_Affinity, r1, 1, 0, &affinity, 1); + + /* If the set membership test fails, then the result of the + ** "x IN (...)" expression must be either 0 or NULL. If the set + ** contains no NULL values, then the result is 0. If the set + ** contains one or more NULL values, then the result of the + ** expression is also NULL. + */ + if( rRhsHasNull==0 || destIfFalse==destIfNull ){ + /* This branch runs if it is known at compile time that the RHS + ** cannot contain NULL values. This happens as the result + ** of a "NOT NULL" constraint in the database schema. + ** + ** Also run this branch if NULL is equivalent to FALSE + ** for this particular IN operator. + */ + sqlite3VdbeAddOp4Int(v, OP_NotFound, pExpr->iTable, destIfFalse, r1, 1); + + }else{ + /* In this branch, the RHS of the IN might contain a NULL and + ** the presence of a NULL on the RHS makes a difference in the + ** outcome. + */ + int j1, j2, j3; + + /* First check to see if the LHS is contained in the RHS. If so, + ** then the presence of NULLs in the RHS does not matter, so jump + ** over all of the code that follows. + */ + j1 = sqlite3VdbeAddOp4Int(v, OP_Found, pExpr->iTable, 0, r1, 1); + + /* Here we begin generating code that runs if the LHS is not + ** contained within the RHS. Generate additional code that + ** tests the RHS for NULLs. If the RHS contains a NULL then + ** jump to destIfNull. If there are no NULLs in the RHS then + ** jump to destIfFalse. + */ + j2 = sqlite3VdbeAddOp1(v, OP_NotNull, rRhsHasNull); + j3 = sqlite3VdbeAddOp4Int(v, OP_Found, pExpr->iTable, 0, rRhsHasNull, 1); + sqlite3VdbeAddOp2(v, OP_Integer, -1, rRhsHasNull); + sqlite3VdbeJumpHere(v, j3); + sqlite3VdbeAddOp2(v, OP_AddImm, rRhsHasNull, 1); + sqlite3VdbeJumpHere(v, j2); + + /* Jump to the appropriate target depending on whether or not + ** the RHS contains a NULL + */ + sqlite3VdbeAddOp2(v, OP_If, rRhsHasNull, destIfNull); + sqlite3VdbeAddOp2(v, OP_Goto, 0, destIfFalse); + + /* The OP_Found at the top of this branch jumps here when true, + ** causing the overall IN expression evaluation to fall through. + */ + sqlite3VdbeJumpHere(v, j1); + } + } + sqlite3ReleaseTempReg(pParse, r1); + sqlite3ExprCachePop(pParse, 1); + VdbeComment((v, "end IN expr")); } #endif /* SQLITE_OMIT_SUBQUERY */ @@ -61722,17 +62195,31 @@ SQLITE_PRIVATE void sqlite3ExprCacheStore(Parse *pParse, int iTab, int iCol, int assert( iReg>0 ); /* Register numbers are always positive */ assert( iCol>=-1 && iCol<32768 ); /* Finite column numbers */ - /* First replace any existing entry */ + /* The SQLITE_ColumnCache flag disables the column cache. This is used + ** for testing only - to verify that SQLite always gets the same answer + ** with and without the column cache. + */ + if( pParse->db->flags & SQLITE_ColumnCache ) return; + + /* First replace any existing entry. + ** + ** Actually, the way the column cache is currently used, we are guaranteed + ** that the object will never already be in cache. Verify this guarantee. + */ +#ifndef NDEBUG for(i=0, p=pParse->aColCache; iiReg && p->iTable==iTab && p->iColumn==iCol ){ cacheEntryClear(pParse, p); p->iLevel = pParse->iCacheLevel; p->iReg = iReg; - p->affChange = 0; p->lru = pParse->iCacheCnt++; return; } +#endif + assert( p->iReg==0 || p->iTable!=iTab || p->iColumn!=iCol ); } +#endif /* Find an empty slot and replace it */ for(i=0, p=pParse->aColCache; iiTable = iTab; p->iColumn = iCol; p->iReg = iReg; - p->affChange = 0; p->tempReg = 0; p->lru = pParse->iCacheCnt++; return; @@ -61763,7 +62249,6 @@ SQLITE_PRIVATE void sqlite3ExprCacheStore(Parse *pParse, int iTab, int iCol, int p->iTable = iTab; p->iColumn = iCol; p->iReg = iReg; - p->affChange = 0; p->tempReg = 0; p->lru = pParse->iCacheCnt++; return; @@ -61771,14 +62256,16 @@ SQLITE_PRIVATE void sqlite3ExprCacheStore(Parse *pParse, int iTab, int iCol, int } /* -** Indicate that a register is being overwritten. Purge the register -** from the column cache. +** Indicate that registers between iReg..iReg+nReg-1 are being overwritten. +** Purge the range of registers from the column cache. */ -SQLITE_PRIVATE void sqlite3ExprCacheRemove(Parse *pParse, int iReg){ +SQLITE_PRIVATE void sqlite3ExprCacheRemove(Parse *pParse, int iReg, int nReg){ int i; + int iLast = iReg + nReg - 1; struct yColCache *p; for(i=0, p=pParse->aColCache; iiReg==iReg ){ + int r = p->iReg; + if( r>=iReg && r<=iLast ){ cacheEntryClear(pParse, p); p->iReg = 0; } @@ -61837,28 +62324,20 @@ static void sqlite3ExprCachePinRegister(Parse *pParse, int iReg){ ** ** There must be an open cursor to pTab in iTable when this routine ** is called. If iColumn<0 then code is generated that extracts the rowid. -** -** This routine might attempt to reuse the value of the column that -** has already been loaded into a register. The value will always -** be used if it has not undergone any affinity changes. But if -** an affinity change has occurred, then the cached value will only be -** used if allowAffChng is true. */ SQLITE_PRIVATE int sqlite3ExprCodeGetColumn( Parse *pParse, /* Parsing and code generating context */ Table *pTab, /* Description of the table we are reading from */ int iColumn, /* Index of the table column */ int iTable, /* The cursor pointing to the table */ - int iReg, /* Store results here */ - int allowAffChng /* True if prior affinity changes are OK */ + int iReg /* Store results here */ ){ Vdbe *v = pParse->pVdbe; int i; struct yColCache *p; for(i=0, p=pParse->aColCache; iiReg>0 && p->iTable==iTable && p->iColumn==iColumn - && (!p->affChange || allowAffChng) ){ + if( p->iReg>0 && p->iTable==iTable && p->iColumn==iColumn ){ p->lru = pParse->iCacheCnt++; sqlite3ExprCachePinRegister(pParse, p->iReg); return p->iReg; @@ -61896,15 +62375,7 @@ SQLITE_PRIVATE void sqlite3ExprCacheClear(Parse *pParse){ ** registers starting with iStart. */ SQLITE_PRIVATE void sqlite3ExprCacheAffinityChange(Parse *pParse, int iStart, int iCount){ - int iEnd = iStart + iCount - 1; - int i; - struct yColCache *p; - for(i=0, p=pParse->aColCache; iiReg; - if( r>=iStart && r<=iEnd ){ - p->affChange = 1; - } - } + sqlite3ExprCacheRemove(pParse, iStart, iCount); } /* @@ -61936,19 +62407,24 @@ SQLITE_PRIVATE void sqlite3ExprCodeCopy(Parse *pParse, int iFrom, int iTo, int n } } +#if defined(SQLITE_DEBUG) || defined(SQLITE_COVERAGE_TEST) /* ** Return true if any register in the range iFrom..iTo (inclusive) ** is used as part of the column cache. +** +** This routine is used within assert() and testcase() macros only +** and does not appear in a normal build. */ static int usedAsColumnCache(Parse *pParse, int iFrom, int iTo){ int i; struct yColCache *p; for(i=0, p=pParse->aColCache; iiReg; - if( r>=iFrom && r<=iTo ) return 1; + if( r>=iFrom && r<=iTo ) return 1; /*NO_TEST*/ } return 0; } +#endif /* SQLITE_DEBUG || SQLITE_COVERAGE_TEST */ /* ** If the last instruction coded is an ephemeral copy of any of @@ -62069,10 +62545,8 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) assert( pParse->ckBase>0 ); inReg = pExpr->iColumn + pParse->ckBase; }else{ - testcase( (pExpr->flags & EP_AnyAff)!=0 ); inReg = sqlite3ExprCodeGetColumn(pParse, pExpr->pTab, - pExpr->iColumn, pExpr->iTable, target, - pExpr->flags & EP_AnyAff); + pExpr->iColumn, pExpr->iTable, target); } break; } @@ -62117,7 +62591,7 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) assert( pExpr->u.zToken[0]!=0 ); if( pExpr->u.zToken[1]==0 && (pOp = sqlite3VdbeGetOp(v, -1))->opcode==OP_Variable - && pOp->p1+pOp->p3==pExpr->iTable + && pOp->p1+pOp->p3==pExpr->iColumn && pOp->p2+pOp->p3==target && pOp->p4.z==0 ){ @@ -62128,7 +62602,7 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) */ pOp->p3++; }else{ - sqlite3VdbeAddOp3(v, OP_Variable, pExpr->iTable, target, 1); + sqlite3VdbeAddOp3(v, OP_Variable, pExpr->iColumn, target, 1); if( pExpr->u.zToken[1]!=0 ){ sqlite3VdbeChangeP4(v, -1, pExpr->u.zToken, 0); } @@ -62189,8 +62663,8 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) testcase( op==TK_GE ); testcase( op==TK_EQ ); testcase( op==TK_NE ); - codeCompareOperands(pParse, pExpr->pLeft, &r1, ®Free1, - pExpr->pRight, &r2, ®Free2); + r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); + r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, ®Free2); codeCompare(pParse, pExpr->pLeft, pExpr->pRight, op, r1, r2, inReg, SQLITE_STOREP2); testcase( regFree1==0 ); @@ -62201,8 +62675,8 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) case TK_ISNOT: { testcase( op==TK_IS ); testcase( op==TK_ISNOT ); - codeCompareOperands(pParse, pExpr->pLeft, &r1, ®Free1, - pExpr->pRight, &r2, ®Free2); + r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); + r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, ®Free2); op = (op==TK_IS) ? TK_EQ : TK_NE; codeCompare(pParse, pExpr->pLeft, pExpr->pRight, op, r1, r2, inReg, SQLITE_STOREP2 | SQLITE_NULLEQ); @@ -62335,6 +62809,27 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) sqlite3ErrorMsg(pParse, "unknown function: %.*s()", nId, zId); break; } + + /* Attempt a direct implementation of the built-in COALESCE() and + ** IFNULL() functions. This avoids unnecessary evalation of + ** arguments past the first non-NULL argument. + */ + if( pDef->flags & SQLITE_FUNC_COALESCE ){ + int endCoalesce = sqlite3VdbeMakeLabel(v); + assert( nFarg>=2 ); + sqlite3ExprCode(pParse, pFarg->a[0].pExpr, target); + for(i=1; ia[i].pExpr, target); + sqlite3ExprCachePop(pParse, 1); + } + sqlite3VdbeResolveLabel(v, endCoalesce); + break; + } + + if( pFarg ){ r1 = sqlite3GetTempRange(pParse, nFarg); sqlite3ExprCachePush(pParse); /* Ticket 2ea2425d34be */ @@ -62380,7 +62875,6 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) if( nFarg ){ sqlite3ReleaseTempRange(pParse, r1, nFarg); } - sqlite3ExprCacheAffinityChange(pParse, r1, nFarg); break; } #ifndef SQLITE_OMIT_SUBQUERY @@ -62388,100 +62882,23 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) case TK_SELECT: { testcase( op==TK_EXISTS ); testcase( op==TK_SELECT ); - sqlite3CodeSubselect(pParse, pExpr, 0, 0); - inReg = pExpr->iColumn; + inReg = sqlite3CodeSubselect(pParse, pExpr, 0, 0); break; } case TK_IN: { - int rNotFound = 0; - int rMayHaveNull = 0; - int j2, j3, j4, j5; - char affinity; - int eType; - - VdbeNoopComment((v, "begin IN expr r%d", target)); - eType = sqlite3FindInIndex(pParse, pExpr, &rMayHaveNull); - if( rMayHaveNull ){ - rNotFound = ++pParse->nMem; - } - - /* Figure out the affinity to use to create a key from the results - ** of the expression. affinityStr stores a static string suitable for - ** P4 of OP_MakeRecord. - */ - affinity = comparisonAffinity(pExpr); - - - /* Code the from " IN (...)". The temporary table - ** pExpr->iTable contains the values that make up the (...) set. - */ - sqlite3ExprCachePush(pParse); - sqlite3ExprCode(pParse, pExpr->pLeft, target); - j2 = sqlite3VdbeAddOp1(v, OP_IsNull, target); - if( eType==IN_INDEX_ROWID ){ - j3 = sqlite3VdbeAddOp1(v, OP_MustBeInt, target); - j4 = sqlite3VdbeAddOp3(v, OP_NotExists, pExpr->iTable, 0, target); - sqlite3VdbeAddOp2(v, OP_Integer, 1, target); - j5 = sqlite3VdbeAddOp0(v, OP_Goto); - sqlite3VdbeJumpHere(v, j3); - sqlite3VdbeJumpHere(v, j4); - sqlite3VdbeAddOp2(v, OP_Integer, 0, target); - }else{ - r2 = regFree2 = sqlite3GetTempReg(pParse); - - /* Create a record and test for set membership. If the set contains - ** the value, then jump to the end of the test code. The target - ** register still contains the true (1) value written to it earlier. - */ - sqlite3VdbeAddOp4(v, OP_MakeRecord, target, 1, r2, &affinity, 1); - sqlite3VdbeAddOp2(v, OP_Integer, 1, target); - j5 = sqlite3VdbeAddOp3(v, OP_Found, pExpr->iTable, 0, r2); - - /* If the set membership test fails, then the result of the - ** "x IN (...)" expression must be either 0 or NULL. If the set - ** contains no NULL values, then the result is 0. If the set - ** contains one or more NULL values, then the result of the - ** expression is also NULL. - */ - if( rNotFound==0 ){ - /* This branch runs if it is known at compile time (now) that - ** the set contains no NULL values. This happens as the result - ** of a "NOT NULL" constraint in the database schema. No need - ** to test the data structure at runtime in this case. - */ - sqlite3VdbeAddOp2(v, OP_Integer, 0, target); - }else{ - /* This block populates the rNotFound register with either NULL - ** or 0 (an integer value). If the data structure contains one - ** or more NULLs, then set rNotFound to NULL. Otherwise, set it - ** to 0. If register rMayHaveNull is already set to some value - ** other than NULL, then the test has already been run and - ** rNotFound is already populated. - */ - static const char nullRecord[] = { 0x02, 0x00 }; - j3 = sqlite3VdbeAddOp1(v, OP_NotNull, rMayHaveNull); - sqlite3VdbeAddOp2(v, OP_Null, 0, rNotFound); - sqlite3VdbeAddOp4(v, OP_Blob, 2, rMayHaveNull, 0, - nullRecord, P4_STATIC); - j4 = sqlite3VdbeAddOp3(v, OP_Found, pExpr->iTable, 0, rMayHaveNull); - sqlite3VdbeAddOp2(v, OP_Integer, 0, rNotFound); - sqlite3VdbeJumpHere(v, j4); - sqlite3VdbeJumpHere(v, j3); - - /* Copy the value of register rNotFound (which is either NULL or 0) - ** into the target register. This will be the result of the - ** expression. - */ - sqlite3VdbeAddOp2(v, OP_Copy, rNotFound, target); - } - } - sqlite3VdbeJumpHere(v, j2); - sqlite3VdbeJumpHere(v, j5); - sqlite3ExprCachePop(pParse, 1); - VdbeComment((v, "end IN expr r%d", target)); + int destIfFalse = sqlite3VdbeMakeLabel(v); + int destIfNull = sqlite3VdbeMakeLabel(v); + sqlite3VdbeAddOp2(v, OP_Null, 0, target); + sqlite3ExprCodeIN(pParse, pExpr, destIfFalse, destIfNull); + sqlite3VdbeAddOp2(v, OP_Integer, 1, target); + sqlite3VdbeResolveLabel(v, destIfFalse); + sqlite3VdbeAddOp2(v, OP_AddImm, target, 0); + sqlite3VdbeResolveLabel(v, destIfNull); break; } -#endif +#endif /* SQLITE_OMIT_SUBQUERY */ + + /* ** x BETWEEN y AND z ** @@ -62498,8 +62915,8 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) struct ExprList_item *pLItem = pExpr->x.pList->a; Expr *pRight = pLItem->pExpr; - codeCompareOperands(pParse, pLeft, &r1, ®Free1, - pRight, &r2, ®Free2); + r1 = sqlite3ExprCodeTemp(pParse, pLeft, ®Free1); + r2 = sqlite3ExprCodeTemp(pParse, pRight, ®Free2); testcase( regFree1==0 ); testcase( regFree2==0 ); r3 = sqlite3GetTempReg(pParse); @@ -62754,6 +63171,7 @@ SQLITE_PRIVATE int sqlite3ExprCodeAndCache(Parse *pParse, Expr *pExpr, int targe iMem = ++pParse->nMem; sqlite3VdbeAddOp2(v, OP_Copy, inReg, iMem); pExpr->iTable = iMem; + pExpr->op2 = pExpr->op; pExpr->op = TK_REGISTER; } return inReg; @@ -62827,6 +63245,7 @@ static int isAppropriateForFactoring(Expr *p){ static int evalConstExpr(Walker *pWalker, Expr *pExpr){ Parse *pParse = pWalker->pParse; switch( pExpr->op ){ + case TK_IN: case TK_REGISTER: { return WRC_Prune; } @@ -62910,6 +63329,62 @@ SQLITE_PRIVATE int sqlite3ExprCodeExprList( return n; } +/* +** Generate code for a BETWEEN operator. +** +** x BETWEEN y AND z +** +** The above is equivalent to +** +** x>=y AND x<=z +** +** Code it as such, taking care to do the common subexpression +** elementation of x. +*/ +static void exprCodeBetween( + Parse *pParse, /* Parsing and code generating context */ + Expr *pExpr, /* The BETWEEN expression */ + int dest, /* Jump here if the jump is taken */ + int jumpIfTrue, /* Take the jump if the BETWEEN is true */ + int jumpIfNull /* Take the jump if the BETWEEN is NULL */ +){ + Expr exprAnd; /* The AND operator in x>=y AND x<=z */ + Expr compLeft; /* The x>=y term */ + Expr compRight; /* The x<=z term */ + Expr exprX; /* The x subexpression */ + int regFree1 = 0; /* Temporary use register */ + + assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); + exprX = *pExpr->pLeft; + exprAnd.op = TK_AND; + exprAnd.pLeft = &compLeft; + exprAnd.pRight = &compRight; + compLeft.op = TK_GE; + compLeft.pLeft = &exprX; + compLeft.pRight = pExpr->x.pList->a[0].pExpr; + compRight.op = TK_LE; + compRight.pLeft = &exprX; + compRight.pRight = pExpr->x.pList->a[1].pExpr; + exprX.iTable = sqlite3ExprCodeTemp(pParse, &exprX, ®Free1); + exprX.op = TK_REGISTER; + if( jumpIfTrue ){ + sqlite3ExprIfTrue(pParse, &exprAnd, dest, jumpIfNull); + }else{ + sqlite3ExprIfFalse(pParse, &exprAnd, dest, jumpIfNull); + } + sqlite3ReleaseTempReg(pParse, regFree1); + + /* Ensure adequate test coverage */ + testcase( jumpIfTrue==0 && jumpIfNull==0 && regFree1==0 ); + testcase( jumpIfTrue==0 && jumpIfNull==0 && regFree1!=0 ); + testcase( jumpIfTrue==0 && jumpIfNull!=0 && regFree1==0 ); + testcase( jumpIfTrue==0 && jumpIfNull!=0 && regFree1!=0 ); + testcase( jumpIfTrue!=0 && jumpIfNull==0 && regFree1==0 ); + testcase( jumpIfTrue!=0 && jumpIfNull==0 && regFree1!=0 ); + testcase( jumpIfTrue!=0 && jumpIfNull!=0 && regFree1==0 ); + testcase( jumpIfTrue!=0 && jumpIfNull!=0 && regFree1!=0 ); +} + /* ** Generate code for a boolean expression such that a jump is made ** to the label "dest" if the expression is true but execution @@ -62976,8 +63451,8 @@ SQLITE_PRIVATE void sqlite3ExprIfTrue(Parse *pParse, Expr *pExpr, int dest, int testcase( op==TK_EQ ); testcase( op==TK_NE ); testcase( jumpIfNull==0 ); - codeCompareOperands(pParse, pExpr->pLeft, &r1, ®Free1, - pExpr->pRight, &r2, ®Free2); + r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); + r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, ®Free2); codeCompare(pParse, pExpr->pLeft, pExpr->pRight, op, r1, r2, dest, jumpIfNull); testcase( regFree1==0 ); @@ -62988,8 +63463,8 @@ SQLITE_PRIVATE void sqlite3ExprIfTrue(Parse *pParse, Expr *pExpr, int dest, int case TK_ISNOT: { testcase( op==TK_IS ); testcase( op==TK_ISNOT ); - codeCompareOperands(pParse, pExpr->pLeft, &r1, ®Free1, - pExpr->pRight, &r2, ®Free2); + r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); + r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, ®Free2); op = (op==TK_IS) ? TK_EQ : TK_NE; codeCompare(pParse, pExpr->pLeft, pExpr->pRight, op, r1, r2, dest, SQLITE_NULLEQ); @@ -63009,36 +63484,16 @@ SQLITE_PRIVATE void sqlite3ExprIfTrue(Parse *pParse, Expr *pExpr, int dest, int break; } case TK_BETWEEN: { - /* x BETWEEN y AND z - ** - ** Is equivalent to - ** - ** x>=y AND x<=z - ** - ** Code it as such, taking care to do the common subexpression - ** elementation of x. - */ - Expr exprAnd; - Expr compLeft; - Expr compRight; - Expr exprX; - - assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); - exprX = *pExpr->pLeft; - exprAnd.op = TK_AND; - exprAnd.pLeft = &compLeft; - exprAnd.pRight = &compRight; - compLeft.op = TK_GE; - compLeft.pLeft = &exprX; - compLeft.pRight = pExpr->x.pList->a[0].pExpr; - compRight.op = TK_LE; - compRight.pLeft = &exprX; - compRight.pRight = pExpr->x.pList->a[1].pExpr; - exprX.iTable = sqlite3ExprCodeTemp(pParse, &exprX, ®Free1); - testcase( regFree1==0 ); - exprX.op = TK_REGISTER; testcase( jumpIfNull==0 ); - sqlite3ExprIfTrue(pParse, &exprAnd, dest, jumpIfNull); + exprCodeBetween(pParse, pExpr, dest, 1, jumpIfNull); + break; + } + case TK_IN: { + int destIfFalse = sqlite3VdbeMakeLabel(v); + int destIfNull = jumpIfNull ? dest : destIfFalse; + sqlite3ExprCodeIN(pParse, pExpr, destIfFalse, destIfNull); + sqlite3VdbeAddOp2(v, OP_Goto, 0, dest); + sqlite3VdbeResolveLabel(v, destIfFalse); break; } default: { @@ -63122,6 +63577,7 @@ SQLITE_PRIVATE void sqlite3ExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int break; } case TK_NOT: { + testcase( jumpIfNull==0 ); sqlite3ExprIfTrue(pParse, pExpr->pLeft, dest, jumpIfNull); break; } @@ -63138,8 +63594,8 @@ SQLITE_PRIVATE void sqlite3ExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int testcase( op==TK_EQ ); testcase( op==TK_NE ); testcase( jumpIfNull==0 ); - codeCompareOperands(pParse, pExpr->pLeft, &r1, ®Free1, - pExpr->pRight, &r2, ®Free2); + r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); + r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, ®Free2); codeCompare(pParse, pExpr->pLeft, pExpr->pRight, op, r1, r2, dest, jumpIfNull); testcase( regFree1==0 ); @@ -63150,8 +63606,8 @@ SQLITE_PRIVATE void sqlite3ExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int case TK_ISNOT: { testcase( pExpr->op==TK_IS ); testcase( pExpr->op==TK_ISNOT ); - codeCompareOperands(pParse, pExpr->pLeft, &r1, ®Free1, - pExpr->pRight, &r2, ®Free2); + r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); + r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, ®Free2); op = (pExpr->op==TK_IS) ? TK_NE : TK_EQ; codeCompare(pParse, pExpr->pLeft, pExpr->pRight, op, r1, r2, dest, SQLITE_NULLEQ); @@ -63169,36 +63625,18 @@ SQLITE_PRIVATE void sqlite3ExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int break; } case TK_BETWEEN: { - /* x BETWEEN y AND z - ** - ** Is equivalent to - ** - ** x>=y AND x<=z - ** - ** Code it as such, taking care to do the common subexpression - ** elementation of x. - */ - Expr exprAnd; - Expr compLeft; - Expr compRight; - Expr exprX; - - assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); - exprX = *pExpr->pLeft; - exprAnd.op = TK_AND; - exprAnd.pLeft = &compLeft; - exprAnd.pRight = &compRight; - compLeft.op = TK_GE; - compLeft.pLeft = &exprX; - compLeft.pRight = pExpr->x.pList->a[0].pExpr; - compRight.op = TK_LE; - compRight.pLeft = &exprX; - compRight.pRight = pExpr->x.pList->a[1].pExpr; - exprX.iTable = sqlite3ExprCodeTemp(pParse, &exprX, ®Free1); - testcase( regFree1==0 ); - exprX.op = TK_REGISTER; testcase( jumpIfNull==0 ); - sqlite3ExprIfFalse(pParse, &exprAnd, dest, jumpIfNull); + exprCodeBetween(pParse, pExpr, dest, 0, jumpIfNull); + break; + } + case TK_IN: { + if( jumpIfNull ){ + sqlite3ExprCodeIN(pParse, pExpr, dest, dest); + }else{ + int destIfNull = sqlite3VdbeMakeLabel(v); + sqlite3ExprCodeIN(pParse, pExpr, dest, destIfNull); + sqlite3VdbeResolveLabel(v, destIfNull); + } break; } default: { @@ -63516,7 +63954,8 @@ SQLITE_PRIVATE int sqlite3GetTempRange(Parse *pParse, int nReg){ int i, n; i = pParse->iRangeReg; n = pParse->nRangeReg; - if( nReg<=n && !usedAsColumnCache(pParse, i, i+n-1) ){ + if( nReg<=n ){ + assert( !usedAsColumnCache(pParse, i, i+n-1) ); pParse->iRangeReg += nReg; pParse->nRangeReg -= nReg; }else{ @@ -63526,6 +63965,7 @@ SQLITE_PRIVATE int sqlite3GetTempRange(Parse *pParse, int nReg){ return i; } SQLITE_PRIVATE void sqlite3ReleaseTempRange(Parse *pParse, int iReg, int nReg){ + sqlite3ExprCacheRemove(pParse, iReg, nReg); if( nReg>pParse->nRangeReg ){ pParse->nRangeReg = nReg; pParse->iRangeReg = iReg; @@ -63547,8 +63987,6 @@ SQLITE_PRIVATE void sqlite3ReleaseTempRange(Parse *pParse, int iReg, int nReg){ ************************************************************************* ** This file contains C code routines that used to generate VDBE code ** that implements the ALTER TABLE command. -** -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ /* @@ -64343,8 +64781,6 @@ exit_begin_add_column: ** ************************************************************************* ** This file contains code associated with the ANALYZE command. -** -** @(#) $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ #ifndef SQLITE_OMIT_ANALYZE @@ -64998,8 +65434,6 @@ SQLITE_PRIVATE int sqlite3AnalysisLoad(sqlite3 *db, int iDb){ ** ************************************************************************* ** This file contains code used to implement the ATTACH and DETACH commands. -** -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ #ifndef SQLITE_OMIT_ATTACH @@ -65138,7 +65572,7 @@ static void attachFunc( aNew->safety_level = 3; #if SQLITE_HAS_CODEC - { + if( rc==SQLITE_OK ){ extern int sqlite3CodecAttach(sqlite3*, int, const void*, int); extern void sqlite3CodecGetKey(sqlite3*, int, void**, int*); int nKey; @@ -65155,13 +65589,13 @@ static void attachFunc( case SQLITE_BLOB: nKey = sqlite3_value_bytes(argv[2]); zKey = (char *)sqlite3_value_blob(argv[2]); - sqlite3CodecAttach(db, db->nDb-1, zKey, nKey); + rc = sqlite3CodecAttach(db, db->nDb-1, zKey, nKey); break; case SQLITE_NULL: /* No key specified. Use the key from the main database */ sqlite3CodecGetKey(db, 0, (void**)&zKey, &nKey); - sqlite3CodecAttach(db, db->nDb-1, zKey, nKey); + rc = sqlite3CodecAttach(db, db->nDb-1, zKey, nKey); break; } } @@ -65540,8 +65974,6 @@ SQLITE_PRIVATE int sqlite3FixTriggerStep( ** API. This facility is an optional feature of the library. Embedded ** systems that do not need this facility may omit it by recompiling ** the library with -DSQLITE_OMIT_AUTHORIZATION=1 -** -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ /* @@ -65801,8 +66233,6 @@ SQLITE_PRIVATE void sqlite3AuthContextPop(AuthContext *pContext){ ** BEGIN TRANSACTION ** COMMIT ** ROLLBACK -** -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ /* @@ -66330,7 +66760,8 @@ SQLITE_PRIVATE void sqlite3UnlinkAndDeleteTable(sqlite3 *db, int iDb, const char assert( db!=0 ); assert( iDb>=0 && iDbnDb ); - assert( zTabName && zTabName[0] ); + assert( zTabName ); + testcase( zTabName[0]==0 ); /* Zero-length table names are allowed */ pDb = &db->aDb[iDb]; p = sqlite3HashInsert(&pDb->pSchema->tblHash, zTabName, sqlite3Strlen30(zTabName),0); @@ -69197,7 +69628,6 @@ SQLITE_PRIVATE int sqlite3OpenTempDatabase(Parse *pParse){ pParse->rc = rc; return 1; } - assert( (db->flags & SQLITE_InTrans)==0 || db->autoCommit ); assert( db->aDb[1].pSchema ); sqlite3PagerJournalMode(sqlite3BtreePager(db->aDb[1].pBt), db->dfltJournalMode); @@ -69500,8 +69930,6 @@ SQLITE_PRIVATE KeyInfo *sqlite3IndexKeyinfo(Parse *pParse, Index *pIdx){ ** ** This file contains functions used to access the internal hash tables ** of user defined functions and collation sequences. -** -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ @@ -69953,8 +70381,6 @@ SQLITE_PRIVATE Schema *sqlite3SchemaGet(sqlite3 *db, Btree *pBt){ ************************************************************************* ** This file contains C code routines that are called by the parser ** in order to generate code for DELETE FROM statements. -** -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ /* @@ -70307,7 +70733,7 @@ SQLITE_PRIVATE void sqlite3DeleteFrom( sqlite3VdbeAddOp2(v, OP_Null, 0, iRowSet); pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere,0,WHERE_DUPLICATES_OK); if( pWInfo==0 ) goto delete_from_cleanup; - regRowid = sqlite3ExprCodeGetColumn(pParse, pTab, -1, iCur, iRowid, 0); + regRowid = sqlite3ExprCodeGetColumn(pParse, pTab, -1, iCur, iRowid); sqlite3VdbeAddOp2(v, OP_RowSetAdd, iRowSet, regRowid); if( db->flags & SQLITE_CountRows ){ sqlite3VdbeAddOp2(v, OP_AddImm, memCnt, 1); @@ -70439,7 +70865,9 @@ SQLITE_PRIVATE void sqlite3GenerateRowDelete( /* TODO: Could use temporary registers here. Also could attempt to ** avoid copying the contents of the rowid register. */ - mask = sqlite3TriggerOldmask(pParse, pTrigger, 0, pTab, onconf); + mask = sqlite3TriggerColmask( + pParse, pTrigger, 0, 0, TRIGGER_BEFORE|TRIGGER_AFTER, pTab, onconf + ); mask |= sqlite3FkOldmask(pParse, pTab); iOld = pParse->nMem+1; pParse->nMem += (1 + pTab->nCol); @@ -70571,13 +70999,11 @@ SQLITE_PRIVATE int sqlite3GenerateIndexKey( if( doMakeRec ){ sqlite3VdbeAddOp3(v, OP_MakeRecord, regBase, nCol+1, regOut); sqlite3VdbeChangeP4(v, -1, sqlite3IndexAffinityStr(v, pIdx), 0); - sqlite3ExprCacheAffinityChange(pParse, regBase, nCol+1); } sqlite3ReleaseTempRange(pParse, regBase, nCol+1); return regBase; } - /************** End of delete.c **********************************************/ /************** Begin file func.c ********************************************/ /* @@ -70695,7 +71121,10 @@ static void lengthFunc( } /* -** Implementation of the abs() function +** Implementation of the abs() function. +** +** IMP: R-23979-26855 The abs(X) function returns the absolute value of +** the numeric argument X. */ static void absFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ assert( argc==1 ); @@ -70705,6 +71134,9 @@ static void absFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ i64 iVal = sqlite3_value_int64(argv[0]); if( iVal<0 ){ if( (iVal<<1)==0 ){ + /* IMP: R-35460-15084 If X is the integer -9223372036854775807 then + ** abs(X) throws an integer overflow error since there is no + ** equivalent positive 64-bit two complement value. */ sqlite3_result_error(context, "integer overflow", -1); return; } @@ -70714,10 +71146,16 @@ static void absFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ break; } case SQLITE_NULL: { + /* IMP: R-37434-19929 Abs(X) returns NULL if X is NULL. */ sqlite3_result_null(context); break; } default: { + /* Because sqlite3_value_double() returns 0.0 if the argument is not + ** something that can be converted into a number, we have: + ** IMP: R-57326-31541 Abs(X) return 0.0 if X is a string or blob that + ** cannot be converted to a numeric value. + */ double rVal = sqlite3_value_double(argv[0]); if( rVal<0 ) rVal = -rVal; sqlite3_result_double(context, rVal); @@ -70735,6 +71173,8 @@ static void absFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ ** If x is a blob, then we count bytes. ** ** If p1 is negative, then we begin abs(p1) from the end of x[]. +** +** If p2 is negative, return the p2 characters preceeding p1. */ static void substrFunc( sqlite3_context *context, @@ -70755,6 +71195,7 @@ static void substrFunc( return; } p0type = sqlite3_value_type(argv[0]); + p1 = sqlite3_value_int(argv[1]); if( p0type==SQLITE_BLOB ){ len = sqlite3_value_bytes(argv[0]); z = sqlite3_value_blob(argv[0]); @@ -70764,11 +71205,12 @@ static void substrFunc( z = sqlite3_value_text(argv[0]); if( z==0 ) return; len = 0; - for(z2=z; *z2; len++){ - SQLITE_SKIP_UTF8(z2); + if( p1<0 ){ + for(z2=z; *z2; len++){ + SQLITE_SKIP_UTF8(z2); + } } } - p1 = sqlite3_value_int(argv[1]); if( argc==3 ){ p2 = sqlite3_value_int(argv[2]); if( p2<0 ){ @@ -70798,10 +71240,6 @@ static void substrFunc( } } assert( p1>=0 && p2>=0 ); - if( p1+p2>len ){ - p2 = len-p1; - if( p2<0 ) p2 = 0; - } if( p0type!=SQLITE_BLOB ){ while( *z && p1 ){ SQLITE_SKIP_UTF8(z); @@ -70812,6 +71250,10 @@ static void substrFunc( } sqlite3_result_text(context, (char*)z, (int)(z2-z), SQLITE_TRANSIENT); }else{ + if( p1+p2>len ){ + p2 = len-p1; + if( p2<0 ) p2 = 0; + } sqlite3_result_blob(context, (char*)&z[p1], (int)p2, SQLITE_TRANSIENT); } } @@ -70913,6 +71355,14 @@ static void lowerFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ } } + +#if 0 /* This function is never used. */ +/* +** The COALESCE() and IFNULL() functions used to be implemented as shown +** here. But now they are implemented as VDBE code so that unused arguments +** do not have to be computed. This legacy implementation is retained as +** comment. +*/ /* ** Implementation of the IFNULL(), NVL(), and COALESCE() functions. ** All three do the same thing. They return the first non-NULL @@ -70931,6 +71381,8 @@ static void ifnullFunc( } } } +#endif /* NOT USED */ +#define ifnullFunc versionFunc /* Substitute function - never called */ /* ** Implementation of random(). Return a random integer. @@ -71605,9 +72057,16 @@ static void trimFunc( } +/* IMP: R-25361-16150 This function is omitted from SQLite by default. It +** is only available if the SQLITE_SOUNDEX compile-time option is used +** when SQLite is built. +*/ #ifdef SQLITE_SOUNDEX /* ** Compute the soundex encoding of a word. +** +** IMP: R-59782-00072 The soundex(X) function returns a string that is the +** soundex encoding of the string X. */ static void soundexFunc( sqlite3_context *context, @@ -71651,10 +72110,12 @@ static void soundexFunc( zResult[j] = 0; sqlite3_result_text(context, zResult, 4, SQLITE_TRANSIENT); }else{ + /* IMP: R-64894-50321 The string "?000" is returned if the argument + ** is NULL or contains no ASCII alphabetic characters. */ sqlite3_result_text(context, "?000", 4, SQLITE_STATIC); } } -#endif +#endif /* SQLITE_SOUNDEX */ #ifndef SQLITE_OMIT_LOAD_EXTENSION /* @@ -72015,10 +72476,12 @@ SQLITE_PRIVATE void sqlite3RegisterGlobalFunctions(void){ FUNCTION(upper, 1, 0, 0, upperFunc ), FUNCTION(lower, 1, 0, 0, lowerFunc ), FUNCTION(coalesce, 1, 0, 0, 0 ), - FUNCTION(coalesce, -1, 0, 0, ifnullFunc ), FUNCTION(coalesce, 0, 0, 0, 0 ), +/* FUNCTION(coalesce, -1, 0, 0, ifnullFunc ), */ + {-1,SQLITE_UTF8,SQLITE_FUNC_COALESCE,0,0,ifnullFunc,0,0,"coalesce",0}, FUNCTION(hex, 1, 0, 0, hexFunc ), - FUNCTION(ifnull, 2, 0, 1, ifnullFunc ), +/* FUNCTION(ifnull, 2, 0, 0, ifnullFunc ), */ + {2,SQLITE_UTF8,SQLITE_FUNC_COALESCE,0,0,ifnullFunc,0,0,"ifnull",0}, FUNCTION(random, 0, 0, 0, randomFunc ), FUNCTION(randomblob, 1, 0, 0, randomBlob ), FUNCTION(nullif, 2, 0, 1, nullifFunc ), @@ -72468,7 +72931,7 @@ static void fkLookupParent( sqlite3VdbeAddOp3(v, OP_MakeRecord, regTemp, nCol, regRec); sqlite3VdbeChangeP4(v, -1, sqlite3IndexAffinityStr(v, pIdx), 0); - sqlite3VdbeAddOp3(v, OP_Found, iCur, iOk, regRec); + sqlite3VdbeAddOp4Int(v, OP_Found, iCur, iOk, regRec, 0); sqlite3ReleaseTempReg(pParse, regRec); sqlite3ReleaseTempRange(pParse, regTemp, nCol); @@ -73274,8 +73737,6 @@ SQLITE_PRIVATE void sqlite3FkDelete(Table *pTab){ ************************************************************************* ** This file contains C code routines that are called by the parser ** to handle INSERT statements in SQLite. -** -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ /* @@ -75095,8 +75556,6 @@ static int xferOptimization( ** implement the programmer interface to the library. Routines in ** other files are for internal use by SQLite and should not be ** accessed by users of the library. -** -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ @@ -75241,8 +75700,6 @@ exec_out: ************************************************************************* ** This file contains code used to dynamically load extensions into ** the SQLite library. -** -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ #ifndef SQLITE_CORE @@ -75266,8 +75723,6 @@ exec_out: ** an SQLite instance. Shared libraries that intend to be loaded ** as extensions by SQLite should #include this file instead of ** sqlite3.h. -** -** @(#) $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ #ifndef _SQLITE3EXT_H_ #define _SQLITE3EXT_H_ @@ -76235,8 +76690,6 @@ SQLITE_PRIVATE void sqlite3AutoLoadExtensions(sqlite3 *db){ ** ************************************************************************* ** This file contains code used to implement the PRAGMA command. -** -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ /* Ignore this whole file if pragmas are disabled @@ -77354,6 +77807,7 @@ SQLITE_PRIVATE void sqlite3Pragma( sqlite3VdbeAddOp2(v, OP_AddImm, 2, 1); /* increment entry count */ for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){ int jmp2; + int r1; static const VdbeOpList idxErr[] = { { OP_AddImm, 1, -1, 0}, { OP_String8, 0, 3, 0}, /* 1 */ @@ -77367,8 +77821,8 @@ SQLITE_PRIVATE void sqlite3Pragma( { OP_IfPos, 1, 0, 0}, /* 9 */ { OP_Halt, 0, 0, 0}, }; - sqlite3GenerateIndexKey(pParse, pIdx, 1, 3, 1); - jmp2 = sqlite3VdbeAddOp3(v, OP_Found, j+2, 0, 3); + r1 = sqlite3GenerateIndexKey(pParse, pIdx, 1, 3, 0); + jmp2 = sqlite3VdbeAddOp4Int(v, OP_Found, j+2, 0, r1, pIdx->nColumn+1); addr = sqlite3VdbeAddOpList(v, ArraySize(idxErr), idxErr); sqlite3VdbeChangeP4(v, addr+1, "rowid ", P4_STATIC); sqlite3VdbeChangeP4(v, addr+3, " missing from index ", P4_STATIC); @@ -77675,8 +78129,6 @@ pragma_out: ** This file contains the implementation of the sqlite3_prepare() ** interface, and routines that contribute to loading the database schema ** from disk. -** -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ /* @@ -78133,7 +78585,7 @@ static void schemaIsValid(Parse *pParse){ } /* Read the schema cookie from the database. If it does not match the - ** value stored as part of the in the in-memory schema representation, + ** value stored as part of the in-memory schema representation, ** set Parse.rc to SQLITE_SCHEMA. */ sqlite3BtreeGetMeta(pBt, BTREE_SCHEMA_VERSION, (u32 *)&cookie); if( cookie!=db->aDb[iDb].pSchema->schema_cookie ){ @@ -78187,6 +78639,7 @@ static int sqlite3Prepare( const char *zSql, /* UTF-8 encoded SQL statement. */ int nBytes, /* Length of zSql in bytes. */ int saveSqlFlag, /* True to copy SQL text into the sqlite3_stmt */ + Vdbe *pReprepare, /* VM being reprepared */ sqlite3_stmt **ppStmt, /* OUT: A pointer to the prepared statement */ const char **pzTail /* OUT: End of parsed string */ ){ @@ -78201,6 +78654,7 @@ static int sqlite3Prepare( rc = SQLITE_NOMEM; goto end_prepare; } + pParse->pReprepare = pReprepare; if( sqlite3SafetyOn(db) ){ rc = SQLITE_MISUSE; @@ -78358,6 +78812,7 @@ static int sqlite3LockAndPrepare( const char *zSql, /* UTF-8 encoded SQL statement. */ int nBytes, /* Length of zSql in bytes. */ int saveSqlFlag, /* True to copy SQL text into the sqlite3_stmt */ + Vdbe *pOld, /* VM being reprepared */ sqlite3_stmt **ppStmt, /* OUT: A pointer to the prepared statement */ const char **pzTail /* OUT: End of parsed string */ ){ @@ -78369,10 +78824,10 @@ static int sqlite3LockAndPrepare( } sqlite3_mutex_enter(db->mutex); sqlite3BtreeEnterAll(db); - rc = sqlite3Prepare(db, zSql, nBytes, saveSqlFlag, ppStmt, pzTail); + rc = sqlite3Prepare(db, zSql, nBytes, saveSqlFlag, pOld, ppStmt, pzTail); if( rc==SQLITE_SCHEMA ){ sqlite3_finalize(*ppStmt); - rc = sqlite3Prepare(db, zSql, nBytes, saveSqlFlag, ppStmt, pzTail); + rc = sqlite3Prepare(db, zSql, nBytes, saveSqlFlag, pOld, ppStmt, pzTail); } sqlite3BtreeLeaveAll(db); sqlite3_mutex_leave(db->mutex); @@ -78398,7 +78853,7 @@ SQLITE_PRIVATE int sqlite3Reprepare(Vdbe *p){ assert( zSql!=0 ); /* Reprepare only called for prepare_v2() statements */ db = sqlite3VdbeDb(p); assert( sqlite3_mutex_held(db->mutex) ); - rc = sqlite3LockAndPrepare(db, zSql, -1, 0, &pNew, 0); + rc = sqlite3LockAndPrepare(db, zSql, -1, 0, p, &pNew, 0); if( rc ){ if( rc==SQLITE_NOMEM ){ db->mallocFailed = 1; @@ -78432,7 +78887,7 @@ SQLITE_API int sqlite3_prepare( const char **pzTail /* OUT: End of parsed string */ ){ int rc; - rc = sqlite3LockAndPrepare(db,zSql,nBytes,0,ppStmt,pzTail); + rc = sqlite3LockAndPrepare(db,zSql,nBytes,0,0,ppStmt,pzTail); assert( rc==SQLITE_OK || ppStmt==0 || *ppStmt==0 ); /* VERIFY: F13021 */ return rc; } @@ -78444,7 +78899,7 @@ SQLITE_API int sqlite3_prepare_v2( const char **pzTail /* OUT: End of parsed string */ ){ int rc; - rc = sqlite3LockAndPrepare(db,zSql,nBytes,1,ppStmt,pzTail); + rc = sqlite3LockAndPrepare(db,zSql,nBytes,1,0,ppStmt,pzTail); assert( rc==SQLITE_OK || ppStmt==0 || *ppStmt==0 ); /* VERIFY: F13021 */ return rc; } @@ -78478,7 +78933,7 @@ static int sqlite3Prepare16( sqlite3_mutex_enter(db->mutex); zSql8 = sqlite3Utf16to8(db, zSql, nBytes); if( zSql8 ){ - rc = sqlite3LockAndPrepare(db, zSql8, -1, saveSqlFlag, ppStmt, &zTail8); + rc = sqlite3LockAndPrepare(db, zSql8, -1, saveSqlFlag, 0, ppStmt, &zTail8); } if( zTail8 && pzTail ){ @@ -78546,8 +79001,6 @@ SQLITE_API int sqlite3_prepare16_v2( ************************************************************************* ** This file contains C code routines that are called by the parser ** to handle SELECT statements in SQLite. -** -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ @@ -78726,51 +79179,80 @@ static int columnIndex(Table *pTab, const char *zCol){ } /* -** Create an expression node for an identifier with the name of zName +** Search the first N tables in pSrc, from left to right, looking for a +** table that has a column named zCol. +** +** When found, set *piTab and *piCol to the table index and column index +** of the matching column and return TRUE. +** +** If not found, return FALSE. */ -SQLITE_PRIVATE Expr *sqlite3CreateIdExpr(Parse *pParse, const char *zName){ - return sqlite3Expr(pParse->db, TK_ID, zName); +static int tableAndColumnIndex( + SrcList *pSrc, /* Array of tables to search */ + int N, /* Number of tables in pSrc->a[] to search */ + const char *zCol, /* Name of the column we are looking for */ + int *piTab, /* Write index of pSrc->a[] here */ + int *piCol /* Write index of pSrc->a[*piTab].pTab->aCol[] here */ +){ + int i; /* For looping over tables in pSrc */ + int iCol; /* Index of column matching zCol */ + + assert( (piTab==0)==(piCol==0) ); /* Both or neither are NULL */ + for(i=0; ia[i].pTab, zCol); + if( iCol>=0 ){ + if( piTab ){ + *piTab = i; + *piCol = iCol; + } + return 1; + } + } + return 0; } /* -** Add a term to the WHERE expression in *ppExpr that requires the -** zCol column to be equal in the two tables pTab1 and pTab2. +** This function is used to add terms implied by JOIN syntax to the +** WHERE clause expression of a SELECT statement. The new term, which +** is ANDed with the existing WHERE clause, is of the form: +** +** (tab1.col1 = tab2.col2) +** +** where tab1 is the iSrc'th table in SrcList pSrc and tab2 is the +** (iSrc+1)'th. Column col1 is column iColLeft of tab1, and col2 is +** column iColRight of tab2. */ static void addWhereTerm( - Parse *pParse, /* Parsing context */ - const char *zCol, /* Name of the column */ - const Table *pTab1, /* First table */ - const char *zAlias1, /* Alias for first table. May be NULL */ - const Table *pTab2, /* Second table */ - const char *zAlias2, /* Alias for second table. May be NULL */ - int iRightJoinTable, /* VDBE cursor for the right table */ - Expr **ppExpr, /* Add the equality term to this expression */ - int isOuterJoin /* True if dealing with an OUTER join */ + Parse *pParse, /* Parsing context */ + SrcList *pSrc, /* List of tables in FROM clause */ + int iLeft, /* Index of first table to join in pSrc */ + int iColLeft, /* Index of column in first table */ + int iRight, /* Index of second table in pSrc */ + int iColRight, /* Index of column in second table */ + int isOuterJoin, /* True if this is an OUTER join */ + Expr **ppWhere /* IN/OUT: The WHERE clause to add to */ ){ - Expr *pE1a, *pE1b, *pE1c; - Expr *pE2a, *pE2b, *pE2c; - Expr *pE; + sqlite3 *db = pParse->db; + Expr *pE1; + Expr *pE2; + Expr *pEq; - pE1a = sqlite3CreateIdExpr(pParse, zCol); - pE2a = sqlite3CreateIdExpr(pParse, zCol); - if( zAlias1==0 ){ - zAlias1 = pTab1->zName; - } - pE1b = sqlite3CreateIdExpr(pParse, zAlias1); - if( zAlias2==0 ){ - zAlias2 = pTab2->zName; - } - pE2b = sqlite3CreateIdExpr(pParse, zAlias2); - pE1c = sqlite3PExpr(pParse, TK_DOT, pE1b, pE1a, 0); - pE2c = sqlite3PExpr(pParse, TK_DOT, pE2b, pE2a, 0); - pE = sqlite3PExpr(pParse, TK_EQ, pE1c, pE2c, 0); - if( pE && isOuterJoin ){ - ExprSetProperty(pE, EP_FromJoin); - assert( !ExprHasAnyProperty(pE, EP_TokenOnly|EP_Reduced) ); - ExprSetIrreducible(pE); - pE->iRightJoinTable = (i16)iRightJoinTable; + assert( iLeftnSrc>iRight ); + assert( pSrc->a[iLeft].pTab ); + assert( pSrc->a[iRight].pTab ); + + pE1 = sqlite3CreateColumnExpr(db, pSrc, iLeft, iColLeft); + pE2 = sqlite3CreateColumnExpr(db, pSrc, iRight, iColRight); + + pEq = sqlite3PExpr(pParse, TK_EQ, pE1, pE2, 0); + if( pEq && isOuterJoin ){ + ExprSetProperty(pEq, EP_FromJoin); + assert( !ExprHasAnyProperty(pEq, EP_TokenOnly|EP_Reduced) ); + ExprSetIrreducible(pEq); + pEq->iRightJoinTable = (i16)pE2->iTable; } - *ppExpr = sqlite3ExprAnd(pParse->db,*ppExpr, pE); + *ppWhere = sqlite3ExprAnd(db, *ppWhere, pEq); } /* @@ -78850,13 +79332,15 @@ static int sqliteProcessJoin(Parse *pParse, Select *p){ "an ON or USING clause", 0); return 1; } - for(j=0; jnCol; j++){ - char *zName = pLeftTab->aCol[j].zName; - if( columnIndex(pRightTab, zName)>=0 ){ - addWhereTerm(pParse, zName, pLeftTab, pLeft->zAlias, - pRightTab, pRight->zAlias, - pRight->iCursor, &p->pWhere, isOuter); - + for(j=0; jnCol; j++){ + char *zName; /* Name of column in the right table */ + int iLeft; /* Matching left table */ + int iLeftCol; /* Matching column in the left table */ + + zName = pRightTab->aCol[j].zName; + if( tableAndColumnIndex(pSrc, i+1, zName, &iLeft, &iLeftCol) ){ + addWhereTerm(pParse, pSrc, iLeft, iLeftCol, i+1, j, + isOuter, &p->pWhere); } } } @@ -78888,15 +79372,22 @@ static int sqliteProcessJoin(Parse *pParse, Select *p){ if( pRight->pUsing ){ IdList *pList = pRight->pUsing; for(j=0; jnId; j++){ - char *zName = pList->a[j].zName; - if( columnIndex(pLeftTab, zName)<0 || columnIndex(pRightTab, zName)<0 ){ + char *zName; /* Name of the term in the USING clause */ + int iLeft; /* Table on the left with matching column name */ + int iLeftCol; /* Column number of matching column on the left */ + int iRightCol; /* Column number of matching column on the right */ + + zName = pList->a[j].zName; + iRightCol = columnIndex(pRightTab, zName); + if( iRightCol<0 + || !tableAndColumnIndex(pSrc, i+1, zName, &iLeft, &iLeftCol) + ){ sqlite3ErrorMsg(pParse, "cannot join using column %s - column " "not present in both tables", zName); return 1; } - addWhereTerm(pParse, zName, pLeftTab, pLeft->zAlias, - pRightTab, pRight->zAlias, - pRight->iCursor, &p->pWhere, isOuter); + addWhereTerm(pParse, pSrc, iLeft, iLeftCol, i+1, iRightCol, + isOuter, &p->pWhere); } } } @@ -78983,8 +79474,8 @@ static void codeDistinct( v = pParse->pVdbe; r1 = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp4Int(v, OP_Found, iTab, addrRepeat, iMem, N); sqlite3VdbeAddOp3(v, OP_MakeRecord, iMem, N, r1); - sqlite3VdbeAddOp3(v, OP_Found, iTab, addrRepeat, r1); sqlite3VdbeAddOp2(v, OP_IdxInsert, iTab, r1); sqlite3ReleaseTempReg(pParse, r1); } @@ -79225,8 +79716,7 @@ static void selectInnerLoop( if( p->iLimit ){ assert( pOrderBy==0 ); /* If there is an ORDER BY, the call to ** pushOntoSorter() would have cleared p->iLimit */ - sqlite3VdbeAddOp2(v, OP_AddImm, p->iLimit, -1); - sqlite3VdbeAddOp2(v, OP_IfZero, p->iLimit, iBreak); + sqlite3VdbeAddOp3(v, OP_IfZero, p->iLimit, iBreak, -1); } } @@ -79456,7 +79946,7 @@ static const char *columnType( ** of the SELECT statement. Return the declaration type and origin ** data for the result-set column of the sub-select. */ - if( ALWAYS(iCol>=0 && iColpEList->nExpr) ){ + if( iCol>=0 && ALWAYS(iColpEList->nExpr) ){ /* If iCol is less than zero, then the expression requests the ** rowid of the sub-select or view. This expression is legal (see ** test case misc2.2.2) - it always evaluates to NULL. @@ -79852,7 +80342,7 @@ static void computeLimitRegisters(Parse *pParse, Select *p, int iBreak){ Vdbe *v = 0; int iLimit = 0; int iOffset; - int addr1; + int addr1, n; if( p->iLimit ) return; /* @@ -79867,10 +80357,18 @@ static void computeLimitRegisters(Parse *pParse, Select *p, int iBreak){ p->iLimit = iLimit = ++pParse->nMem; v = sqlite3GetVdbe(pParse); if( NEVER(v==0) ) return; /* VDBE should have already been allocated */ - sqlite3ExprCode(pParse, p->pLimit, iLimit); - sqlite3VdbeAddOp1(v, OP_MustBeInt, iLimit); - VdbeComment((v, "LIMIT counter")); - sqlite3VdbeAddOp2(v, OP_IfZero, iLimit, iBreak); + if( sqlite3ExprIsInteger(p->pLimit, &n) ){ + sqlite3VdbeAddOp2(v, OP_Integer, n, iLimit); + VdbeComment((v, "LIMIT counter")); + if( n==0 ){ + sqlite3VdbeAddOp2(v, OP_Goto, 0, iBreak); + } + }else{ + sqlite3ExprCode(pParse, p->pLimit, iLimit); + sqlite3VdbeAddOp1(v, OP_MustBeInt, iLimit); + VdbeComment((v, "LIMIT counter")); + sqlite3VdbeAddOp2(v, OP_IfZero, iLimit, iBreak); + } if( p->pOffset ){ p->iOffset = iOffset = ++pParse->nMem; pParse->nMem++; /* Allocate an extra register for limit+offset */ @@ -80206,7 +80704,7 @@ static int multiSelect( sqlite3VdbeAddOp2(v, OP_Rewind, tab1, iBreak); r1 = sqlite3GetTempReg(pParse); iStart = sqlite3VdbeAddOp2(v, OP_RowKey, tab1, r1); - sqlite3VdbeAddOp3(v, OP_NotFound, tab2, iCont, r1); + sqlite3VdbeAddOp4Int(v, OP_NotFound, tab2, iCont, r1, 0); sqlite3ReleaseTempReg(pParse, r1); selectInnerLoop(pParse, p, p->pEList, tab1, p->pEList->nExpr, 0, -1, &dest, iCont, iBreak); @@ -80425,8 +80923,7 @@ static int generateOutputSubroutine( /* Jump to the end of the loop if the LIMIT is reached. */ if( p->iLimit ){ - sqlite3VdbeAddOp2(v, OP_AddImm, p->iLimit, -1); - sqlite3VdbeAddOp2(v, OP_IfZero, p->iLimit, iBreak); + sqlite3VdbeAddOp3(v, OP_IfZero, p->iLimit, iBreak, -1); } /* Generate the subroutine return @@ -81010,7 +81507,7 @@ static void substSelect( ** ** (11) The subquery and the outer query do not both have ORDER BY clauses. ** -** (12) Not implemented. Subsumed into restriction (3). Was previously +** (**) Not implemented. Subsumed into restriction (3). Was previously ** a separate restriction deriving from ticket #350. ** ** (13) The subquery and outer query do not both use LIMIT @@ -81084,6 +81581,7 @@ static int flattenSubquery( */ assert( p!=0 ); assert( p->pPrior==0 ); /* Unable to flatten compound queries */ + if( db->flags & SQLITE_QueryFlattener ) return 0; pSrc = p->pSrc; assert( pSrc && iFrom>=0 && iFromnSrc ); pSubitem = &pSrc->a[iFrom]; @@ -81707,14 +82205,14 @@ static int selectExpander(Walker *pWalker, Select *p){ } if( i>0 && zTName==0 ){ - struct SrcList_item *pLeft = &pTabList->a[i-1]; - if( (pLeft[1].jointype & JT_NATURAL)!=0 && - columnIndex(pLeft->pTab, zName)>=0 ){ + if( (pFrom->jointype & JT_NATURAL)!=0 + && tableAndColumnIndex(pTabList, i, zName, 0, 0) + ){ /* In a NATURAL join, omit the join columns from the - ** table on the right */ + ** table to the right of the join */ continue; } - if( sqlite3IdListIndex(pLeft[1].pUsing, zName)>=0 ){ + if( sqlite3IdListIndex(pFrom->pUsing, zName)>=0 ){ /* In a join with a USING clause, omit columns in the ** using clause from the table on the right. */ continue; @@ -81981,8 +82479,8 @@ static void updateAccumulator(Parse *pParse, AggInfo *pAggInfo){ sqlite3VdbeAddOp4(v, OP_AggStep, 0, regAgg, pF->iMem, (void*)pF->pFunc, P4_FUNCDEF); sqlite3VdbeChangeP5(v, (u8)nArg); - sqlite3ReleaseTempRange(pParse, regAgg, nArg); sqlite3ExprCacheAffinityChange(pParse, regAgg, nArg); + sqlite3ReleaseTempRange(pParse, regAgg, nArg); if( addrNext ){ sqlite3VdbeResolveLabel(v, addrNext); sqlite3ExprCacheClear(pParse); @@ -82408,7 +82906,7 @@ SQLITE_PRIVATE int sqlite3Select( int r2; r2 = sqlite3ExprCodeGetColumn(pParse, - pCol->pTab, pCol->iColumn, pCol->iTable, r1, 0); + pCol->pTab, pCol->iColumn, pCol->iTable, r1); if( r1!=r2 ){ sqlite3VdbeAddOp2(v, OP_SCopy, r2, r1); } @@ -82794,8 +83292,6 @@ SQLITE_PRIVATE void sqlite3PrintSelect(Select *p, int indent){ ** ** These routines are in a separate files so that they will not be linked ** if they are not used. -** -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ #ifndef SQLITE_OMIT_GET_TABLE @@ -82986,9 +83482,7 @@ SQLITE_API void sqlite3_free_table( ** May you share freely, never taking more than you give. ** ************************************************************************* -** -** -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ +** This file contains the implementation for TRIGGERs */ #ifndef SQLITE_OMIT_TRIGGER @@ -83790,7 +84284,8 @@ static TriggerPrg *codeRowTrigger( pProgram->nRef = 1; pPrg->pTrigger = pTrigger; pPrg->orconf = orconf; - pPrg->oldmask = 0xffffffff; + pPrg->aColmask[0] = 0xffffffff; + pPrg->aColmask[1] = 0xffffffff; /* Allocate and populate a new Parse context to use for coding the ** trigger sub-program. */ @@ -83851,7 +84346,8 @@ static TriggerPrg *codeRowTrigger( pProgram->nMem = pSubParse->nMem; pProgram->nCsr = pSubParse->nTab; pProgram->token = (void *)pTrigger; - pPrg->oldmask = pSubParse->oldmask; + pPrg->aColmask[0] = pSubParse->oldmask; + pPrg->aColmask[1] = pSubParse->newmask; sqlite3VdbeDelete(v); } @@ -84011,28 +84507,36 @@ SQLITE_PRIVATE void sqlite3CodeRowTrigger( } /* -** Triggers fired by UPDATE or DELETE statements may access values stored -** in the old.* pseudo-table. This function returns a 32-bit bitmask -** indicating which columns of the old.* table actually are used by -** triggers. This information may be used by the caller to avoid having -** to load the entire old.* record into memory when executing an UPDATE -** or DELETE command. +** Triggers may access values stored in the old.* or new.* pseudo-table. +** This function returns a 32-bit bitmask indicating which columns of the +** old.* or new.* tables actually are used by triggers. This information +** may be used by the caller, for example, to avoid having to load the entire +** old.* record into memory when executing an UPDATE or DELETE command. ** ** Bit 0 of the returned mask is set if the left-most column of the -** table may be accessed using an old. reference. Bit 1 is set if +** table may be accessed using an [old|new]. reference. Bit 1 is set if ** the second leftmost column value is required, and so on. If there ** are more than 32 columns in the table, and at least one of the columns ** with an index greater than 32 may be accessed, 0xffffffff is returned. ** -** It is not possible to determine if the old.rowid column is accessed -** by triggers. The caller must always assume that it is. +** It is not possible to determine if the old.rowid or new.rowid column is +** accessed by triggers. The caller must always assume that it is. +** +** Parameter isNew must be either 1 or 0. If it is 0, then the mask returned +** applies to the old.* table. If 1, the new.* table. ** -** There is no equivalent function for new.* references. +** Parameter tr_tm must be a mask with one or both of the TRIGGER_BEFORE +** and TRIGGER_AFTER bits set. Values accessed by BEFORE triggers are only +** included in the returned mask if the TRIGGER_BEFORE bit is set in the +** tr_tm parameter. Similarly, values accessed by AFTER triggers are only +** included in the returned mask if the TRIGGER_AFTER bit is set in tr_tm. */ -SQLITE_PRIVATE u32 sqlite3TriggerOldmask( +SQLITE_PRIVATE u32 sqlite3TriggerColmask( Parse *pParse, /* Parse context */ Trigger *pTrigger, /* List of triggers on table pTab */ ExprList *pChanges, /* Changes list for any UPDATE OF triggers */ + int isNew, /* 1 for new.* ref mask, 0 for old.* ref mask */ + int tr_tm, /* Mask of TRIGGER_BEFORE|TRIGGER_AFTER */ Table *pTab, /* The table to code triggers from */ int orconf /* Default ON CONFLICT policy for trigger steps */ ){ @@ -84040,12 +84544,15 @@ SQLITE_PRIVATE u32 sqlite3TriggerOldmask( u32 mask = 0; Trigger *p; + assert( isNew==1 || isNew==0 ); for(p=pTrigger; p; p=p->pNext){ - if( p->op==op && checkColumnOverlap(p->pColumns,pChanges) ){ + if( p->op==op && (tr_tm&p->tr_tm) + && checkColumnOverlap(p->pColumns,pChanges) + ){ TriggerPrg *pPrg; pPrg = getRowTrigger(pParse, p, pTab, orconf); if( pPrg ){ - mask |= pPrg->oldmask; + mask |= pPrg->aColmask[isNew]; } } } @@ -84070,8 +84577,6 @@ SQLITE_PRIVATE u32 sqlite3TriggerOldmask( ************************************************************************* ** This file contains C code routines that are called by the parser ** to handle UPDATE statements. -** -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ #ifndef SQLITE_OMIT_VIRTUALTABLE @@ -84171,14 +84676,15 @@ SQLITE_PRIVATE void sqlite3Update( AuthContext sContext; /* The authorization context */ NameContext sNC; /* The name-context to resolve expressions in */ int iDb; /* Database containing the table being updated */ - int j1; /* Addresses of jump instructions */ int okOnePass; /* True for one-pass algorithm without the FIFO */ int hasFK; /* True if foreign key processing is required */ #ifndef SQLITE_OMIT_TRIGGER - int isView; /* Trying to update a view */ - Trigger *pTrigger; /* List of triggers on pTab, if required */ + int isView; /* True when updating a view (INSTEAD OF trigger) */ + Trigger *pTrigger; /* List of triggers on pTab, if required */ + int tmask; /* Mask of TRIGGER_BEFORE|TRIGGER_AFTER */ #endif + int newmask; /* Mask of NEW.* columns accessed by BEFORE triggers */ /* Register Allocations */ int regRowCount = 0; /* A count of rows changed */ @@ -84206,11 +84712,13 @@ SQLITE_PRIVATE void sqlite3Update( ** updated is a view. */ #ifndef SQLITE_OMIT_TRIGGER - pTrigger = sqlite3TriggersExist(pParse, pTab, TK_UPDATE, pChanges, 0); + pTrigger = sqlite3TriggersExist(pParse, pTab, TK_UPDATE, pChanges, &tmask); isView = pTab->pSelect!=0; + assert( pTrigger || tmask==0 ); #else # define pTrigger 0 # define isView 0 +# define tmask 0 #endif #ifdef SQLITE_OMIT_VIEW # undef isView @@ -84220,7 +84728,7 @@ SQLITE_PRIVATE void sqlite3Update( if( sqlite3ViewGetColumnNames(pParse, pTab) ){ goto update_cleanup; } - if( sqlite3IsReadOnly(pParse, pTab, (pTrigger?1:0)) ){ + if( sqlite3IsReadOnly(pParse, pTab, tmask) ){ goto update_cleanup; } aXRef = sqlite3DbMallocRaw(db, sizeof(int) * pTab->nCol ); @@ -84448,7 +84956,9 @@ SQLITE_PRIVATE void sqlite3Update( ** with the required old.* column data. */ if( hasFK || pTrigger ){ u32 oldmask = (hasFK ? sqlite3FkOldmask(pParse, pTab) : 0); - oldmask |= sqlite3TriggerOldmask(pParse, pTrigger, pChanges, pTab, onError); + oldmask |= sqlite3TriggerColmask(pParse, + pTrigger, pChanges, 0, TRIGGER_BEFORE|TRIGGER_AFTER, pTab, onError + ); for(i=0; inCol; i++){ if( aXRef[i]<0 || oldmask==0xffffffff || (oldmask & (1<nCol; i++){ if( i==pTab->iPKey ){ sqlite3VdbeAddOp2(v, OP_Null, 0, regNew+i); }else{ j = aXRef[i]; - if( j<0 ){ + if( j>=0 ){ + sqlite3ExprCode(pParse, pChanges->a[j].pExpr, regNew+i); + }else if( 0==(tmask&TRIGGER_BEFORE) || i>31 || (newmask&(1<a[j].pExpr, regNew+i); } } } /* Fire any BEFORE UPDATE triggers. This happens before constraints are - ** verified. One could argue that this is wrong. */ - if( pTrigger ){ + ** verified. One could argue that this is wrong. + */ + if( tmask&TRIGGER_BEFORE ){ sqlite3VdbeAddOp2(v, OP_Affinity, regNew, pTab->nCol); sqlite3TableAffinityStr(v, pTab); sqlite3CodeRowTrigger(pParse, pTrigger, TK_UPDATE, pChanges, @@ -84492,11 +85022,25 @@ SQLITE_PRIVATE void sqlite3Update( ** case, jump to the next row. No updates or AFTER triggers are ** required. This behaviour - what happens when the row being updated ** is deleted or renamed by a BEFORE trigger - is left undefined in the - ** documentation. */ + ** documentation. + */ sqlite3VdbeAddOp3(v, OP_NotExists, iCur, addr, regOldRowid); + + /* If it did not delete it, the row-trigger may still have modified + ** some of the columns of the row being updated. Load the values for + ** all columns not modified by the update statement into their + ** registers in case this has happened. + */ + for(i=0; inCol; i++){ + if( aXRef[i]<0 && i!=pTab->iPKey ){ + sqlite3VdbeAddOp3(v, OP_Column, iCur, i, regNew+i); + sqlite3ColumnDefault(v, pTab, i, regNew+i); + } + } } if( !isView ){ + int j1; /* Address of jump instruction */ /* Do constraint checks. */ sqlite3GenerateConstraintChecks(pParse, pTab, iCur, regNewRowid, @@ -84637,8 +85181,7 @@ static void updateVirtualTable( /* Construct the SELECT statement that will find the new values for ** all updated rows. */ - pEList = sqlite3ExprListAppend(pParse, 0, - sqlite3CreateIdExpr(pParse, "_rowid_")); + pEList = sqlite3ExprListAppend(pParse, 0, sqlite3Expr(db, TK_ID, "_rowid_")); if( pRowid ){ pEList = sqlite3ExprListAppend(pParse, pEList, sqlite3ExprDup(db, pRowid, 0)); @@ -84648,7 +85191,7 @@ static void updateVirtualTable( if( aXRef[i]>=0 ){ pExpr = sqlite3ExprDup(db, pChanges->a[aXRef[i]].pExpr, 0); }else{ - pExpr = sqlite3CreateIdExpr(pParse, pTab->aCol[i].zName); + pExpr = sqlite3Expr(db, TK_ID, pTab->aCol[i].zName); } pEList = sqlite3ExprListAppend(pParse, pEList, pExpr); } @@ -84704,8 +85247,6 @@ static void updateVirtualTable( ** ** Most of the code in this file may be omitted by defining the ** SQLITE_OMIT_VACUUM macro. -** -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ #if !defined(SQLITE_OMIT_VACUUM) && !defined(SQLITE_OMIT_ATTACH) @@ -84777,6 +85318,7 @@ SQLITE_PRIVATE int sqlite3RunVacuum(char **pzErrMsg, sqlite3 *db){ int saved_flags; /* Saved value of the db->flags */ int saved_nChange; /* Saved value of db->nChange */ int saved_nTotalChange; /* Saved value of db->nTotalChange */ + void (*saved_xTrace)(void*,const char*); /* Saved db->xTrace */ Db *pDb = 0; /* Database to detach at end of vacuum */ int isMemDb; /* True if vacuuming a :memory: database */ int nRes; @@ -84792,8 +85334,10 @@ SQLITE_PRIVATE int sqlite3RunVacuum(char **pzErrMsg, sqlite3 *db){ saved_flags = db->flags; saved_nChange = db->nChange; saved_nTotalChange = db->nTotalChange; + saved_xTrace = db->xTrace; db->flags |= SQLITE_WriteSchema | SQLITE_IgnoreChecks; db->flags &= ~SQLITE_ForeignKeys; + db->xTrace = 0; pMain = db->aDb[0].pBt; isMemDb = sqlite3PagerIsMemdb(sqlite3BtreePager(pMain)); @@ -84819,6 +85363,12 @@ SQLITE_PRIVATE int sqlite3RunVacuum(char **pzErrMsg, sqlite3 *db){ assert( strcmp(db->aDb[db->nDb-1].zName,"vacuum_db")==0 ); pTemp = db->aDb[db->nDb-1].pBt; + /* The call to execSql() to attach the temp database has left the file + ** locked (as there was more than one active statement when the transaction + ** to read the schema was concluded. Unlock it here so that this doesn't + ** cause problems for the call to BtreeSetPageSize() below. */ + sqlite3BtreeCommit(pTemp); + nRes = sqlite3BtreeGetReserve(pMain); /* A VACUUM cannot change the pagesize of an encrypted database. */ @@ -84872,13 +85422,13 @@ SQLITE_PRIVATE int sqlite3RunVacuum(char **pzErrMsg, sqlite3 *db){ if( rc!=SQLITE_OK ) goto end_of_vacuum; /* Loop through the tables in the main database. For each, do - ** an "INSERT INTO vacuum_db.xxx SELECT * FROM xxx;" to copy + ** an "INSERT INTO vacuum_db.xxx SELECT * FROM main.xxx;" to copy ** the contents to the temporary database. */ rc = execExecSql(db, "SELECT 'INSERT INTO vacuum_db.' || quote(name) " - "|| ' SELECT * FROM ' || quote(name) || ';'" - "FROM sqlite_master " + "|| ' SELECT * FROM main.' || quote(name) || ';'" + "FROM main.sqlite_master " "WHERE type = 'table' AND name!='sqlite_sequence' " " AND rootpage>0" @@ -84894,7 +85444,7 @@ SQLITE_PRIVATE int sqlite3RunVacuum(char **pzErrMsg, sqlite3 *db){ if( rc!=SQLITE_OK ) goto end_of_vacuum; rc = execExecSql(db, "SELECT 'INSERT INTO vacuum_db.' || quote(name) " - "|| ' SELECT * FROM ' || quote(name) || ';' " + "|| ' SELECT * FROM main.' || quote(name) || ';' " "FROM vacuum_db.sqlite_master WHERE name=='sqlite_sequence';" ); if( rc!=SQLITE_OK ) goto end_of_vacuum; @@ -84908,7 +85458,7 @@ SQLITE_PRIVATE int sqlite3RunVacuum(char **pzErrMsg, sqlite3 *db){ rc = execSql(db, "INSERT INTO vacuum_db.sqlite_master " " SELECT type, name, tbl_name, rootpage, sql" - " FROM sqlite_master" + " FROM main.sqlite_master" " WHERE type='view' OR type='trigger'" " OR (type='table' AND rootpage=0)" ); @@ -84968,6 +85518,7 @@ end_of_vacuum: db->flags = saved_flags; db->nChange = saved_nChange; db->nTotalChange = saved_nTotalChange; + db->xTrace = saved_xTrace; /* Currently there is an SQL level transaction open on the vacuum ** database. No locks are held on any other files (since the main file @@ -85004,8 +85555,6 @@ end_of_vacuum: ** ************************************************************************* ** This file contains code used to help implement virtual tables. -** -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ #ifndef SQLITE_OMIT_VIRTUALTABLE @@ -85664,11 +86213,11 @@ SQLITE_API int sqlite3_declare_vtab(sqlite3 *db, const char *zCreateTable){ pParse->declareVtab = 1; pParse->db = db; - if( - SQLITE_OK == sqlite3RunParser(pParse, zCreateTable, &zErr) && - pParse->pNewTable && - !pParse->pNewTable->pSelect && - (pParse->pNewTable->tabFlags & TF_Virtual)==0 + if( SQLITE_OK==sqlite3RunParser(pParse, zCreateTable, &zErr) + && pParse->pNewTable + && !db->mallocFailed + && !pParse->pNewTable->pSelect + && (pParse->pNewTable->tabFlags & TF_Virtual)==0 ){ if( !pTab->aCol ){ pTab->aCol = pParse->pNewTable->aCol; @@ -85677,7 +86226,7 @@ SQLITE_API int sqlite3_declare_vtab(sqlite3 *db, const char *zCreateTable){ pParse->pNewTable->aCol = 0; } db->pVTab = 0; - } else { + }else{ sqlite3Error(db, SQLITE_ERROR, zErr); sqlite3DbFree(db, zErr); rc = SQLITE_ERROR; @@ -85973,8 +86522,6 @@ SQLITE_PRIVATE void sqlite3VtabMakeWritable(Parse *pParse, Table *pTab){ ** rows. Indices are selected and used to speed the search when doing ** so is applicable. Because this module is responsible for selecting ** indices, you might also think of this module as the "query optimizer". -** -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ /* @@ -86582,11 +87129,11 @@ static void exprAnalyzeAll( static int isLikeOrGlob( Parse *pParse, /* Parsing and code generating context */ Expr *pExpr, /* Test this expression */ - int *pnPattern, /* Number of non-wildcard prefix characters */ + Expr **ppPrefix, /* Pointer to TK_STRING expression with pattern prefix */ int *pisComplete, /* True if the only wildcard is % in the last character */ int *pnoCase /* True if uppercase is equivalent to lowercase */ ){ - const char *z; /* String on RHS of LIKE operator */ + const char *z = 0; /* String on RHS of LIKE operator */ Expr *pRight, *pLeft; /* Right and left size of LIKE operator */ ExprList *pList; /* List of operands to the LIKE operator */ int c; /* One character in z[] */ @@ -86594,6 +87141,8 @@ static int isLikeOrGlob( char wc[3]; /* Wildcard characters */ CollSeq *pColl; /* Collating sequence for LHS */ sqlite3 *db = pParse->db; /* Database connection */ + sqlite3_value *pVal = 0; + int op; /* Opcode of pRight */ if( !sqlite3IsLikeFunction(db, pExpr, pnoCase, wc) ){ return 0; @@ -86602,35 +87151,77 @@ static int isLikeOrGlob( if( *pnoCase ) return 0; #endif pList = pExpr->x.pList; - pRight = pList->a[0].pExpr; - if( pRight->op!=TK_STRING ){ - return 0; - } pLeft = pList->a[1].pExpr; - if( pLeft->op!=TK_COLUMN ){ + if( pLeft->op!=TK_COLUMN || sqlite3ExprAffinity(pLeft)!=SQLITE_AFF_TEXT ){ + /* IMP: R-02065-49465 The left-hand side of the LIKE or GLOB operator must + ** be the name of an indexed column with TEXT affinity. */ return 0; } + assert( pLeft->iColumn!=(-1) ); /* Because IPK never has AFF_TEXT */ pColl = sqlite3ExprCollSeq(pParse, pLeft); - assert( pColl!=0 || pLeft->iColumn==-1 ); - if( pColl==0 ) return 0; + assert( pColl!=0 ); /* Every non-IPK column has a collating sequence */ if( (pColl->type!=SQLITE_COLL_BINARY || *pnoCase) && (pColl->type!=SQLITE_COLL_NOCASE || !*pnoCase) ){ + /* IMP: R-09003-32046 For the GLOB operator, the column must use the + ** default BINARY collating sequence. + ** IMP: R-41408-28306 For the LIKE operator, if case_sensitive_like mode + ** is enabled then the column must use the default BINARY collating + ** sequence, or if case_sensitive_like mode is disabled then the column + ** must use the built-in NOCASE collating sequence. + */ return 0; } - if( sqlite3ExprAffinity(pLeft)!=SQLITE_AFF_TEXT ) return 0; - z = pRight->u.zToken; - if( ALWAYS(z) ){ + + pRight = pList->a[0].pExpr; + op = pRight->op; + if( op==TK_REGISTER ){ + op = pRight->op2; + } + if( op==TK_VARIABLE ){ + Vdbe *pReprepare = pParse->pReprepare; + pVal = sqlite3VdbeGetValue(pReprepare, pRight->iColumn, SQLITE_AFF_NONE); + if( pVal && sqlite3_value_type(pVal)==SQLITE_TEXT ){ + z = (char *)sqlite3_value_text(pVal); + } + sqlite3VdbeSetVarmask(pParse->pVdbe, pRight->iColumn); + assert( pRight->op==TK_VARIABLE || pRight->op==TK_REGISTER ); + }else if( op==TK_STRING ){ + z = pRight->u.zToken; + } + if( z ){ cnt = 0; while( (c=z[cnt])!=0 && c!=wc[0] && c!=wc[1] && c!=wc[2] ){ cnt++; } if( cnt!=0 && c!=0 && 255!=(u8)z[cnt-1] ){ + Expr *pPrefix; *pisComplete = z[cnt]==wc[0] && z[cnt+1]==0; - *pnPattern = cnt; - return 1; + pPrefix = sqlite3Expr(db, TK_STRING, z); + if( pPrefix ) pPrefix->u.zToken[cnt] = 0; + *ppPrefix = pPrefix; + if( op==TK_VARIABLE ){ + Vdbe *v = pParse->pVdbe; + sqlite3VdbeSetVarmask(v, pRight->iColumn); + if( *pisComplete && pRight->u.zToken[1] ){ + /* If the rhs of the LIKE expression is a variable, and the current + ** value of the variable means there is no need to invoke the LIKE + ** function, then no OP_Variable will be added to the program. + ** This causes problems for the sqlite3_bind_parameter_name() + ** API. To workaround them, add a dummy OP_Variable here. + */ + int r1 = sqlite3GetTempReg(pParse); + sqlite3ExprCodeTarget(pParse, pRight, r1); + sqlite3VdbeChangeP3(v, sqlite3VdbeCurrentAddr(v)-1, 0); + sqlite3ReleaseTempReg(pParse, r1); + } + } + }else{ + z = 0; } } - return 0; + + sqlite3ValueFree(pVal); + return (z!=0); } #endif /* SQLITE_OMIT_LIKE_OPTIMIZATION */ @@ -87011,10 +87602,10 @@ static void exprAnalyze( Expr *pExpr; /* The expression to be analyzed */ Bitmask prereqLeft; /* Prerequesites of the pExpr->pLeft */ Bitmask prereqAll; /* Prerequesites of pExpr */ - Bitmask extraRight = 0; - int nPattern; - int isComplete; - int noCase; + Bitmask extraRight = 0; /* */ + Expr *pStr1 = 0; /* RHS of LIKE/GLOB operator */ + int isComplete = 0; /* RHS of LIKE/GLOB ends with wildcard */ + int noCase = 0; /* LIKE/GLOB distinguishes case */ int op; /* Top-level operator. pExpr->op */ Parse *pParse = pWC->pParse; /* Parsing context */ sqlite3 *db = pParse->db; /* Database connection */ @@ -87149,21 +87740,21 @@ static void exprAnalyze( ** The last character of the prefix "abc" is incremented to form the ** termination condition "abd". */ - if( isLikeOrGlob(pParse, pExpr, &nPattern, &isComplete, &noCase) - && pWC->op==TK_AND ){ - Expr *pLeft, *pRight; - Expr *pStr1, *pStr2; - Expr *pNewExpr1, *pNewExpr2; - int idxNew1, idxNew2; + if( pWC->op==TK_AND + && isLikeOrGlob(pParse, pExpr, &pStr1, &isComplete, &noCase) + ){ + Expr *pLeft; /* LHS of LIKE/GLOB operator */ + Expr *pStr2; /* Copy of pStr1 - RHS of LIKE/GLOB operator */ + Expr *pNewExpr1; + Expr *pNewExpr2; + int idxNew1; + int idxNew2; pLeft = pExpr->x.pList->a[1].pExpr; - pRight = pExpr->x.pList->a[0].pExpr; - pStr1 = sqlite3Expr(db, TK_STRING, pRight->u.zToken); - if( pStr1 ) pStr1->u.zToken[nPattern] = 0; pStr2 = sqlite3ExprDup(db, pStr1, 0); if( !db->mallocFailed ){ u8 c, *pC; /* Last character before the first wildcard */ - pC = (u8*)&pStr2->u.zToken[nPattern-1]; + pC = (u8*)&pStr2->u.zToken[sqlite3Strlen30(pStr2->u.zToken)-1]; c = *pC; if( noCase ){ /* The point is to increment the last character before the first @@ -87941,6 +88532,42 @@ static int whereRangeRegion( } #endif /* #ifdef SQLITE_ENABLE_STAT2 */ +/* +** If expression pExpr represents a literal value, set *pp to point to +** an sqlite3_value structure containing the same value, with affinity +** aff applied to it, before returning. It is the responsibility of the +** caller to eventually release this structure by passing it to +** sqlite3ValueFree(). +** +** If the current parse is a recompile (sqlite3Reprepare()) and pExpr +** is an SQL variable that currently has a non-NULL value bound to it, +** create an sqlite3_value structure containing this value, again with +** affinity aff applied to it, instead. +** +** If neither of the above apply, set *pp to NULL. +** +** If an error occurs, return an error code. Otherwise, SQLITE_OK. +*/ +#ifdef SQLITE_ENABLE_STAT2 +static int valueFromExpr( + Parse *pParse, + Expr *pExpr, + u8 aff, + sqlite3_value **pp +){ + /* The evalConstExpr() function will have already converted any TK_VARIABLE + ** expression involved in an comparison into a TK_REGISTER. */ + assert( pExpr->op!=TK_VARIABLE ); + if( pExpr->op==TK_REGISTER && pExpr->op2==TK_VARIABLE ){ + int iVar = pExpr->iColumn; + sqlite3VdbeSetVarmask(pParse->pVdbe, iVar); + *pp = sqlite3VdbeGetValue(pParse->pReprepare, iVar, aff); + return SQLITE_OK; + } + return sqlite3ValueFromExpr(pParse->db, pExpr, SQLITE_UTF8, aff, pp); +} +#endif + /* ** This function is used to estimate the number of rows that will be visited ** by scanning an index for a range of values. The range may have an upper @@ -87993,23 +88620,22 @@ static int whereRangeScanEst( int rc = SQLITE_OK; #ifdef SQLITE_ENABLE_STAT2 - sqlite3 *db = pParse->db; - sqlite3_value *pLowerVal = 0; - sqlite3_value *pUpperVal = 0; if( nEq==0 && p->aSample ){ + sqlite3_value *pLowerVal = 0; + sqlite3_value *pUpperVal = 0; int iEst; int iLower = 0; int iUpper = SQLITE_INDEX_SAMPLES; - u8 aff = p->pTable->aCol[0].affinity; + u8 aff = p->pTable->aCol[p->aiColumn[0]].affinity; if( pLower ){ Expr *pExpr = pLower->pExpr->pRight; - rc = sqlite3ValueFromExpr(db, pExpr, SQLITE_UTF8, aff, &pLowerVal); + rc = valueFromExpr(pParse, pExpr, aff, &pLowerVal); } if( rc==SQLITE_OK && pUpper ){ Expr *pExpr = pUpper->pExpr->pRight; - rc = sqlite3ValueFromExpr(db, pExpr, SQLITE_UTF8, aff, &pUpperVal); + rc = valueFromExpr(pParse, pExpr, aff, &pUpperVal); } if( rc!=SQLITE_OK || (pLowerVal==0 && pUpperVal==0) ){ @@ -88474,16 +89100,39 @@ static void disableTerm(WhereLevel *pLevel, WhereTerm *pTerm){ ** Code an OP_Affinity opcode to apply the column affinity string zAff ** to the n registers starting at base. ** -** Buffer zAff was allocated using sqlite3DbMalloc(). It is the -** responsibility of this function to arrange for it to be eventually -** freed using sqlite3DbFree(). +** As an optimization, SQLITE_AFF_NONE entries (which are no-ops) at the +** beginning and end of zAff are ignored. If all entries in zAff are +** SQLITE_AFF_NONE, then no code gets generated. +** +** This routine makes its own copy of zAff so that the caller is free +** to modify zAff after this routine returns. */ static void codeApplyAffinity(Parse *pParse, int base, int n, char *zAff){ Vdbe *v = pParse->pVdbe; + if( zAff==0 ){ + assert( pParse->db->mallocFailed ); + return; + } assert( v!=0 ); - sqlite3VdbeAddOp2(v, OP_Affinity, base, n); - sqlite3VdbeChangeP4(v, -1, zAff, P4_DYNAMIC); - sqlite3ExprCacheAffinityChange(pParse, base, n); + + /* Adjust base and n to skip over SQLITE_AFF_NONE entries at the beginning + ** and end of the affinity string. + */ + while( n>0 && zAff[0]==SQLITE_AFF_NONE ){ + n--; + base++; + zAff++; + } + while( n>1 && zAff[n-1]==SQLITE_AFF_NONE ){ + n--; + } + + /* Code the OP_Affinity opcode if there is anything left to do. */ + if( n>0 ){ + sqlite3VdbeAddOp2(v, OP_Affinity, base, n); + sqlite3VdbeChangeP4(v, -1, zAff, n); + sqlite3ExprCacheAffinityChange(pParse, base, n); + } } @@ -88554,7 +89203,7 @@ static int codeEqualityTerm( /* ** Generate code that will evaluate all == and IN constraints for an -** index. The values for all constraints are left on the stack. +** index. ** ** For example, consider table t1(a,b,c,d,e,f) with index i1(a,b,c). ** Suppose the WHERE clause is this: a==5 AND b IN (1,2,3) AND c>5 AND c<10 @@ -88566,7 +89215,8 @@ static int codeEqualityTerm( ** ** In the example above nEq==2. But this subroutine works for any value ** of nEq including 0. If nEq==0, this routine is nearly a no-op. -** The only thing it does is allocate the pLevel->iMem memory cell. +** The only thing it does is allocate the pLevel->iMem memory cell and +** compute the affinity string. ** ** This routine always allocates at least one memory cell and returns ** the index of that memory cell. The code that @@ -88644,11 +89294,15 @@ static int codeAllEqualityTerms( testcase( pTerm->eOperator & WO_ISNULL ); testcase( pTerm->eOperator & WO_IN ); if( (pTerm->eOperator & (WO_ISNULL|WO_IN))==0 ){ - sqlite3VdbeAddOp2(v, OP_IsNull, regBase+j, pLevel->addrBrk); - if( zAff - && sqlite3CompareAffinity(pTerm->pExpr->pRight, zAff[j])==SQLITE_AFF_NONE - ){ - zAff[j] = SQLITE_AFF_NONE; + Expr *pRight = pTerm->pExpr->pRight; + sqlite3ExprCodeIsNullJump(v, pRight, regBase+j, pLevel->addrBrk); + if( zAff ){ + if( sqlite3CompareAffinity(pRight, zAff[j])==SQLITE_AFF_NONE ){ + zAff[j] = SQLITE_AFF_NONE; + } + if( sqlite3ExprNeedsNoAffinityChange(pRight, zAff[j]) ){ + zAff[j] = SQLITE_AFF_NONE; + } } } } @@ -88728,6 +89382,7 @@ static Bitmask codeOneLoopStart( const struct sqlite3_index_constraint *aConstraint = pVtabIdx->aConstraint; + sqlite3ExprCachePush(pParse); iReg = sqlite3GetTempRange(pParse, nConstraint+2); for(j=1; j<=nConstraint; j++){ for(k=0; kp1 = iCur; pLevel->p2 = sqlite3VdbeCurrentAddr(v); sqlite3ReleaseTempRange(pParse, iReg, nConstraint+2); + sqlite3ExprCachePop(pParse, 1); }else #endif /* SQLITE_OMIT_VIRTUALTABLE */ @@ -88974,15 +89630,18 @@ static Bitmask codeOneLoopStart( if( pRangeStart ){ Expr *pRight = pRangeStart->pExpr->pRight; sqlite3ExprCode(pParse, pRight, regBase+nEq); - sqlite3VdbeAddOp2(v, OP_IsNull, regBase+nEq, addrNxt); - if( zAff - && sqlite3CompareAffinity(pRight, zAff[nConstraint])==SQLITE_AFF_NONE - ){ - /* Since the comparison is to be performed with no conversions applied - ** to the operands, set the affinity to apply to pRight to - ** SQLITE_AFF_NONE. */ - zAff[nConstraint] = SQLITE_AFF_NONE; - } + sqlite3ExprCodeIsNullJump(v, pRight, regBase+nEq, addrNxt); + if( zAff ){ + if( sqlite3CompareAffinity(pRight, zAff[nConstraint])==SQLITE_AFF_NONE){ + /* Since the comparison is to be performed with no conversions + ** applied to the operands, set the affinity to apply to pRight to + ** SQLITE_AFF_NONE. */ + zAff[nConstraint] = SQLITE_AFF_NONE; + } + if( sqlite3ExprNeedsNoAffinityChange(pRight, zAff[nConstraint]) ){ + zAff[nConstraint] = SQLITE_AFF_NONE; + } + } nConstraint++; }else if( isMinQuery ){ sqlite3VdbeAddOp2(v, OP_Null, 0, regBase+nEq); @@ -88999,8 +89658,7 @@ static Bitmask codeOneLoopStart( testcase( op==OP_SeekGe ); testcase( op==OP_SeekLe ); testcase( op==OP_SeekLt ); - sqlite3VdbeAddOp4(v, op, iIdxCur, addrNxt, regBase, - SQLITE_INT_TO_PTR(nConstraint), P4_INT32); + sqlite3VdbeAddOp4Int(v, op, iIdxCur, addrNxt, regBase, nConstraint); /* Load the value for the inequality constraint at the end of the ** range (if any). @@ -89008,21 +89666,24 @@ static Bitmask codeOneLoopStart( nConstraint = nEq; if( pRangeEnd ){ Expr *pRight = pRangeEnd->pExpr->pRight; - sqlite3ExprCacheRemove(pParse, regBase+nEq); + sqlite3ExprCacheRemove(pParse, regBase+nEq, 1); sqlite3ExprCode(pParse, pRight, regBase+nEq); - sqlite3VdbeAddOp2(v, OP_IsNull, regBase+nEq, addrNxt); - zAff = sqlite3DbStrDup(pParse->db, zAff); - if( zAff - && sqlite3CompareAffinity(pRight, zAff[nConstraint])==SQLITE_AFF_NONE - ){ - /* Since the comparison is to be performed with no conversions applied - ** to the operands, set the affinity to apply to pRight to - ** SQLITE_AFF_NONE. */ - zAff[nConstraint] = SQLITE_AFF_NONE; - } + sqlite3ExprCodeIsNullJump(v, pRight, regBase+nEq, addrNxt); + if( zAff ){ + if( sqlite3CompareAffinity(pRight, zAff[nConstraint])==SQLITE_AFF_NONE){ + /* Since the comparison is to be performed with no conversions + ** applied to the operands, set the affinity to apply to pRight to + ** SQLITE_AFF_NONE. */ + zAff[nConstraint] = SQLITE_AFF_NONE; + } + if( sqlite3ExprNeedsNoAffinityChange(pRight, zAff[nConstraint]) ){ + zAff[nConstraint] = SQLITE_AFF_NONE; + } + } codeApplyAffinity(pParse, regBase, nEq+1, zAff); nConstraint++; } + sqlite3DbFree(pParse->db, zAff); /* Top of the loop body */ pLevel->p2 = sqlite3VdbeCurrentAddr(v); @@ -89033,8 +89694,7 @@ static Bitmask codeOneLoopStart( testcase( op==OP_IdxGE ); testcase( op==OP_IdxLT ); if( op!=OP_Noop ){ - sqlite3VdbeAddOp4(v, op, iIdxCur, addrNxt, regBase, - SQLITE_INT_TO_PTR(nConstraint), P4_INT32); + sqlite3VdbeAddOp4Int(v, op, iIdxCur, addrNxt, regBase, nConstraint); sqlite3VdbeChangeP5(v, endEq!=bRev ?1:0); } @@ -89111,13 +89771,14 @@ static Bitmask codeOneLoopStart( */ WhereClause *pOrWc; /* The OR-clause broken out into subterms */ WhereTerm *pFinal; /* Final subterm within the OR-clause. */ - SrcList oneTab; /* Shortened table list */ + SrcList *pOrTab; /* Shortened table list or OR-clause generation */ int regReturn = ++pParse->nMem; /* Register used with OP_Gosub */ int regRowset = 0; /* Register for RowSet object */ int regRowid = 0; /* Register holding rowid */ int iLoopBody = sqlite3VdbeMakeLabel(v); /* Start of loop body */ int iRetInit; /* Address of regReturn init */ + int untestedTerms = 0; /* Some terms not completely tested */ int ii; pTerm = pLevel->plan.u.pTerm; @@ -89126,11 +89787,30 @@ static Bitmask codeOneLoopStart( assert( (pTerm->wtFlags & TERM_ORINFO)!=0 ); pOrWc = &pTerm->u.pOrInfo->wc; pFinal = &pOrWc->a[pOrWc->nTerm-1]; + pLevel->op = OP_Return; + pLevel->p1 = regReturn; - /* Set up a SrcList containing just the table being scanned by this loop. */ - oneTab.nSrc = 1; - oneTab.nAlloc = 1; - oneTab.a[0] = *pTabItem; + /* Set up a new SrcList ni pOrTab containing the table being scanned + ** by this loop in the a[0] slot and all notReady tables in a[1..] slots. + ** This becomes the SrcList in the recursive call to sqlite3WhereBegin(). + */ + if( pWInfo->nLevel>1 ){ + int nNotReady; /* The number of notReady tables */ + struct SrcList_item *origSrc; /* Original list of tables */ + nNotReady = pWInfo->nLevel - iLevel - 1; + pOrTab = sqlite3StackAllocRaw(pParse->db, + sizeof(*pOrTab)+ nNotReady*sizeof(pOrTab->a[0])); + if( pOrTab==0 ) return notReady; + pOrTab->nAlloc = (i16)(nNotReady + 1); + pOrTab->nSrc = pOrTab->nAlloc; + memcpy(pOrTab->a, pTabItem, sizeof(*pTabItem)); + origSrc = pWInfo->pTabList->a; + for(k=1; k<=nNotReady; k++){ + memcpy(&pOrTab->a[k], &origSrc[pLevel[k].iFrom], sizeof(pOrTab->a[k])); + } + }else{ + pOrTab = pWInfo->pTabList; + } /* Initialize the rowset register to contain NULL. An SQL NULL is ** equivalent to an empty rowset. @@ -89155,33 +89835,38 @@ static Bitmask codeOneLoopStart( if( pOrTerm->leftCursor==iCur || pOrTerm->eOperator==WO_AND ){ WhereInfo *pSubWInfo; /* Info for single OR-term scan */ /* Loop through table entries that match term pOrTerm. */ - pSubWInfo = sqlite3WhereBegin(pParse, &oneTab, pOrTerm->pExpr, 0, - WHERE_OMIT_OPEN | WHERE_OMIT_CLOSE | WHERE_FORCE_TABLE); + pSubWInfo = sqlite3WhereBegin(pParse, pOrTab, pOrTerm->pExpr, 0, + WHERE_OMIT_OPEN | WHERE_OMIT_CLOSE | + WHERE_FORCE_TABLE | WHERE_ONETABLE_ONLY); if( pSubWInfo ){ if( (wctrlFlags & WHERE_DUPLICATES_OK)==0 ){ int iSet = ((ii==pOrWc->nTerm-1)?-1:ii); int r; r = sqlite3ExprCodeGetColumn(pParse, pTabItem->pTab, -1, iCur, - regRowid, 0); - sqlite3VdbeAddOp4(v, OP_RowSetTest, regRowset, - sqlite3VdbeCurrentAddr(v)+2, - r, SQLITE_INT_TO_PTR(iSet), P4_INT32); + regRowid); + sqlite3VdbeAddOp4Int(v, OP_RowSetTest, regRowset, + sqlite3VdbeCurrentAddr(v)+2, r, iSet); } sqlite3VdbeAddOp2(v, OP_Gosub, regReturn, iLoopBody); + /* The pSubWInfo->untestedTerms flag means that this OR term + ** contained one or more AND term from a notReady table. The + ** terms from the notReady table could not be tested and will + ** need to be tested later. + */ + if( pSubWInfo->untestedTerms ) untestedTerms = 1; + /* Finish the loop through table entries that match term pOrTerm. */ sqlite3WhereEnd(pSubWInfo); } } } sqlite3VdbeChangeP1(v, iRetInit, sqlite3VdbeCurrentAddr(v)); - /* sqlite3VdbeAddOp2(v, OP_Null, 0, regRowset); */ sqlite3VdbeAddOp2(v, OP_Goto, 0, pLevel->addrBrk); sqlite3VdbeResolveLabel(v, iLoopBody); - pLevel->op = OP_Return; - pLevel->p1 = regReturn; - disableTerm(pLevel, pTerm); + if( pWInfo->nLevel>1 ) sqlite3StackFree(pParse->db, pOrTab); + if( !untestedTerms ) disableTerm(pLevel, pTerm); }else #endif /* SQLITE_OMIT_OR_OPTIMIZATION */ @@ -89209,7 +89894,12 @@ static Bitmask codeOneLoopStart( testcase( pTerm->wtFlags & TERM_VIRTUAL ); testcase( pTerm->wtFlags & TERM_CODED ); if( pTerm->wtFlags & (TERM_VIRTUAL|TERM_CODED) ) continue; - if( (pTerm->prereqAll & notReady)!=0 ) continue; + if( (pTerm->prereqAll & notReady)!=0 ){ + testcase( pWInfo->untestedTerms==0 + && (pWInfo->wctrlFlags & WHERE_ONETABLE_ONLY)!=0 ); + pWInfo->untestedTerms = 1; + continue; + } pE = pTerm->pExpr; assert( pE!=0 ); if( pLevel->iLeftJoin && !ExprHasProperty(pE, EP_FromJoin) ){ @@ -89232,7 +89922,10 @@ static Bitmask codeOneLoopStart( testcase( pTerm->wtFlags & TERM_VIRTUAL ); testcase( pTerm->wtFlags & TERM_CODED ); if( pTerm->wtFlags & (TERM_VIRTUAL|TERM_CODED) ) continue; - if( (pTerm->prereqAll & notReady)!=0 ) continue; + if( (pTerm->prereqAll & notReady)!=0 ){ + assert( pWInfo->untestedTerms ); + continue; + } assert( pTerm->pExpr ); sqlite3ExprIfFalse(pParse, pTerm->pExpr, addrCont, SQLITE_JUMPIFNULL); pTerm->wtFlags |= TERM_CODED; @@ -89375,6 +90068,7 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( ){ int i; /* Loop counter */ int nByteWInfo; /* Num. bytes allocated for WhereInfo struct */ + int nTabList; /* Number of elements in pTabList */ WhereInfo *pWInfo; /* Will become the return value of this function */ Vdbe *v = pParse->pVdbe; /* The virtual database engine */ Bitmask notReady; /* Cursors that are not yet positioned */ @@ -89394,6 +90088,13 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( return 0; } + /* This function normally generates a nested loop for all tables in + ** pTabList. But if the WHERE_ONETABLE_ONLY flag is set, then we should + ** only generate code for the first table in pTabList and assume that + ** any cursors associated with subsequent tables are uninitialized. + */ + nTabList = (wctrlFlags & WHERE_ONETABLE_ONLY) ? 1 : pTabList->nSrc; + /* Allocate and initialize the WhereInfo structure that will become the ** return value. A single allocation is used to store the WhereInfo ** struct, the contents of WhereInfo.a[], the WhereClause structure @@ -89402,7 +90103,7 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( ** some architectures. Hence the ROUND8() below. */ db = pParse->db; - nByteWInfo = ROUND8(sizeof(WhereInfo)+(pTabList->nSrc-1)*sizeof(WhereLevel)); + nByteWInfo = ROUND8(sizeof(WhereInfo)+(nTabList-1)*sizeof(WhereLevel)); pWInfo = sqlite3DbMallocZero(db, nByteWInfo + sizeof(WhereClause) + @@ -89411,7 +90112,7 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( if( db->mallocFailed ){ goto whereBeginError; } - pWInfo->nLevel = pTabList->nSrc; + pWInfo->nLevel = nTabList; pWInfo->pParse = pParse; pWInfo->pTabList = pTabList; pWInfo->iBreak = sqlite3VdbeMakeLabel(v); @@ -89430,7 +90131,7 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( /* Special case: a WHERE clause that is constant. Evaluate the ** expression and either jump over all of the code or fall thru. */ - if( pWhere && (pTabList->nSrc==0 || sqlite3ExprIsConstantNotJoin(pWhere)) ){ + if( pWhere && (nTabList==0 || sqlite3ExprIsConstantNotJoin(pWhere)) ){ sqlite3ExprIfFalse(pParse, pWhere, pWInfo->iBreak, SQLITE_JUMPIFNULL); pWhere = 0; } @@ -89450,6 +90151,11 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( ** to virtual table cursors are set. This is used to selectively disable ** the OR-to-IN transformation in exprAnalyzeOrTerm(). It is not helpful ** with virtual tables. + ** + ** Note that bitmasks are created for all pTabList->nSrc tables in + ** pTabList, not just the first nTabList tables. nTabList is normally + ** equal to pTabList->nSrc but might be shortened to 1 if the + ** WHERE_ONETABLE_ONLY flag is set. */ assert( pWC->vmask==0 && pMaskSet->n==0 ); for(i=0; inSrc; i++){ @@ -89501,7 +90207,7 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( pLevel = pWInfo->a; andFlags = ~0; WHERETRACE(("*** Optimizer Start ***\n")); - for(i=iFrom=0, pLevel=pWInfo->a; inSrc; i++, pLevel++){ + for(i=iFrom=0, pLevel=pWInfo->a; i=0 && bestJ<0; isOptimal--){ Bitmask mask = (isOptimal ? 0 : notReady); - assert( (pTabList->nSrc-iFrom)>1 || isOptimal ); - for(j=iFrom, pTabItem=&pTabList->a[j]; jnSrc; j++, pTabItem++){ + assert( (nTabList-iFrom)>1 || isOptimal ); + for(j=iFrom, pTabItem=&pTabList->a[j]; ja; inSrc; i++, pLevel++){ + for(i=0, pLevel=pWInfo->a; icolUsed; int n = 0; for(; b; b=b>>1, n++){} - sqlite3VdbeChangeP4(v, sqlite3VdbeCurrentAddr(v)-1, SQLITE_INT_TO_PTR(n), P4_INT32); + sqlite3VdbeChangeP4(v, sqlite3VdbeCurrentAddr(v)-1, + SQLITE_INT_TO_PTR(n), P4_INT32); assert( n<=pTab->nCol ); } }else{ @@ -89722,7 +90429,7 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( ** program. */ notReady = ~(Bitmask)0; - for(i=0; inSrc; i++){ + for(i=0; iiContinue = pWInfo->a[i].addrCont; } @@ -89734,7 +90441,7 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( ** the index is listed as "{}". If the primary key is used the ** index name is '*'. */ - for(i=0; inSrc; i++){ + for(i=0; ia[i]; @@ -89802,7 +90509,7 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ /* Generate loop termination code. */ sqlite3ExprCacheClear(pParse); - for(i=pTabList->nSrc-1; i>=0; i--){ + for(i=pWInfo->nLevel-1; i>=0; i--){ pLevel = &pWInfo->a[i]; sqlite3VdbeResolveLabel(v, pLevel->addrCont); if( pLevel->op!=OP_Noop ){ @@ -89824,7 +90531,11 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ if( pLevel->iLeftJoin ){ int addr; addr = sqlite3VdbeAddOp1(v, OP_IfPos, pLevel->iLeftJoin); - sqlite3VdbeAddOp1(v, OP_NullRow, pTabList->a[i].iCursor); + assert( (pLevel->plan.wsFlags & WHERE_IDX_ONLY)==0 + || (pLevel->plan.wsFlags & WHERE_INDEXED)!=0 ); + if( (pLevel->plan.wsFlags & WHERE_IDX_ONLY)==0 ){ + sqlite3VdbeAddOp1(v, OP_NullRow, pTabList->a[i].iCursor); + } if( pLevel->iIdxCur>=0 ){ sqlite3VdbeAddOp1(v, OP_NullRow, pLevel->iIdxCur); } @@ -89844,7 +90555,8 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ /* Close all of the cursors that were opened by sqlite3WhereBegin. */ - for(i=0, pLevel=pWInfo->a; inSrc; i++, pLevel++){ + assert( pWInfo->nLevel==1 || pWInfo->nLevel==pTabList->nSrc ); + for(i=0, pLevel=pWInfo->a; inLevel; i++, pLevel++){ struct SrcList_item *pTabItem = &pTabList->a[pLevel->iFrom]; Table *pTab = pTabItem->pTab; assert( pTab!=0 ); @@ -89875,7 +90587,6 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ int k, j, last; VdbeOp *pOp; Index *pIdx = pLevel->plan.u.pIdx; - int useIndexOnly = pLevel->plan.wsFlags & WHERE_IDX_ONLY; assert( pIdx!=0 ); pOp = sqlite3VdbeGetOp(v, pWInfo->iTop); @@ -89890,12 +90601,11 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ break; } } - assert(!useIndexOnly || jnColumn); + assert( (pLevel->plan.wsFlags & WHERE_IDX_ONLY)==0 + || jnColumn ); }else if( pOp->opcode==OP_Rowid ){ pOp->p1 = pLevel->iIdxCur; pOp->opcode = OP_IdxRowid; - }else if( pOp->opcode==OP_NullRow && useIndexOnly ){ - pOp->opcode = OP_Noop; } } } @@ -90016,6 +90726,17 @@ struct AttachKey { int type; Token key; }; pOut->zEnd = &pPostOp->z[pPostOp->n]; } + /* A routine to convert a binary TK_IS or TK_ISNOT expression into a + ** unary TK_ISNULL or TK_NOTNULL expression. */ + static void binaryToUnaryIfNull(Parse *pParse, Expr *pY, Expr *pA, int op){ + sqlite3 *db = pParse->db; + if( db->mallocFailed==0 && pY->op==TK_NULL ){ + pA->op = (u8)op; + sqlite3ExprDelete(db, pA->pRight); + pA->pRight = 0; + } + } + /* Construct an expression node for a unary prefix operator */ static void spanUnaryPrefix( @@ -90107,8 +90828,8 @@ typedef union { #define sqlite3ParserARG_PDECL ,Parse *pParse #define sqlite3ParserARG_FETCH Parse *pParse = yypParser->pParse #define sqlite3ParserARG_STORE yypParser->pParse = pParse -#define YYNSTATE 629 -#define YYNRULE 329 +#define YYNSTATE 631 +#define YYNRULE 330 #define YYFALLBACK 1 #define YY_NO_ACTION (YYNSTATE+YYNRULE+2) #define YY_ACCEPT_ACTION (YYNSTATE+YYNRULE+1) @@ -90178,468 +90899,473 @@ static const YYMINORTYPE yyzerominor = { 0 }; ** shifting non-terminals after a reduce. ** yy_default[] Default action for each state. */ +#define YY_ACTTAB_COUNT (1543) static const YYACTIONTYPE yy_action[] = { - /* 0 */ 312, 959, 182, 628, 2, 157, 219, 450, 24, 24, - /* 10 */ 24, 24, 221, 26, 26, 26, 26, 27, 27, 28, - /* 20 */ 28, 28, 29, 221, 424, 425, 30, 492, 33, 141, - /* 30 */ 457, 463, 31, 26, 26, 26, 26, 27, 27, 28, - /* 40 */ 28, 28, 29, 221, 28, 28, 28, 29, 221, 23, - /* 50 */ 22, 32, 465, 466, 464, 464, 25, 25, 24, 24, - /* 60 */ 24, 24, 293, 26, 26, 26, 26, 27, 27, 28, - /* 70 */ 28, 28, 29, 221, 312, 450, 319, 479, 344, 208, - /* 80 */ 47, 26, 26, 26, 26, 27, 27, 28, 28, 28, - /* 90 */ 29, 221, 427, 428, 163, 339, 543, 368, 371, 372, - /* 100 */ 521, 317, 472, 473, 457, 463, 296, 373, 294, 21, - /* 110 */ 336, 367, 419, 416, 424, 425, 523, 1, 544, 446, - /* 120 */ 80, 424, 425, 23, 22, 32, 465, 466, 464, 464, - /* 130 */ 25, 25, 24, 24, 24, 24, 564, 26, 26, 26, - /* 140 */ 26, 27, 27, 28, 28, 28, 29, 221, 312, 233, - /* 150 */ 319, 441, 554, 152, 139, 263, 365, 268, 366, 160, - /* 160 */ 551, 352, 332, 421, 222, 272, 362, 322, 218, 557, - /* 170 */ 116, 339, 248, 574, 477, 223, 216, 573, 457, 463, - /* 180 */ 450, 59, 427, 428, 295, 610, 336, 563, 538, 427, - /* 190 */ 428, 385, 608, 609, 562, 446, 87, 23, 22, 32, - /* 200 */ 465, 466, 464, 464, 25, 25, 24, 24, 24, 24, - /* 210 */ 447, 26, 26, 26, 26, 27, 27, 28, 28, 28, - /* 220 */ 29, 221, 312, 233, 477, 223, 576, 134, 139, 263, - /* 230 */ 365, 268, 366, 160, 406, 354, 226, 498, 481, 272, - /* 240 */ 339, 27, 27, 28, 28, 28, 29, 221, 450, 442, - /* 250 */ 199, 540, 457, 463, 349, 336, 163, 551, 66, 368, - /* 260 */ 371, 372, 450, 415, 446, 80, 522, 581, 401, 373, - /* 270 */ 452, 23, 22, 32, 465, 466, 464, 464, 25, 25, - /* 280 */ 24, 24, 24, 24, 447, 26, 26, 26, 26, 27, - /* 290 */ 27, 28, 28, 28, 29, 221, 312, 339, 556, 607, - /* 300 */ 197, 454, 454, 454, 546, 578, 352, 198, 607, 440, - /* 310 */ 65, 351, 336, 426, 426, 399, 289, 424, 425, 606, - /* 320 */ 605, 446, 73, 426, 214, 219, 457, 463, 606, 410, - /* 330 */ 450, 241, 306, 196, 565, 479, 555, 208, 288, 29, - /* 340 */ 221, 447, 4, 874, 504, 23, 22, 32, 465, 466, - /* 350 */ 464, 464, 25, 25, 24, 24, 24, 24, 447, 26, - /* 360 */ 26, 26, 26, 27, 27, 28, 28, 28, 29, 221, - /* 370 */ 312, 163, 582, 339, 368, 371, 372, 314, 424, 425, - /* 380 */ 604, 222, 397, 227, 373, 427, 428, 339, 336, 409, - /* 390 */ 222, 478, 339, 30, 396, 33, 141, 446, 81, 62, - /* 400 */ 457, 463, 336, 157, 400, 450, 504, 336, 438, 426, - /* 410 */ 500, 446, 87, 41, 380, 613, 446, 80, 581, 23, - /* 420 */ 22, 32, 465, 466, 464, 464, 25, 25, 24, 24, - /* 430 */ 24, 24, 213, 26, 26, 26, 26, 27, 27, 28, - /* 440 */ 28, 28, 29, 221, 312, 513, 427, 428, 517, 254, - /* 450 */ 524, 386, 225, 339, 486, 363, 389, 339, 356, 443, - /* 460 */ 494, 236, 30, 497, 33, 141, 399, 289, 336, 495, - /* 470 */ 487, 501, 336, 450, 457, 463, 219, 446, 95, 445, - /* 480 */ 68, 446, 95, 444, 424, 425, 488, 44, 348, 288, - /* 490 */ 504, 424, 425, 23, 22, 32, 465, 466, 464, 464, - /* 500 */ 25, 25, 24, 24, 24, 24, 391, 26, 26, 26, - /* 510 */ 26, 27, 27, 28, 28, 28, 29, 221, 312, 361, - /* 520 */ 556, 426, 520, 328, 191, 271, 339, 329, 247, 259, - /* 530 */ 339, 566, 65, 249, 336, 426, 424, 425, 445, 516, - /* 540 */ 426, 336, 444, 446, 9, 336, 556, 451, 457, 463, - /* 550 */ 446, 74, 427, 428, 446, 69, 192, 618, 65, 427, - /* 560 */ 428, 426, 323, 277, 16, 202, 189, 23, 22, 32, - /* 570 */ 465, 466, 464, 464, 25, 25, 24, 24, 24, 24, - /* 580 */ 255, 26, 26, 26, 26, 27, 27, 28, 28, 28, - /* 590 */ 29, 221, 312, 339, 486, 426, 537, 235, 515, 447, - /* 600 */ 339, 629, 419, 416, 427, 428, 217, 281, 336, 279, - /* 610 */ 487, 203, 144, 526, 527, 336, 391, 446, 78, 429, - /* 620 */ 430, 431, 457, 463, 446, 99, 488, 341, 528, 468, - /* 630 */ 468, 426, 343, 472, 473, 626, 949, 474, 949, 529, - /* 640 */ 447, 23, 22, 32, 465, 466, 464, 464, 25, 25, - /* 650 */ 24, 24, 24, 24, 339, 26, 26, 26, 26, 27, - /* 660 */ 27, 28, 28, 28, 29, 221, 312, 339, 162, 336, - /* 670 */ 275, 283, 476, 376, 339, 579, 527, 346, 446, 98, - /* 680 */ 622, 30, 336, 33, 141, 339, 426, 339, 508, 336, - /* 690 */ 469, 446, 105, 418, 2, 222, 457, 463, 446, 101, - /* 700 */ 336, 219, 336, 426, 161, 626, 948, 290, 948, 446, - /* 710 */ 108, 446, 109, 398, 284, 23, 22, 32, 465, 466, - /* 720 */ 464, 464, 25, 25, 24, 24, 24, 24, 339, 26, - /* 730 */ 26, 26, 26, 27, 27, 28, 28, 28, 29, 221, - /* 740 */ 312, 339, 271, 336, 339, 58, 535, 482, 143, 339, - /* 750 */ 622, 318, 446, 133, 408, 257, 336, 426, 321, 336, - /* 760 */ 357, 339, 272, 426, 336, 446, 135, 184, 446, 61, - /* 770 */ 457, 463, 219, 446, 106, 426, 336, 493, 341, 234, - /* 780 */ 468, 468, 621, 310, 407, 446, 102, 209, 144, 23, - /* 790 */ 22, 32, 465, 466, 464, 464, 25, 25, 24, 24, - /* 800 */ 24, 24, 339, 26, 26, 26, 26, 27, 27, 28, - /* 810 */ 28, 28, 29, 221, 312, 339, 271, 336, 339, 341, - /* 820 */ 538, 468, 468, 572, 383, 496, 446, 79, 499, 549, - /* 830 */ 336, 426, 508, 336, 508, 341, 339, 468, 468, 446, - /* 840 */ 103, 391, 446, 70, 457, 463, 572, 426, 40, 426, - /* 850 */ 42, 336, 220, 324, 504, 341, 426, 468, 468, 18, - /* 860 */ 446, 100, 266, 23, 22, 32, 465, 466, 464, 464, - /* 870 */ 25, 25, 24, 24, 24, 24, 339, 26, 26, 26, - /* 880 */ 26, 27, 27, 28, 28, 28, 29, 221, 312, 339, - /* 890 */ 283, 336, 339, 261, 548, 384, 339, 327, 142, 550, - /* 900 */ 446, 136, 475, 475, 336, 426, 185, 336, 499, 396, - /* 910 */ 339, 336, 370, 446, 137, 256, 446, 138, 457, 463, - /* 920 */ 446, 71, 499, 360, 426, 336, 161, 311, 623, 215, - /* 930 */ 426, 359, 237, 412, 446, 82, 200, 23, 34, 32, - /* 940 */ 465, 466, 464, 464, 25, 25, 24, 24, 24, 24, - /* 950 */ 339, 26, 26, 26, 26, 27, 27, 28, 28, 28, - /* 960 */ 29, 221, 312, 447, 271, 336, 339, 271, 340, 210, - /* 970 */ 447, 172, 625, 211, 446, 83, 240, 552, 142, 426, - /* 980 */ 321, 336, 426, 426, 339, 414, 331, 181, 458, 459, - /* 990 */ 446, 72, 457, 463, 470, 506, 67, 158, 394, 336, - /* 1000 */ 587, 325, 499, 447, 326, 311, 624, 447, 446, 84, - /* 1010 */ 461, 462, 22, 32, 465, 466, 464, 464, 25, 25, - /* 1020 */ 24, 24, 24, 24, 339, 26, 26, 26, 26, 27, - /* 1030 */ 27, 28, 28, 28, 29, 221, 312, 460, 339, 336, - /* 1040 */ 339, 283, 423, 393, 532, 533, 204, 205, 446, 85, - /* 1050 */ 625, 392, 547, 336, 162, 336, 426, 426, 339, 435, - /* 1060 */ 436, 339, 446, 104, 446, 86, 457, 463, 264, 291, - /* 1070 */ 274, 49, 162, 336, 426, 426, 336, 297, 265, 542, - /* 1080 */ 541, 405, 446, 88, 594, 446, 89, 32, 465, 466, - /* 1090 */ 464, 464, 25, 25, 24, 24, 24, 24, 600, 26, - /* 1100 */ 26, 26, 26, 27, 27, 28, 28, 28, 29, 221, - /* 1110 */ 36, 345, 339, 3, 214, 8, 422, 335, 425, 437, - /* 1120 */ 375, 148, 162, 36, 345, 339, 3, 336, 342, 432, - /* 1130 */ 335, 425, 149, 577, 426, 162, 446, 90, 151, 339, - /* 1140 */ 336, 342, 434, 339, 283, 433, 333, 347, 447, 446, - /* 1150 */ 75, 588, 6, 158, 336, 448, 140, 481, 336, 426, - /* 1160 */ 347, 453, 334, 446, 76, 49, 350, 446, 91, 7, - /* 1170 */ 481, 426, 397, 283, 355, 250, 426, 39, 38, 251, - /* 1180 */ 339, 426, 48, 353, 37, 337, 338, 596, 426, 452, - /* 1190 */ 39, 38, 514, 252, 390, 336, 20, 37, 337, 338, - /* 1200 */ 253, 43, 452, 206, 446, 92, 219, 449, 242, 243, - /* 1210 */ 244, 150, 246, 283, 491, 593, 597, 490, 224, 258, - /* 1220 */ 454, 454, 454, 455, 456, 10, 503, 183, 426, 178, - /* 1230 */ 156, 301, 426, 454, 454, 454, 455, 456, 10, 339, - /* 1240 */ 302, 426, 36, 345, 50, 3, 339, 505, 260, 335, - /* 1250 */ 425, 262, 339, 176, 336, 581, 598, 358, 364, 175, - /* 1260 */ 342, 336, 177, 446, 93, 46, 345, 336, 3, 339, - /* 1270 */ 446, 94, 335, 425, 525, 339, 446, 77, 320, 347, - /* 1280 */ 511, 339, 507, 342, 336, 589, 601, 56, 56, 481, - /* 1290 */ 336, 512, 283, 446, 17, 531, 336, 426, 530, 446, - /* 1300 */ 96, 534, 347, 404, 298, 446, 97, 426, 313, 39, - /* 1310 */ 38, 267, 481, 219, 535, 536, 37, 337, 338, 283, - /* 1320 */ 620, 452, 309, 283, 111, 19, 288, 509, 269, 424, - /* 1330 */ 425, 539, 39, 38, 426, 238, 270, 411, 426, 37, - /* 1340 */ 337, 338, 426, 426, 452, 558, 426, 307, 231, 276, - /* 1350 */ 278, 426, 454, 454, 454, 455, 456, 10, 553, 280, - /* 1360 */ 426, 559, 239, 230, 426, 426, 299, 282, 287, 481, - /* 1370 */ 560, 388, 584, 232, 426, 454, 454, 454, 455, 456, - /* 1380 */ 10, 561, 426, 426, 585, 395, 426, 426, 292, 194, - /* 1390 */ 195, 592, 603, 300, 303, 308, 377, 522, 381, 426, - /* 1400 */ 426, 452, 567, 426, 304, 617, 426, 426, 426, 426, - /* 1410 */ 379, 53, 147, 165, 166, 167, 580, 212, 569, 426, - /* 1420 */ 426, 285, 168, 570, 387, 120, 123, 187, 590, 402, - /* 1430 */ 403, 125, 454, 454, 454, 330, 599, 614, 186, 126, - /* 1440 */ 127, 128, 615, 616, 57, 60, 619, 107, 229, 64, - /* 1450 */ 115, 420, 245, 130, 439, 180, 315, 207, 670, 316, - /* 1460 */ 671, 467, 672, 153, 154, 35, 483, 471, 480, 188, - /* 1470 */ 201, 155, 484, 5, 485, 489, 12, 502, 45, 11, - /* 1480 */ 110, 145, 518, 519, 510, 228, 51, 112, 369, 273, - /* 1490 */ 113, 159, 545, 52, 374, 114, 164, 265, 378, 190, - /* 1500 */ 146, 568, 117, 158, 286, 382, 169, 119, 15, 583, - /* 1510 */ 170, 171, 121, 586, 122, 54, 55, 13, 124, 591, - /* 1520 */ 173, 174, 118, 575, 129, 595, 571, 131, 14, 132, - /* 1530 */ 611, 63, 612, 193, 602, 179, 305, 413, 417, 960, - /* 1540 */ 627, + /* 0 */ 313, 49, 556, 46, 147, 172, 628, 598, 55, 55, + /* 10 */ 55, 55, 302, 53, 53, 53, 53, 52, 52, 51, + /* 20 */ 51, 51, 50, 238, 603, 66, 624, 623, 604, 598, + /* 30 */ 591, 585, 48, 53, 53, 53, 53, 52, 52, 51, + /* 40 */ 51, 51, 50, 238, 51, 51, 51, 50, 238, 56, + /* 50 */ 57, 47, 583, 582, 584, 584, 54, 54, 55, 55, + /* 60 */ 55, 55, 609, 53, 53, 53, 53, 52, 52, 51, + /* 70 */ 51, 51, 50, 238, 313, 598, 672, 330, 411, 217, + /* 80 */ 32, 53, 53, 53, 53, 52, 52, 51, 51, 51, + /* 90 */ 50, 238, 330, 414, 621, 620, 166, 598, 673, 382, + /* 100 */ 379, 378, 602, 73, 591, 585, 307, 424, 166, 58, + /* 110 */ 377, 382, 379, 378, 516, 515, 624, 623, 254, 200, + /* 120 */ 199, 198, 377, 56, 57, 47, 583, 582, 584, 584, + /* 130 */ 54, 54, 55, 55, 55, 55, 581, 53, 53, 53, + /* 140 */ 53, 52, 52, 51, 51, 51, 50, 238, 313, 270, + /* 150 */ 226, 422, 283, 133, 177, 139, 284, 385, 279, 384, + /* 160 */ 169, 197, 251, 282, 253, 226, 411, 275, 440, 167, + /* 170 */ 139, 284, 385, 279, 384, 169, 571, 236, 591, 585, + /* 180 */ 240, 414, 275, 622, 621, 620, 674, 437, 441, 442, + /* 190 */ 602, 88, 352, 266, 439, 268, 438, 56, 57, 47, + /* 200 */ 583, 582, 584, 584, 54, 54, 55, 55, 55, 55, + /* 210 */ 465, 53, 53, 53, 53, 52, 52, 51, 51, 51, + /* 220 */ 50, 238, 313, 471, 52, 52, 51, 51, 51, 50, + /* 230 */ 238, 234, 166, 491, 567, 382, 379, 378, 1, 440, + /* 240 */ 252, 176, 624, 623, 608, 67, 377, 513, 622, 443, + /* 250 */ 237, 577, 591, 585, 622, 172, 466, 598, 554, 441, + /* 260 */ 340, 409, 526, 580, 580, 349, 596, 553, 194, 482, + /* 270 */ 175, 56, 57, 47, 583, 582, 584, 584, 54, 54, + /* 280 */ 55, 55, 55, 55, 562, 53, 53, 53, 53, 52, + /* 290 */ 52, 51, 51, 51, 50, 238, 313, 594, 594, 594, + /* 300 */ 561, 578, 469, 65, 259, 351, 258, 411, 624, 623, + /* 310 */ 621, 620, 332, 576, 575, 240, 560, 568, 520, 411, + /* 320 */ 341, 237, 414, 624, 623, 598, 591, 585, 542, 519, + /* 330 */ 171, 602, 95, 68, 414, 624, 623, 624, 623, 38, + /* 340 */ 877, 506, 507, 602, 88, 56, 57, 47, 583, 582, + /* 350 */ 584, 584, 54, 54, 55, 55, 55, 55, 532, 53, + /* 360 */ 53, 53, 53, 52, 52, 51, 51, 51, 50, 238, + /* 370 */ 313, 411, 579, 398, 531, 237, 621, 620, 388, 625, + /* 380 */ 500, 206, 167, 396, 233, 312, 414, 387, 569, 492, + /* 390 */ 216, 621, 620, 566, 622, 602, 74, 533, 210, 491, + /* 400 */ 591, 585, 548, 621, 620, 621, 620, 300, 598, 466, + /* 410 */ 481, 67, 603, 35, 622, 601, 604, 547, 6, 56, + /* 420 */ 57, 47, 583, 582, 584, 584, 54, 54, 55, 55, + /* 430 */ 55, 55, 601, 53, 53, 53, 53, 52, 52, 51, + /* 440 */ 51, 51, 50, 238, 313, 411, 184, 409, 528, 580, + /* 450 */ 580, 551, 962, 186, 419, 2, 353, 259, 351, 258, + /* 460 */ 414, 409, 411, 580, 580, 44, 411, 544, 240, 602, + /* 470 */ 94, 190, 7, 62, 591, 585, 598, 414, 350, 607, + /* 480 */ 493, 414, 409, 317, 580, 580, 602, 95, 496, 565, + /* 490 */ 602, 80, 203, 56, 57, 47, 583, 582, 584, 584, + /* 500 */ 54, 54, 55, 55, 55, 55, 535, 53, 53, 53, + /* 510 */ 53, 52, 52, 51, 51, 51, 50, 238, 313, 202, + /* 520 */ 564, 293, 511, 49, 562, 46, 147, 411, 394, 183, + /* 530 */ 563, 549, 505, 549, 174, 409, 322, 580, 580, 39, + /* 540 */ 561, 37, 414, 624, 623, 192, 473, 383, 591, 585, + /* 550 */ 474, 602, 80, 601, 504, 544, 560, 364, 402, 210, + /* 560 */ 421, 952, 361, 952, 365, 201, 144, 56, 57, 47, + /* 570 */ 583, 582, 584, 584, 54, 54, 55, 55, 55, 55, + /* 580 */ 559, 53, 53, 53, 53, 52, 52, 51, 51, 51, + /* 590 */ 50, 238, 313, 601, 232, 264, 272, 321, 374, 484, + /* 600 */ 510, 146, 342, 146, 328, 425, 485, 407, 576, 575, + /* 610 */ 622, 621, 620, 49, 168, 46, 147, 353, 546, 491, + /* 620 */ 204, 240, 591, 585, 421, 951, 549, 951, 549, 168, + /* 630 */ 429, 67, 390, 343, 622, 434, 307, 423, 338, 360, + /* 640 */ 391, 56, 57, 47, 583, 582, 584, 584, 54, 54, + /* 650 */ 55, 55, 55, 55, 601, 53, 53, 53, 53, 52, + /* 660 */ 52, 51, 51, 51, 50, 238, 313, 34, 318, 425, + /* 670 */ 237, 21, 359, 273, 411, 167, 411, 276, 411, 540, + /* 680 */ 411, 422, 13, 318, 619, 618, 617, 622, 275, 414, + /* 690 */ 336, 414, 622, 414, 622, 414, 591, 585, 602, 69, + /* 700 */ 602, 97, 602, 100, 602, 98, 631, 629, 334, 475, + /* 710 */ 475, 367, 319, 148, 327, 56, 57, 47, 583, 582, + /* 720 */ 584, 584, 54, 54, 55, 55, 55, 55, 411, 53, + /* 730 */ 53, 53, 53, 52, 52, 51, 51, 51, 50, 238, + /* 740 */ 313, 411, 331, 414, 411, 49, 276, 46, 147, 569, + /* 750 */ 406, 216, 602, 106, 573, 573, 414, 354, 524, 414, + /* 760 */ 411, 622, 411, 224, 4, 602, 104, 605, 602, 108, + /* 770 */ 591, 585, 622, 20, 375, 414, 167, 414, 215, 144, + /* 780 */ 470, 239, 167, 225, 602, 109, 602, 134, 18, 56, + /* 790 */ 57, 47, 583, 582, 584, 584, 54, 54, 55, 55, + /* 800 */ 55, 55, 411, 53, 53, 53, 53, 52, 52, 51, + /* 810 */ 51, 51, 50, 238, 313, 411, 276, 414, 12, 459, + /* 820 */ 276, 171, 411, 16, 223, 189, 602, 135, 354, 170, + /* 830 */ 414, 622, 630, 2, 411, 622, 540, 414, 143, 602, + /* 840 */ 61, 359, 132, 622, 591, 585, 602, 105, 458, 414, + /* 850 */ 23, 622, 446, 326, 23, 538, 622, 325, 602, 103, + /* 860 */ 427, 530, 309, 56, 57, 47, 583, 582, 584, 584, + /* 870 */ 54, 54, 55, 55, 55, 55, 411, 53, 53, 53, + /* 880 */ 53, 52, 52, 51, 51, 51, 50, 238, 313, 411, + /* 890 */ 264, 414, 411, 276, 359, 219, 157, 214, 357, 366, + /* 900 */ 602, 96, 522, 521, 414, 622, 358, 414, 622, 622, + /* 910 */ 411, 613, 612, 602, 102, 142, 602, 77, 591, 585, + /* 920 */ 529, 540, 231, 426, 308, 414, 622, 622, 468, 521, + /* 930 */ 324, 601, 257, 263, 602, 99, 622, 56, 45, 47, + /* 940 */ 583, 582, 584, 584, 54, 54, 55, 55, 55, 55, + /* 950 */ 411, 53, 53, 53, 53, 52, 52, 51, 51, 51, + /* 960 */ 50, 238, 313, 264, 264, 414, 411, 213, 209, 544, + /* 970 */ 544, 207, 611, 28, 602, 138, 50, 238, 622, 622, + /* 980 */ 381, 414, 503, 140, 323, 222, 274, 622, 590, 589, + /* 990 */ 602, 137, 591, 585, 629, 334, 606, 30, 622, 571, + /* 1000 */ 236, 601, 601, 130, 496, 601, 453, 451, 288, 286, + /* 1010 */ 587, 586, 57, 47, 583, 582, 584, 584, 54, 54, + /* 1020 */ 55, 55, 55, 55, 411, 53, 53, 53, 53, 52, + /* 1030 */ 52, 51, 51, 51, 50, 238, 313, 588, 411, 414, + /* 1040 */ 411, 264, 410, 129, 595, 400, 27, 376, 602, 136, + /* 1050 */ 128, 165, 479, 414, 282, 414, 622, 622, 411, 622, + /* 1060 */ 622, 411, 602, 76, 602, 93, 591, 585, 188, 372, + /* 1070 */ 368, 125, 476, 414, 261, 160, 414, 171, 124, 472, + /* 1080 */ 123, 15, 602, 92, 450, 602, 75, 47, 583, 582, + /* 1090 */ 584, 584, 54, 54, 55, 55, 55, 55, 464, 53, + /* 1100 */ 53, 53, 53, 52, 52, 51, 51, 51, 50, 238, + /* 1110 */ 43, 405, 264, 3, 558, 264, 545, 415, 623, 159, + /* 1120 */ 541, 158, 539, 278, 25, 461, 121, 622, 408, 622, + /* 1130 */ 622, 622, 24, 43, 405, 622, 3, 622, 622, 120, + /* 1140 */ 415, 623, 11, 456, 411, 156, 452, 403, 509, 277, + /* 1150 */ 118, 408, 489, 113, 205, 449, 271, 567, 221, 414, + /* 1160 */ 269, 267, 155, 622, 622, 111, 411, 622, 602, 95, + /* 1170 */ 403, 622, 411, 110, 10, 622, 622, 40, 41, 534, + /* 1180 */ 567, 414, 64, 264, 42, 413, 412, 414, 601, 596, + /* 1190 */ 602, 91, 445, 436, 150, 435, 602, 90, 622, 265, + /* 1200 */ 40, 41, 337, 242, 411, 191, 333, 42, 413, 412, + /* 1210 */ 398, 420, 596, 316, 622, 399, 260, 107, 230, 414, + /* 1220 */ 594, 594, 594, 593, 592, 14, 220, 411, 602, 101, + /* 1230 */ 240, 622, 43, 405, 362, 3, 149, 315, 626, 415, + /* 1240 */ 623, 127, 414, 594, 594, 594, 593, 592, 14, 622, + /* 1250 */ 408, 602, 89, 411, 181, 33, 405, 463, 3, 411, + /* 1260 */ 264, 462, 415, 623, 616, 615, 614, 355, 414, 403, + /* 1270 */ 417, 416, 622, 408, 414, 622, 622, 602, 87, 567, + /* 1280 */ 418, 627, 622, 602, 86, 8, 241, 180, 126, 255, + /* 1290 */ 600, 178, 403, 240, 208, 455, 395, 294, 444, 40, + /* 1300 */ 41, 297, 567, 248, 622, 296, 42, 413, 412, 247, + /* 1310 */ 622, 596, 244, 622, 30, 60, 31, 243, 430, 624, + /* 1320 */ 623, 292, 40, 41, 622, 295, 145, 622, 601, 42, + /* 1330 */ 413, 412, 622, 622, 596, 393, 622, 397, 599, 59, + /* 1340 */ 235, 622, 594, 594, 594, 593, 592, 14, 218, 291, + /* 1350 */ 622, 36, 344, 305, 304, 303, 179, 301, 411, 567, + /* 1360 */ 454, 557, 173, 185, 622, 594, 594, 594, 593, 592, + /* 1370 */ 14, 411, 29, 414, 151, 289, 246, 523, 411, 196, + /* 1380 */ 195, 335, 602, 85, 411, 245, 414, 526, 392, 543, + /* 1390 */ 411, 596, 287, 414, 285, 602, 72, 537, 153, 414, + /* 1400 */ 466, 411, 602, 71, 154, 414, 411, 152, 602, 84, + /* 1410 */ 386, 536, 329, 411, 602, 83, 414, 518, 280, 411, + /* 1420 */ 513, 414, 594, 594, 594, 602, 82, 517, 414, 311, + /* 1430 */ 602, 81, 411, 514, 414, 512, 131, 602, 70, 229, + /* 1440 */ 228, 227, 494, 602, 17, 411, 488, 414, 259, 346, + /* 1450 */ 249, 389, 487, 486, 314, 164, 602, 79, 310, 240, + /* 1460 */ 414, 373, 480, 163, 262, 371, 414, 162, 369, 602, + /* 1470 */ 78, 212, 478, 26, 477, 602, 9, 161, 467, 363, + /* 1480 */ 141, 122, 339, 187, 119, 457, 348, 117, 347, 116, + /* 1490 */ 115, 114, 448, 112, 182, 320, 22, 433, 19, 432, + /* 1500 */ 431, 63, 428, 610, 193, 298, 597, 574, 572, 404, + /* 1510 */ 555, 552, 290, 281, 510, 499, 498, 497, 495, 380, + /* 1520 */ 356, 460, 256, 250, 345, 447, 306, 5, 570, 550, + /* 1530 */ 299, 211, 370, 401, 550, 508, 502, 501, 490, 527, + /* 1540 */ 525, 483, 238, }; static const YYCODETYPE yy_lookahead[] = { - /* 0 */ 19, 142, 143, 144, 145, 24, 115, 26, 77, 78, - /* 10 */ 79, 80, 92, 82, 83, 84, 85, 86, 87, 88, - /* 20 */ 89, 90, 91, 92, 26, 27, 222, 223, 224, 225, + /* 0 */ 19, 222, 223, 224, 225, 24, 1, 26, 77, 78, + /* 10 */ 79, 80, 15, 82, 83, 84, 85, 86, 87, 88, + /* 20 */ 89, 90, 91, 92, 113, 22, 26, 27, 117, 26, /* 30 */ 49, 50, 81, 82, 83, 84, 85, 86, 87, 88, /* 40 */ 89, 90, 91, 92, 88, 89, 90, 91, 92, 68, /* 50 */ 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, - /* 60 */ 79, 80, 16, 82, 83, 84, 85, 86, 87, 88, - /* 70 */ 89, 90, 91, 92, 19, 94, 19, 166, 167, 168, + /* 60 */ 79, 80, 23, 82, 83, 84, 85, 86, 87, 88, + /* 70 */ 89, 90, 91, 92, 19, 94, 118, 19, 150, 22, /* 80 */ 25, 82, 83, 84, 85, 86, 87, 88, 89, 90, - /* 90 */ 91, 92, 94, 95, 96, 150, 36, 99, 100, 101, - /* 100 */ 174, 169, 170, 171, 49, 50, 60, 109, 62, 54, - /* 110 */ 165, 51, 1, 2, 26, 27, 174, 22, 58, 174, - /* 120 */ 175, 26, 27, 68, 69, 70, 71, 72, 73, 74, - /* 130 */ 75, 76, 77, 78, 79, 80, 186, 82, 83, 84, - /* 140 */ 85, 86, 87, 88, 89, 90, 91, 92, 19, 92, - /* 150 */ 19, 172, 173, 96, 97, 98, 99, 100, 101, 102, - /* 160 */ 181, 216, 146, 147, 232, 108, 221, 107, 152, 186, - /* 170 */ 154, 150, 195, 30, 86, 87, 160, 34, 49, 50, - /* 180 */ 26, 52, 94, 95, 138, 97, 165, 181, 182, 94, - /* 190 */ 95, 48, 104, 105, 188, 174, 175, 68, 69, 70, + /* 90 */ 91, 92, 19, 165, 94, 95, 96, 94, 118, 99, + /* 100 */ 100, 101, 174, 175, 49, 50, 22, 23, 96, 54, + /* 110 */ 110, 99, 100, 101, 7, 8, 26, 27, 16, 105, + /* 120 */ 106, 107, 110, 68, 69, 70, 71, 72, 73, 74, + /* 130 */ 75, 76, 77, 78, 79, 80, 113, 82, 83, 84, + /* 140 */ 85, 86, 87, 88, 89, 90, 91, 92, 19, 16, + /* 150 */ 92, 67, 98, 24, 96, 97, 98, 99, 100, 101, + /* 160 */ 102, 25, 60, 109, 62, 92, 150, 109, 150, 25, + /* 170 */ 97, 98, 99, 100, 101, 102, 86, 87, 49, 50, + /* 180 */ 116, 165, 109, 165, 94, 95, 118, 97, 170, 171, + /* 190 */ 174, 175, 128, 60, 104, 62, 106, 68, 69, 70, /* 200 */ 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - /* 210 */ 194, 82, 83, 84, 85, 86, 87, 88, 89, 90, - /* 220 */ 91, 92, 19, 92, 86, 87, 21, 24, 97, 98, - /* 230 */ 99, 100, 101, 102, 218, 214, 215, 208, 66, 108, - /* 240 */ 150, 86, 87, 88, 89, 90, 91, 92, 94, 173, - /* 250 */ 160, 183, 49, 50, 191, 165, 96, 181, 22, 99, - /* 260 */ 100, 101, 26, 247, 174, 175, 94, 57, 63, 109, - /* 270 */ 98, 68, 69, 70, 71, 72, 73, 74, 75, 76, - /* 280 */ 77, 78, 79, 80, 194, 82, 83, 84, 85, 86, - /* 290 */ 87, 88, 89, 90, 91, 92, 19, 150, 150, 150, - /* 300 */ 25, 129, 130, 131, 183, 100, 216, 160, 150, 161, - /* 310 */ 162, 221, 165, 165, 165, 105, 106, 26, 27, 170, - /* 320 */ 171, 174, 175, 165, 160, 115, 49, 50, 170, 171, - /* 330 */ 94, 148, 163, 185, 186, 166, 167, 168, 128, 91, - /* 340 */ 92, 194, 196, 138, 166, 68, 69, 70, 71, 72, - /* 350 */ 73, 74, 75, 76, 77, 78, 79, 80, 194, 82, + /* 210 */ 11, 82, 83, 84, 85, 86, 87, 88, 89, 90, + /* 220 */ 91, 92, 19, 21, 86, 87, 88, 89, 90, 91, + /* 230 */ 92, 215, 96, 150, 66, 99, 100, 101, 22, 150, + /* 240 */ 138, 118, 26, 27, 161, 162, 110, 103, 165, 231, + /* 250 */ 232, 23, 49, 50, 165, 24, 57, 26, 32, 170, + /* 260 */ 171, 112, 94, 114, 115, 63, 98, 41, 185, 186, + /* 270 */ 118, 68, 69, 70, 71, 72, 73, 74, 75, 76, + /* 280 */ 77, 78, 79, 80, 12, 82, 83, 84, 85, 86, + /* 290 */ 87, 88, 89, 90, 91, 92, 19, 129, 130, 131, + /* 300 */ 28, 23, 100, 25, 105, 106, 107, 150, 26, 27, + /* 310 */ 94, 95, 169, 170, 171, 116, 44, 23, 46, 150, + /* 320 */ 231, 232, 165, 26, 27, 94, 49, 50, 23, 57, + /* 330 */ 25, 174, 175, 22, 165, 26, 27, 26, 27, 136, + /* 340 */ 138, 97, 98, 174, 175, 68, 69, 70, 71, 72, + /* 350 */ 73, 74, 75, 76, 77, 78, 79, 80, 23, 82, /* 360 */ 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - /* 370 */ 19, 96, 11, 150, 99, 100, 101, 155, 26, 27, - /* 380 */ 231, 232, 218, 205, 109, 94, 95, 150, 165, 231, - /* 390 */ 232, 166, 150, 222, 150, 224, 225, 174, 175, 235, - /* 400 */ 49, 50, 165, 24, 240, 26, 166, 165, 153, 165, - /* 410 */ 119, 174, 175, 136, 237, 244, 174, 175, 57, 68, + /* 370 */ 19, 150, 23, 216, 23, 232, 94, 95, 221, 150, + /* 380 */ 23, 160, 25, 214, 215, 163, 165, 88, 166, 167, + /* 390 */ 168, 94, 95, 23, 165, 174, 175, 88, 160, 150, + /* 400 */ 49, 50, 120, 94, 95, 94, 95, 158, 26, 57, + /* 410 */ 161, 162, 113, 136, 165, 194, 117, 120, 22, 68, /* 420 */ 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, - /* 430 */ 79, 80, 236, 82, 83, 84, 85, 86, 87, 88, - /* 440 */ 89, 90, 91, 92, 19, 205, 94, 95, 23, 226, - /* 450 */ 165, 229, 215, 150, 12, 88, 234, 150, 216, 174, - /* 460 */ 32, 217, 222, 25, 224, 225, 105, 106, 165, 41, - /* 470 */ 28, 119, 165, 94, 49, 50, 115, 174, 175, 112, - /* 480 */ 22, 174, 175, 116, 26, 27, 44, 136, 46, 128, - /* 490 */ 166, 26, 27, 68, 69, 70, 71, 72, 73, 74, - /* 500 */ 75, 76, 77, 78, 79, 80, 150, 82, 83, 84, - /* 510 */ 85, 86, 87, 88, 89, 90, 91, 92, 19, 150, - /* 520 */ 150, 165, 23, 220, 196, 150, 150, 220, 158, 205, - /* 530 */ 150, 161, 162, 198, 165, 165, 26, 27, 112, 23, - /* 540 */ 165, 165, 116, 174, 175, 165, 150, 166, 49, 50, - /* 550 */ 174, 175, 94, 95, 174, 175, 118, 161, 162, 94, - /* 560 */ 95, 165, 187, 16, 22, 160, 24, 68, 69, 70, + /* 430 */ 79, 80, 194, 82, 83, 84, 85, 86, 87, 88, + /* 440 */ 89, 90, 91, 92, 19, 150, 23, 112, 23, 114, + /* 450 */ 115, 25, 142, 143, 144, 145, 218, 105, 106, 107, + /* 460 */ 165, 112, 150, 114, 115, 22, 150, 166, 116, 174, + /* 470 */ 175, 22, 76, 235, 49, 50, 94, 165, 240, 172, + /* 480 */ 173, 165, 112, 155, 114, 115, 174, 175, 181, 11, + /* 490 */ 174, 175, 22, 68, 69, 70, 71, 72, 73, 74, + /* 500 */ 75, 76, 77, 78, 79, 80, 205, 82, 83, 84, + /* 510 */ 85, 86, 87, 88, 89, 90, 91, 92, 19, 160, + /* 520 */ 23, 226, 23, 222, 12, 224, 225, 150, 216, 23, + /* 530 */ 23, 25, 36, 25, 25, 112, 220, 114, 115, 135, + /* 540 */ 28, 137, 165, 26, 27, 119, 30, 51, 49, 50, + /* 550 */ 34, 174, 175, 194, 58, 166, 44, 229, 46, 160, + /* 560 */ 22, 23, 234, 25, 48, 206, 207, 68, 69, 70, /* 570 */ 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - /* 580 */ 150, 82, 83, 84, 85, 86, 87, 88, 89, 90, - /* 590 */ 91, 92, 19, 150, 12, 165, 23, 241, 88, 194, - /* 600 */ 150, 0, 1, 2, 94, 95, 160, 60, 165, 62, - /* 610 */ 28, 206, 207, 190, 191, 165, 150, 174, 175, 7, - /* 620 */ 8, 9, 49, 50, 174, 175, 44, 111, 46, 113, - /* 630 */ 114, 165, 169, 170, 171, 22, 23, 233, 25, 57, - /* 640 */ 194, 68, 69, 70, 71, 72, 73, 74, 75, 76, - /* 650 */ 77, 78, 79, 80, 150, 82, 83, 84, 85, 86, - /* 660 */ 87, 88, 89, 90, 91, 92, 19, 150, 25, 165, - /* 670 */ 23, 150, 233, 19, 150, 190, 191, 228, 174, 175, - /* 680 */ 67, 222, 165, 224, 225, 150, 165, 150, 150, 165, - /* 690 */ 23, 174, 175, 144, 145, 232, 49, 50, 174, 175, - /* 700 */ 165, 115, 165, 165, 50, 22, 23, 241, 25, 174, - /* 710 */ 175, 174, 175, 127, 193, 68, 69, 70, 71, 72, + /* 580 */ 23, 82, 83, 84, 85, 86, 87, 88, 89, 90, + /* 590 */ 91, 92, 19, 194, 205, 150, 23, 220, 19, 181, + /* 600 */ 182, 95, 97, 95, 108, 67, 188, 169, 170, 171, + /* 610 */ 165, 94, 95, 222, 50, 224, 225, 218, 120, 150, + /* 620 */ 160, 116, 49, 50, 22, 23, 120, 25, 120, 50, + /* 630 */ 161, 162, 19, 128, 165, 244, 22, 23, 193, 240, + /* 640 */ 27, 68, 69, 70, 71, 72, 73, 74, 75, 76, + /* 650 */ 77, 78, 79, 80, 194, 82, 83, 84, 85, 86, + /* 660 */ 87, 88, 89, 90, 91, 92, 19, 25, 104, 67, + /* 670 */ 232, 24, 150, 23, 150, 25, 150, 150, 150, 150, + /* 680 */ 150, 67, 25, 104, 7, 8, 9, 165, 109, 165, + /* 690 */ 245, 165, 165, 165, 165, 165, 49, 50, 174, 175, + /* 700 */ 174, 175, 174, 175, 174, 175, 0, 1, 2, 105, + /* 710 */ 106, 107, 248, 249, 187, 68, 69, 70, 71, 72, /* 720 */ 73, 74, 75, 76, 77, 78, 79, 80, 150, 82, /* 730 */ 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - /* 740 */ 19, 150, 150, 165, 150, 24, 103, 23, 150, 150, - /* 750 */ 67, 213, 174, 175, 97, 209, 165, 165, 104, 165, - /* 760 */ 150, 150, 108, 165, 165, 174, 175, 23, 174, 175, - /* 770 */ 49, 50, 115, 174, 175, 165, 165, 177, 111, 187, - /* 780 */ 113, 114, 250, 251, 127, 174, 175, 206, 207, 68, + /* 740 */ 19, 150, 213, 165, 150, 222, 150, 224, 225, 166, + /* 750 */ 167, 168, 174, 175, 129, 130, 165, 150, 165, 165, + /* 760 */ 150, 165, 150, 241, 35, 174, 175, 174, 174, 175, + /* 770 */ 49, 50, 165, 52, 23, 165, 25, 165, 206, 207, + /* 780 */ 23, 197, 25, 187, 174, 175, 174, 175, 204, 68, /* 790 */ 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, /* 800 */ 79, 80, 150, 82, 83, 84, 85, 86, 87, 88, - /* 810 */ 89, 90, 91, 92, 19, 150, 150, 165, 150, 111, - /* 820 */ 182, 113, 114, 105, 106, 177, 174, 175, 25, 166, - /* 830 */ 165, 165, 150, 165, 150, 111, 150, 113, 114, 174, - /* 840 */ 175, 150, 174, 175, 49, 50, 128, 165, 135, 165, - /* 850 */ 137, 165, 197, 187, 166, 111, 165, 113, 114, 204, - /* 860 */ 174, 175, 177, 68, 69, 70, 71, 72, 73, 74, + /* 810 */ 89, 90, 91, 92, 19, 150, 150, 165, 35, 23, + /* 820 */ 150, 25, 150, 22, 217, 24, 174, 175, 150, 35, + /* 830 */ 165, 165, 144, 145, 150, 165, 150, 165, 118, 174, + /* 840 */ 175, 150, 22, 165, 49, 50, 174, 175, 23, 165, + /* 850 */ 25, 165, 23, 187, 25, 27, 165, 187, 174, 175, + /* 860 */ 23, 23, 25, 68, 69, 70, 71, 72, 73, 74, /* 870 */ 75, 76, 77, 78, 79, 80, 150, 82, 83, 84, /* 880 */ 85, 86, 87, 88, 89, 90, 91, 92, 19, 150, - /* 890 */ 150, 165, 150, 205, 177, 213, 150, 213, 95, 177, - /* 900 */ 174, 175, 129, 130, 165, 165, 23, 165, 25, 150, - /* 910 */ 150, 165, 178, 174, 175, 150, 174, 175, 49, 50, - /* 920 */ 174, 175, 119, 19, 165, 165, 50, 22, 23, 160, - /* 930 */ 165, 27, 241, 193, 174, 175, 160, 68, 69, 70, + /* 890 */ 150, 165, 150, 150, 150, 217, 25, 160, 19, 213, + /* 900 */ 174, 175, 190, 191, 165, 165, 27, 165, 165, 165, + /* 910 */ 150, 150, 150, 174, 175, 39, 174, 175, 49, 50, + /* 920 */ 23, 150, 52, 250, 251, 165, 165, 165, 190, 191, + /* 930 */ 187, 194, 241, 193, 174, 175, 165, 68, 69, 70, /* 940 */ 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, /* 950 */ 150, 82, 83, 84, 85, 86, 87, 88, 89, 90, - /* 960 */ 91, 92, 19, 194, 150, 165, 150, 150, 150, 160, - /* 970 */ 194, 25, 67, 160, 174, 175, 217, 166, 95, 165, - /* 980 */ 104, 165, 165, 165, 150, 245, 248, 249, 49, 50, - /* 990 */ 174, 175, 49, 50, 23, 23, 25, 25, 242, 165, - /* 1000 */ 199, 187, 119, 194, 187, 22, 23, 194, 174, 175, + /* 960 */ 91, 92, 19, 150, 150, 165, 150, 160, 160, 166, + /* 970 */ 166, 160, 150, 22, 174, 175, 91, 92, 165, 165, + /* 980 */ 52, 165, 29, 150, 213, 241, 23, 165, 49, 50, + /* 990 */ 174, 175, 49, 50, 1, 2, 173, 126, 165, 86, + /* 1000 */ 87, 194, 194, 22, 181, 194, 193, 193, 205, 205, /* 1010 */ 71, 72, 69, 70, 71, 72, 73, 74, 75, 76, /* 1020 */ 77, 78, 79, 80, 150, 82, 83, 84, 85, 86, /* 1030 */ 87, 88, 89, 90, 91, 92, 19, 98, 150, 165, - /* 1040 */ 150, 150, 150, 19, 7, 8, 105, 106, 174, 175, - /* 1050 */ 67, 27, 23, 165, 25, 165, 165, 165, 150, 150, - /* 1060 */ 150, 150, 174, 175, 174, 175, 49, 50, 98, 242, - /* 1070 */ 23, 125, 25, 165, 165, 165, 165, 209, 108, 97, - /* 1080 */ 98, 209, 174, 175, 193, 174, 175, 70, 71, 72, - /* 1090 */ 73, 74, 75, 76, 77, 78, 79, 80, 199, 82, + /* 1040 */ 150, 150, 150, 22, 150, 150, 22, 52, 174, 175, + /* 1050 */ 22, 102, 20, 165, 109, 165, 165, 165, 150, 165, + /* 1060 */ 165, 150, 174, 175, 174, 175, 49, 50, 24, 19, + /* 1070 */ 43, 104, 59, 165, 138, 104, 165, 25, 53, 53, + /* 1080 */ 22, 5, 174, 175, 193, 174, 175, 70, 71, 72, + /* 1090 */ 73, 74, 75, 76, 77, 78, 79, 80, 1, 82, /* 1100 */ 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - /* 1110 */ 19, 20, 150, 22, 160, 22, 149, 26, 27, 150, - /* 1120 */ 23, 6, 25, 19, 20, 150, 22, 165, 37, 149, - /* 1130 */ 26, 27, 151, 23, 165, 25, 174, 175, 151, 150, - /* 1140 */ 165, 37, 13, 150, 150, 149, 149, 56, 194, 174, - /* 1150 */ 175, 23, 25, 25, 165, 194, 150, 66, 165, 165, - /* 1160 */ 56, 150, 159, 174, 175, 125, 150, 174, 175, 76, - /* 1170 */ 66, 165, 218, 150, 122, 199, 165, 86, 87, 200, - /* 1180 */ 150, 165, 123, 121, 93, 94, 95, 193, 165, 98, - /* 1190 */ 86, 87, 88, 201, 240, 165, 124, 93, 94, 95, - /* 1200 */ 202, 135, 98, 5, 174, 175, 115, 203, 10, 11, - /* 1210 */ 12, 13, 14, 150, 157, 17, 193, 150, 227, 210, - /* 1220 */ 129, 130, 131, 132, 133, 134, 150, 157, 165, 31, - /* 1230 */ 117, 33, 165, 129, 130, 131, 132, 133, 134, 150, - /* 1240 */ 42, 165, 19, 20, 104, 22, 150, 211, 210, 26, - /* 1250 */ 27, 210, 150, 55, 165, 57, 193, 120, 104, 61, - /* 1260 */ 37, 165, 64, 174, 175, 19, 20, 165, 22, 150, - /* 1270 */ 174, 175, 26, 27, 176, 150, 174, 175, 47, 56, - /* 1280 */ 211, 150, 150, 37, 165, 23, 23, 25, 25, 66, - /* 1290 */ 165, 211, 150, 174, 175, 184, 165, 165, 176, 174, - /* 1300 */ 175, 178, 56, 105, 106, 174, 175, 165, 110, 86, - /* 1310 */ 87, 176, 66, 115, 103, 176, 93, 94, 95, 150, - /* 1320 */ 23, 98, 25, 150, 22, 22, 128, 150, 150, 26, - /* 1330 */ 27, 150, 86, 87, 165, 193, 150, 139, 165, 93, - /* 1340 */ 94, 95, 165, 165, 98, 150, 165, 179, 92, 150, - /* 1350 */ 150, 165, 129, 130, 131, 132, 133, 134, 184, 150, - /* 1360 */ 165, 176, 193, 230, 165, 165, 193, 150, 150, 66, - /* 1370 */ 176, 150, 150, 230, 165, 129, 130, 131, 132, 133, - /* 1380 */ 134, 176, 165, 165, 150, 150, 165, 165, 150, 86, - /* 1390 */ 87, 150, 150, 150, 150, 179, 18, 94, 45, 165, - /* 1400 */ 165, 98, 157, 165, 150, 150, 165, 165, 165, 165, - /* 1410 */ 157, 135, 68, 156, 156, 156, 189, 157, 157, 165, - /* 1420 */ 165, 238, 156, 239, 157, 189, 22, 219, 199, 157, - /* 1430 */ 18, 192, 129, 130, 131, 157, 199, 40, 219, 192, - /* 1440 */ 192, 192, 157, 157, 243, 243, 38, 164, 180, 246, - /* 1450 */ 180, 1, 15, 189, 23, 249, 252, 22, 117, 252, - /* 1460 */ 117, 112, 117, 117, 117, 22, 11, 23, 23, 22, - /* 1470 */ 22, 25, 23, 35, 23, 23, 35, 119, 25, 25, - /* 1480 */ 22, 117, 23, 23, 27, 52, 22, 22, 52, 23, - /* 1490 */ 22, 35, 29, 22, 52, 22, 102, 108, 19, 24, - /* 1500 */ 39, 20, 104, 25, 138, 43, 104, 22, 5, 1, - /* 1510 */ 117, 35, 107, 27, 126, 76, 76, 22, 118, 1, - /* 1520 */ 16, 120, 53, 53, 118, 20, 59, 107, 22, 126, - /* 1530 */ 23, 16, 23, 22, 127, 15, 140, 65, 3, 253, - /* 1540 */ 4, + /* 1110 */ 19, 20, 150, 22, 150, 150, 150, 26, 27, 118, + /* 1120 */ 150, 35, 150, 150, 76, 27, 108, 165, 37, 165, + /* 1130 */ 165, 165, 76, 19, 20, 165, 22, 165, 165, 127, + /* 1140 */ 26, 27, 22, 1, 150, 16, 20, 56, 150, 150, + /* 1150 */ 119, 37, 150, 119, 160, 193, 150, 66, 193, 165, + /* 1160 */ 150, 150, 121, 165, 165, 108, 150, 165, 174, 175, + /* 1170 */ 56, 165, 150, 127, 22, 165, 165, 86, 87, 88, + /* 1180 */ 66, 165, 16, 150, 93, 94, 95, 165, 194, 98, + /* 1190 */ 174, 175, 128, 23, 15, 23, 174, 175, 165, 150, + /* 1200 */ 86, 87, 65, 140, 150, 22, 3, 93, 94, 95, + /* 1210 */ 216, 4, 98, 252, 165, 221, 150, 164, 180, 165, + /* 1220 */ 129, 130, 131, 132, 133, 134, 193, 150, 174, 175, + /* 1230 */ 116, 165, 19, 20, 150, 22, 249, 252, 149, 26, + /* 1240 */ 27, 180, 165, 129, 130, 131, 132, 133, 134, 165, + /* 1250 */ 37, 174, 175, 150, 6, 19, 20, 150, 22, 150, + /* 1260 */ 150, 150, 26, 27, 149, 149, 13, 150, 165, 56, + /* 1270 */ 149, 159, 165, 37, 165, 165, 165, 174, 175, 66, + /* 1280 */ 146, 147, 165, 174, 175, 25, 152, 151, 154, 150, + /* 1290 */ 194, 151, 56, 116, 160, 150, 123, 202, 150, 86, + /* 1300 */ 87, 199, 66, 193, 165, 200, 93, 94, 95, 150, + /* 1310 */ 165, 98, 150, 165, 126, 22, 124, 150, 150, 26, + /* 1320 */ 27, 150, 86, 87, 165, 201, 150, 165, 194, 93, + /* 1330 */ 94, 95, 165, 165, 98, 150, 165, 122, 203, 125, + /* 1340 */ 227, 165, 129, 130, 131, 132, 133, 134, 5, 150, + /* 1350 */ 165, 135, 218, 10, 11, 12, 13, 14, 150, 66, + /* 1360 */ 17, 157, 118, 157, 165, 129, 130, 131, 132, 133, + /* 1370 */ 134, 150, 104, 165, 31, 210, 33, 176, 150, 86, + /* 1380 */ 87, 247, 174, 175, 150, 42, 165, 94, 121, 211, + /* 1390 */ 150, 98, 210, 165, 210, 174, 175, 211, 55, 165, + /* 1400 */ 57, 150, 174, 175, 61, 165, 150, 64, 174, 175, + /* 1410 */ 104, 211, 47, 150, 174, 175, 165, 176, 176, 150, + /* 1420 */ 103, 165, 129, 130, 131, 174, 175, 184, 165, 179, + /* 1430 */ 174, 175, 150, 178, 165, 176, 22, 174, 175, 230, + /* 1440 */ 92, 230, 184, 174, 175, 150, 176, 165, 105, 106, + /* 1450 */ 107, 150, 176, 176, 111, 156, 174, 175, 179, 116, + /* 1460 */ 165, 18, 157, 156, 238, 157, 165, 156, 45, 174, + /* 1470 */ 175, 157, 157, 135, 239, 174, 175, 156, 189, 157, + /* 1480 */ 68, 189, 139, 219, 22, 199, 157, 192, 18, 192, + /* 1490 */ 192, 192, 199, 189, 219, 157, 243, 40, 243, 157, + /* 1500 */ 157, 246, 38, 153, 196, 198, 166, 233, 233, 228, + /* 1510 */ 177, 177, 209, 177, 182, 177, 166, 177, 166, 178, + /* 1520 */ 242, 199, 242, 209, 209, 199, 148, 196, 166, 208, + /* 1530 */ 195, 236, 237, 191, 208, 183, 183, 183, 186, 174, + /* 1540 */ 174, 186, 92, }; -#define YY_SHIFT_USE_DFLT (-110) -#define YY_SHIFT_MAX 417 +#define YY_SHIFT_USE_DFLT (-90) +#define YY_SHIFT_COUNT (418) +#define YY_SHIFT_MIN (-89) +#define YY_SHIFT_MAX (1470) static const short yy_shift_ofst[] = { - /* 0 */ 111, 1091, 1198, 1091, 1223, 1223, -2, 88, 88, -19, - /* 10 */ 1223, 1223, 1223, 1223, 1223, 210, 465, 129, 1104, 1223, - /* 20 */ 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, - /* 30 */ 1223, 1223, 1246, 1223, 1223, 1223, 1223, 1223, 1223, 1223, - /* 40 */ 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, - /* 50 */ 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, - /* 60 */ 1223, -49, 361, 465, 465, 154, 138, 138, -109, 55, - /* 70 */ 203, 277, 351, 425, 499, 573, 647, 721, 795, 869, + /* 0 */ 993, 1114, 1343, 1114, 1213, 1213, 90, 90, 0, -19, + /* 10 */ 1213, 1213, 1213, 1213, 1213, 352, 517, 721, 1091, 1213, + /* 20 */ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, + /* 30 */ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, + /* 40 */ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1236, 1213, 1213, + /* 50 */ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, + /* 60 */ 1213, -49, 199, 517, 517, 913, 913, 382, 1177, 55, + /* 70 */ 647, 573, 499, 425, 351, 277, 203, 129, 795, 795, /* 80 */ 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, - /* 90 */ 795, 795, 795, 795, 795, 795, 795, 795, 943, 1017, - /* 100 */ 1017, -69, -69, -69, -69, -1, -1, 57, 155, -44, - /* 110 */ 465, 465, 465, 465, 465, 654, 205, 465, 465, 465, - /* 120 */ 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, - /* 130 */ 465, 465, 465, 248, 154, -80, -110, -110, -110, 1303, - /* 140 */ 131, 95, 291, 352, 458, 510, 582, 582, 465, 465, - /* 150 */ 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, - /* 160 */ 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, - /* 170 */ 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, - /* 180 */ 613, 683, 601, 379, 379, 379, 657, 586, -109, -109, - /* 190 */ -109, -110, -110, -110, 172, 172, 275, 160, 516, 667, - /* 200 */ 724, 442, 744, 883, 60, 60, 612, 367, 236, 803, - /* 210 */ 708, 708, 143, 718, 708, 708, 708, 708, 542, 426, - /* 220 */ 438, 154, 773, 773, 713, 428, 428, 904, 428, 876, - /* 230 */ 428, 154, 428, 154, 643, 1024, 946, 1024, 904, 904, - /* 240 */ 946, 1115, 1115, 1115, 1115, 1129, 1129, 1127, -109, 1040, - /* 250 */ 1052, 1059, 1062, 1072, 1066, 1113, 1113, 1140, 1137, 1140, - /* 260 */ 1137, 1140, 1137, 1154, 1154, 1231, 1154, 1211, 1154, 1302, - /* 270 */ 1256, 1256, 1231, 1154, 1154, 1154, 1302, 1378, 1113, 1378, - /* 280 */ 1113, 1378, 1113, 1113, 1353, 1276, 1378, 1113, 1344, 1344, - /* 290 */ 1404, 1040, 1113, 1412, 1412, 1412, 1412, 1040, 1344, 1404, - /* 300 */ 1113, 1397, 1397, 1113, 1113, 1408, -110, -110, -110, -110, - /* 310 */ -110, -110, 939, 46, 547, 905, 983, 971, 972, 970, - /* 320 */ 1037, 941, 982, 1029, 1047, 1097, 1110, 1128, 1262, 1263, - /* 330 */ 1093, 1297, 1450, 1437, 1431, 1435, 1341, 1343, 1345, 1346, - /* 340 */ 1347, 1349, 1443, 1444, 1445, 1447, 1455, 1448, 1449, 1446, - /* 350 */ 1451, 1452, 1453, 1438, 1454, 1441, 1453, 1358, 1458, 1456, - /* 360 */ 1457, 1364, 1459, 1460, 1461, 1433, 1464, 1463, 1436, 1465, - /* 370 */ 1466, 1468, 1471, 1442, 1473, 1394, 1389, 1479, 1481, 1475, - /* 380 */ 1398, 1462, 1467, 1469, 1478, 1470, 1366, 1402, 1485, 1503, - /* 390 */ 1508, 1393, 1476, 1486, 1405, 1439, 1440, 1388, 1495, 1400, - /* 400 */ 1518, 1504, 1401, 1505, 1406, 1420, 1403, 1506, 1407, 1507, - /* 410 */ 1509, 1515, 1472, 1520, 1396, 1511, 1535, 1536, + /* 90 */ 795, 795, 795, 795, 795, 795, 869, 795, 943, 1017, + /* 100 */ 1017, -69, -69, -69, -69, -1, -1, 58, 138, -44, + /* 110 */ 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, + /* 120 */ 517, 517, 517, 517, 517, 517, 202, 579, 517, 517, + /* 130 */ 517, 517, 517, 382, 885, 1450, -90, -90, -90, 1293, + /* 140 */ 73, 272, 272, 309, 311, 297, 282, 216, 602, 538, + /* 150 */ 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, + /* 160 */ 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, + /* 170 */ 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, + /* 180 */ 517, 517, 505, 231, 231, 231, 706, 64, 1177, 1177, + /* 190 */ 1177, -90, -90, -90, 136, 168, 168, 12, 496, 496, + /* 200 */ 496, 506, 423, 512, 370, 349, 335, 149, 149, 149, + /* 210 */ 149, 604, 516, 149, 149, 508, 3, 299, 677, 871, + /* 220 */ 613, 613, 879, 871, 879, 144, 382, 226, 382, 226, + /* 230 */ 564, 226, 613, 226, 226, 404, 625, 625, 382, 426, + /* 240 */ -89, 801, 1464, 1244, 1244, 1457, 1457, 1244, 1462, 1412, + /* 250 */ 1188, 1470, 1470, 1470, 1470, 1244, 1188, 1462, 1412, 1412, + /* 260 */ 1244, 1443, 1338, 1423, 1244, 1244, 1443, 1244, 1443, 1244, + /* 270 */ 1443, 1414, 1306, 1306, 1306, 1365, 1348, 1348, 1414, 1306, + /* 280 */ 1317, 1306, 1365, 1306, 1306, 1267, 1268, 1267, 1268, 1267, + /* 290 */ 1268, 1244, 1244, 1216, 1214, 1215, 1192, 1173, 1188, 1177, + /* 300 */ 1260, 1253, 1253, 1248, 1248, 1248, 1248, -90, -90, -90, + /* 310 */ -90, -90, -90, 939, 102, 614, 84, 133, 14, 837, + /* 320 */ 396, 829, 825, 796, 757, 751, 650, 357, 244, 107, + /* 330 */ 54, 305, 278, 1207, 1203, 1183, 1063, 1179, 1137, 1166, + /* 340 */ 1172, 1170, 1064, 1152, 1046, 1057, 1034, 1126, 1041, 1129, + /* 350 */ 1142, 1031, 1120, 1012, 1056, 1048, 1018, 1098, 1086, 1001, + /* 360 */ 1097, 1076, 1058, 971, 936, 1026, 1052, 1025, 1013, 1027, + /* 370 */ 967, 1044, 1032, 1050, 945, 949, 1028, 995, 1024, 1021, + /* 380 */ 963, 981, 928, 953, 951, 870, 876, 897, 838, 720, + /* 390 */ 828, 794, 820, 498, 642, 783, 657, 729, 642, 557, + /* 400 */ 507, 509, 497, 470, 478, 449, 294, 228, 443, 23, + /* 410 */ 152, 123, 68, -20, -42, 57, 39, -3, 5, }; -#define YY_REDUCE_USE_DFLT (-197) -#define YY_REDUCE_MAX 311 +#define YY_REDUCE_USE_DFLT (-222) +#define YY_REDUCE_COUNT (312) +#define YY_REDUCE_MIN (-221) +#define YY_REDUCE_MAX (1378) static const short yy_reduce_ofst[] = { - /* 0 */ -141, 90, 16, 147, -55, 21, 148, 149, 158, 240, - /* 10 */ 223, 237, 242, 303, 307, 164, 370, 171, 369, 376, - /* 20 */ 380, 443, 450, 504, 517, 524, 535, 537, 578, 591, - /* 30 */ 594, 599, 611, 652, 665, 668, 686, 726, 739, 742, - /* 40 */ 746, 760, 800, 816, 834, 874, 888, 890, 908, 911, - /* 50 */ 962, 975, 989, 993, 1030, 1089, 1096, 1102, 1119, 1125, - /* 60 */ 1131, -196, 954, 740, 396, 169, -68, 463, 405, 459, - /* 70 */ 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, - /* 80 */ 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, - /* 90 */ 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, - /* 100 */ 459, 459, 459, 459, 459, 459, 459, -21, 459, 459, - /* 110 */ 538, 375, 592, 666, 814, 6, 222, 521, 682, 817, - /* 120 */ 356, 244, 466, 684, 691, 891, 994, 1023, 1063, 1142, - /* 130 */ 1169, 759, 1173, 459, -89, 459, 459, 459, 459, 285, - /* 140 */ 76, 430, 598, 610, 765, 818, 423, 485, 892, 909, - /* 150 */ 910, 969, 1006, 818, 1011, 1016, 1067, 1076, 1132, 1177, - /* 160 */ 1178, 1181, 1186, 1195, 1199, 1200, 1209, 1217, 1218, 1221, - /* 170 */ 1222, 1234, 1235, 1238, 1241, 1242, 1243, 1244, 1254, 1255, - /* 180 */ 532, 532, 549, 178, 324, 688, 446, 769, 776, 809, - /* 190 */ 813, 655, 581, 738, -74, -58, -50, -17, -23, -23, - /* 200 */ -23, 63, -23, 29, 68, 121, 183, 146, 225, 29, - /* 210 */ -23, -23, 196, 177, -23, -23, -23, -23, 255, 328, - /* 220 */ 335, 381, 404, 439, 449, 600, 648, 546, 685, 638, - /* 230 */ 717, 663, 722, 811, 734, 756, 801, 827, 868, 872, - /* 240 */ 899, 967, 980, 996, 997, 981, 987, 1003, 961, 976, - /* 250 */ 979, 992, 998, 1004, 991, 1057, 1070, 1009, 1036, 1038, - /* 260 */ 1069, 1041, 1080, 1098, 1122, 1111, 1135, 1123, 1139, 1168, - /* 270 */ 1133, 1143, 1174, 1185, 1194, 1205, 1216, 1257, 1245, 1258, - /* 280 */ 1253, 1259, 1260, 1261, 1183, 1184, 1266, 1267, 1227, 1236, - /* 290 */ 1208, 1229, 1272, 1239, 1247, 1248, 1249, 1237, 1264, 1219, - /* 300 */ 1278, 1201, 1202, 1285, 1286, 1203, 1283, 1268, 1270, 1206, - /* 310 */ 1204, 1207, + /* 0 */ 310, 994, 1134, 221, 169, 157, 89, 18, 83, 301, + /* 10 */ 377, 316, 312, 16, 295, 238, 249, 391, 1301, 1295, + /* 20 */ 1282, 1269, 1263, 1256, 1251, 1240, 1234, 1228, 1221, 1208, + /* 30 */ 1109, 1103, 1077, 1054, 1022, 1016, 911, 908, 890, 888, + /* 40 */ 874, 816, 800, 760, 742, 739, 726, 684, 672, 665, + /* 50 */ 652, 612, 610, 594, 591, 578, 530, 528, 526, 524, + /* 60 */ -72, -221, 399, 469, 445, 438, 143, 222, 359, 523, + /* 70 */ 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, + /* 80 */ 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, + /* 90 */ 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, + /* 100 */ 523, 523, 523, 523, 523, 523, 523, 307, 523, 523, + /* 110 */ 1110, 678, 1033, 965, 962, 891, 814, 813, 744, 771, + /* 120 */ 691, 607, 522, 743, 686, 740, 328, 418, 670, 666, + /* 130 */ 596, 527, 529, 583, 523, 523, 523, 523, 523, 593, + /* 140 */ 823, 738, 712, 892, 1199, 1185, 1176, 1171, 673, 673, + /* 150 */ 1168, 1167, 1162, 1159, 1148, 1145, 1139, 1117, 1111, 1107, + /* 160 */ 1084, 1066, 1049, 1011, 1010, 1006, 1002, 999, 998, 973, + /* 170 */ 972, 970, 966, 964, 895, 894, 892, 833, 822, 762, + /* 180 */ 761, 229, 811, 804, 803, 389, 688, 808, 807, 737, + /* 190 */ 460, 464, 572, 584, 1355, 1366, 1365, 1352, 1354, 1353, + /* 200 */ 1352, 1326, 1335, 1342, 1335, 1335, 1335, 1335, 1335, 1335, + /* 210 */ 1335, 1295, 1295, 1335, 1335, 1321, 1362, 1331, 1378, 1326, + /* 220 */ 1315, 1314, 1280, 1322, 1278, 1341, 1352, 1340, 1350, 1338, + /* 230 */ 1332, 1336, 1303, 1334, 1333, 1281, 1275, 1274, 1340, 1307, + /* 240 */ 1308, 1350, 1255, 1343, 1342, 1255, 1253, 1338, 1275, 1304, + /* 250 */ 1293, 1299, 1298, 1297, 1295, 1329, 1286, 1264, 1292, 1289, + /* 260 */ 1322, 1321, 1235, 1226, 1315, 1314, 1311, 1308, 1307, 1305, + /* 270 */ 1299, 1279, 1277, 1276, 1270, 1258, 1211, 1209, 1250, 1259, + /* 280 */ 1255, 1242, 1243, 1241, 1201, 1200, 1184, 1186, 1182, 1178, + /* 290 */ 1165, 1206, 1204, 1113, 1135, 1095, 1124, 1105, 1102, 1096, + /* 300 */ 1112, 1140, 1136, 1121, 1116, 1115, 1089, 985, 961, 987, + /* 310 */ 1061, 1038, 1053, }; static const YYACTIONTYPE yy_default[] = { - /* 0 */ 634, 869, 958, 958, 869, 958, 958, 898, 898, 757, - /* 10 */ 867, 958, 958, 958, 958, 958, 958, 932, 958, 958, - /* 20 */ 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, - /* 30 */ 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, - /* 40 */ 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, - /* 50 */ 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, - /* 60 */ 958, 841, 958, 958, 958, 673, 898, 898, 761, 792, - /* 70 */ 958, 958, 958, 958, 958, 958, 958, 958, 793, 958, - /* 80 */ 871, 866, 862, 864, 863, 870, 794, 783, 790, 797, - /* 90 */ 772, 911, 799, 800, 806, 807, 933, 931, 829, 828, - /* 100 */ 847, 831, 845, 853, 846, 830, 840, 665, 832, 833, - /* 110 */ 958, 958, 958, 958, 958, 726, 660, 958, 958, 958, - /* 120 */ 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, - /* 130 */ 958, 958, 958, 834, 958, 835, 848, 849, 850, 958, - /* 140 */ 958, 958, 958, 958, 958, 958, 958, 958, 640, 958, - /* 150 */ 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, - /* 160 */ 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, - /* 170 */ 958, 958, 958, 958, 958, 882, 958, 936, 938, 958, - /* 180 */ 958, 958, 634, 757, 757, 757, 958, 958, 958, 958, - /* 190 */ 958, 751, 761, 950, 958, 958, 717, 958, 958, 958, - /* 200 */ 958, 958, 958, 958, 958, 958, 642, 749, 675, 759, - /* 210 */ 662, 738, 904, 958, 923, 921, 740, 802, 958, 749, - /* 220 */ 758, 958, 958, 958, 865, 786, 786, 774, 786, 696, - /* 230 */ 786, 958, 786, 958, 699, 916, 796, 916, 774, 774, - /* 240 */ 796, 639, 639, 639, 639, 650, 650, 716, 958, 796, - /* 250 */ 787, 789, 779, 791, 958, 765, 765, 773, 778, 773, - /* 260 */ 778, 773, 778, 728, 728, 713, 728, 699, 728, 875, - /* 270 */ 879, 879, 713, 728, 728, 728, 875, 657, 765, 657, - /* 280 */ 765, 657, 765, 765, 908, 910, 657, 765, 730, 730, - /* 290 */ 808, 796, 765, 737, 737, 737, 737, 796, 730, 808, - /* 300 */ 765, 935, 935, 765, 765, 943, 683, 701, 701, 950, - /* 310 */ 955, 955, 958, 958, 958, 958, 958, 958, 958, 958, - /* 320 */ 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, - /* 330 */ 884, 958, 958, 648, 958, 667, 815, 820, 816, 958, - /* 340 */ 817, 743, 958, 958, 958, 958, 958, 958, 958, 958, - /* 350 */ 958, 958, 868, 958, 780, 958, 788, 958, 958, 958, - /* 360 */ 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, - /* 370 */ 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, - /* 380 */ 958, 958, 958, 906, 907, 958, 958, 958, 958, 958, - /* 390 */ 958, 914, 958, 958, 958, 958, 958, 958, 958, 958, - /* 400 */ 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, - /* 410 */ 958, 958, 942, 958, 958, 945, 635, 958, 630, 632, - /* 420 */ 633, 637, 638, 641, 667, 668, 670, 671, 672, 643, - /* 430 */ 644, 645, 646, 647, 649, 653, 651, 652, 654, 661, - /* 440 */ 663, 682, 684, 686, 747, 748, 812, 741, 742, 746, - /* 450 */ 669, 823, 814, 818, 819, 821, 822, 836, 837, 839, - /* 460 */ 844, 852, 855, 838, 843, 851, 854, 744, 745, 858, - /* 470 */ 676, 677, 680, 681, 894, 896, 895, 897, 679, 678, - /* 480 */ 824, 827, 860, 861, 924, 925, 926, 927, 928, 856, - /* 490 */ 766, 859, 842, 781, 784, 785, 782, 750, 760, 768, - /* 500 */ 769, 770, 771, 755, 756, 762, 777, 810, 811, 775, - /* 510 */ 776, 763, 764, 752, 753, 754, 857, 813, 825, 826, - /* 520 */ 687, 688, 820, 689, 690, 691, 729, 732, 733, 734, - /* 530 */ 692, 711, 714, 715, 693, 700, 694, 695, 702, 703, - /* 540 */ 704, 706, 707, 708, 709, 710, 705, 876, 877, 880, - /* 550 */ 878, 697, 698, 712, 685, 674, 666, 718, 721, 722, - /* 560 */ 723, 724, 725, 727, 719, 720, 664, 655, 658, 767, - /* 570 */ 900, 909, 905, 901, 902, 903, 659, 872, 873, 731, - /* 580 */ 804, 805, 899, 912, 915, 917, 918, 919, 809, 920, - /* 590 */ 922, 913, 947, 656, 735, 736, 739, 881, 929, 795, - /* 600 */ 798, 801, 803, 883, 885, 887, 889, 890, 891, 892, - /* 610 */ 893, 886, 888, 930, 934, 937, 939, 940, 941, 944, - /* 620 */ 946, 951, 952, 953, 956, 957, 954, 636, 631, + /* 0 */ 636, 872, 961, 961, 961, 872, 901, 901, 961, 760, + /* 10 */ 961, 961, 961, 961, 870, 961, 961, 935, 961, 961, + /* 20 */ 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, + /* 30 */ 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, + /* 40 */ 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, + /* 50 */ 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, + /* 60 */ 961, 844, 961, 961, 961, 901, 901, 675, 764, 795, + /* 70 */ 961, 961, 961, 961, 961, 961, 961, 961, 934, 936, + /* 80 */ 810, 809, 803, 802, 914, 775, 800, 793, 786, 797, + /* 90 */ 873, 866, 867, 865, 869, 874, 961, 796, 832, 850, + /* 100 */ 831, 849, 856, 848, 834, 843, 833, 667, 835, 836, + /* 110 */ 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, + /* 120 */ 961, 961, 961, 961, 961, 961, 662, 729, 961, 961, + /* 130 */ 961, 961, 961, 961, 837, 838, 853, 852, 851, 961, + /* 140 */ 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, + /* 150 */ 961, 941, 939, 961, 885, 961, 961, 961, 961, 961, + /* 160 */ 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, + /* 170 */ 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, + /* 180 */ 961, 642, 961, 760, 760, 760, 636, 961, 961, 961, + /* 190 */ 961, 953, 764, 754, 720, 961, 961, 961, 961, 961, + /* 200 */ 961, 961, 961, 961, 961, 961, 961, 805, 743, 924, + /* 210 */ 926, 961, 907, 741, 664, 762, 677, 752, 644, 799, + /* 220 */ 777, 777, 919, 799, 919, 701, 961, 789, 961, 789, + /* 230 */ 698, 789, 777, 789, 789, 868, 961, 961, 961, 761, + /* 240 */ 752, 961, 946, 768, 768, 938, 938, 768, 811, 733, + /* 250 */ 799, 740, 740, 740, 740, 768, 799, 811, 733, 733, + /* 260 */ 768, 659, 913, 911, 768, 768, 659, 768, 659, 768, + /* 270 */ 659, 878, 731, 731, 731, 716, 882, 882, 878, 731, + /* 280 */ 701, 731, 716, 731, 731, 781, 776, 781, 776, 781, + /* 290 */ 776, 768, 768, 961, 794, 782, 792, 790, 799, 961, + /* 300 */ 719, 652, 652, 641, 641, 641, 641, 958, 958, 953, + /* 310 */ 703, 703, 685, 961, 961, 961, 961, 961, 961, 961, + /* 320 */ 887, 961, 961, 961, 961, 961, 961, 961, 961, 961, + /* 330 */ 961, 961, 961, 961, 637, 948, 961, 961, 945, 961, + /* 340 */ 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, + /* 350 */ 961, 961, 961, 961, 961, 961, 961, 961, 961, 917, + /* 360 */ 961, 961, 961, 961, 961, 961, 910, 909, 961, 961, + /* 370 */ 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, + /* 380 */ 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, + /* 390 */ 961, 961, 961, 961, 791, 961, 783, 961, 871, 961, + /* 400 */ 961, 961, 961, 961, 961, 961, 961, 961, 961, 746, + /* 410 */ 820, 961, 819, 823, 818, 669, 961, 650, 961, 633, + /* 420 */ 638, 957, 960, 959, 956, 955, 954, 949, 947, 944, + /* 430 */ 943, 942, 940, 937, 933, 891, 889, 896, 895, 894, + /* 440 */ 893, 892, 890, 888, 886, 806, 804, 801, 798, 932, + /* 450 */ 884, 742, 739, 738, 658, 950, 916, 925, 923, 812, + /* 460 */ 922, 921, 920, 918, 915, 902, 808, 807, 734, 876, + /* 470 */ 875, 661, 906, 905, 904, 908, 912, 903, 770, 660, + /* 480 */ 657, 666, 723, 722, 730, 728, 727, 726, 725, 724, + /* 490 */ 721, 668, 676, 687, 715, 700, 699, 881, 883, 880, + /* 500 */ 879, 708, 707, 713, 712, 711, 710, 709, 706, 705, + /* 510 */ 704, 697, 696, 702, 695, 718, 717, 714, 694, 737, + /* 520 */ 736, 735, 732, 693, 692, 691, 823, 690, 689, 829, + /* 530 */ 828, 816, 860, 757, 756, 755, 767, 766, 779, 778, + /* 540 */ 814, 813, 780, 765, 759, 758, 774, 773, 772, 771, + /* 550 */ 763, 753, 785, 788, 787, 784, 845, 862, 769, 859, + /* 560 */ 931, 930, 929, 928, 927, 864, 863, 830, 827, 680, + /* 570 */ 681, 900, 898, 899, 897, 683, 682, 679, 678, 861, + /* 580 */ 748, 747, 857, 854, 846, 841, 858, 855, 847, 842, + /* 590 */ 840, 839, 825, 824, 822, 821, 817, 826, 671, 749, + /* 600 */ 745, 744, 815, 751, 750, 688, 686, 684, 665, 663, + /* 610 */ 656, 654, 653, 655, 651, 649, 648, 647, 646, 645, + /* 620 */ 674, 673, 672, 670, 669, 643, 640, 639, 635, 634, + /* 630 */ 632, }; -#define YY_SZ_ACTTAB (int)(sizeof(yy_action)/sizeof(yy_action[0])) /* The next table maps tokens into fallback tokens. If a construct ** like the following: @@ -90823,13 +91549,13 @@ static const char *const yyTokenName[] = { "COLLATE", "BITNOT", "STRING", "JOIN_KW", "CONSTRAINT", "DEFAULT", "NULL", "PRIMARY", "UNIQUE", "CHECK", "REFERENCES", "AUTOINCR", - "ON", "DELETE", "UPDATE", "SET", - "DEFERRABLE", "FOREIGN", "DROP", "UNION", - "ALL", "EXCEPT", "INTERSECT", "SELECT", - "DISTINCT", "DOT", "FROM", "JOIN", - "USING", "ORDER", "GROUP", "HAVING", - "LIMIT", "WHERE", "INTO", "VALUES", - "INSERT", "INTEGER", "FLOAT", "BLOB", + "ON", "INSERT", "DELETE", "UPDATE", + "SET", "DEFERRABLE", "FOREIGN", "DROP", + "UNION", "ALL", "EXCEPT", "INTERSECT", + "SELECT", "DISTINCT", "DOT", "FROM", + "JOIN", "USING", "ORDER", "GROUP", + "HAVING", "LIMIT", "WHERE", "INTO", + "VALUES", "INTEGER", "FLOAT", "BLOB", "REGISTER", "VARIABLE", "CASE", "WHEN", "THEN", "ELSE", "INDEX", "ALTER", "ADD", "error", "input", "cmdlist", @@ -90943,260 +91669,261 @@ static const char *const yyRuleName[] = { /* 72 */ "refargs ::=", /* 73 */ "refargs ::= refargs refarg", /* 74 */ "refarg ::= MATCH nm", - /* 75 */ "refarg ::= ON DELETE refact", - /* 76 */ "refarg ::= ON UPDATE refact", - /* 77 */ "refact ::= SET NULL", - /* 78 */ "refact ::= SET DEFAULT", - /* 79 */ "refact ::= CASCADE", - /* 80 */ "refact ::= RESTRICT", - /* 81 */ "refact ::= NO ACTION", - /* 82 */ "defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt", - /* 83 */ "defer_subclause ::= DEFERRABLE init_deferred_pred_opt", - /* 84 */ "init_deferred_pred_opt ::=", - /* 85 */ "init_deferred_pred_opt ::= INITIALLY DEFERRED", - /* 86 */ "init_deferred_pred_opt ::= INITIALLY IMMEDIATE", - /* 87 */ "conslist_opt ::=", - /* 88 */ "conslist_opt ::= COMMA conslist", - /* 89 */ "conslist ::= conslist COMMA tcons", - /* 90 */ "conslist ::= conslist tcons", - /* 91 */ "conslist ::= tcons", - /* 92 */ "tcons ::= CONSTRAINT nm", - /* 93 */ "tcons ::= PRIMARY KEY LP idxlist autoinc RP onconf", - /* 94 */ "tcons ::= UNIQUE LP idxlist RP onconf", - /* 95 */ "tcons ::= CHECK LP expr RP onconf", - /* 96 */ "tcons ::= FOREIGN KEY LP idxlist RP REFERENCES nm idxlist_opt refargs defer_subclause_opt", - /* 97 */ "defer_subclause_opt ::=", - /* 98 */ "defer_subclause_opt ::= defer_subclause", - /* 99 */ "onconf ::=", - /* 100 */ "onconf ::= ON CONFLICT resolvetype", - /* 101 */ "orconf ::=", - /* 102 */ "orconf ::= OR resolvetype", - /* 103 */ "resolvetype ::= raisetype", - /* 104 */ "resolvetype ::= IGNORE", - /* 105 */ "resolvetype ::= REPLACE", - /* 106 */ "cmd ::= DROP TABLE ifexists fullname", - /* 107 */ "ifexists ::= IF EXISTS", - /* 108 */ "ifexists ::=", - /* 109 */ "cmd ::= createkw temp VIEW ifnotexists nm dbnm AS select", - /* 110 */ "cmd ::= DROP VIEW ifexists fullname", - /* 111 */ "cmd ::= select", - /* 112 */ "select ::= oneselect", - /* 113 */ "select ::= select multiselect_op oneselect", - /* 114 */ "multiselect_op ::= UNION", - /* 115 */ "multiselect_op ::= UNION ALL", - /* 116 */ "multiselect_op ::= EXCEPT|INTERSECT", - /* 117 */ "oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt", - /* 118 */ "distinct ::= DISTINCT", - /* 119 */ "distinct ::= ALL", - /* 120 */ "distinct ::=", - /* 121 */ "sclp ::= selcollist COMMA", - /* 122 */ "sclp ::=", - /* 123 */ "selcollist ::= sclp expr as", - /* 124 */ "selcollist ::= sclp STAR", - /* 125 */ "selcollist ::= sclp nm DOT STAR", - /* 126 */ "as ::= AS nm", - /* 127 */ "as ::= ids", - /* 128 */ "as ::=", - /* 129 */ "from ::=", - /* 130 */ "from ::= FROM seltablist", - /* 131 */ "stl_prefix ::= seltablist joinop", - /* 132 */ "stl_prefix ::=", - /* 133 */ "seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt", - /* 134 */ "seltablist ::= stl_prefix LP select RP as on_opt using_opt", - /* 135 */ "seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt", - /* 136 */ "dbnm ::=", - /* 137 */ "dbnm ::= DOT nm", - /* 138 */ "fullname ::= nm dbnm", - /* 139 */ "joinop ::= COMMA|JOIN", - /* 140 */ "joinop ::= JOIN_KW JOIN", - /* 141 */ "joinop ::= JOIN_KW nm JOIN", - /* 142 */ "joinop ::= JOIN_KW nm nm JOIN", - /* 143 */ "on_opt ::= ON expr", - /* 144 */ "on_opt ::=", - /* 145 */ "indexed_opt ::=", - /* 146 */ "indexed_opt ::= INDEXED BY nm", - /* 147 */ "indexed_opt ::= NOT INDEXED", - /* 148 */ "using_opt ::= USING LP inscollist RP", - /* 149 */ "using_opt ::=", - /* 150 */ "orderby_opt ::=", - /* 151 */ "orderby_opt ::= ORDER BY sortlist", - /* 152 */ "sortlist ::= sortlist COMMA sortitem sortorder", - /* 153 */ "sortlist ::= sortitem sortorder", - /* 154 */ "sortitem ::= expr", - /* 155 */ "sortorder ::= ASC", - /* 156 */ "sortorder ::= DESC", - /* 157 */ "sortorder ::=", - /* 158 */ "groupby_opt ::=", - /* 159 */ "groupby_opt ::= GROUP BY nexprlist", - /* 160 */ "having_opt ::=", - /* 161 */ "having_opt ::= HAVING expr", - /* 162 */ "limit_opt ::=", - /* 163 */ "limit_opt ::= LIMIT expr", - /* 164 */ "limit_opt ::= LIMIT expr OFFSET expr", - /* 165 */ "limit_opt ::= LIMIT expr COMMA expr", - /* 166 */ "cmd ::= DELETE FROM fullname indexed_opt where_opt", - /* 167 */ "where_opt ::=", - /* 168 */ "where_opt ::= WHERE expr", - /* 169 */ "cmd ::= UPDATE orconf fullname indexed_opt SET setlist where_opt", - /* 170 */ "setlist ::= setlist COMMA nm EQ expr", - /* 171 */ "setlist ::= nm EQ expr", - /* 172 */ "cmd ::= insert_cmd INTO fullname inscollist_opt VALUES LP itemlist RP", - /* 173 */ "cmd ::= insert_cmd INTO fullname inscollist_opt select", - /* 174 */ "cmd ::= insert_cmd INTO fullname inscollist_opt DEFAULT VALUES", - /* 175 */ "insert_cmd ::= INSERT orconf", - /* 176 */ "insert_cmd ::= REPLACE", - /* 177 */ "itemlist ::= itemlist COMMA expr", - /* 178 */ "itemlist ::= expr", - /* 179 */ "inscollist_opt ::=", - /* 180 */ "inscollist_opt ::= LP inscollist RP", - /* 181 */ "inscollist ::= inscollist COMMA nm", - /* 182 */ "inscollist ::= nm", - /* 183 */ "expr ::= term", - /* 184 */ "expr ::= LP expr RP", - /* 185 */ "term ::= NULL", - /* 186 */ "expr ::= id", - /* 187 */ "expr ::= JOIN_KW", - /* 188 */ "expr ::= nm DOT nm", - /* 189 */ "expr ::= nm DOT nm DOT nm", - /* 190 */ "term ::= INTEGER|FLOAT|BLOB", - /* 191 */ "term ::= STRING", - /* 192 */ "expr ::= REGISTER", - /* 193 */ "expr ::= VARIABLE", - /* 194 */ "expr ::= expr COLLATE ids", - /* 195 */ "expr ::= CAST LP expr AS typetoken RP", - /* 196 */ "expr ::= ID LP distinct exprlist RP", - /* 197 */ "expr ::= ID LP STAR RP", - /* 198 */ "term ::= CTIME_KW", - /* 199 */ "expr ::= expr AND expr", - /* 200 */ "expr ::= expr OR expr", - /* 201 */ "expr ::= expr LT|GT|GE|LE expr", - /* 202 */ "expr ::= expr EQ|NE expr", - /* 203 */ "expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr", - /* 204 */ "expr ::= expr PLUS|MINUS expr", - /* 205 */ "expr ::= expr STAR|SLASH|REM expr", - /* 206 */ "expr ::= expr CONCAT expr", - /* 207 */ "likeop ::= LIKE_KW", - /* 208 */ "likeop ::= NOT LIKE_KW", - /* 209 */ "likeop ::= MATCH", - /* 210 */ "likeop ::= NOT MATCH", - /* 211 */ "escape ::= ESCAPE expr", - /* 212 */ "escape ::=", - /* 213 */ "expr ::= expr likeop expr escape", - /* 214 */ "expr ::= expr ISNULL|NOTNULL", - /* 215 */ "expr ::= expr NOT NULL", - /* 216 */ "expr ::= expr IS expr", - /* 217 */ "expr ::= expr IS NOT expr", - /* 218 */ "expr ::= NOT expr", - /* 219 */ "expr ::= BITNOT expr", - /* 220 */ "expr ::= MINUS expr", - /* 221 */ "expr ::= PLUS expr", - /* 222 */ "between_op ::= BETWEEN", - /* 223 */ "between_op ::= NOT BETWEEN", - /* 224 */ "expr ::= expr between_op expr AND expr", - /* 225 */ "in_op ::= IN", - /* 226 */ "in_op ::= NOT IN", - /* 227 */ "expr ::= expr in_op LP exprlist RP", - /* 228 */ "expr ::= LP select RP", - /* 229 */ "expr ::= expr in_op LP select RP", - /* 230 */ "expr ::= expr in_op nm dbnm", - /* 231 */ "expr ::= EXISTS LP select RP", - /* 232 */ "expr ::= CASE case_operand case_exprlist case_else END", - /* 233 */ "case_exprlist ::= case_exprlist WHEN expr THEN expr", - /* 234 */ "case_exprlist ::= WHEN expr THEN expr", - /* 235 */ "case_else ::= ELSE expr", - /* 236 */ "case_else ::=", - /* 237 */ "case_operand ::= expr", - /* 238 */ "case_operand ::=", - /* 239 */ "exprlist ::= nexprlist", - /* 240 */ "exprlist ::=", - /* 241 */ "nexprlist ::= nexprlist COMMA expr", - /* 242 */ "nexprlist ::= expr", - /* 243 */ "cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP idxlist RP", - /* 244 */ "uniqueflag ::= UNIQUE", - /* 245 */ "uniqueflag ::=", - /* 246 */ "idxlist_opt ::=", - /* 247 */ "idxlist_opt ::= LP idxlist RP", - /* 248 */ "idxlist ::= idxlist COMMA nm collate sortorder", - /* 249 */ "idxlist ::= nm collate sortorder", - /* 250 */ "collate ::=", - /* 251 */ "collate ::= COLLATE ids", - /* 252 */ "cmd ::= DROP INDEX ifexists fullname", - /* 253 */ "cmd ::= VACUUM", - /* 254 */ "cmd ::= VACUUM nm", - /* 255 */ "cmd ::= PRAGMA nm dbnm", - /* 256 */ "cmd ::= PRAGMA nm dbnm EQ nmnum", - /* 257 */ "cmd ::= PRAGMA nm dbnm LP nmnum RP", - /* 258 */ "cmd ::= PRAGMA nm dbnm EQ minus_num", - /* 259 */ "cmd ::= PRAGMA nm dbnm LP minus_num RP", - /* 260 */ "nmnum ::= plus_num", - /* 261 */ "nmnum ::= nm", - /* 262 */ "nmnum ::= ON", - /* 263 */ "nmnum ::= DELETE", - /* 264 */ "nmnum ::= DEFAULT", - /* 265 */ "plus_num ::= plus_opt number", - /* 266 */ "minus_num ::= MINUS number", - /* 267 */ "number ::= INTEGER|FLOAT", - /* 268 */ "plus_opt ::= PLUS", - /* 269 */ "plus_opt ::=", - /* 270 */ "cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END", - /* 271 */ "trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause", - /* 272 */ "trigger_time ::= BEFORE", - /* 273 */ "trigger_time ::= AFTER", - /* 274 */ "trigger_time ::= INSTEAD OF", - /* 275 */ "trigger_time ::=", - /* 276 */ "trigger_event ::= DELETE|INSERT", - /* 277 */ "trigger_event ::= UPDATE", - /* 278 */ "trigger_event ::= UPDATE OF inscollist", - /* 279 */ "foreach_clause ::=", - /* 280 */ "foreach_clause ::= FOR EACH ROW", - /* 281 */ "when_clause ::=", - /* 282 */ "when_clause ::= WHEN expr", - /* 283 */ "trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI", - /* 284 */ "trigger_cmd_list ::= trigger_cmd SEMI", - /* 285 */ "trnm ::= nm", - /* 286 */ "trnm ::= nm DOT nm", - /* 287 */ "tridxby ::=", - /* 288 */ "tridxby ::= INDEXED BY nm", - /* 289 */ "tridxby ::= NOT INDEXED", - /* 290 */ "trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt", - /* 291 */ "trigger_cmd ::= insert_cmd INTO trnm inscollist_opt VALUES LP itemlist RP", - /* 292 */ "trigger_cmd ::= insert_cmd INTO trnm inscollist_opt select", - /* 293 */ "trigger_cmd ::= DELETE FROM trnm tridxby where_opt", - /* 294 */ "trigger_cmd ::= select", - /* 295 */ "expr ::= RAISE LP IGNORE RP", - /* 296 */ "expr ::= RAISE LP raisetype COMMA nm RP", - /* 297 */ "raisetype ::= ROLLBACK", - /* 298 */ "raisetype ::= ABORT", - /* 299 */ "raisetype ::= FAIL", - /* 300 */ "cmd ::= DROP TRIGGER ifexists fullname", - /* 301 */ "cmd ::= ATTACH database_kw_opt expr AS expr key_opt", - /* 302 */ "cmd ::= DETACH database_kw_opt expr", - /* 303 */ "key_opt ::=", - /* 304 */ "key_opt ::= KEY expr", - /* 305 */ "database_kw_opt ::= DATABASE", - /* 306 */ "database_kw_opt ::=", - /* 307 */ "cmd ::= REINDEX", - /* 308 */ "cmd ::= REINDEX nm dbnm", - /* 309 */ "cmd ::= ANALYZE", - /* 310 */ "cmd ::= ANALYZE nm dbnm", - /* 311 */ "cmd ::= ALTER TABLE fullname RENAME TO nm", - /* 312 */ "cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt column", - /* 313 */ "add_column_fullname ::= fullname", - /* 314 */ "kwcolumn_opt ::=", - /* 315 */ "kwcolumn_opt ::= COLUMNKW", - /* 316 */ "cmd ::= create_vtab", - /* 317 */ "cmd ::= create_vtab LP vtabarglist RP", - /* 318 */ "create_vtab ::= createkw VIRTUAL TABLE nm dbnm USING nm", - /* 319 */ "vtabarglist ::= vtabarg", - /* 320 */ "vtabarglist ::= vtabarglist COMMA vtabarg", - /* 321 */ "vtabarg ::=", - /* 322 */ "vtabarg ::= vtabarg vtabargtoken", - /* 323 */ "vtabargtoken ::= ANY", - /* 324 */ "vtabargtoken ::= lp anylist RP", - /* 325 */ "lp ::= LP", - /* 326 */ "anylist ::=", - /* 327 */ "anylist ::= anylist LP anylist RP", - /* 328 */ "anylist ::= anylist ANY", + /* 75 */ "refarg ::= ON INSERT refact", + /* 76 */ "refarg ::= ON DELETE refact", + /* 77 */ "refarg ::= ON UPDATE refact", + /* 78 */ "refact ::= SET NULL", + /* 79 */ "refact ::= SET DEFAULT", + /* 80 */ "refact ::= CASCADE", + /* 81 */ "refact ::= RESTRICT", + /* 82 */ "refact ::= NO ACTION", + /* 83 */ "defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt", + /* 84 */ "defer_subclause ::= DEFERRABLE init_deferred_pred_opt", + /* 85 */ "init_deferred_pred_opt ::=", + /* 86 */ "init_deferred_pred_opt ::= INITIALLY DEFERRED", + /* 87 */ "init_deferred_pred_opt ::= INITIALLY IMMEDIATE", + /* 88 */ "conslist_opt ::=", + /* 89 */ "conslist_opt ::= COMMA conslist", + /* 90 */ "conslist ::= conslist COMMA tcons", + /* 91 */ "conslist ::= conslist tcons", + /* 92 */ "conslist ::= tcons", + /* 93 */ "tcons ::= CONSTRAINT nm", + /* 94 */ "tcons ::= PRIMARY KEY LP idxlist autoinc RP onconf", + /* 95 */ "tcons ::= UNIQUE LP idxlist RP onconf", + /* 96 */ "tcons ::= CHECK LP expr RP onconf", + /* 97 */ "tcons ::= FOREIGN KEY LP idxlist RP REFERENCES nm idxlist_opt refargs defer_subclause_opt", + /* 98 */ "defer_subclause_opt ::=", + /* 99 */ "defer_subclause_opt ::= defer_subclause", + /* 100 */ "onconf ::=", + /* 101 */ "onconf ::= ON CONFLICT resolvetype", + /* 102 */ "orconf ::=", + /* 103 */ "orconf ::= OR resolvetype", + /* 104 */ "resolvetype ::= raisetype", + /* 105 */ "resolvetype ::= IGNORE", + /* 106 */ "resolvetype ::= REPLACE", + /* 107 */ "cmd ::= DROP TABLE ifexists fullname", + /* 108 */ "ifexists ::= IF EXISTS", + /* 109 */ "ifexists ::=", + /* 110 */ "cmd ::= createkw temp VIEW ifnotexists nm dbnm AS select", + /* 111 */ "cmd ::= DROP VIEW ifexists fullname", + /* 112 */ "cmd ::= select", + /* 113 */ "select ::= oneselect", + /* 114 */ "select ::= select multiselect_op oneselect", + /* 115 */ "multiselect_op ::= UNION", + /* 116 */ "multiselect_op ::= UNION ALL", + /* 117 */ "multiselect_op ::= EXCEPT|INTERSECT", + /* 118 */ "oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt", + /* 119 */ "distinct ::= DISTINCT", + /* 120 */ "distinct ::= ALL", + /* 121 */ "distinct ::=", + /* 122 */ "sclp ::= selcollist COMMA", + /* 123 */ "sclp ::=", + /* 124 */ "selcollist ::= sclp expr as", + /* 125 */ "selcollist ::= sclp STAR", + /* 126 */ "selcollist ::= sclp nm DOT STAR", + /* 127 */ "as ::= AS nm", + /* 128 */ "as ::= ids", + /* 129 */ "as ::=", + /* 130 */ "from ::=", + /* 131 */ "from ::= FROM seltablist", + /* 132 */ "stl_prefix ::= seltablist joinop", + /* 133 */ "stl_prefix ::=", + /* 134 */ "seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt", + /* 135 */ "seltablist ::= stl_prefix LP select RP as on_opt using_opt", + /* 136 */ "seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt", + /* 137 */ "dbnm ::=", + /* 138 */ "dbnm ::= DOT nm", + /* 139 */ "fullname ::= nm dbnm", + /* 140 */ "joinop ::= COMMA|JOIN", + /* 141 */ "joinop ::= JOIN_KW JOIN", + /* 142 */ "joinop ::= JOIN_KW nm JOIN", + /* 143 */ "joinop ::= JOIN_KW nm nm JOIN", + /* 144 */ "on_opt ::= ON expr", + /* 145 */ "on_opt ::=", + /* 146 */ "indexed_opt ::=", + /* 147 */ "indexed_opt ::= INDEXED BY nm", + /* 148 */ "indexed_opt ::= NOT INDEXED", + /* 149 */ "using_opt ::= USING LP inscollist RP", + /* 150 */ "using_opt ::=", + /* 151 */ "orderby_opt ::=", + /* 152 */ "orderby_opt ::= ORDER BY sortlist", + /* 153 */ "sortlist ::= sortlist COMMA sortitem sortorder", + /* 154 */ "sortlist ::= sortitem sortorder", + /* 155 */ "sortitem ::= expr", + /* 156 */ "sortorder ::= ASC", + /* 157 */ "sortorder ::= DESC", + /* 158 */ "sortorder ::=", + /* 159 */ "groupby_opt ::=", + /* 160 */ "groupby_opt ::= GROUP BY nexprlist", + /* 161 */ "having_opt ::=", + /* 162 */ "having_opt ::= HAVING expr", + /* 163 */ "limit_opt ::=", + /* 164 */ "limit_opt ::= LIMIT expr", + /* 165 */ "limit_opt ::= LIMIT expr OFFSET expr", + /* 166 */ "limit_opt ::= LIMIT expr COMMA expr", + /* 167 */ "cmd ::= DELETE FROM fullname indexed_opt where_opt", + /* 168 */ "where_opt ::=", + /* 169 */ "where_opt ::= WHERE expr", + /* 170 */ "cmd ::= UPDATE orconf fullname indexed_opt SET setlist where_opt", + /* 171 */ "setlist ::= setlist COMMA nm EQ expr", + /* 172 */ "setlist ::= nm EQ expr", + /* 173 */ "cmd ::= insert_cmd INTO fullname inscollist_opt VALUES LP itemlist RP", + /* 174 */ "cmd ::= insert_cmd INTO fullname inscollist_opt select", + /* 175 */ "cmd ::= insert_cmd INTO fullname inscollist_opt DEFAULT VALUES", + /* 176 */ "insert_cmd ::= INSERT orconf", + /* 177 */ "insert_cmd ::= REPLACE", + /* 178 */ "itemlist ::= itemlist COMMA expr", + /* 179 */ "itemlist ::= expr", + /* 180 */ "inscollist_opt ::=", + /* 181 */ "inscollist_opt ::= LP inscollist RP", + /* 182 */ "inscollist ::= inscollist COMMA nm", + /* 183 */ "inscollist ::= nm", + /* 184 */ "expr ::= term", + /* 185 */ "expr ::= LP expr RP", + /* 186 */ "term ::= NULL", + /* 187 */ "expr ::= id", + /* 188 */ "expr ::= JOIN_KW", + /* 189 */ "expr ::= nm DOT nm", + /* 190 */ "expr ::= nm DOT nm DOT nm", + /* 191 */ "term ::= INTEGER|FLOAT|BLOB", + /* 192 */ "term ::= STRING", + /* 193 */ "expr ::= REGISTER", + /* 194 */ "expr ::= VARIABLE", + /* 195 */ "expr ::= expr COLLATE ids", + /* 196 */ "expr ::= CAST LP expr AS typetoken RP", + /* 197 */ "expr ::= ID LP distinct exprlist RP", + /* 198 */ "expr ::= ID LP STAR RP", + /* 199 */ "term ::= CTIME_KW", + /* 200 */ "expr ::= expr AND expr", + /* 201 */ "expr ::= expr OR expr", + /* 202 */ "expr ::= expr LT|GT|GE|LE expr", + /* 203 */ "expr ::= expr EQ|NE expr", + /* 204 */ "expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr", + /* 205 */ "expr ::= expr PLUS|MINUS expr", + /* 206 */ "expr ::= expr STAR|SLASH|REM expr", + /* 207 */ "expr ::= expr CONCAT expr", + /* 208 */ "likeop ::= LIKE_KW", + /* 209 */ "likeop ::= NOT LIKE_KW", + /* 210 */ "likeop ::= MATCH", + /* 211 */ "likeop ::= NOT MATCH", + /* 212 */ "escape ::= ESCAPE expr", + /* 213 */ "escape ::=", + /* 214 */ "expr ::= expr likeop expr escape", + /* 215 */ "expr ::= expr ISNULL|NOTNULL", + /* 216 */ "expr ::= expr NOT NULL", + /* 217 */ "expr ::= expr IS expr", + /* 218 */ "expr ::= expr IS NOT expr", + /* 219 */ "expr ::= NOT expr", + /* 220 */ "expr ::= BITNOT expr", + /* 221 */ "expr ::= MINUS expr", + /* 222 */ "expr ::= PLUS expr", + /* 223 */ "between_op ::= BETWEEN", + /* 224 */ "between_op ::= NOT BETWEEN", + /* 225 */ "expr ::= expr between_op expr AND expr", + /* 226 */ "in_op ::= IN", + /* 227 */ "in_op ::= NOT IN", + /* 228 */ "expr ::= expr in_op LP exprlist RP", + /* 229 */ "expr ::= LP select RP", + /* 230 */ "expr ::= expr in_op LP select RP", + /* 231 */ "expr ::= expr in_op nm dbnm", + /* 232 */ "expr ::= EXISTS LP select RP", + /* 233 */ "expr ::= CASE case_operand case_exprlist case_else END", + /* 234 */ "case_exprlist ::= case_exprlist WHEN expr THEN expr", + /* 235 */ "case_exprlist ::= WHEN expr THEN expr", + /* 236 */ "case_else ::= ELSE expr", + /* 237 */ "case_else ::=", + /* 238 */ "case_operand ::= expr", + /* 239 */ "case_operand ::=", + /* 240 */ "exprlist ::= nexprlist", + /* 241 */ "exprlist ::=", + /* 242 */ "nexprlist ::= nexprlist COMMA expr", + /* 243 */ "nexprlist ::= expr", + /* 244 */ "cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP idxlist RP", + /* 245 */ "uniqueflag ::= UNIQUE", + /* 246 */ "uniqueflag ::=", + /* 247 */ "idxlist_opt ::=", + /* 248 */ "idxlist_opt ::= LP idxlist RP", + /* 249 */ "idxlist ::= idxlist COMMA nm collate sortorder", + /* 250 */ "idxlist ::= nm collate sortorder", + /* 251 */ "collate ::=", + /* 252 */ "collate ::= COLLATE ids", + /* 253 */ "cmd ::= DROP INDEX ifexists fullname", + /* 254 */ "cmd ::= VACUUM", + /* 255 */ "cmd ::= VACUUM nm", + /* 256 */ "cmd ::= PRAGMA nm dbnm", + /* 257 */ "cmd ::= PRAGMA nm dbnm EQ nmnum", + /* 258 */ "cmd ::= PRAGMA nm dbnm LP nmnum RP", + /* 259 */ "cmd ::= PRAGMA nm dbnm EQ minus_num", + /* 260 */ "cmd ::= PRAGMA nm dbnm LP minus_num RP", + /* 261 */ "nmnum ::= plus_num", + /* 262 */ "nmnum ::= nm", + /* 263 */ "nmnum ::= ON", + /* 264 */ "nmnum ::= DELETE", + /* 265 */ "nmnum ::= DEFAULT", + /* 266 */ "plus_num ::= plus_opt number", + /* 267 */ "minus_num ::= MINUS number", + /* 268 */ "number ::= INTEGER|FLOAT", + /* 269 */ "plus_opt ::= PLUS", + /* 270 */ "plus_opt ::=", + /* 271 */ "cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END", + /* 272 */ "trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause", + /* 273 */ "trigger_time ::= BEFORE", + /* 274 */ "trigger_time ::= AFTER", + /* 275 */ "trigger_time ::= INSTEAD OF", + /* 276 */ "trigger_time ::=", + /* 277 */ "trigger_event ::= DELETE|INSERT", + /* 278 */ "trigger_event ::= UPDATE", + /* 279 */ "trigger_event ::= UPDATE OF inscollist", + /* 280 */ "foreach_clause ::=", + /* 281 */ "foreach_clause ::= FOR EACH ROW", + /* 282 */ "when_clause ::=", + /* 283 */ "when_clause ::= WHEN expr", + /* 284 */ "trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI", + /* 285 */ "trigger_cmd_list ::= trigger_cmd SEMI", + /* 286 */ "trnm ::= nm", + /* 287 */ "trnm ::= nm DOT nm", + /* 288 */ "tridxby ::=", + /* 289 */ "tridxby ::= INDEXED BY nm", + /* 290 */ "tridxby ::= NOT INDEXED", + /* 291 */ "trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt", + /* 292 */ "trigger_cmd ::= insert_cmd INTO trnm inscollist_opt VALUES LP itemlist RP", + /* 293 */ "trigger_cmd ::= insert_cmd INTO trnm inscollist_opt select", + /* 294 */ "trigger_cmd ::= DELETE FROM trnm tridxby where_opt", + /* 295 */ "trigger_cmd ::= select", + /* 296 */ "expr ::= RAISE LP IGNORE RP", + /* 297 */ "expr ::= RAISE LP raisetype COMMA nm RP", + /* 298 */ "raisetype ::= ROLLBACK", + /* 299 */ "raisetype ::= ABORT", + /* 300 */ "raisetype ::= FAIL", + /* 301 */ "cmd ::= DROP TRIGGER ifexists fullname", + /* 302 */ "cmd ::= ATTACH database_kw_opt expr AS expr key_opt", + /* 303 */ "cmd ::= DETACH database_kw_opt expr", + /* 304 */ "key_opt ::=", + /* 305 */ "key_opt ::= KEY expr", + /* 306 */ "database_kw_opt ::= DATABASE", + /* 307 */ "database_kw_opt ::=", + /* 308 */ "cmd ::= REINDEX", + /* 309 */ "cmd ::= REINDEX nm dbnm", + /* 310 */ "cmd ::= ANALYZE", + /* 311 */ "cmd ::= ANALYZE nm dbnm", + /* 312 */ "cmd ::= ALTER TABLE fullname RENAME TO nm", + /* 313 */ "cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt column", + /* 314 */ "add_column_fullname ::= fullname", + /* 315 */ "kwcolumn_opt ::=", + /* 316 */ "kwcolumn_opt ::= COLUMNKW", + /* 317 */ "cmd ::= create_vtab", + /* 318 */ "cmd ::= create_vtab LP vtabarglist RP", + /* 319 */ "create_vtab ::= createkw VIRTUAL TABLE nm dbnm USING nm", + /* 320 */ "vtabarglist ::= vtabarg", + /* 321 */ "vtabarglist ::= vtabarglist COMMA vtabarg", + /* 322 */ "vtabarg ::=", + /* 323 */ "vtabarg ::= vtabarg vtabargtoken", + /* 324 */ "vtabargtoken ::= ANY", + /* 325 */ "vtabargtoken ::= lp anylist RP", + /* 326 */ "lp ::= LP", + /* 327 */ "anylist ::=", + /* 328 */ "anylist ::= anylist LP anylist RP", + /* 329 */ "anylist ::= anylist ANY", }; #endif /* NDEBUG */ @@ -91426,14 +92153,13 @@ static int yy_find_shift_action( int i; int stateno = pParser->yystack[pParser->yyidx].stateno; - if( stateno>YY_SHIFT_MAX || (i = yy_shift_ofst[stateno])==YY_SHIFT_USE_DFLT ){ + if( stateno>YY_SHIFT_COUNT + || (i = yy_shift_ofst[stateno])==YY_SHIFT_USE_DFLT ){ return yy_default[stateno]; } assert( iLookAhead!=YYNOCODE ); i += iLookAhead; - if( i<0 || i>=YY_SZ_ACTTAB || yy_lookahead[i]!=iLookAhead ){ - /* The user of ";" instead of "\000" as a statement terminator in SQLite - ** means that we always have a look-ahead token. */ + if( i<0 || i>=YY_ACTTAB_COUNT || yy_lookahead[i]!=iLookAhead ){ if( iLookAhead>0 ){ #ifdef YYFALLBACK YYCODETYPE iFallback; /* Fallback token */ @@ -91451,7 +92177,15 @@ static int yy_find_shift_action( #ifdef YYWILDCARD { int j = i - iLookAhead + YYWILDCARD; - if( j>=0 && j=0 && +#endif +#if YY_SHIFT_MAX+YYWILDCARD>=YY_ACTTAB_COUNT + j %s\n", @@ -91483,22 +92217,22 @@ static int yy_find_reduce_action( ){ int i; #ifdef YYERRORSYMBOL - if( stateno>YY_REDUCE_MAX ){ + if( stateno>YY_REDUCE_COUNT ){ return yy_default[stateno]; } #else - assert( stateno<=YY_REDUCE_MAX ); + assert( stateno<=YY_REDUCE_COUNT ); #endif i = yy_reduce_ofst[stateno]; assert( i!=YY_REDUCE_USE_DFLT ); assert( iLookAhead!=YYNOCODE ); i += iLookAhead; #ifdef YYERRORSYMBOL - if( i<0 || i>=YY_SZ_ACTTAB || yy_lookahead[i]!=iLookAhead ){ + if( i<0 || i>=YY_ACTTAB_COUNT || yy_lookahead[i]!=iLookAhead ){ return yy_default[stateno]; } #else - assert( i>=0 && i=0 && idb, yymsp[0].minor.yy3); } break; - case 112: /* select ::= oneselect */ + case 113: /* select ::= oneselect */ {yygotominor.yy3 = yymsp[0].minor.yy3;} break; - case 113: /* select ::= select multiselect_op oneselect */ + case 114: /* select ::= select multiselect_op oneselect */ { if( yymsp[0].minor.yy3 ){ yymsp[0].minor.yy3->op = (u8)yymsp[-1].minor.yy328; @@ -92260,39 +92996,39 @@ static void yy_reduce( yygotominor.yy3 = yymsp[0].minor.yy3; } break; - case 115: /* multiselect_op ::= UNION ALL */ + case 116: /* multiselect_op ::= UNION ALL */ {yygotominor.yy328 = TK_ALL;} break; - case 117: /* oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt */ + case 118: /* oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt */ { yygotominor.yy3 = sqlite3SelectNew(pParse,yymsp[-6].minor.yy14,yymsp[-5].minor.yy65,yymsp[-4].minor.yy132,yymsp[-3].minor.yy14,yymsp[-2].minor.yy132,yymsp[-1].minor.yy14,yymsp[-7].minor.yy328,yymsp[0].minor.yy476.pLimit,yymsp[0].minor.yy476.pOffset); } break; - case 121: /* sclp ::= selcollist COMMA */ - case 247: /* idxlist_opt ::= LP idxlist RP */ yytestcase(yyruleno==247); + case 122: /* sclp ::= selcollist COMMA */ + case 248: /* idxlist_opt ::= LP idxlist RP */ yytestcase(yyruleno==248); {yygotominor.yy14 = yymsp[-1].minor.yy14;} break; - case 122: /* sclp ::= */ - case 150: /* orderby_opt ::= */ yytestcase(yyruleno==150); - case 158: /* groupby_opt ::= */ yytestcase(yyruleno==158); - case 240: /* exprlist ::= */ yytestcase(yyruleno==240); - case 246: /* idxlist_opt ::= */ yytestcase(yyruleno==246); + case 123: /* sclp ::= */ + case 151: /* orderby_opt ::= */ yytestcase(yyruleno==151); + case 159: /* groupby_opt ::= */ yytestcase(yyruleno==159); + case 241: /* exprlist ::= */ yytestcase(yyruleno==241); + case 247: /* idxlist_opt ::= */ yytestcase(yyruleno==247); {yygotominor.yy14 = 0;} break; - case 123: /* selcollist ::= sclp expr as */ + case 124: /* selcollist ::= sclp expr as */ { yygotominor.yy14 = sqlite3ExprListAppend(pParse, yymsp[-2].minor.yy14, yymsp[-1].minor.yy346.pExpr); if( yymsp[0].minor.yy0.n>0 ) sqlite3ExprListSetName(pParse, yygotominor.yy14, &yymsp[0].minor.yy0, 1); sqlite3ExprListSetSpan(pParse,yygotominor.yy14,&yymsp[-1].minor.yy346); } break; - case 124: /* selcollist ::= sclp STAR */ + case 125: /* selcollist ::= sclp STAR */ { Expr *p = sqlite3Expr(pParse->db, TK_ALL, 0); yygotominor.yy14 = sqlite3ExprListAppend(pParse, yymsp[-1].minor.yy14, p); } break; - case 125: /* selcollist ::= sclp nm DOT STAR */ + case 126: /* selcollist ::= sclp nm DOT STAR */ { Expr *pRight = sqlite3PExpr(pParse, TK_ALL, 0, 0, &yymsp[0].minor.yy0); Expr *pLeft = sqlite3PExpr(pParse, TK_ID, 0, 0, &yymsp[-2].minor.yy0); @@ -92300,39 +93036,39 @@ static void yy_reduce( yygotominor.yy14 = sqlite3ExprListAppend(pParse,yymsp[-3].minor.yy14, pDot); } break; - case 128: /* as ::= */ + case 129: /* as ::= */ {yygotominor.yy0.n = 0;} break; - case 129: /* from ::= */ + case 130: /* from ::= */ {yygotominor.yy65 = sqlite3DbMallocZero(pParse->db, sizeof(*yygotominor.yy65));} break; - case 130: /* from ::= FROM seltablist */ + case 131: /* from ::= FROM seltablist */ { yygotominor.yy65 = yymsp[0].minor.yy65; sqlite3SrcListShiftJoinType(yygotominor.yy65); } break; - case 131: /* stl_prefix ::= seltablist joinop */ + case 132: /* stl_prefix ::= seltablist joinop */ { yygotominor.yy65 = yymsp[-1].minor.yy65; if( ALWAYS(yygotominor.yy65 && yygotominor.yy65->nSrc>0) ) yygotominor.yy65->a[yygotominor.yy65->nSrc-1].jointype = (u8)yymsp[0].minor.yy328; } break; - case 132: /* stl_prefix ::= */ + case 133: /* stl_prefix ::= */ {yygotominor.yy65 = 0;} break; - case 133: /* seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt */ + case 134: /* seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt */ { yygotominor.yy65 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy65,&yymsp[-5].minor.yy0,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,0,yymsp[-1].minor.yy132,yymsp[0].minor.yy408); sqlite3SrcListIndexedBy(pParse, yygotominor.yy65, &yymsp[-2].minor.yy0); } break; - case 134: /* seltablist ::= stl_prefix LP select RP as on_opt using_opt */ + case 135: /* seltablist ::= stl_prefix LP select RP as on_opt using_opt */ { yygotominor.yy65 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy65,0,0,&yymsp[-2].minor.yy0,yymsp[-4].minor.yy3,yymsp[-1].minor.yy132,yymsp[0].minor.yy408); } break; - case 135: /* seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt */ + case 136: /* seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt */ { if( yymsp[-6].minor.yy65==0 && yymsp[-2].minor.yy0.n==0 && yymsp[-1].minor.yy132==0 && yymsp[0].minor.yy408==0 ){ yygotominor.yy65 = yymsp[-4].minor.yy65; @@ -92344,158 +93080,158 @@ static void yy_reduce( } } break; - case 136: /* dbnm ::= */ - case 145: /* indexed_opt ::= */ yytestcase(yyruleno==145); + case 137: /* dbnm ::= */ + case 146: /* indexed_opt ::= */ yytestcase(yyruleno==146); {yygotominor.yy0.z=0; yygotominor.yy0.n=0;} break; - case 138: /* fullname ::= nm dbnm */ + case 139: /* fullname ::= nm dbnm */ {yygotominor.yy65 = sqlite3SrcListAppend(pParse->db,0,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0);} break; - case 139: /* joinop ::= COMMA|JOIN */ + case 140: /* joinop ::= COMMA|JOIN */ { yygotominor.yy328 = JT_INNER; } break; - case 140: /* joinop ::= JOIN_KW JOIN */ + case 141: /* joinop ::= JOIN_KW JOIN */ { yygotominor.yy328 = sqlite3JoinType(pParse,&yymsp[-1].minor.yy0,0,0); } break; - case 141: /* joinop ::= JOIN_KW nm JOIN */ + case 142: /* joinop ::= JOIN_KW nm JOIN */ { yygotominor.yy328 = sqlite3JoinType(pParse,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0,0); } break; - case 142: /* joinop ::= JOIN_KW nm nm JOIN */ + case 143: /* joinop ::= JOIN_KW nm nm JOIN */ { yygotominor.yy328 = sqlite3JoinType(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0); } break; - case 143: /* on_opt ::= ON expr */ - case 154: /* sortitem ::= expr */ yytestcase(yyruleno==154); - case 161: /* having_opt ::= HAVING expr */ yytestcase(yyruleno==161); - case 168: /* where_opt ::= WHERE expr */ yytestcase(yyruleno==168); - case 235: /* case_else ::= ELSE expr */ yytestcase(yyruleno==235); - case 237: /* case_operand ::= expr */ yytestcase(yyruleno==237); + case 144: /* on_opt ::= ON expr */ + case 155: /* sortitem ::= expr */ yytestcase(yyruleno==155); + case 162: /* having_opt ::= HAVING expr */ yytestcase(yyruleno==162); + case 169: /* where_opt ::= WHERE expr */ yytestcase(yyruleno==169); + case 236: /* case_else ::= ELSE expr */ yytestcase(yyruleno==236); + case 238: /* case_operand ::= expr */ yytestcase(yyruleno==238); {yygotominor.yy132 = yymsp[0].minor.yy346.pExpr;} break; - case 144: /* on_opt ::= */ - case 160: /* having_opt ::= */ yytestcase(yyruleno==160); - case 167: /* where_opt ::= */ yytestcase(yyruleno==167); - case 236: /* case_else ::= */ yytestcase(yyruleno==236); - case 238: /* case_operand ::= */ yytestcase(yyruleno==238); + case 145: /* on_opt ::= */ + case 161: /* having_opt ::= */ yytestcase(yyruleno==161); + case 168: /* where_opt ::= */ yytestcase(yyruleno==168); + case 237: /* case_else ::= */ yytestcase(yyruleno==237); + case 239: /* case_operand ::= */ yytestcase(yyruleno==239); {yygotominor.yy132 = 0;} break; - case 147: /* indexed_opt ::= NOT INDEXED */ + case 148: /* indexed_opt ::= NOT INDEXED */ {yygotominor.yy0.z=0; yygotominor.yy0.n=1;} break; - case 148: /* using_opt ::= USING LP inscollist RP */ - case 180: /* inscollist_opt ::= LP inscollist RP */ yytestcase(yyruleno==180); + case 149: /* using_opt ::= USING LP inscollist RP */ + case 181: /* inscollist_opt ::= LP inscollist RP */ yytestcase(yyruleno==181); {yygotominor.yy408 = yymsp[-1].minor.yy408;} break; - case 149: /* using_opt ::= */ - case 179: /* inscollist_opt ::= */ yytestcase(yyruleno==179); + case 150: /* using_opt ::= */ + case 180: /* inscollist_opt ::= */ yytestcase(yyruleno==180); {yygotominor.yy408 = 0;} break; - case 151: /* orderby_opt ::= ORDER BY sortlist */ - case 159: /* groupby_opt ::= GROUP BY nexprlist */ yytestcase(yyruleno==159); - case 239: /* exprlist ::= nexprlist */ yytestcase(yyruleno==239); + case 152: /* orderby_opt ::= ORDER BY sortlist */ + case 160: /* groupby_opt ::= GROUP BY nexprlist */ yytestcase(yyruleno==160); + case 240: /* exprlist ::= nexprlist */ yytestcase(yyruleno==240); {yygotominor.yy14 = yymsp[0].minor.yy14;} break; - case 152: /* sortlist ::= sortlist COMMA sortitem sortorder */ + case 153: /* sortlist ::= sortlist COMMA sortitem sortorder */ { yygotominor.yy14 = sqlite3ExprListAppend(pParse,yymsp[-3].minor.yy14,yymsp[-1].minor.yy132); if( yygotominor.yy14 ) yygotominor.yy14->a[yygotominor.yy14->nExpr-1].sortOrder = (u8)yymsp[0].minor.yy328; } break; - case 153: /* sortlist ::= sortitem sortorder */ + case 154: /* sortlist ::= sortitem sortorder */ { yygotominor.yy14 = sqlite3ExprListAppend(pParse,0,yymsp[-1].minor.yy132); if( yygotominor.yy14 && ALWAYS(yygotominor.yy14->a) ) yygotominor.yy14->a[0].sortOrder = (u8)yymsp[0].minor.yy328; } break; - case 155: /* sortorder ::= ASC */ - case 157: /* sortorder ::= */ yytestcase(yyruleno==157); + case 156: /* sortorder ::= ASC */ + case 158: /* sortorder ::= */ yytestcase(yyruleno==158); {yygotominor.yy328 = SQLITE_SO_ASC;} break; - case 156: /* sortorder ::= DESC */ + case 157: /* sortorder ::= DESC */ {yygotominor.yy328 = SQLITE_SO_DESC;} break; - case 162: /* limit_opt ::= */ + case 163: /* limit_opt ::= */ {yygotominor.yy476.pLimit = 0; yygotominor.yy476.pOffset = 0;} break; - case 163: /* limit_opt ::= LIMIT expr */ + case 164: /* limit_opt ::= LIMIT expr */ {yygotominor.yy476.pLimit = yymsp[0].minor.yy346.pExpr; yygotominor.yy476.pOffset = 0;} break; - case 164: /* limit_opt ::= LIMIT expr OFFSET expr */ + case 165: /* limit_opt ::= LIMIT expr OFFSET expr */ {yygotominor.yy476.pLimit = yymsp[-2].minor.yy346.pExpr; yygotominor.yy476.pOffset = yymsp[0].minor.yy346.pExpr;} break; - case 165: /* limit_opt ::= LIMIT expr COMMA expr */ + case 166: /* limit_opt ::= LIMIT expr COMMA expr */ {yygotominor.yy476.pOffset = yymsp[-2].minor.yy346.pExpr; yygotominor.yy476.pLimit = yymsp[0].minor.yy346.pExpr;} break; - case 166: /* cmd ::= DELETE FROM fullname indexed_opt where_opt */ + case 167: /* cmd ::= DELETE FROM fullname indexed_opt where_opt */ { sqlite3SrcListIndexedBy(pParse, yymsp[-2].minor.yy65, &yymsp[-1].minor.yy0); sqlite3DeleteFrom(pParse,yymsp[-2].minor.yy65,yymsp[0].minor.yy132); } break; - case 169: /* cmd ::= UPDATE orconf fullname indexed_opt SET setlist where_opt */ + case 170: /* cmd ::= UPDATE orconf fullname indexed_opt SET setlist where_opt */ { sqlite3SrcListIndexedBy(pParse, yymsp[-4].minor.yy65, &yymsp[-3].minor.yy0); sqlite3ExprListCheckLength(pParse,yymsp[-1].minor.yy14,"set list"); sqlite3Update(pParse,yymsp[-4].minor.yy65,yymsp[-1].minor.yy14,yymsp[0].minor.yy132,yymsp[-5].minor.yy186); } break; - case 170: /* setlist ::= setlist COMMA nm EQ expr */ + case 171: /* setlist ::= setlist COMMA nm EQ expr */ { yygotominor.yy14 = sqlite3ExprListAppend(pParse, yymsp[-4].minor.yy14, yymsp[0].minor.yy346.pExpr); sqlite3ExprListSetName(pParse, yygotominor.yy14, &yymsp[-2].minor.yy0, 1); } break; - case 171: /* setlist ::= nm EQ expr */ + case 172: /* setlist ::= nm EQ expr */ { yygotominor.yy14 = sqlite3ExprListAppend(pParse, 0, yymsp[0].minor.yy346.pExpr); sqlite3ExprListSetName(pParse, yygotominor.yy14, &yymsp[-2].minor.yy0, 1); } break; - case 172: /* cmd ::= insert_cmd INTO fullname inscollist_opt VALUES LP itemlist RP */ + case 173: /* cmd ::= insert_cmd INTO fullname inscollist_opt VALUES LP itemlist RP */ {sqlite3Insert(pParse, yymsp[-5].minor.yy65, yymsp[-1].minor.yy14, 0, yymsp[-4].minor.yy408, yymsp[-7].minor.yy186);} break; - case 173: /* cmd ::= insert_cmd INTO fullname inscollist_opt select */ + case 174: /* cmd ::= insert_cmd INTO fullname inscollist_opt select */ {sqlite3Insert(pParse, yymsp[-2].minor.yy65, 0, yymsp[0].minor.yy3, yymsp[-1].minor.yy408, yymsp[-4].minor.yy186);} break; - case 174: /* cmd ::= insert_cmd INTO fullname inscollist_opt DEFAULT VALUES */ + case 175: /* cmd ::= insert_cmd INTO fullname inscollist_opt DEFAULT VALUES */ {sqlite3Insert(pParse, yymsp[-3].minor.yy65, 0, 0, yymsp[-2].minor.yy408, yymsp[-5].minor.yy186);} break; - case 175: /* insert_cmd ::= INSERT orconf */ + case 176: /* insert_cmd ::= INSERT orconf */ {yygotominor.yy186 = yymsp[0].minor.yy186;} break; - case 176: /* insert_cmd ::= REPLACE */ + case 177: /* insert_cmd ::= REPLACE */ {yygotominor.yy186 = OE_Replace;} break; - case 177: /* itemlist ::= itemlist COMMA expr */ - case 241: /* nexprlist ::= nexprlist COMMA expr */ yytestcase(yyruleno==241); + case 178: /* itemlist ::= itemlist COMMA expr */ + case 242: /* nexprlist ::= nexprlist COMMA expr */ yytestcase(yyruleno==242); {yygotominor.yy14 = sqlite3ExprListAppend(pParse,yymsp[-2].minor.yy14,yymsp[0].minor.yy346.pExpr);} break; - case 178: /* itemlist ::= expr */ - case 242: /* nexprlist ::= expr */ yytestcase(yyruleno==242); + case 179: /* itemlist ::= expr */ + case 243: /* nexprlist ::= expr */ yytestcase(yyruleno==243); {yygotominor.yy14 = sqlite3ExprListAppend(pParse,0,yymsp[0].minor.yy346.pExpr);} break; - case 181: /* inscollist ::= inscollist COMMA nm */ + case 182: /* inscollist ::= inscollist COMMA nm */ {yygotominor.yy408 = sqlite3IdListAppend(pParse->db,yymsp[-2].minor.yy408,&yymsp[0].minor.yy0);} break; - case 182: /* inscollist ::= nm */ + case 183: /* inscollist ::= nm */ {yygotominor.yy408 = sqlite3IdListAppend(pParse->db,0,&yymsp[0].minor.yy0);} break; - case 183: /* expr ::= term */ - case 211: /* escape ::= ESCAPE expr */ yytestcase(yyruleno==211); + case 184: /* expr ::= term */ + case 212: /* escape ::= ESCAPE expr */ yytestcase(yyruleno==212); {yygotominor.yy346 = yymsp[0].minor.yy346;} break; - case 184: /* expr ::= LP expr RP */ + case 185: /* expr ::= LP expr RP */ {yygotominor.yy346.pExpr = yymsp[-1].minor.yy346.pExpr; spanSet(&yygotominor.yy346,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0);} break; - case 185: /* term ::= NULL */ - case 190: /* term ::= INTEGER|FLOAT|BLOB */ yytestcase(yyruleno==190); - case 191: /* term ::= STRING */ yytestcase(yyruleno==191); + case 186: /* term ::= NULL */ + case 191: /* term ::= INTEGER|FLOAT|BLOB */ yytestcase(yyruleno==191); + case 192: /* term ::= STRING */ yytestcase(yyruleno==192); {spanExpr(&yygotominor.yy346, pParse, yymsp[0].major, &yymsp[0].minor.yy0);} break; - case 186: /* expr ::= id */ - case 187: /* expr ::= JOIN_KW */ yytestcase(yyruleno==187); + case 187: /* expr ::= id */ + case 188: /* expr ::= JOIN_KW */ yytestcase(yyruleno==188); {spanExpr(&yygotominor.yy346, pParse, TK_ID, &yymsp[0].minor.yy0);} break; - case 188: /* expr ::= nm DOT nm */ + case 189: /* expr ::= nm DOT nm */ { Expr *temp1 = sqlite3PExpr(pParse, TK_ID, 0, 0, &yymsp[-2].minor.yy0); Expr *temp2 = sqlite3PExpr(pParse, TK_ID, 0, 0, &yymsp[0].minor.yy0); @@ -92503,7 +93239,7 @@ static void yy_reduce( spanSet(&yygotominor.yy346,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0); } break; - case 189: /* expr ::= nm DOT nm DOT nm */ + case 190: /* expr ::= nm DOT nm DOT nm */ { Expr *temp1 = sqlite3PExpr(pParse, TK_ID, 0, 0, &yymsp[-4].minor.yy0); Expr *temp2 = sqlite3PExpr(pParse, TK_ID, 0, 0, &yymsp[-2].minor.yy0); @@ -92513,7 +93249,7 @@ static void yy_reduce( spanSet(&yygotominor.yy346,&yymsp[-4].minor.yy0,&yymsp[0].minor.yy0); } break; - case 192: /* expr ::= REGISTER */ + case 193: /* expr ::= REGISTER */ { /* When doing a nested parse, one can include terms in an expression ** that look like this: #1 #2 ... These terms refer to registers @@ -92528,27 +93264,27 @@ static void yy_reduce( spanSet(&yygotominor.yy346, &yymsp[0].minor.yy0, &yymsp[0].minor.yy0); } break; - case 193: /* expr ::= VARIABLE */ + case 194: /* expr ::= VARIABLE */ { spanExpr(&yygotominor.yy346, pParse, TK_VARIABLE, &yymsp[0].minor.yy0); sqlite3ExprAssignVarNumber(pParse, yygotominor.yy346.pExpr); spanSet(&yygotominor.yy346, &yymsp[0].minor.yy0, &yymsp[0].minor.yy0); } break; - case 194: /* expr ::= expr COLLATE ids */ + case 195: /* expr ::= expr COLLATE ids */ { yygotominor.yy346.pExpr = sqlite3ExprSetColl(pParse, yymsp[-2].minor.yy346.pExpr, &yymsp[0].minor.yy0); yygotominor.yy346.zStart = yymsp[-2].minor.yy346.zStart; yygotominor.yy346.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n]; } break; - case 195: /* expr ::= CAST LP expr AS typetoken RP */ + case 196: /* expr ::= CAST LP expr AS typetoken RP */ { yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_CAST, yymsp[-3].minor.yy346.pExpr, 0, &yymsp[-1].minor.yy0); spanSet(&yygotominor.yy346,&yymsp[-5].minor.yy0,&yymsp[0].minor.yy0); } break; - case 196: /* expr ::= ID LP distinct exprlist RP */ + case 197: /* expr ::= ID LP distinct exprlist RP */ { if( yymsp[-1].minor.yy14 && yymsp[-1].minor.yy14->nExpr>pParse->db->aLimit[SQLITE_LIMIT_FUNCTION_ARG] ){ sqlite3ErrorMsg(pParse, "too many arguments on function %T", &yymsp[-4].minor.yy0); @@ -92560,13 +93296,13 @@ static void yy_reduce( } } break; - case 197: /* expr ::= ID LP STAR RP */ + case 198: /* expr ::= ID LP STAR RP */ { yygotominor.yy346.pExpr = sqlite3ExprFunction(pParse, 0, &yymsp[-3].minor.yy0); spanSet(&yygotominor.yy346,&yymsp[-3].minor.yy0,&yymsp[0].minor.yy0); } break; - case 198: /* term ::= CTIME_KW */ + case 199: /* term ::= CTIME_KW */ { /* The CURRENT_TIME, CURRENT_DATE, and CURRENT_TIMESTAMP values are ** treated as functions that return constants */ @@ -92577,28 +93313,28 @@ static void yy_reduce( spanSet(&yygotominor.yy346, &yymsp[0].minor.yy0, &yymsp[0].minor.yy0); } break; - case 199: /* expr ::= expr AND expr */ - case 200: /* expr ::= expr OR expr */ yytestcase(yyruleno==200); - case 201: /* expr ::= expr LT|GT|GE|LE expr */ yytestcase(yyruleno==201); - case 202: /* expr ::= expr EQ|NE expr */ yytestcase(yyruleno==202); - case 203: /* expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr */ yytestcase(yyruleno==203); - case 204: /* expr ::= expr PLUS|MINUS expr */ yytestcase(yyruleno==204); - case 205: /* expr ::= expr STAR|SLASH|REM expr */ yytestcase(yyruleno==205); - case 206: /* expr ::= expr CONCAT expr */ yytestcase(yyruleno==206); + case 200: /* expr ::= expr AND expr */ + case 201: /* expr ::= expr OR expr */ yytestcase(yyruleno==201); + case 202: /* expr ::= expr LT|GT|GE|LE expr */ yytestcase(yyruleno==202); + case 203: /* expr ::= expr EQ|NE expr */ yytestcase(yyruleno==203); + case 204: /* expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr */ yytestcase(yyruleno==204); + case 205: /* expr ::= expr PLUS|MINUS expr */ yytestcase(yyruleno==205); + case 206: /* expr ::= expr STAR|SLASH|REM expr */ yytestcase(yyruleno==206); + case 207: /* expr ::= expr CONCAT expr */ yytestcase(yyruleno==207); {spanBinaryExpr(&yygotominor.yy346,pParse,yymsp[-1].major,&yymsp[-2].minor.yy346,&yymsp[0].minor.yy346);} break; - case 207: /* likeop ::= LIKE_KW */ - case 209: /* likeop ::= MATCH */ yytestcase(yyruleno==209); + case 208: /* likeop ::= LIKE_KW */ + case 210: /* likeop ::= MATCH */ yytestcase(yyruleno==210); {yygotominor.yy96.eOperator = yymsp[0].minor.yy0; yygotominor.yy96.not = 0;} break; - case 208: /* likeop ::= NOT LIKE_KW */ - case 210: /* likeop ::= NOT MATCH */ yytestcase(yyruleno==210); + case 209: /* likeop ::= NOT LIKE_KW */ + case 211: /* likeop ::= NOT MATCH */ yytestcase(yyruleno==211); {yygotominor.yy96.eOperator = yymsp[0].minor.yy0; yygotominor.yy96.not = 1;} break; - case 212: /* escape ::= */ + case 213: /* escape ::= */ {memset(&yygotominor.yy346,0,sizeof(yygotominor.yy346));} break; - case 213: /* expr ::= expr likeop expr escape */ + case 214: /* expr ::= expr likeop expr escape */ { ExprList *pList; pList = sqlite3ExprListAppend(pParse,0, yymsp[-1].minor.yy346.pExpr); @@ -92613,39 +93349,35 @@ static void yy_reduce( if( yygotominor.yy346.pExpr ) yygotominor.yy346.pExpr->flags |= EP_InfixFunc; } break; - case 214: /* expr ::= expr ISNULL|NOTNULL */ + case 215: /* expr ::= expr ISNULL|NOTNULL */ {spanUnaryPostfix(&yygotominor.yy346,pParse,yymsp[0].major,&yymsp[-1].minor.yy346,&yymsp[0].minor.yy0);} break; - case 215: /* expr ::= expr NOT NULL */ + case 216: /* expr ::= expr NOT NULL */ {spanUnaryPostfix(&yygotominor.yy346,pParse,TK_NOTNULL,&yymsp[-2].minor.yy346,&yymsp[0].minor.yy0);} break; - case 216: /* expr ::= expr IS expr */ + case 217: /* expr ::= expr IS expr */ { spanBinaryExpr(&yygotominor.yy346,pParse,TK_IS,&yymsp[-2].minor.yy346,&yymsp[0].minor.yy346); - if( pParse->db->mallocFailed==0 && yymsp[0].minor.yy346.pExpr->op==TK_NULL ){ - yygotominor.yy346.pExpr->op = TK_ISNULL; - } + binaryToUnaryIfNull(pParse, yymsp[0].minor.yy346.pExpr, yygotominor.yy346.pExpr, TK_ISNULL); } break; - case 217: /* expr ::= expr IS NOT expr */ + case 218: /* expr ::= expr IS NOT expr */ { spanBinaryExpr(&yygotominor.yy346,pParse,TK_ISNOT,&yymsp[-3].minor.yy346,&yymsp[0].minor.yy346); - if( pParse->db->mallocFailed==0 && yymsp[0].minor.yy346.pExpr->op==TK_NULL ){ - yygotominor.yy346.pExpr->op = TK_NOTNULL; - } + binaryToUnaryIfNull(pParse, yymsp[0].minor.yy346.pExpr, yygotominor.yy346.pExpr, TK_NOTNULL); } break; - case 218: /* expr ::= NOT expr */ - case 219: /* expr ::= BITNOT expr */ yytestcase(yyruleno==219); + case 219: /* expr ::= NOT expr */ + case 220: /* expr ::= BITNOT expr */ yytestcase(yyruleno==220); {spanUnaryPrefix(&yygotominor.yy346,pParse,yymsp[-1].major,&yymsp[0].minor.yy346,&yymsp[-1].minor.yy0);} break; - case 220: /* expr ::= MINUS expr */ + case 221: /* expr ::= MINUS expr */ {spanUnaryPrefix(&yygotominor.yy346,pParse,TK_UMINUS,&yymsp[0].minor.yy346,&yymsp[-1].minor.yy0);} break; - case 221: /* expr ::= PLUS expr */ + case 222: /* expr ::= PLUS expr */ {spanUnaryPrefix(&yygotominor.yy346,pParse,TK_UPLUS,&yymsp[0].minor.yy346,&yymsp[-1].minor.yy0);} break; - case 224: /* expr ::= expr between_op expr AND expr */ + case 225: /* expr ::= expr between_op expr AND expr */ { ExprList *pList = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy346.pExpr); pList = sqlite3ExprListAppend(pParse,pList, yymsp[0].minor.yy346.pExpr); @@ -92660,7 +93392,7 @@ static void yy_reduce( yygotominor.yy346.zEnd = yymsp[0].minor.yy346.zEnd; } break; - case 227: /* expr ::= expr in_op LP exprlist RP */ + case 228: /* expr ::= expr in_op LP exprlist RP */ { yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy346.pExpr, 0, 0); if( yygotominor.yy346.pExpr ){ @@ -92674,7 +93406,7 @@ static void yy_reduce( yygotominor.yy346.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n]; } break; - case 228: /* expr ::= LP select RP */ + case 229: /* expr ::= LP select RP */ { yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_SELECT, 0, 0, 0); if( yygotominor.yy346.pExpr ){ @@ -92688,7 +93420,7 @@ static void yy_reduce( yygotominor.yy346.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n]; } break; - case 229: /* expr ::= expr in_op LP select RP */ + case 230: /* expr ::= expr in_op LP select RP */ { yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy346.pExpr, 0, 0); if( yygotominor.yy346.pExpr ){ @@ -92703,7 +93435,7 @@ static void yy_reduce( yygotominor.yy346.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n]; } break; - case 230: /* expr ::= expr in_op nm dbnm */ + case 231: /* expr ::= expr in_op nm dbnm */ { SrcList *pSrc = sqlite3SrcListAppend(pParse->db, 0,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0); yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_IN, yymsp[-3].minor.yy346.pExpr, 0, 0); @@ -92719,7 +93451,7 @@ static void yy_reduce( yygotominor.yy346.zEnd = yymsp[0].minor.yy0.z ? &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n] : &yymsp[-1].minor.yy0.z[yymsp[-1].minor.yy0.n]; } break; - case 231: /* expr ::= EXISTS LP select RP */ + case 232: /* expr ::= EXISTS LP select RP */ { Expr *p = yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_EXISTS, 0, 0, 0); if( p ){ @@ -92733,7 +93465,7 @@ static void yy_reduce( yygotominor.yy346.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n]; } break; - case 232: /* expr ::= CASE case_operand case_exprlist case_else END */ + case 233: /* expr ::= CASE case_operand case_exprlist case_else END */ { yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_CASE, yymsp[-3].minor.yy132, yymsp[-1].minor.yy132, 0); if( yygotominor.yy346.pExpr ){ @@ -92746,33 +93478,33 @@ static void yy_reduce( yygotominor.yy346.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n]; } break; - case 233: /* case_exprlist ::= case_exprlist WHEN expr THEN expr */ + case 234: /* case_exprlist ::= case_exprlist WHEN expr THEN expr */ { yygotominor.yy14 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy14, yymsp[-2].minor.yy346.pExpr); yygotominor.yy14 = sqlite3ExprListAppend(pParse,yygotominor.yy14, yymsp[0].minor.yy346.pExpr); } break; - case 234: /* case_exprlist ::= WHEN expr THEN expr */ + case 235: /* case_exprlist ::= WHEN expr THEN expr */ { yygotominor.yy14 = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy346.pExpr); yygotominor.yy14 = sqlite3ExprListAppend(pParse,yygotominor.yy14, yymsp[0].minor.yy346.pExpr); } break; - case 243: /* cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP idxlist RP */ + case 244: /* cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP idxlist RP */ { sqlite3CreateIndex(pParse, &yymsp[-6].minor.yy0, &yymsp[-5].minor.yy0, sqlite3SrcListAppend(pParse->db,0,&yymsp[-3].minor.yy0,0), yymsp[-1].minor.yy14, yymsp[-9].minor.yy328, &yymsp[-10].minor.yy0, &yymsp[0].minor.yy0, SQLITE_SO_ASC, yymsp[-7].minor.yy328); } break; - case 244: /* uniqueflag ::= UNIQUE */ - case 298: /* raisetype ::= ABORT */ yytestcase(yyruleno==298); + case 245: /* uniqueflag ::= UNIQUE */ + case 299: /* raisetype ::= ABORT */ yytestcase(yyruleno==299); {yygotominor.yy328 = OE_Abort;} break; - case 245: /* uniqueflag ::= */ + case 246: /* uniqueflag ::= */ {yygotominor.yy328 = OE_None;} break; - case 248: /* idxlist ::= idxlist COMMA nm collate sortorder */ + case 249: /* idxlist ::= idxlist COMMA nm collate sortorder */ { Expr *p = 0; if( yymsp[-1].minor.yy0.n>0 ){ @@ -92785,7 +93517,7 @@ static void yy_reduce( if( yygotominor.yy14 ) yygotominor.yy14->a[yygotominor.yy14->nExpr-1].sortOrder = (u8)yymsp[0].minor.yy328; } break; - case 249: /* idxlist ::= nm collate sortorder */ + case 250: /* idxlist ::= nm collate sortorder */ { Expr *p = 0; if( yymsp[-1].minor.yy0.n>0 ){ @@ -92798,32 +93530,32 @@ static void yy_reduce( if( yygotominor.yy14 ) yygotominor.yy14->a[yygotominor.yy14->nExpr-1].sortOrder = (u8)yymsp[0].minor.yy328; } break; - case 250: /* collate ::= */ + case 251: /* collate ::= */ {yygotominor.yy0.z = 0; yygotominor.yy0.n = 0;} break; - case 252: /* cmd ::= DROP INDEX ifexists fullname */ + case 253: /* cmd ::= DROP INDEX ifexists fullname */ {sqlite3DropIndex(pParse, yymsp[0].minor.yy65, yymsp[-1].minor.yy328);} break; - case 253: /* cmd ::= VACUUM */ - case 254: /* cmd ::= VACUUM nm */ yytestcase(yyruleno==254); + case 254: /* cmd ::= VACUUM */ + case 255: /* cmd ::= VACUUM nm */ yytestcase(yyruleno==255); {sqlite3Vacuum(pParse);} break; - case 255: /* cmd ::= PRAGMA nm dbnm */ + case 256: /* cmd ::= PRAGMA nm dbnm */ {sqlite3Pragma(pParse,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0,0,0);} break; - case 256: /* cmd ::= PRAGMA nm dbnm EQ nmnum */ + case 257: /* cmd ::= PRAGMA nm dbnm EQ nmnum */ {sqlite3Pragma(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0,0);} break; - case 257: /* cmd ::= PRAGMA nm dbnm LP nmnum RP */ + case 258: /* cmd ::= PRAGMA nm dbnm LP nmnum RP */ {sqlite3Pragma(pParse,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,&yymsp[-1].minor.yy0,0);} break; - case 258: /* cmd ::= PRAGMA nm dbnm EQ minus_num */ + case 259: /* cmd ::= PRAGMA nm dbnm EQ minus_num */ {sqlite3Pragma(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0,1);} break; - case 259: /* cmd ::= PRAGMA nm dbnm LP minus_num RP */ + case 260: /* cmd ::= PRAGMA nm dbnm LP minus_num RP */ {sqlite3Pragma(pParse,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,&yymsp[-1].minor.yy0,1);} break; - case 270: /* cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */ + case 271: /* cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */ { Token all; all.z = yymsp[-3].minor.yy0.z; @@ -92831,38 +93563,38 @@ static void yy_reduce( sqlite3FinishTrigger(pParse, yymsp[-1].minor.yy473, &all); } break; - case 271: /* trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */ + case 272: /* trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */ { sqlite3BeginTrigger(pParse, &yymsp[-7].minor.yy0, &yymsp[-6].minor.yy0, yymsp[-5].minor.yy328, yymsp[-4].minor.yy378.a, yymsp[-4].minor.yy378.b, yymsp[-2].minor.yy65, yymsp[0].minor.yy132, yymsp[-10].minor.yy328, yymsp[-8].minor.yy328); yygotominor.yy0 = (yymsp[-6].minor.yy0.n==0?yymsp[-7].minor.yy0:yymsp[-6].minor.yy0); } break; - case 272: /* trigger_time ::= BEFORE */ - case 275: /* trigger_time ::= */ yytestcase(yyruleno==275); + case 273: /* trigger_time ::= BEFORE */ + case 276: /* trigger_time ::= */ yytestcase(yyruleno==276); { yygotominor.yy328 = TK_BEFORE; } break; - case 273: /* trigger_time ::= AFTER */ + case 274: /* trigger_time ::= AFTER */ { yygotominor.yy328 = TK_AFTER; } break; - case 274: /* trigger_time ::= INSTEAD OF */ + case 275: /* trigger_time ::= INSTEAD OF */ { yygotominor.yy328 = TK_INSTEAD;} break; - case 276: /* trigger_event ::= DELETE|INSERT */ - case 277: /* trigger_event ::= UPDATE */ yytestcase(yyruleno==277); + case 277: /* trigger_event ::= DELETE|INSERT */ + case 278: /* trigger_event ::= UPDATE */ yytestcase(yyruleno==278); {yygotominor.yy378.a = yymsp[0].major; yygotominor.yy378.b = 0;} break; - case 278: /* trigger_event ::= UPDATE OF inscollist */ + case 279: /* trigger_event ::= UPDATE OF inscollist */ {yygotominor.yy378.a = TK_UPDATE; yygotominor.yy378.b = yymsp[0].minor.yy408;} break; - case 281: /* when_clause ::= */ - case 303: /* key_opt ::= */ yytestcase(yyruleno==303); + case 282: /* when_clause ::= */ + case 304: /* key_opt ::= */ yytestcase(yyruleno==304); { yygotominor.yy132 = 0; } break; - case 282: /* when_clause ::= WHEN expr */ - case 304: /* key_opt ::= KEY expr */ yytestcase(yyruleno==304); + case 283: /* when_clause ::= WHEN expr */ + case 305: /* key_opt ::= KEY expr */ yytestcase(yyruleno==305); { yygotominor.yy132 = yymsp[0].minor.yy346.pExpr; } break; - case 283: /* trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */ + case 284: /* trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */ { assert( yymsp[-2].minor.yy473!=0 ); yymsp[-2].minor.yy473->pLast->pNext = yymsp[-1].minor.yy473; @@ -92870,14 +93602,14 @@ static void yy_reduce( yygotominor.yy473 = yymsp[-2].minor.yy473; } break; - case 284: /* trigger_cmd_list ::= trigger_cmd SEMI */ + case 285: /* trigger_cmd_list ::= trigger_cmd SEMI */ { assert( yymsp[-1].minor.yy473!=0 ); yymsp[-1].minor.yy473->pLast = yymsp[-1].minor.yy473; yygotominor.yy473 = yymsp[-1].minor.yy473; } break; - case 286: /* trnm ::= nm DOT nm */ + case 287: /* trnm ::= nm DOT nm */ { yygotominor.yy0 = yymsp[0].minor.yy0; sqlite3ErrorMsg(pParse, @@ -92885,36 +93617,36 @@ static void yy_reduce( "statements within triggers"); } break; - case 288: /* tridxby ::= INDEXED BY nm */ + case 289: /* tridxby ::= INDEXED BY nm */ { sqlite3ErrorMsg(pParse, "the INDEXED BY clause is not allowed on UPDATE or DELETE statements " "within triggers"); } break; - case 289: /* tridxby ::= NOT INDEXED */ + case 290: /* tridxby ::= NOT INDEXED */ { sqlite3ErrorMsg(pParse, "the NOT INDEXED clause is not allowed on UPDATE or DELETE statements " "within triggers"); } break; - case 290: /* trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt */ + case 291: /* trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt */ { yygotominor.yy473 = sqlite3TriggerUpdateStep(pParse->db, &yymsp[-4].minor.yy0, yymsp[-1].minor.yy14, yymsp[0].minor.yy132, yymsp[-5].minor.yy186); } break; - case 291: /* trigger_cmd ::= insert_cmd INTO trnm inscollist_opt VALUES LP itemlist RP */ + case 292: /* trigger_cmd ::= insert_cmd INTO trnm inscollist_opt VALUES LP itemlist RP */ {yygotominor.yy473 = sqlite3TriggerInsertStep(pParse->db, &yymsp[-5].minor.yy0, yymsp[-4].minor.yy408, yymsp[-1].minor.yy14, 0, yymsp[-7].minor.yy186);} break; - case 292: /* trigger_cmd ::= insert_cmd INTO trnm inscollist_opt select */ + case 293: /* trigger_cmd ::= insert_cmd INTO trnm inscollist_opt select */ {yygotominor.yy473 = sqlite3TriggerInsertStep(pParse->db, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy408, 0, yymsp[0].minor.yy3, yymsp[-4].minor.yy186);} break; - case 293: /* trigger_cmd ::= DELETE FROM trnm tridxby where_opt */ + case 294: /* trigger_cmd ::= DELETE FROM trnm tridxby where_opt */ {yygotominor.yy473 = sqlite3TriggerDeleteStep(pParse->db, &yymsp[-2].minor.yy0, yymsp[0].minor.yy132);} break; - case 294: /* trigger_cmd ::= select */ + case 295: /* trigger_cmd ::= select */ {yygotominor.yy473 = sqlite3TriggerSelectStep(pParse->db, yymsp[0].minor.yy3); } break; - case 295: /* expr ::= RAISE LP IGNORE RP */ + case 296: /* expr ::= RAISE LP IGNORE RP */ { yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_RAISE, 0, 0, 0); if( yygotominor.yy346.pExpr ){ @@ -92924,7 +93656,7 @@ static void yy_reduce( yygotominor.yy346.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n]; } break; - case 296: /* expr ::= RAISE LP raisetype COMMA nm RP */ + case 297: /* expr ::= RAISE LP raisetype COMMA nm RP */ { yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_RAISE, 0, 0, &yymsp[-1].minor.yy0); if( yygotominor.yy346.pExpr ) { @@ -92934,72 +93666,72 @@ static void yy_reduce( yygotominor.yy346.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n]; } break; - case 297: /* raisetype ::= ROLLBACK */ + case 298: /* raisetype ::= ROLLBACK */ {yygotominor.yy328 = OE_Rollback;} break; - case 299: /* raisetype ::= FAIL */ + case 300: /* raisetype ::= FAIL */ {yygotominor.yy328 = OE_Fail;} break; - case 300: /* cmd ::= DROP TRIGGER ifexists fullname */ + case 301: /* cmd ::= DROP TRIGGER ifexists fullname */ { sqlite3DropTrigger(pParse,yymsp[0].minor.yy65,yymsp[-1].minor.yy328); } break; - case 301: /* cmd ::= ATTACH database_kw_opt expr AS expr key_opt */ + case 302: /* cmd ::= ATTACH database_kw_opt expr AS expr key_opt */ { sqlite3Attach(pParse, yymsp[-3].minor.yy346.pExpr, yymsp[-1].minor.yy346.pExpr, yymsp[0].minor.yy132); } break; - case 302: /* cmd ::= DETACH database_kw_opt expr */ + case 303: /* cmd ::= DETACH database_kw_opt expr */ { sqlite3Detach(pParse, yymsp[0].minor.yy346.pExpr); } break; - case 307: /* cmd ::= REINDEX */ + case 308: /* cmd ::= REINDEX */ {sqlite3Reindex(pParse, 0, 0);} break; - case 308: /* cmd ::= REINDEX nm dbnm */ + case 309: /* cmd ::= REINDEX nm dbnm */ {sqlite3Reindex(pParse, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0);} break; - case 309: /* cmd ::= ANALYZE */ + case 310: /* cmd ::= ANALYZE */ {sqlite3Analyze(pParse, 0, 0);} break; - case 310: /* cmd ::= ANALYZE nm dbnm */ + case 311: /* cmd ::= ANALYZE nm dbnm */ {sqlite3Analyze(pParse, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0);} break; - case 311: /* cmd ::= ALTER TABLE fullname RENAME TO nm */ + case 312: /* cmd ::= ALTER TABLE fullname RENAME TO nm */ { sqlite3AlterRenameTable(pParse,yymsp[-3].minor.yy65,&yymsp[0].minor.yy0); } break; - case 312: /* cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt column */ + case 313: /* cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt column */ { sqlite3AlterFinishAddColumn(pParse, &yymsp[0].minor.yy0); } break; - case 313: /* add_column_fullname ::= fullname */ + case 314: /* add_column_fullname ::= fullname */ { pParse->db->lookaside.bEnabled = 0; sqlite3AlterBeginAddColumn(pParse, yymsp[0].minor.yy65); } break; - case 316: /* cmd ::= create_vtab */ + case 317: /* cmd ::= create_vtab */ {sqlite3VtabFinishParse(pParse,0);} break; - case 317: /* cmd ::= create_vtab LP vtabarglist RP */ + case 318: /* cmd ::= create_vtab LP vtabarglist RP */ {sqlite3VtabFinishParse(pParse,&yymsp[0].minor.yy0);} break; - case 318: /* create_vtab ::= createkw VIRTUAL TABLE nm dbnm USING nm */ + case 319: /* create_vtab ::= createkw VIRTUAL TABLE nm dbnm USING nm */ { sqlite3VtabBeginParse(pParse, &yymsp[-3].minor.yy0, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0); } break; - case 321: /* vtabarg ::= */ + case 322: /* vtabarg ::= */ {sqlite3VtabArgInit(pParse);} break; - case 323: /* vtabargtoken ::= ANY */ - case 324: /* vtabargtoken ::= lp anylist RP */ yytestcase(yyruleno==324); - case 325: /* lp ::= LP */ yytestcase(yyruleno==325); + case 324: /* vtabargtoken ::= ANY */ + case 325: /* vtabargtoken ::= lp anylist RP */ yytestcase(yyruleno==325); + case 326: /* lp ::= LP */ yytestcase(yyruleno==326); {sqlite3VtabArgExtend(pParse,&yymsp[0].minor.yy0);} break; default: @@ -93024,25 +93756,25 @@ static void yy_reduce( /* (55) carg ::= CONSTRAINT nm ccons */ yytestcase(yyruleno==55); /* (56) carg ::= ccons */ yytestcase(yyruleno==56); /* (62) ccons ::= NULL onconf */ yytestcase(yyruleno==62); - /* (89) conslist ::= conslist COMMA tcons */ yytestcase(yyruleno==89); - /* (90) conslist ::= conslist tcons */ yytestcase(yyruleno==90); - /* (91) conslist ::= tcons */ yytestcase(yyruleno==91); - /* (92) tcons ::= CONSTRAINT nm */ yytestcase(yyruleno==92); - /* (268) plus_opt ::= PLUS */ yytestcase(yyruleno==268); - /* (269) plus_opt ::= */ yytestcase(yyruleno==269); - /* (279) foreach_clause ::= */ yytestcase(yyruleno==279); - /* (280) foreach_clause ::= FOR EACH ROW */ yytestcase(yyruleno==280); - /* (287) tridxby ::= */ yytestcase(yyruleno==287); - /* (305) database_kw_opt ::= DATABASE */ yytestcase(yyruleno==305); - /* (306) database_kw_opt ::= */ yytestcase(yyruleno==306); - /* (314) kwcolumn_opt ::= */ yytestcase(yyruleno==314); - /* (315) kwcolumn_opt ::= COLUMNKW */ yytestcase(yyruleno==315); - /* (319) vtabarglist ::= vtabarg */ yytestcase(yyruleno==319); - /* (320) vtabarglist ::= vtabarglist COMMA vtabarg */ yytestcase(yyruleno==320); - /* (322) vtabarg ::= vtabarg vtabargtoken */ yytestcase(yyruleno==322); - /* (326) anylist ::= */ yytestcase(yyruleno==326); - /* (327) anylist ::= anylist LP anylist RP */ yytestcase(yyruleno==327); - /* (328) anylist ::= anylist ANY */ yytestcase(yyruleno==328); + /* (90) conslist ::= conslist COMMA tcons */ yytestcase(yyruleno==90); + /* (91) conslist ::= conslist tcons */ yytestcase(yyruleno==91); + /* (92) conslist ::= tcons */ yytestcase(yyruleno==92); + /* (93) tcons ::= CONSTRAINT nm */ yytestcase(yyruleno==93); + /* (269) plus_opt ::= PLUS */ yytestcase(yyruleno==269); + /* (270) plus_opt ::= */ yytestcase(yyruleno==270); + /* (280) foreach_clause ::= */ yytestcase(yyruleno==280); + /* (281) foreach_clause ::= FOR EACH ROW */ yytestcase(yyruleno==281); + /* (288) tridxby ::= */ yytestcase(yyruleno==288); + /* (306) database_kw_opt ::= DATABASE */ yytestcase(yyruleno==306); + /* (307) database_kw_opt ::= */ yytestcase(yyruleno==307); + /* (315) kwcolumn_opt ::= */ yytestcase(yyruleno==315); + /* (316) kwcolumn_opt ::= COLUMNKW */ yytestcase(yyruleno==316); + /* (320) vtabarglist ::= vtabarg */ yytestcase(yyruleno==320); + /* (321) vtabarglist ::= vtabarglist COMMA vtabarg */ yytestcase(yyruleno==321); + /* (323) vtabarg ::= vtabarg vtabargtoken */ yytestcase(yyruleno==323); + /* (327) anylist ::= */ yytestcase(yyruleno==327); + /* (328) anylist ::= anylist LP anylist RP */ yytestcase(yyruleno==328); + /* (329) anylist ::= anylist ANY */ yytestcase(yyruleno==329); break; }; yygoto = yyRuleInfo[yyruleno].lhs; @@ -93316,8 +94048,6 @@ SQLITE_PRIVATE void sqlite3Parser( ** This file contains C code that splits an SQL input string up into ** individual tokens and sends those tokens one-by-one over to the ** parser for analysis. -** -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ /* @@ -93370,7 +94100,7 @@ const unsigned char ebcdicToAscii[] = { ** ** The code in this file has been automatically generated by ** -** $Header: /home/drh/sqlite/trans/cvs/sqlite/sqlite/tool/mkkeywordhash.c,v 1.38 2009/06/09 14:27:41 drh Exp $ +** sqlite/tool/mkkeywordhash.c ** ** The code in this file implements a function that determines whether ** or not a given identifier is really an SQL keyword. The same thing @@ -93425,23 +94155,23 @@ static int keywordCode(const char *z, int n){ 'A','C','U','U','M','V','I','E','W','I','N','I','T','I','A','L','L','Y', }; static const unsigned char aHash[127] = { - 72, 101, 114, 70, 0, 44, 0, 0, 78, 0, 73, 0, 0, + 72, 101, 114, 70, 0, 45, 0, 0, 78, 0, 73, 0, 0, 42, 12, 74, 15, 0, 113, 81, 50, 108, 0, 19, 0, 0, 118, 0, 116, 111, 0, 22, 89, 0, 9, 0, 0, 66, 67, - 0, 65, 6, 0, 48, 86, 98, 0, 115, 97, 0, 0, 45, + 0, 65, 6, 0, 48, 86, 98, 0, 115, 97, 0, 0, 44, 0, 99, 24, 0, 17, 0, 119, 49, 23, 0, 5, 106, 25, 92, 0, 0, 121, 102, 56, 120, 53, 28, 51, 0, 87, 0, 96, 26, 0, 95, 0, 0, 0, 91, 88, 93, 84, 105, 14, 39, 104, 0, 77, 0, 18, 85, 107, 32, 0, 117, 76, 109, - 59, 46, 80, 0, 0, 90, 40, 0, 112, 0, 36, 0, 0, - 29, 0, 82, 58, 60, 0, 20, 57, 0, 52, + 58, 46, 80, 0, 0, 90, 40, 0, 112, 0, 36, 0, 0, + 29, 0, 82, 59, 60, 0, 20, 57, 0, 52, }; static const unsigned char aNext[121] = { 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 33, 21, 0, 0, 0, 43, 3, 47, - 0, 0, 0, 0, 30, 54, 0, 0, 38, 0, 0, 0, 1, + 0, 0, 0, 0, 33, 0, 21, 0, 0, 0, 43, 3, 47, + 0, 0, 0, 0, 30, 0, 54, 0, 38, 0, 0, 0, 1, 62, 0, 0, 63, 0, 41, 0, 0, 0, 0, 0, 0, 0, 61, 0, 0, 0, 0, 31, 55, 16, 34, 10, 0, 0, 0, 0, 0, 0, 0, 11, 68, 75, 0, 8, 0, 100, 94, 0, @@ -93452,8 +94182,8 @@ static int keywordCode(const char *z, int n){ 7, 7, 5, 4, 6, 4, 5, 3, 6, 7, 3, 6, 6, 7, 7, 3, 8, 2, 6, 5, 4, 4, 3, 10, 4, 6, 11, 6, 2, 7, 5, 5, 9, 6, 9, 9, 7, 10, 10, - 4, 6, 2, 3, 4, 9, 2, 6, 5, 6, 6, 5, 6, - 5, 5, 7, 7, 7, 2, 3, 4, 4, 7, 3, 6, 4, + 4, 6, 2, 3, 9, 4, 2, 6, 5, 6, 6, 5, 6, + 5, 5, 7, 7, 7, 3, 2, 4, 4, 7, 3, 6, 4, 7, 6, 12, 6, 9, 4, 6, 5, 4, 7, 6, 5, 6, 7, 5, 4, 5, 6, 5, 7, 3, 7, 13, 2, 2, 4, 6, 6, 8, 5, 17, 12, 7, 8, 8, 2, 4, 4, 4, @@ -93484,7 +94214,7 @@ static int keywordCode(const char *z, int n){ TK_OFFSET, TK_OF, TK_SET, TK_TEMP, TK_TEMP, TK_OR, TK_UNIQUE, TK_QUERY, TK_ATTACH, TK_HAVING, TK_GROUP, TK_UPDATE, TK_BEGIN, TK_JOIN_KW, TK_RELEASE, - TK_BETWEEN, TK_NOTNULL, TK_NO, TK_NOT, TK_NULL, + TK_BETWEEN, TK_NOTNULL, TK_NOT, TK_NO, TK_NULL, TK_LIKE_KW, TK_CASCADE, TK_ASC, TK_DELETE, TK_CASE, TK_COLLATE, TK_CREATE, TK_CTIME_KW, TK_DETACH, TK_IMMEDIATE, TK_JOIN, TK_INSERT, TK_MATCH, TK_PLAN, TK_ANALYZE, @@ -93549,8 +94279,8 @@ static int keywordCode(const char *z, int n){ testcase( i==40 ); /* OFFSET */ testcase( i==41 ); /* OF */ testcase( i==42 ); /* SET */ - testcase( i==43 ); /* TEMP */ - testcase( i==44 ); /* TEMPORARY */ + testcase( i==43 ); /* TEMPORARY */ + testcase( i==44 ); /* TEMP */ testcase( i==45 ); /* OR */ testcase( i==46 ); /* UNIQUE */ testcase( i==47 ); /* QUERY */ @@ -93563,8 +94293,8 @@ static int keywordCode(const char *z, int n){ testcase( i==54 ); /* RELEASE */ testcase( i==55 ); /* BETWEEN */ testcase( i==56 ); /* NOTNULL */ - testcase( i==57 ); /* NO */ - testcase( i==58 ); /* NOT */ + testcase( i==57 ); /* NOT */ + testcase( i==58 ); /* NO */ testcase( i==59 ); /* NULL */ testcase( i==60 ); /* LIKE */ testcase( i==61 ); /* CASCADE */ @@ -93635,6 +94365,7 @@ static int keywordCode(const char *z, int n){ SQLITE_PRIVATE int sqlite3KeywordCode(const unsigned char *z, int n){ return keywordCode((char*)z, n); } +#define SQLITE_N_KEYWORD 121 /************** End of keywordhash.h *****************************************/ /************** Continuing where we left off in tokenize.c *******************/ @@ -93657,16 +94388,7 @@ SQLITE_PRIVATE int sqlite3KeywordCode(const unsigned char *z, int n){ ** But the feature is undocumented. */ #ifdef SQLITE_ASCII -SQLITE_PRIVATE const char sqlite3IsAsciiIdChar[] = { -/* x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF */ - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 2x */ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, /* 3x */ - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 4x */ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, /* 5x */ - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 6x */ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, /* 7x */ -}; -#define IdChar(C) (((c=C)&0x80)!=0 || (c>0x1f && sqlite3IsAsciiIdChar[c-0x20])) +#define IdChar(C) ((sqlite3CtypeMap[(unsigned char)C]&0x46)!=0) #endif #ifdef SQLITE_EBCDIC SQLITE_PRIVATE const char sqlite3IsEbcdicIdChar[] = { @@ -93707,8 +94429,9 @@ SQLITE_PRIVATE int sqlite3GetToken(const unsigned char *z, int *tokenType){ } case '-': { if( z[1]=='-' ){ + /* IMP: R-15891-05542 -- syntax diagram for comments */ for(i=2; (c=z[i])!=0 && c!='\n'; i++){} - *tokenType = TK_SPACE; + *tokenType = TK_SPACE; /* IMP: R-22934-25134 */ return i; } *tokenType = TK_MINUS; @@ -93739,9 +94462,10 @@ SQLITE_PRIVATE int sqlite3GetToken(const unsigned char *z, int *tokenType){ *tokenType = TK_SLASH; return 1; } + /* IMP: R-15891-05542 -- syntax diagram for comments */ for(i=3, c=z[2]; (c!='*' || z[i]!='/') && (c=z[i])!=0; i++){} if( c ) i++; - *tokenType = TK_SPACE; + *tokenType = TK_SPACE; /* IMP: R-22934-25134 */ return i; } case '%': { @@ -94126,8 +94850,6 @@ abort_parse: ** This code used to be part of the tokenizer.c source file. But by ** separating it out, the code will be automatically omitted from ** static links that do not use it. -** -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ #ifndef SQLITE_OMIT_COMPLETE @@ -94136,8 +94858,7 @@ abort_parse: */ #ifndef SQLITE_AMALGAMATION #ifdef SQLITE_ASCII -SQLITE_PRIVATE const char sqlite3IsAsciiIdChar[]; -#define IdChar(C) (((c=C)&0x80)!=0 || (c>0x1f && sqlite3IsAsciiIdChar[c-0x20])) +#define IdChar(C) ((sqlite3CtypeMap[(unsigned char)C]&0x46)!=0) #endif #ifdef SQLITE_EBCDIC SQLITE_PRIVATE const char sqlite3IsEbcdicIdChar[]; @@ -94153,11 +94874,13 @@ SQLITE_PRIVATE const char sqlite3IsEbcdicIdChar[]; #define tkSEMI 0 #define tkWS 1 #define tkOTHER 2 +#ifndef SQLITE_OMIT_TRIGGER #define tkEXPLAIN 3 #define tkCREATE 4 #define tkTEMP 5 #define tkTRIGGER 6 #define tkEND 7 +#endif /* ** Return TRUE if the given SQL string ends in a semicolon. @@ -94166,36 +94889,38 @@ SQLITE_PRIVATE const char sqlite3IsEbcdicIdChar[]; ** Whenever the CREATE TRIGGER keywords are seen, the statement ** must end with ";END;". ** -** This implementation uses a state machine with 7 states: +** This implementation uses a state machine with 8 states: +** +** (0) INVALID We have not yet seen a non-whitespace character. ** -** (0) START At the beginning or end of an SQL statement. This routine +** (1) START At the beginning or end of an SQL statement. This routine ** returns 1 if it ends in the START state and 0 if it ends ** in any other state. ** -** (1) NORMAL We are in the middle of statement which ends with a single +** (2) NORMAL We are in the middle of statement which ends with a single ** semicolon. ** -** (2) EXPLAIN The keyword EXPLAIN has been seen at the beginning of +** (3) EXPLAIN The keyword EXPLAIN has been seen at the beginning of ** a statement. ** -** (3) CREATE The keyword CREATE has been seen at the beginning of a +** (4) CREATE The keyword CREATE has been seen at the beginning of a ** statement, possibly preceeded by EXPLAIN and/or followed by ** TEMP or TEMPORARY ** -** (4) TRIGGER We are in the middle of a trigger definition that must be +** (5) TRIGGER We are in the middle of a trigger definition that must be ** ended by a semicolon, the keyword END, and another semicolon. ** -** (5) SEMI We've seen the first semicolon in the ";END;" that occurs at +** (6) SEMI We've seen the first semicolon in the ";END;" that occurs at ** the end of a trigger definition. ** -** (6) END We've seen the ";END" of the ";END;" that occurs at the end +** (7) END We've seen the ";END" of the ";END;" that occurs at the end ** of a trigger difinition. ** ** Transitions between states above are determined by tokens extracted ** from the input. The following tokens are significant: ** ** (0) tkSEMI A semicolon. -** (1) tkWS Whitespace +** (1) tkWS Whitespace. ** (2) tkOTHER Any other SQL token. ** (3) tkEXPLAIN The "explain" keyword. ** (4) tkCREATE The "create" keyword. @@ -94204,6 +94929,7 @@ SQLITE_PRIVATE const char sqlite3IsEbcdicIdChar[]; ** (7) tkEND The "end" keyword. ** ** Whitespace never causes a state transition and is always ignored. +** This means that a SQL string of all whitespace is invalid. ** ** If we compile with SQLITE_OMIT_TRIGGER, all of the computation needed ** to recognize the end of a trigger can be omitted. All we have to do @@ -94217,26 +94943,28 @@ SQLITE_API int sqlite3_complete(const char *zSql){ /* A complex statement machine used to detect the end of a CREATE TRIGGER ** statement. This is the normal case. */ - static const u8 trans[7][8] = { + static const u8 trans[8][8] = { /* Token: */ - /* State: ** SEMI WS OTHER EXPLAIN CREATE TEMP TRIGGER END */ - /* 0 START: */ { 0, 0, 1, 2, 3, 1, 1, 1, }, - /* 1 NORMAL: */ { 0, 1, 1, 1, 1, 1, 1, 1, }, - /* 2 EXPLAIN: */ { 0, 2, 2, 1, 3, 1, 1, 1, }, - /* 3 CREATE: */ { 0, 3, 1, 1, 1, 3, 4, 1, }, - /* 4 TRIGGER: */ { 5, 4, 4, 4, 4, 4, 4, 4, }, - /* 5 SEMI: */ { 5, 5, 4, 4, 4, 4, 4, 6, }, - /* 6 END: */ { 0, 6, 4, 4, 4, 4, 4, 4, }, + /* State: ** SEMI WS OTHER EXPLAIN CREATE TEMP TRIGGER END */ + /* 0 INVALID: */ { 1, 0, 2, 3, 4, 2, 2, 2, }, + /* 1 START: */ { 1, 1, 2, 3, 4, 2, 2, 2, }, + /* 2 NORMAL: */ { 1, 2, 2, 2, 2, 2, 2, 2, }, + /* 3 EXPLAIN: */ { 1, 3, 3, 2, 4, 2, 2, 2, }, + /* 4 CREATE: */ { 1, 4, 2, 2, 2, 4, 5, 2, }, + /* 5 TRIGGER: */ { 6, 5, 5, 5, 5, 5, 5, 5, }, + /* 6 SEMI: */ { 6, 6, 5, 5, 5, 5, 5, 7, }, + /* 7 END: */ { 1, 7, 5, 5, 5, 5, 5, 5, }, }; #else - /* If triggers are not suppored by this compile then the statement machine + /* If triggers are not supported by this compile then the statement machine ** used to detect the end of a statement is much simplier */ - static const u8 trans[2][3] = { + static const u8 trans[3][3] = { /* Token: */ /* State: ** SEMI WS OTHER */ - /* 0 START: */ { 0, 0, 1, }, - /* 1 NORMAL: */ { 0, 1, 1, }, + /* 0 INVALID: */ { 1, 0, 2, }, + /* 1 START: */ { 1, 1, 2, }, + /* 2 NORMAL: */ { 1, 2, 2, }, }; #endif /* SQLITE_OMIT_TRIGGER */ @@ -94272,7 +95000,7 @@ SQLITE_API int sqlite3_complete(const char *zSql){ break; } while( *zSql && *zSql!='\n' ){ zSql++; } - if( *zSql==0 ) return state==0; + if( *zSql==0 ) return state==1; token = tkWS; break; } @@ -94294,7 +95022,9 @@ SQLITE_API int sqlite3_complete(const char *zSql){ break; } default: { - int c; +#ifdef SQLITE_EBCDIC + unsigned char c; +#endif if( IdChar((u8)*zSql) ){ /* Keywords and unquoted identifiers */ int nId; @@ -94354,7 +95084,7 @@ SQLITE_API int sqlite3_complete(const char *zSql){ state = trans[state][token]; zSql++; } - return state==0; + return state==1; } #ifndef SQLITE_OMIT_UTF16 @@ -94742,7 +95472,7 @@ SQLITE_API int sqlite3_config(int op, ...){ /* Mutex configuration options are only available in a threadsafe ** compile. */ -#if SQLITE_THREADSAFE +#if defined(SQLITE_THREADSAFE) && SQLITE_THREADSAFE>0 case SQLITE_CONFIG_SINGLETHREAD: { /* Disable all mutexing */ sqlite3GlobalConfig.bCoreMutex = 0; @@ -95696,7 +96426,7 @@ SQLITE_PRIVATE int sqlite3TempInMemory(const sqlite3 *db){ ** The sqlite3TempInMemory() function is used to determine which. */ SQLITE_PRIVATE int sqlite3BtreeFactory( - const sqlite3 *db, /* Main database when opening aux otherwise 0 */ + sqlite3 *db, /* Main database when opening aux otherwise 0 */ const char *zFilename, /* Name of the file containing the BTree database */ int omitJournal, /* if TRUE then do not journal this file */ int nCache, /* How many pages in the page cache */ @@ -95958,9 +96688,6 @@ static const int aHardLimit[] = { #if SQLITE_MAX_LIKE_PATTERN_LENGTH<1 # error SQLITE_MAX_LIKE_PATTERN_LENGTH must be at least 1 #endif -#if SQLITE_MAX_VARIABLE_NUMBER<1 -# error SQLITE_MAX_VARIABLE_NUMBER must be at least 1 -#endif #if SQLITE_MAX_COLUMN>32767 # error SQLITE_MAX_COLUMN must not exceed 32767 #endif @@ -96761,6 +97488,40 @@ SQLITE_API int sqlite3_test_control(int op, ...){ break; } + /* sqlite3_test_control(SQLITE_TESTCTRL_OPTIMIZATIONS, sqlite3 *db, int N) + ** + ** Enable or disable various optimizations for testing purposes. The + ** argument N is a bitmask of optimizations to be disabled. For normal + ** operation N should be 0. The idea is that a test program (like the + ** SQL Logic Test or SLT test module) can run the same SQL multiple times + ** with various optimizations disabled to verify that the same answer + ** is obtained in every case. + */ + case SQLITE_TESTCTRL_OPTIMIZATIONS: { + sqlite3 *db = va_arg(ap, sqlite3*); + int x = va_arg(ap,int); + db->flags = (x & SQLITE_OptMask) | (db->flags & ~SQLITE_OptMask); + break; + } + +#ifdef SQLITE_N_KEYWORD + /* sqlite3_test_control(SQLITE_TESTCTRL_ISKEYWORD, const char *zWord) + ** + ** If zWord is a keyword recognized by the parser, then return the + ** number of keywords. Or if zWord is not a keyword, return 0. + ** + ** This test feature is only available in the amalgamation since + ** the SQLITE_N_KEYWORD macro is not defined in this file if SQLite + ** is built using separate source files. + */ + case SQLITE_TESTCTRL_ISKEYWORD: { + const char *zWord = va_arg(ap, const char*); + int n = sqlite3Strlen30(zWord); + rc = (sqlite3KeywordCode((u8*)zWord, n)!=TK_ID) ? SQLITE_N_KEYWORD : 0; + break; + } +#endif + } va_end(ap); #endif /* SQLITE_OMIT_BUILTIN_TEST */ @@ -96783,8 +97544,6 @@ SQLITE_API int sqlite3_test_control(int op, ...){ ** ** This file contains the implementation of the sqlite3_unlock_notify() ** API method and its associated functionality. -** -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ /* Omit this entire file if SQLITE_ENABLE_UNLOCK_NOTIFY is not defined. */ @@ -97383,11 +98142,10 @@ SQLITE_PRIVATE void sqlite3ConnectionClosed(sqlite3 *db){ # define SQLITE_CORE 1 #endif - -/************** Include fts3_expr.h in the middle of fts3.c ******************/ -/************** Begin file fts3_expr.h ***************************************/ +/************** Include fts3Int.h in the middle of fts3.c ********************/ +/************** Begin file fts3Int.h *****************************************/ /* -** 2008 Nov 28 +** 2009 Nov 12 ** ** The author disclaims copyright to this source code. In place of ** a legal notice, here is a blessing: @@ -97400,7 +98158,14 @@ SQLITE_PRIVATE void sqlite3ConnectionClosed(sqlite3 *db){ ** */ -/************** Include fts3_tokenizer.h in the middle of fts3_expr.h ********/ +#ifndef _FTSINT_H +#define _FTSINT_H + +#if !defined(NDEBUG) && !defined(SQLITE_DEBUG) +# define NDEBUG 1 +#endif + +/************** Include fts3_tokenizer.h in the middle of fts3Int.h **********/ /************** Begin file fts3_tokenizer.h **********************************/ /* ** 2006 July 10 @@ -97548,94 +98313,15 @@ struct sqlite3_tokenizer_cursor { /* Tokenizer implementations will typically add additional fields */ }; -#endif /* _FTS3_TOKENIZER_H_ */ - -/************** End of fts3_tokenizer.h **************************************/ -/************** Continuing where we left off in fts3_expr.h ******************/ - -/* -** The following describes the syntax supported by the fts3 MATCH -** operator in a similar format to that used by the lemon parser -** generator. This module does not use actually lemon, it uses a -** custom parser. -** -** query ::= andexpr (OR andexpr)*. -** -** andexpr ::= notexpr (AND? notexpr)*. -** -** notexpr ::= nearexpr (NOT nearexpr|-TOKEN)*. -** notexpr ::= LP query RP. -** -** nearexpr ::= phrase (NEAR distance_opt nearexpr)*. -** -** distance_opt ::= . -** distance_opt ::= / INTEGER. -** -** phrase ::= TOKEN. -** phrase ::= COLUMN:TOKEN. -** phrase ::= "TOKEN TOKEN TOKEN...". -*/ - -typedef struct Fts3Expr Fts3Expr; -typedef struct Fts3Phrase Fts3Phrase; - -/* -** A "phrase" is a sequence of one or more tokens that must match in -** sequence. A single token is the base case and the most common case. -** For a sequence of tokens contained in "...", nToken will be the number -** of tokens in the string. -*/ -struct Fts3Phrase { - int nToken; /* Number of tokens in the phrase */ - int iColumn; /* Index of column this phrase must match */ - int isNot; /* Phrase prefixed by unary not (-) operator */ - struct PhraseToken { - char *z; /* Text of the token */ - int n; /* Number of bytes in buffer pointed to by z */ - int isPrefix; /* True if token ends in with a "*" character */ - } aToken[1]; /* One entry for each token in the phrase */ -}; - -/* -** A tree of these objects forms the RHS of a MATCH operator. -*/ -struct Fts3Expr { - int eType; /* One of the FTSQUERY_XXX values defined below */ - int nNear; /* Valid if eType==FTSQUERY_NEAR */ - Fts3Expr *pParent; /* pParent->pLeft==this or pParent->pRight==this */ - Fts3Expr *pLeft; /* Left operand */ - Fts3Expr *pRight; /* Right operand */ - Fts3Phrase *pPhrase; /* Valid if eType==FTSQUERY_PHRASE */ -}; +int fts3_global_term_cnt(int iTerm, int iCol); +int fts3_term_cnt(int iTerm, int iCol); -SQLITE_PRIVATE int sqlite3Fts3ExprParse(sqlite3_tokenizer *, char **, int, int, - const char *, int, Fts3Expr **); -SQLITE_PRIVATE void sqlite3Fts3ExprFree(Fts3Expr *); -/* -** Candidate values for Fts3Query.eType. Note that the order of the first -** four values is in order of precedence when parsing expressions. For -** example, the following: -** -** "a OR b AND c NOT d NEAR e" -** -** is equivalent to: -** -** "a OR (b AND (c NOT (d NEAR e)))" -*/ -#define FTSQUERY_NEAR 1 -#define FTSQUERY_NOT 2 -#define FTSQUERY_AND 3 -#define FTSQUERY_OR 4 -#define FTSQUERY_PHRASE 5 - -#ifdef SQLITE_TEST -SQLITE_PRIVATE void sqlite3Fts3ExprInitTestInterface(sqlite3 *db); -#endif +#endif /* _FTS3_TOKENIZER_H_ */ -/************** End of fts3_expr.h *******************************************/ -/************** Continuing where we left off in fts3.c ***********************/ -/************** Include fts3_hash.h in the middle of fts3.c ******************/ +/************** End of fts3_tokenizer.h **************************************/ +/************** Continuing where we left off in fts3Int.h ********************/ +/************** Include fts3_hash.h in the middle of fts3Int.h ***************/ /************** Begin file fts3_hash.h ***************************************/ /* ** 2001 September 22 @@ -97657,8 +98343,8 @@ SQLITE_PRIVATE void sqlite3Fts3ExprInitTestInterface(sqlite3 *db); #define _FTS3_HASH_H_ /* Forward declarations of structures. */ -typedef struct fts3Hash fts3Hash; -typedef struct fts3HashElem fts3HashElem; +typedef struct Fts3Hash Fts3Hash; +typedef struct Fts3HashElem Fts3HashElem; /* A complete hash table is an instance of the following structure. ** The internals of this structure are intended to be opaque -- client @@ -97668,15 +98354,15 @@ typedef struct fts3HashElem fts3HashElem; ** accessing this structure are really macros, so we can't really make ** this structure opaque. */ -struct fts3Hash { +struct Fts3Hash { char keyClass; /* HASH_INT, _POINTER, _STRING, _BINARY */ char copyKey; /* True if copy of key made on insert */ int count; /* Number of entries in this table */ - fts3HashElem *first; /* The first element of the array */ + Fts3HashElem *first; /* The first element of the array */ int htsize; /* Number of buckets in the hash table */ struct _fts3ht { /* the hash table */ int count; /* Number of entries with this hash */ - fts3HashElem *chain; /* Pointer to first entry with this hash */ + Fts3HashElem *chain; /* Pointer to first entry with this hash */ } *ht; }; @@ -97686,8 +98372,8 @@ struct fts3Hash { ** Again, this structure is intended to be opaque, but it can't really ** be opaque because it is used by macros. */ -struct fts3HashElem { - fts3HashElem *next, *prev; /* Next and previous elements in the table */ +struct Fts3HashElem { + Fts3HashElem *next, *prev; /* Next and previous elements in the table */ void *data; /* Data associated with this element */ void *pKey; int nKey; /* Key associated with this element */ }; @@ -97710,25 +98396,27 @@ struct fts3HashElem { /* ** Access routines. To delete, insert a NULL pointer. */ -SQLITE_PRIVATE void sqlite3Fts3HashInit(fts3Hash*, int keytype, int copyKey); -SQLITE_PRIVATE void *sqlite3Fts3HashInsert(fts3Hash*, const void *pKey, int nKey, void *pData); -SQLITE_PRIVATE void *sqlite3Fts3HashFind(const fts3Hash*, const void *pKey, int nKey); -SQLITE_PRIVATE void sqlite3Fts3HashClear(fts3Hash*); +SQLITE_PRIVATE void sqlite3Fts3HashInit(Fts3Hash *pNew, char keyClass, char copyKey); +SQLITE_PRIVATE void *sqlite3Fts3HashInsert(Fts3Hash*, const void *pKey, int nKey, void *pData); +SQLITE_PRIVATE void *sqlite3Fts3HashFind(const Fts3Hash*, const void *pKey, int nKey); +SQLITE_PRIVATE void sqlite3Fts3HashClear(Fts3Hash*); +SQLITE_PRIVATE Fts3HashElem *sqlite3Fts3HashFindElem(const Fts3Hash *, const void *, int); /* ** Shorthand for the functions above */ -#define fts3HashInit sqlite3Fts3HashInit -#define fts3HashInsert sqlite3Fts3HashInsert -#define fts3HashFind sqlite3Fts3HashFind -#define fts3HashClear sqlite3Fts3HashClear +#define fts3HashInit sqlite3Fts3HashInit +#define fts3HashInsert sqlite3Fts3HashInsert +#define fts3HashFind sqlite3Fts3HashFind +#define fts3HashClear sqlite3Fts3HashClear +#define fts3HashFindElem sqlite3Fts3HashFindElem /* ** Macros for looping over all elements of a hash table. The idiom is ** like this: ** -** fts3Hash h; -** fts3HashElem *p; +** Fts3Hash h; +** Fts3HashElem *p; ** ... ** for(p=fts3HashFirst(&h); p; p=fts3HashNext(p)){ ** SomeStructure *pData = fts3HashData(p); @@ -97749,105 +98437,307 @@ SQLITE_PRIVATE void sqlite3Fts3HashClear(fts3Hash*); #endif /* _FTS3_HASH_H_ */ /************** End of fts3_hash.h *******************************************/ -/************** Continuing where we left off in fts3.c ***********************/ -#ifndef SQLITE_CORE - SQLITE_EXTENSION_INIT1 -#endif +/************** Continuing where we left off in fts3Int.h ********************/ +/* +** This constant controls how often segments are merged. Once there are +** FTS3_MERGE_COUNT segments of level N, they are merged into a single +** segment of level N+1. +*/ +#define FTS3_MERGE_COUNT 16 -/* TODO(shess) MAN, this thing needs some refactoring. At minimum, it -** would be nice to order the file better, perhaps something along the -** lines of: -** -** - utility functions -** - table setup functions -** - table update functions -** - table query functions -** -** Put the query functions last because they're likely to reference -** typedefs or functions from the table update section. +/* +** This is the maximum amount of data (in bytes) to store in the +** Fts3Table.pendingTerms hash table. Normally, the hash table is +** populated as documents are inserted/updated/deleted in a transaction +** and used to create a new segment when the transaction is committed. +** However if this limit is reached midway through a transaction, a new +** segment is created and the hash table cleared immediately. */ +#define FTS3_MAX_PENDING_DATA (1*1024*1024) -#if 0 -# define FTSTRACE(A) printf A; fflush(stdout) -#else -# define FTSTRACE(A) -#endif +/* +** Macro to return the number of elements in an array. SQLite has a +** similar macro called ArraySize(). Use a different name to avoid +** a collision when building an amalgamation with built-in FTS3. +*/ +#define SizeofArray(X) ((int)(sizeof(X)/sizeof(X[0]))) -/* It is not safe to call isspace(), tolower(), or isalnum() on -** hi-bit-set characters. This is the same solution used in the -** tokenizer. +/* +** Maximum length of a varint encoded integer. The varint format is different +** from that used by SQLite, so the maximum length is 10, not 9. */ -/* TODO(shess) The snippet-generation code should be using the -** tokenizer-generated tokens rather than doing its own local -** tokenization. +#define FTS3_VARINT_MAX 10 + +/* +** This section provides definitions to allow the +** FTS3 extension to be compiled outside of the +** amalgamation. */ -/* TODO(shess) Is __isascii() a portable version of (c&0x80)==0? */ -static int safe_isspace(char c){ - return (c&0x80)==0 ? isspace(c) : 0; -} -static int safe_tolower(char c){ - return (c&0x80)==0 ? tolower(c) : c; -} -static int safe_isalnum(char c){ - return (c&0x80)==0 ? isalnum(c) : 0; -} +#ifndef SQLITE_AMALGAMATION +/* +** Macros indicating that conditional expressions are always true or +** false. +*/ +# define ALWAYS(x) (x) +# define NEVER(X) (x) +/* +** Internal types used by SQLite. +*/ +typedef unsigned char u8; /* 1-byte (or larger) unsigned integer */ +typedef short int i16; /* 2-byte (or larger) signed integer */ +typedef unsigned int u32; /* 4-byte unsigned integer */ +typedef sqlite3_uint64 u64; /* 8-byte unsigned integer */ +/* +** Macro used to suppress compiler warnings for unused parameters. +*/ +#define UNUSED_PARAMETER(x) (void)(x) +#endif -typedef enum DocListType { - DL_DOCIDS, /* docids only */ - DL_POSITIONS, /* docids + positions */ - DL_POSITIONS_OFFSETS /* docids + positions + offsets */ -} DocListType; +typedef struct Fts3Table Fts3Table; +typedef struct Fts3Cursor Fts3Cursor; +typedef struct Fts3Expr Fts3Expr; +typedef struct Fts3Phrase Fts3Phrase; +typedef struct Fts3SegReader Fts3SegReader; +typedef struct Fts3SegFilter Fts3SegFilter; /* -** By default, only positions and not offsets are stored in the doclists. -** To change this so that offsets are stored too, compile with -** -** -DDL_DEFAULT=DL_POSITIONS_OFFSETS +** A connection to a fulltext index is an instance of the following +** structure. The xCreate and xConnect methods create an instance +** of this structure and xDestroy and xDisconnect free that instance. +** All other methods receive a pointer to the structure as one of their +** arguments. +*/ +struct Fts3Table { + sqlite3_vtab base; /* Base class used by SQLite core */ + sqlite3 *db; /* The database connection */ + const char *zDb; /* logical database name */ + const char *zName; /* virtual table name */ + int nColumn; /* number of named columns in virtual table */ + char **azColumn; /* column names. malloced */ + sqlite3_tokenizer *pTokenizer; /* tokenizer for inserts and queries */ + + /* Precompiled statements used by the implementation. Each of these + ** statements is run and reset within a single virtual table API call. + */ + sqlite3_stmt *aStmt[18]; + + /* Pointer to string containing the SQL: + ** + ** "SELECT block FROM %_segments WHERE blockid BETWEEN ? AND ? + ** ORDER BY blockid" + */ + char *zSelectLeaves; + int nLeavesStmt; /* Valid statements in aLeavesStmt */ + int nLeavesTotal; /* Total number of prepared leaves stmts */ + int nLeavesAlloc; /* Allocated size of aLeavesStmt */ + sqlite3_stmt **aLeavesStmt; /* Array of prepared zSelectLeaves stmts */ + + int nNodeSize; /* Soft limit for node size */ + + /* The following hash table is used to buffer pending index updates during + ** transactions. Variable nPendingData estimates the memory size of the + ** pending data, including hash table overhead, but not malloc overhead. + ** When nPendingData exceeds nMaxPendingData, the buffer is flushed + ** automatically. Variable iPrevDocid is the docid of the most recently + ** inserted record. + */ + int nMaxPendingData; + int nPendingData; + sqlite_int64 iPrevDocid; + Fts3Hash pendingTerms; +}; + +/* +** When the core wants to read from the virtual table, it creates a +** virtual table cursor (an instance of the following structure) using +** the xOpen method. Cursors are destroyed using the xClose method. +*/ +struct Fts3Cursor { + sqlite3_vtab_cursor base; /* Base class used by SQLite core */ + i16 eSearch; /* Search strategy (see below) */ + u8 isEof; /* True if at End Of Results */ + u8 isRequireSeek; /* True if must seek pStmt to %_content row */ + sqlite3_stmt *pStmt; /* Prepared statement in use by the cursor */ + Fts3Expr *pExpr; /* Parsed MATCH query string */ + sqlite3_int64 iPrevId; /* Previous id read from aDoclist */ + char *pNextId; /* Pointer into the body of aDoclist */ + char *aDoclist; /* List of docids for full-text queries */ + int nDoclist; /* Size of buffer at aDoclist */ + int isMatchinfoOk; /* True when aMatchinfo[] matches iPrevId */ + u32 *aMatchinfo; +}; + +/* +** The Fts3Cursor.eSearch member is always set to one of the following. +** Actualy, Fts3Cursor.eSearch can be greater than or equal to +** FTS3_FULLTEXT_SEARCH. If so, then Fts3Cursor.eSearch - 2 is the index +** of the column to be searched. For example, in ** -** If DL_DEFAULT is set to DL_DOCIDS, your table can only be inserted -** into (no deletes or updates). +** CREATE VIRTUAL TABLE ex1 USING fts3(a,b,c,d); +** SELECT docid FROM ex1 WHERE b MATCH 'one two three'; +** +** Because the LHS of the MATCH operator is 2nd column "b", +** Fts3Cursor.eSearch will be set to FTS3_FULLTEXT_SEARCH+1. (+0 for a, +** +1 for b, +2 for c, +3 for d.) If the LHS of MATCH were "ex1" +** indicating that all columns should be searched, +** then eSearch would be set to FTS3_FULLTEXT_SEARCH+4. */ -#ifndef DL_DEFAULT -# define DL_DEFAULT DL_POSITIONS -#endif +#define FTS3_FULLSCAN_SEARCH 0 /* Linear scan of %_content table */ +#define FTS3_DOCID_SEARCH 1 /* Lookup by rowid on %_content table */ +#define FTS3_FULLTEXT_SEARCH 2 /* Full-text index search */ -enum { - POS_END = 0, /* end of this position list */ - POS_COLUMN, /* followed by new column number */ - POS_BASE +/* +** A "phrase" is a sequence of one or more tokens that must match in +** sequence. A single token is the base case and the most common case. +** For a sequence of tokens contained in "...", nToken will be the number +** of tokens in the string. +*/ +struct Fts3Phrase { + int nToken; /* Number of tokens in the phrase */ + int iColumn; /* Index of column this phrase must match */ + int isNot; /* Phrase prefixed by unary not (-) operator */ + struct PhraseToken { + char *z; /* Text of the token */ + int n; /* Number of bytes in buffer pointed to by z */ + int isPrefix; /* True if token ends in with a "*" character */ + } aToken[1]; /* One entry for each token in the phrase */ }; -/* MERGE_COUNT controls how often we merge segments (see comment at -** top of file). +/* +** A tree of these objects forms the RHS of a MATCH operator. +** +** If Fts3Expr.eType is either FTSQUERY_NEAR or FTSQUERY_PHRASE and isLoaded +** is true, then aDoclist points to a malloced buffer, size nDoclist bytes, +** containing the results of the NEAR or phrase query in FTS3 doclist +** format. As usual, the initial "Length" field found in doclists stored +** on disk is omitted from this buffer. +** +** Variable pCurrent always points to the start of a docid field within +** aDoclist. Since the doclist is usually scanned in docid order, this can +** be used to accelerate seeking to the required docid within the doclist. */ -#define MERGE_COUNT 16 +struct Fts3Expr { + int eType; /* One of the FTSQUERY_XXX values defined below */ + int nNear; /* Valid if eType==FTSQUERY_NEAR */ + Fts3Expr *pParent; /* pParent->pLeft==this or pParent->pRight==this */ + Fts3Expr *pLeft; /* Left operand */ + Fts3Expr *pRight; /* Right operand */ + Fts3Phrase *pPhrase; /* Valid if eType==FTSQUERY_PHRASE */ -/* utility functions */ + int isLoaded; /* True if aDoclist/nDoclist are initialized. */ + char *aDoclist; /* Buffer containing doclist */ + int nDoclist; /* Size of aDoclist in bytes */ + + sqlite3_int64 iCurrent; + char *pCurrent; +}; -/* CLEAR() and SCRAMBLE() abstract memset() on a pointer to a single -** record to prevent errors of the form: +/* +** Candidate values for Fts3Query.eType. Note that the order of the first +** four values is in order of precedence when parsing expressions. For +** example, the following: ** -** my_function(SomeType *b){ -** memset(b, '\0', sizeof(b)); // sizeof(b)!=sizeof(*b) -** } +** "a OR b AND c NOT d NEAR e" +** +** is equivalent to: +** +** "a OR (b AND (c NOT (d NEAR e)))" */ -/* TODO(shess) Obvious candidates for a header file. */ -#define CLEAR(b) memset(b, '\0', sizeof(*(b))) +#define FTSQUERY_NEAR 1 +#define FTSQUERY_NOT 2 +#define FTSQUERY_AND 3 +#define FTSQUERY_OR 4 +#define FTSQUERY_PHRASE 5 -#ifndef NDEBUG -# define SCRAMBLE(b) memset(b, 0x55, sizeof(*(b))) -#else -# define SCRAMBLE(b) + +/* fts3_init.c */ +SQLITE_PRIVATE int sqlite3Fts3DeleteVtab(int, sqlite3_vtab *); +SQLITE_PRIVATE int sqlite3Fts3InitVtab(int, sqlite3*, void*, int, const char*const*, + sqlite3_vtab **, char **); + +/* fts3_write.c */ +SQLITE_PRIVATE int sqlite3Fts3UpdateMethod(sqlite3_vtab*,int,sqlite3_value**,sqlite3_int64*); +SQLITE_PRIVATE int sqlite3Fts3PendingTermsFlush(Fts3Table *); +SQLITE_PRIVATE void sqlite3Fts3PendingTermsClear(Fts3Table *); +SQLITE_PRIVATE int sqlite3Fts3Optimize(Fts3Table *); +SQLITE_PRIVATE int sqlite3Fts3SegReaderNew(Fts3Table *,int, sqlite3_int64, + sqlite3_int64, sqlite3_int64, const char *, int, Fts3SegReader**); +SQLITE_PRIVATE int sqlite3Fts3SegReaderPending(Fts3Table*,const char*,int,int,Fts3SegReader**); +SQLITE_PRIVATE void sqlite3Fts3SegReaderFree(Fts3Table *, Fts3SegReader *); +SQLITE_PRIVATE int sqlite3Fts3SegReaderIterate( + Fts3Table *, Fts3SegReader **, int, Fts3SegFilter *, + int (*)(Fts3Table *, void *, char *, int, char *, int), void * +); +SQLITE_PRIVATE int sqlite3Fts3ReadBlock(Fts3Table*, sqlite3_int64, char const**, int*); +SQLITE_PRIVATE int sqlite3Fts3AllSegdirs(Fts3Table*, sqlite3_stmt **); + +/* Flags allowed as part of the 4th argument to SegmentReaderIterate() */ +#define FTS3_SEGMENT_REQUIRE_POS 0x00000001 +#define FTS3_SEGMENT_IGNORE_EMPTY 0x00000002 +#define FTS3_SEGMENT_COLUMN_FILTER 0x00000004 +#define FTS3_SEGMENT_PREFIX 0x00000008 + +/* Type passed as 4th argument to SegmentReaderIterate() */ +struct Fts3SegFilter { + const char *zTerm; + int nTerm; + int iCol; + int flags; +}; + +/* fts3.c */ +SQLITE_PRIVATE int sqlite3Fts3PutVarint(char *, sqlite3_int64); +SQLITE_PRIVATE int sqlite3Fts3GetVarint(const char *, sqlite_int64 *); +SQLITE_PRIVATE int sqlite3Fts3GetVarint32(const char *, int *); +SQLITE_PRIVATE int sqlite3Fts3VarintLen(sqlite3_uint64); +SQLITE_PRIVATE void sqlite3Fts3Dequote(char *); + +SQLITE_PRIVATE char *sqlite3Fts3FindPositions(Fts3Expr *, sqlite3_int64, int); +SQLITE_PRIVATE int sqlite3Fts3ExprLoadDoclist(Fts3Table *, Fts3Expr *); + +/* fts3_tokenizer.c */ +SQLITE_PRIVATE const char *sqlite3Fts3NextToken(const char *, int *); +SQLITE_PRIVATE int sqlite3Fts3InitHashTable(sqlite3 *, Fts3Hash *, const char *); +SQLITE_PRIVATE int sqlite3Fts3InitTokenizer(Fts3Hash *pHash, + const char *, sqlite3_tokenizer **, const char **, char ** +); + +/* fts3_snippet.c */ +SQLITE_PRIVATE void sqlite3Fts3Offsets(sqlite3_context*, Fts3Cursor*); +SQLITE_PRIVATE void sqlite3Fts3Snippet(sqlite3_context*, Fts3Cursor*, + const char *, const char *, const char * +); +SQLITE_PRIVATE void sqlite3Fts3Snippet2(sqlite3_context *, Fts3Cursor *, const char *, + const char *, const char *, int, int +); +SQLITE_PRIVATE void sqlite3Fts3Matchinfo(sqlite3_context *, Fts3Cursor *); + +/* fts3_expr.c */ +SQLITE_PRIVATE int sqlite3Fts3ExprParse(sqlite3_tokenizer *, + char **, int, int, const char *, int, Fts3Expr ** +); +SQLITE_PRIVATE void sqlite3Fts3ExprFree(Fts3Expr *); +#ifdef SQLITE_TEST +SQLITE_PRIVATE int sqlite3Fts3ExprInitTestInterface(sqlite3 *db); #endif -/* We may need up to VARINT_MAX bytes to store an encoded 64-bit integer. */ -#define VARINT_MAX 10 +#endif /* _FTSINT_H */ -/* Write a 64-bit variable-length integer to memory starting at p[0]. - * The length of data written will be between 1 and VARINT_MAX bytes. - * The number of bytes written is returned. */ -static int fts3PutVarint(char *p, sqlite_int64 v){ +/************** End of fts3Int.h *********************************************/ +/************** Continuing where we left off in fts3.c ***********************/ + + +#ifndef SQLITE_CORE + SQLITE_EXTENSION_INIT1 +#endif + +/* +** Write a 64-bit variable-length integer to memory starting at p[0]. +** The length of data written will be between 1 and FTS3_VARINT_MAX bytes. +** The number of bytes written is returned. +*/ +SQLITE_PRIVATE int sqlite3Fts3PutVarint(char *p, sqlite_int64 v){ unsigned char *q = (unsigned char *) p; sqlite_uint64 vu = v; do{ @@ -97855,9138 +98745,8501 @@ static int fts3PutVarint(char *p, sqlite_int64 v){ vu >>= 7; }while( vu!=0 ); q[-1] &= 0x7f; /* turn off high bit in final byte */ - assert( q - (unsigned char *)p <= VARINT_MAX ); + assert( q - (unsigned char *)p <= FTS3_VARINT_MAX ); return (int) (q - (unsigned char *)p); } -/* Read a 64-bit variable-length integer from memory starting at p[0]. - * Return the number of bytes read, or 0 on error. - * The value is stored in *v. */ -static int fts3GetVarint(const char *p, sqlite_int64 *v){ +/* +** Read a 64-bit variable-length integer from memory starting at p[0]. +** Return the number of bytes read, or 0 on error. +** The value is stored in *v. +*/ +SQLITE_PRIVATE int sqlite3Fts3GetVarint(const char *p, sqlite_int64 *v){ const unsigned char *q = (const unsigned char *) p; sqlite_uint64 x = 0, y = 1; - while( (*q & 0x80) == 0x80 ){ + while( (*q&0x80)==0x80 && q-(unsigned char *)p= VARINT_MAX ){ /* bad data */ - assert( 0 ); - return 0; - } } x += y * (*q++); *v = (sqlite_int64) x; return (int) (q - (unsigned char *)p); } -static int fts3GetVarint32(const char *p, int *pi){ +/* +** Similar to sqlite3Fts3GetVarint(), except that the output is truncated to a +** 32-bit integer before it is returned. +*/ +SQLITE_PRIVATE int sqlite3Fts3GetVarint32(const char *p, int *pi){ sqlite_int64 i; - int ret = fts3GetVarint(p, &i); + int ret = sqlite3Fts3GetVarint(p, &i); *pi = (int) i; - assert( *pi==i ); return ret; } -/*******************************************************************/ -/* DataBuffer is used to collect data into a buffer in piecemeal -** fashion. It implements the usual distinction between amount of -** data currently stored (nData) and buffer capacity (nCapacity). -** -** dataBufferInit - create a buffer with given initial capacity. -** dataBufferReset - forget buffer's data, retaining capacity. -** dataBufferDestroy - free buffer's data. -** dataBufferSwap - swap contents of two buffers. -** dataBufferExpand - expand capacity without adding data. -** dataBufferAppend - append data. -** dataBufferAppend2 - append two pieces of data at once. -** dataBufferReplace - replace buffer's data. -*/ -typedef struct DataBuffer { - char *pData; /* Pointer to malloc'ed buffer. */ - int nCapacity; /* Size of pData buffer. */ - int nData; /* End of data loaded into pData. */ -} DataBuffer; - -static void dataBufferInit(DataBuffer *pBuffer, int nCapacity){ - assert( nCapacity>=0 ); - pBuffer->nData = 0; - pBuffer->nCapacity = nCapacity; - pBuffer->pData = nCapacity==0 ? NULL : sqlite3_malloc(nCapacity); -} -static void dataBufferReset(DataBuffer *pBuffer){ - pBuffer->nData = 0; -} -static void dataBufferDestroy(DataBuffer *pBuffer){ - if( pBuffer->pData!=NULL ) sqlite3_free(pBuffer->pData); - SCRAMBLE(pBuffer); -} -static void dataBufferSwap(DataBuffer *pBuffer1, DataBuffer *pBuffer2){ - DataBuffer tmp = *pBuffer1; - *pBuffer1 = *pBuffer2; - *pBuffer2 = tmp; -} -static void dataBufferExpand(DataBuffer *pBuffer, int nAddCapacity){ - assert( nAddCapacity>0 ); - /* TODO(shess) Consider expanding more aggressively. Note that the - ** underlying malloc implementation may take care of such things for - ** us already. - */ - if( pBuffer->nData+nAddCapacity>pBuffer->nCapacity ){ - pBuffer->nCapacity = pBuffer->nData+nAddCapacity; - pBuffer->pData = sqlite3_realloc(pBuffer->pData, pBuffer->nCapacity); - } -} -static void dataBufferAppend(DataBuffer *pBuffer, - const char *pSource, int nSource){ - assert( nSource>0 && pSource!=NULL ); - dataBufferExpand(pBuffer, nSource); - memcpy(pBuffer->pData+pBuffer->nData, pSource, nSource); - pBuffer->nData += nSource; -} -static void dataBufferAppend2(DataBuffer *pBuffer, - const char *pSource1, int nSource1, - const char *pSource2, int nSource2){ - assert( nSource1>0 && pSource1!=NULL ); - assert( nSource2>0 && pSource2!=NULL ); - dataBufferExpand(pBuffer, nSource1+nSource2); - memcpy(pBuffer->pData+pBuffer->nData, pSource1, nSource1); - memcpy(pBuffer->pData+pBuffer->nData+nSource1, pSource2, nSource2); - pBuffer->nData += nSource1+nSource2; -} -static void dataBufferReplace(DataBuffer *pBuffer, - const char *pSource, int nSource){ - dataBufferReset(pBuffer); - dataBufferAppend(pBuffer, pSource, nSource); -} - -/* StringBuffer is a null-terminated version of DataBuffer. */ -typedef struct StringBuffer { - DataBuffer b; /* Includes null terminator. */ -} StringBuffer; - -static void initStringBuffer(StringBuffer *sb){ - dataBufferInit(&sb->b, 100); - dataBufferReplace(&sb->b, "", 1); -} -static int stringBufferLength(StringBuffer *sb){ - return sb->b.nData-1; -} -static char *stringBufferData(StringBuffer *sb){ - return sb->b.pData; -} -static void stringBufferDestroy(StringBuffer *sb){ - dataBufferDestroy(&sb->b); -} - -static void nappend(StringBuffer *sb, const char *zFrom, int nFrom){ - assert( sb->b.nData>0 ); - if( nFrom>0 ){ - sb->b.nData--; - dataBufferAppend2(&sb->b, zFrom, nFrom, "", 1); - } -} -static void append(StringBuffer *sb, const char *zFrom){ - nappend(sb, zFrom, strlen(zFrom)); -} - -/* Append a list of strings separated by commas. */ -static void appendList(StringBuffer *sb, int nString, char **azString){ - int i; - for(i=0; i0 ) append(sb, ", "); - append(sb, azString[i]); - } -} - -static int endsInWhiteSpace(StringBuffer *p){ - return stringBufferLength(p)>0 && - safe_isspace(stringBufferData(p)[stringBufferLength(p)-1]); -} - -/* If the StringBuffer ends in something other than white space, add a -** single space character to the end. +/* +** Return the number of bytes required to store the value passed as the +** first argument in varint form. */ -static void appendWhiteSpace(StringBuffer *p){ - if( stringBufferLength(p)==0 ) return; - if( !endsInWhiteSpace(p) ) append(p, " "); +SQLITE_PRIVATE int sqlite3Fts3VarintLen(sqlite3_uint64 v){ + int i = 0; + do{ + i++; + v >>= 7; + }while( v!=0 ); + return i; } -/* Remove white space from the end of the StringBuffer */ -static void trimWhiteSpace(StringBuffer *p){ - while( endsInWhiteSpace(p) ){ - p->b.pData[--p->b.nData-1] = '\0'; - } -} - -/*******************************************************************/ -/* DLReader is used to read document elements from a doclist. The -** current docid is cached, so dlrDocid() is fast. DLReader does not -** own the doclist buffer. -** -** dlrAtEnd - true if there's no more data to read. -** dlrDocid - docid of current document. -** dlrDocData - doclist data for current document (including docid). -** dlrDocDataBytes - length of same. -** dlrAllDataBytes - length of all remaining data. -** dlrPosData - position data for current document. -** dlrPosDataLen - length of pos data for current document (incl POS_END). -** dlrStep - step to current document. -** dlrInit - initial for doclist of given type against given data. -** dlrDestroy - clean up. -** -** Expected usage is something like: -** -** DLReader reader; -** dlrInit(&reader, pData, nData); -** while( !dlrAtEnd(&reader) ){ -** // calls to dlrDocid() and kin. -** dlrStep(&reader); -** } -** dlrDestroy(&reader); +/* +** Convert an SQL-style quoted string into a normal string by removing +** the quote characters. The conversion is done in-place. If the +** input does not begin with a quote character, then this routine +** is a no-op. +** +** Examples: +** +** "abc" becomes abc +** 'xyz' becomes xyz +** [pqr] becomes pqr +** `mno` becomes mno +** */ -typedef struct DLReader { - DocListType iType; - const char *pData; - int nData; +SQLITE_PRIVATE void sqlite3Fts3Dequote(char *z){ + char quote; /* Quote character (if any ) */ - sqlite_int64 iDocid; - int nElement; -} DLReader; - -static int dlrAtEnd(DLReader *pReader){ - assert( pReader->nData>=0 ); - return pReader->nData==0; -} -static sqlite_int64 dlrDocid(DLReader *pReader){ - assert( !dlrAtEnd(pReader) ); - return pReader->iDocid; -} -static const char *dlrDocData(DLReader *pReader){ - assert( !dlrAtEnd(pReader) ); - return pReader->pData; -} -static int dlrDocDataBytes(DLReader *pReader){ - assert( !dlrAtEnd(pReader) ); - return pReader->nElement; -} -static int dlrAllDataBytes(DLReader *pReader){ - assert( !dlrAtEnd(pReader) ); - return pReader->nData; -} -/* TODO(shess) Consider adding a field to track iDocid varint length -** to make these two functions faster. This might matter (a tiny bit) -** for queries. -*/ -static const char *dlrPosData(DLReader *pReader){ - sqlite_int64 iDummy; - int n = fts3GetVarint(pReader->pData, &iDummy); - assert( !dlrAtEnd(pReader) ); - return pReader->pData+n; -} -static int dlrPosDataLen(DLReader *pReader){ - sqlite_int64 iDummy; - int n = fts3GetVarint(pReader->pData, &iDummy); - assert( !dlrAtEnd(pReader) ); - return pReader->nElement-n; -} -static void dlrStep(DLReader *pReader){ - assert( !dlrAtEnd(pReader) ); - - /* Skip past current doclist element. */ - assert( pReader->nElement<=pReader->nData ); - pReader->pData += pReader->nElement; - pReader->nData -= pReader->nElement; - - /* If there is more data, read the next doclist element. */ - if( pReader->nData!=0 ){ - sqlite_int64 iDocidDelta; - int iDummy, n = fts3GetVarint(pReader->pData, &iDocidDelta); - pReader->iDocid += iDocidDelta; - if( pReader->iType>=DL_POSITIONS ){ - assert( nnData ); - while( 1 ){ - n += fts3GetVarint32(pReader->pData+n, &iDummy); - assert( n<=pReader->nData ); - if( iDummy==POS_END ) break; - if( iDummy==POS_COLUMN ){ - n += fts3GetVarint32(pReader->pData+n, &iDummy); - assert( nnData ); - }else if( pReader->iType==DL_POSITIONS_OFFSETS ){ - n += fts3GetVarint32(pReader->pData+n, &iDummy); - n += fts3GetVarint32(pReader->pData+n, &iDummy); - assert( nnData ); - } + quote = z[0]; + if( quote=='[' || quote=='\'' || quote=='"' || quote=='`' ){ + int iIn = 1; /* Index of next byte to read from input */ + int iOut = 0; /* Index of next byte to write to output */ + + /* If the first byte was a '[', then the close-quote character is a ']' */ + if( quote=='[' ) quote = ']'; + + while( ALWAYS(z[iIn]) ){ + if( z[iIn]==quote ){ + if( z[iIn+1]!=quote ) break; + z[iOut++] = quote; + iIn += 2; + }else{ + z[iOut++] = z[iIn++]; } } - pReader->nElement = n; - assert( pReader->nElement<=pReader->nData ); + z[iOut] = '\0'; } } -static void dlrInit(DLReader *pReader, DocListType iType, - const char *pData, int nData){ - assert( pData!=NULL && nData!=0 ); - pReader->iType = iType; - pReader->pData = pData; - pReader->nData = nData; - pReader->nElement = 0; - pReader->iDocid = 0; - /* Load the first element's data. There must be a first element. */ - dlrStep(pReader); -} -static void dlrDestroy(DLReader *pReader){ - SCRAMBLE(pReader); +static void fts3GetDeltaVarint(char **pp, sqlite3_int64 *pVal){ + sqlite3_int64 iVal; + *pp += sqlite3Fts3GetVarint(*pp, &iVal); + *pVal += iVal; } -#ifndef NDEBUG -/* Verify that the doclist can be validly decoded. Also returns the -** last docid found because it is convenient in other assertions for -** DLWriter. -*/ -static void docListValidate(DocListType iType, const char *pData, int nData, - sqlite_int64 *pLastDocid){ - sqlite_int64 iPrevDocid = 0; - assert( nData>0 ); - assert( pData!=0 ); - assert( pData+nData>pData ); - while( nData!=0 ){ - sqlite_int64 iDocidDelta; - int n = fts3GetVarint(pData, &iDocidDelta); - iPrevDocid += iDocidDelta; - if( iType>DL_DOCIDS ){ - int iDummy; - while( 1 ){ - n += fts3GetVarint32(pData+n, &iDummy); - if( iDummy==POS_END ) break; - if( iDummy==POS_COLUMN ){ - n += fts3GetVarint32(pData+n, &iDummy); - }else if( iType>DL_POSITIONS ){ - n += fts3GetVarint32(pData+n, &iDummy); - n += fts3GetVarint32(pData+n, &iDummy); - } - assert( n<=nData ); - } - } - assert( n<=nData ); - pData += n; - nData -= n; +static void fts3GetDeltaVarint2(char **pp, char *pEnd, sqlite3_int64 *pVal){ + if( *pp>=pEnd ){ + *pp = 0; + }else{ + fts3GetDeltaVarint(pp, pVal); } - if( pLastDocid ) *pLastDocid = iPrevDocid; } -#define ASSERT_VALID_DOCLIST(i, p, n, o) docListValidate(i, p, n, o) -#else -#define ASSERT_VALID_DOCLIST(i, p, n, o) assert( 1 ) -#endif - -/*******************************************************************/ -/* DLWriter is used to write doclist data to a DataBuffer. DLWriter -** always appends to the buffer and does not own it. -** -** dlwInit - initialize to write a given type doclistto a buffer. -** dlwDestroy - clear the writer's memory. Does not free buffer. -** dlwAppend - append raw doclist data to buffer. -** dlwCopy - copy next doclist from reader to writer. -** dlwAdd - construct doclist element and append to buffer. -** Only apply dlwAdd() to DL_DOCIDS doclists (else use PLWriter). -*/ -typedef struct DLWriter { - DocListType iType; - DataBuffer *b; - sqlite_int64 iPrevDocid; -#ifndef NDEBUG - int has_iPrevDocid; -#endif -} DLWriter; -static void dlwInit(DLWriter *pWriter, DocListType iType, DataBuffer *b){ - pWriter->b = b; - pWriter->iType = iType; - pWriter->iPrevDocid = 0; -#ifndef NDEBUG - pWriter->has_iPrevDocid = 0; -#endif -} -static void dlwDestroy(DLWriter *pWriter){ - SCRAMBLE(pWriter); -} -/* iFirstDocid is the first docid in the doclist in pData. It is -** needed because pData may point within a larger doclist, in which -** case the first item would be delta-encoded. -** -** iLastDocid is the final docid in the doclist in pData. It is -** needed to create the new iPrevDocid for future delta-encoding. The -** code could decode the passed doclist to recreate iLastDocid, but -** the only current user (docListMerge) already has decoded this -** information. -*/ -/* TODO(shess) This has become just a helper for docListMerge. -** Consider a refactor to make this cleaner. +/* +** The xDisconnect() virtual table method. */ -static void dlwAppend(DLWriter *pWriter, - const char *pData, int nData, - sqlite_int64 iFirstDocid, sqlite_int64 iLastDocid){ - sqlite_int64 iDocid = 0; - char c[VARINT_MAX]; - int nFirstOld, nFirstNew; /* Old and new varint len of first docid. */ -#ifndef NDEBUG - sqlite_int64 iLastDocidDelta; -#endif - - /* Recode the initial docid as delta from iPrevDocid. */ - nFirstOld = fts3GetVarint(pData, &iDocid); - assert( nFirstOldiType==DL_DOCIDS) ); - nFirstNew = fts3PutVarint(c, iFirstDocid-pWriter->iPrevDocid); +static int fts3DisconnectMethod(sqlite3_vtab *pVtab){ + Fts3Table *p = (Fts3Table *)pVtab; + int i; - /* Verify that the incoming doclist is valid AND that it ends with - ** the expected docid. This is essential because we'll trust this - ** docid in future delta-encoding. - */ - ASSERT_VALID_DOCLIST(pWriter->iType, pData, nData, &iLastDocidDelta); - assert( iLastDocid==iFirstDocid-iDocid+iLastDocidDelta ); + assert( p->nPendingData==0 ); - /* Append recoded initial docid and everything else. Rest of docids - ** should have been delta-encoded from previous initial docid. - */ - if( nFirstOldb, c, nFirstNew, - pData+nFirstOld, nData-nFirstOld); - }else{ - dataBufferAppend(pWriter->b, c, nFirstNew); + /* Free any prepared statements held */ + for(i=0; iaStmt); i++){ + sqlite3_finalize(p->aStmt[i]); } - pWriter->iPrevDocid = iLastDocid; -} -static void dlwCopy(DLWriter *pWriter, DLReader *pReader){ - dlwAppend(pWriter, dlrDocData(pReader), dlrDocDataBytes(pReader), - dlrDocid(pReader), dlrDocid(pReader)); -} -static void dlwAdd(DLWriter *pWriter, sqlite_int64 iDocid){ - char c[VARINT_MAX]; - int n = fts3PutVarint(c, iDocid-pWriter->iPrevDocid); + for(i=0; inLeavesStmt; i++){ + sqlite3_finalize(p->aLeavesStmt[i]); + } + sqlite3_free(p->zSelectLeaves); + sqlite3_free(p->aLeavesStmt); - /* Docids must ascend. */ - assert( !pWriter->has_iPrevDocid || iDocid>pWriter->iPrevDocid ); - assert( pWriter->iType==DL_DOCIDS ); + /* Invoke the tokenizer destructor to free the tokenizer. */ + p->pTokenizer->pModule->xDestroy(p->pTokenizer); - dataBufferAppend(pWriter->b, c, n); - pWriter->iPrevDocid = iDocid; -#ifndef NDEBUG - pWriter->has_iPrevDocid = 1; -#endif + sqlite3_free(p); + return SQLITE_OK; } -/*******************************************************************/ -/* PLReader is used to read data from a document's position list. As -** the caller steps through the list, data is cached so that varints -** only need to be decoded once. -** -** plrInit, plrDestroy - create/destroy a reader. -** plrColumn, plrPosition, plrStartOffset, plrEndOffset - accessors -** plrAtEnd - at end of stream, only call plrDestroy once true. -** plrStep - step to the next element. +/* +** The xDestroy() virtual table method. */ -typedef struct PLReader { - /* These refer to the next position's data. nData will reach 0 when - ** reading the last position, so plrStep() signals EOF by setting - ** pData to NULL. - */ - const char *pData; - int nData; +static int fts3DestroyMethod(sqlite3_vtab *pVtab){ + int rc; /* Return code */ + Fts3Table *p = (Fts3Table *)pVtab; - DocListType iType; - int iColumn; /* the last column read */ - int iPosition; /* the last position read */ - int iStartOffset; /* the last start offset read */ - int iEndOffset; /* the last end offset read */ -} PLReader; + /* Create a script to drop the underlying three storage tables. */ + char *zSql = sqlite3_mprintf( + "DROP TABLE IF EXISTS %Q.'%q_content';" + "DROP TABLE IF EXISTS %Q.'%q_segments';" + "DROP TABLE IF EXISTS %Q.'%q_segdir';", + p->zDb, p->zName, p->zDb, p->zName, p->zDb, p->zName + ); -static int plrAtEnd(PLReader *pReader){ - return pReader->pData==NULL; -} -static int plrColumn(PLReader *pReader){ - assert( !plrAtEnd(pReader) ); - return pReader->iColumn; -} -static int plrPosition(PLReader *pReader){ - assert( !plrAtEnd(pReader) ); - return pReader->iPosition; -} -static int plrStartOffset(PLReader *pReader){ - assert( !plrAtEnd(pReader) ); - return pReader->iStartOffset; -} -static int plrEndOffset(PLReader *pReader){ - assert( !plrAtEnd(pReader) ); - return pReader->iEndOffset; + /* If malloc has failed, set rc to SQLITE_NOMEM. Otherwise, try to + ** execute the SQL script created above. + */ + if( zSql ){ + rc = sqlite3_exec(p->db, zSql, 0, 0, 0); + sqlite3_free(zSql); + }else{ + rc = SQLITE_NOMEM; + } + + /* If everything has worked, invoke fts3DisconnectMethod() to free the + ** memory associated with the Fts3Table structure and return SQLITE_OK. + ** Otherwise, return an SQLite error code. + */ + return (rc==SQLITE_OK ? fts3DisconnectMethod(pVtab) : rc); } -static void plrStep(PLReader *pReader){ - int i, n; - assert( !plrAtEnd(pReader) ); - if( pReader->nData==0 ){ - pReader->pData = NULL; - return; - } +/* +** Invoke sqlite3_declare_vtab() to declare the schema for the FTS3 table +** passed as the first argument. This is done as part of the xConnect() +** and xCreate() methods. +*/ +static int fts3DeclareVtab(Fts3Table *p){ + int i; /* Iterator variable */ + int rc; /* Return code */ + char *zSql; /* SQL statement passed to declare_vtab() */ + char *zCols; /* List of user defined columns */ - n = fts3GetVarint32(pReader->pData, &i); - if( i==POS_COLUMN ){ - n += fts3GetVarint32(pReader->pData+n, &pReader->iColumn); - pReader->iPosition = 0; - pReader->iStartOffset = 0; - n += fts3GetVarint32(pReader->pData+n, &i); + /* Create a list of user columns for the virtual table */ + zCols = sqlite3_mprintf("%Q, ", p->azColumn[0]); + for(i=1; zCols && inColumn; i++){ + zCols = sqlite3_mprintf("%z%Q, ", zCols, p->azColumn[i]); } - /* Should never see adjacent column changes. */ - assert( i!=POS_COLUMN ); - if( i==POS_END ){ - pReader->nData = 0; - pReader->pData = NULL; - return; - } + /* Create the whole "CREATE TABLE" statement to pass to SQLite */ + zSql = sqlite3_mprintf( + "CREATE TABLE x(%s %Q HIDDEN, docid HIDDEN)", zCols, p->zName + ); - pReader->iPosition += i-POS_BASE; - if( pReader->iType==DL_POSITIONS_OFFSETS ){ - n += fts3GetVarint32(pReader->pData+n, &i); - pReader->iStartOffset += i; - n += fts3GetVarint32(pReader->pData+n, &i); - pReader->iEndOffset = pReader->iStartOffset+i; + if( !zCols || !zSql ){ + rc = SQLITE_NOMEM; + }else{ + rc = sqlite3_declare_vtab(p->db, zSql); } - assert( n<=pReader->nData ); - pReader->pData += n; - pReader->nData -= n; -} -static void plrInit(PLReader *pReader, DLReader *pDLReader){ - pReader->pData = dlrPosData(pDLReader); - pReader->nData = dlrPosDataLen(pDLReader); - pReader->iType = pDLReader->iType; - pReader->iColumn = 0; - pReader->iPosition = 0; - pReader->iStartOffset = 0; - pReader->iEndOffset = 0; - plrStep(pReader); -} -static void plrDestroy(PLReader *pReader){ - SCRAMBLE(pReader); + sqlite3_free(zSql); + sqlite3_free(zCols); + return rc; } -/*******************************************************************/ -/* PLWriter is used in constructing a document's position list. As a -** convenience, if iType is DL_DOCIDS, PLWriter becomes a no-op. -** PLWriter writes to the associated DLWriter's buffer. -** -** plwInit - init for writing a document's poslist. -** plwDestroy - clear a writer. -** plwAdd - append position and offset information. -** plwCopy - copy next position's data from reader to writer. -** plwTerminate - add any necessary doclist terminator. -** -** Calling plwAdd() after plwTerminate() may result in a corrupt -** doclist. -*/ -/* TODO(shess) Until we've written the second item, we can cache the -** first item's information. Then we'd have three states: -** -** - initialized with docid, no positions. -** - docid and one position. -** - docid and multiple positions. -** -** Only the last state needs to actually write to dlw->b, which would -** be an improvement in the DLCollector case. +/* +** Create the backing store tables (%_content, %_segments and %_segdir) +** required by the FTS3 table passed as the only argument. This is done +** as part of the vtab xCreate() method. */ -typedef struct PLWriter { - DLWriter *dlw; - - int iColumn; /* the last column written */ - int iPos; /* the last position written */ - int iOffset; /* the last start offset written */ -} PLWriter; +static int fts3CreateTables(Fts3Table *p){ + int rc; /* Return code */ + int i; /* Iterator variable */ + char *zContentCols; /* Columns of %_content table */ + char *zSql; /* SQL script to create required tables */ + + /* Create a list of user columns for the content table */ + zContentCols = sqlite3_mprintf("docid INTEGER PRIMARY KEY"); + for(i=0; zContentCols && inColumn; i++){ + char *z = p->azColumn[i]; + zContentCols = sqlite3_mprintf("%z, 'c%d%q'", zContentCols, i, z); + } + + /* Create the whole SQL script */ + zSql = sqlite3_mprintf( + "CREATE TABLE %Q.'%q_content'(%s);" + "CREATE TABLE %Q.'%q_segments'(blockid INTEGER PRIMARY KEY, block BLOB);" + "CREATE TABLE %Q.'%q_segdir'(" + "level INTEGER," + "idx INTEGER," + "start_block INTEGER," + "leaves_end_block INTEGER," + "end_block INTEGER," + "root BLOB," + "PRIMARY KEY(level, idx)" + ");", + p->zDb, p->zName, zContentCols, p->zDb, p->zName, p->zDb, p->zName + ); -/* TODO(shess) In the case where the parent is reading these values -** from a PLReader, we could optimize to a copy if that PLReader has -** the same type as pWriter. -*/ -static void plwAdd(PLWriter *pWriter, int iColumn, int iPos, - int iStartOffset, int iEndOffset){ - /* Worst-case space for POS_COLUMN, iColumn, iPosDelta, - ** iStartOffsetDelta, and iEndOffsetDelta. + /* Unless a malloc() failure has occurred, execute the SQL script to + ** create the tables used to store data for this FTS3 virtual table. */ - char c[5*VARINT_MAX]; - int n = 0; - - /* Ban plwAdd() after plwTerminate(). */ - assert( pWriter->iPos!=-1 ); - - if( pWriter->dlw->iType==DL_DOCIDS ) return; - - if( iColumn!=pWriter->iColumn ){ - n += fts3PutVarint(c+n, POS_COLUMN); - n += fts3PutVarint(c+n, iColumn); - pWriter->iColumn = iColumn; - pWriter->iPos = 0; - pWriter->iOffset = 0; - } - assert( iPos>=pWriter->iPos ); - n += fts3PutVarint(c+n, POS_BASE+(iPos-pWriter->iPos)); - pWriter->iPos = iPos; - if( pWriter->dlw->iType==DL_POSITIONS_OFFSETS ){ - assert( iStartOffset>=pWriter->iOffset ); - n += fts3PutVarint(c+n, iStartOffset-pWriter->iOffset); - pWriter->iOffset = iStartOffset; - assert( iEndOffset>=iStartOffset ); - n += fts3PutVarint(c+n, iEndOffset-iStartOffset); + if( zContentCols==0 || zSql==0 ){ + rc = SQLITE_NOMEM; + }else{ + rc = sqlite3_exec(p->db, zSql, 0, 0, 0); } - dataBufferAppend(pWriter->dlw->b, c, n); -} -static void plwCopy(PLWriter *pWriter, PLReader *pReader){ - plwAdd(pWriter, plrColumn(pReader), plrPosition(pReader), - plrStartOffset(pReader), plrEndOffset(pReader)); + + sqlite3_free(zSql); + sqlite3_free(zContentCols); + return rc; } -static void plwInit(PLWriter *pWriter, DLWriter *dlw, sqlite_int64 iDocid){ - char c[VARINT_MAX]; - int n; - pWriter->dlw = dlw; +/* +** This function is the implementation of both the xConnect and xCreate +** methods of the FTS3 virtual table. +** +** The argv[] array contains the following: +** +** argv[0] -> module name +** argv[1] -> database name +** argv[2] -> table name +** argv[...] -> "column name" and other module argument fields. +*/ +static int fts3InitVtab( + int isCreate, /* True for xCreate, false for xConnect */ + sqlite3 *db, /* The SQLite database connection */ + void *pAux, /* Hash table containing tokenizers */ + int argc, /* Number of elements in argv array */ + const char * const *argv, /* xCreate/xConnect argument array */ + sqlite3_vtab **ppVTab, /* Write the resulting vtab structure here */ + char **pzErr /* Write any error message here */ +){ + Fts3Hash *pHash = (Fts3Hash *)pAux; + Fts3Table *p; /* Pointer to allocated vtab */ + int rc; /* Return code */ + int i; /* Iterator variable */ + int nByte; /* Size of allocation used for *p */ + int iCol; + int nString = 0; + int nCol = 0; + char *zCsr; + int nDb; + int nName; - /* Docids must ascend. */ - assert( !pWriter->dlw->has_iPrevDocid || iDocid>pWriter->dlw->iPrevDocid ); - n = fts3PutVarint(c, iDocid-pWriter->dlw->iPrevDocid); - dataBufferAppend(pWriter->dlw->b, c, n); - pWriter->dlw->iPrevDocid = iDocid; -#ifndef NDEBUG - pWriter->dlw->has_iPrevDocid = 1; -#endif + const char *zTokenizer = 0; /* Name of tokenizer to use */ + sqlite3_tokenizer *pTokenizer = 0; /* Tokenizer for this table */ - pWriter->iColumn = 0; - pWriter->iPos = 0; - pWriter->iOffset = 0; -} -/* TODO(shess) Should plwDestroy() also terminate the doclist? But -** then plwDestroy() would no longer be just a destructor, it would -** also be doing work, which isn't consistent with the overall idiom. -** Another option would be for plwAdd() to always append any necessary -** terminator, so that the output is always correct. But that would -** add incremental work to the common case with the only benefit being -** API elegance. Punt for now. -*/ -static void plwTerminate(PLWriter *pWriter){ - if( pWriter->dlw->iType>DL_DOCIDS ){ - char c[VARINT_MAX]; - int n = fts3PutVarint(c, POS_END); - dataBufferAppend(pWriter->dlw->b, c, n); + nDb = (int)strlen(argv[1]) + 1; + nName = (int)strlen(argv[2]) + 1; + for(i=3; iiPos = -1; -#endif -} -static void plwDestroy(PLWriter *pWriter){ - SCRAMBLE(pWriter); -} - -/*******************************************************************/ -/* DLCollector wraps PLWriter and DLWriter to provide a -** dynamically-allocated doclist area to use during tokenization. -** -** dlcNew - malloc up and initialize a collector. -** dlcDelete - destroy a collector and all contained items. -** dlcAddPos - append position and offset information. -** dlcAddDoclist - add the collected doclist to the given buffer. -** dlcNext - terminate the current document and open another. -*/ -typedef struct DLCollector { - DataBuffer b; - DLWriter dlw; - PLWriter plw; -} DLCollector; - -/* TODO(shess) This could also be done by calling plwTerminate() and -** dataBufferAppend(). I tried that, expecting nominal performance -** differences, but it seemed to pretty reliably be worth 1% to code -** it this way. I suspect it is the incremental malloc overhead (some -** percentage of the plwTerminate() calls will cause a realloc), so -** this might be worth revisiting if the DataBuffer implementation -** changes. -*/ -static void dlcAddDoclist(DLCollector *pCollector, DataBuffer *b){ - if( pCollector->dlw.iType>DL_DOCIDS ){ - char c[VARINT_MAX]; - int n = fts3PutVarint(c, POS_END); - dataBufferAppend2(b, pCollector->b.pData, pCollector->b.nData, c, n); - }else{ - dataBufferAppend(b, pCollector->b.pData, pCollector->b.nData); + nCol = argc - 3 - (zTokenizer!=0); + if( zTokenizer==0 ){ + rc = sqlite3Fts3InitTokenizer(pHash, 0, &pTokenizer, 0, pzErr); + if( rc!=SQLITE_OK ){ + return rc; + } + assert( pTokenizer ); } -} -static void dlcNext(DLCollector *pCollector, sqlite_int64 iDocid){ - plwTerminate(&pCollector->plw); - plwDestroy(&pCollector->plw); - plwInit(&pCollector->plw, &pCollector->dlw, iDocid); -} -static void dlcAddPos(DLCollector *pCollector, int iColumn, int iPos, - int iStartOffset, int iEndOffset){ - plwAdd(&pCollector->plw, iColumn, iPos, iStartOffset, iEndOffset); -} - -static DLCollector *dlcNew(sqlite_int64 iDocid, DocListType iType){ - DLCollector *pCollector = sqlite3_malloc(sizeof(DLCollector)); - dataBufferInit(&pCollector->b, 0); - dlwInit(&pCollector->dlw, iType, &pCollector->b); - plwInit(&pCollector->plw, &pCollector->dlw, iDocid); - return pCollector; -} -static void dlcDelete(DLCollector *pCollector){ - plwDestroy(&pCollector->plw); - dlwDestroy(&pCollector->dlw); - dataBufferDestroy(&pCollector->b); - SCRAMBLE(pCollector); - sqlite3_free(pCollector); -} + if( nCol==0 ){ + nCol = 1; + } -/* Copy the doclist data of iType in pData/nData into *out, trimming -** unnecessary data as we go. Only columns matching iColumn are -** copied, all columns copied if iColumn is -1. Elements with no -** matching columns are dropped. The output is an iOutType doclist. -*/ -/* NOTE(shess) This code is only valid after all doclists are merged. -** If this is run before merges, then doclist items which represent -** deletion will be trimmed, and will thus not effect a deletion -** during the merge. -*/ -static void docListTrim(DocListType iType, const char *pData, int nData, - int iColumn, DocListType iOutType, DataBuffer *out){ - DLReader dlReader; - DLWriter dlWriter; + /* Allocate and populate the Fts3Table structure. */ + nByte = sizeof(Fts3Table) + /* Fts3Table */ + nCol * sizeof(char *) + /* azColumn */ + nName + /* zName */ + nDb + /* zDb */ + nString; /* Space for azColumn strings */ + p = (Fts3Table*)sqlite3_malloc(nByte); + if( p==0 ){ + rc = SQLITE_NOMEM; + goto fts3_init_out; + } + memset(p, 0, nByte); - assert( iOutType<=iType ); + p->db = db; + p->nColumn = nCol; + p->nPendingData = 0; + p->azColumn = (char **)&p[1]; + p->pTokenizer = pTokenizer; + p->nNodeSize = 1000; + p->nMaxPendingData = FTS3_MAX_PENDING_DATA; + zCsr = (char *)&p->azColumn[nCol]; + + fts3HashInit(&p->pendingTerms, FTS3_HASH_STRING, 1); + + /* Fill in the zName and zDb fields of the vtab structure. */ + p->zName = zCsr; + memcpy(zCsr, argv[2], nName); + zCsr += nName; + p->zDb = zCsr; + memcpy(zCsr, argv[1], nDb); + zCsr += nDb; + + /* Fill in the azColumn array */ + iCol = 0; + for(i=3; iazColumn[iCol++] = zCsr; + zCsr += n+1; + assert( zCsr <= &((char *)p)[nByte] ); + } + } + if( iCol==0 ){ + assert( nCol==1 ); + p->azColumn[0] = "content"; + } - dlrInit(&dlReader, iType, pData, nData); - dlwInit(&dlWriter, iOutType, out); + /* If this is an xCreate call, create the underlying tables in the + ** database. TODO: For xConnect(), it could verify that said tables exist. + */ + if( isCreate ){ + rc = fts3CreateTables(p); + if( rc!=SQLITE_OK ) goto fts3_init_out; + } - while( !dlrAtEnd(&dlReader) ){ - PLReader plReader; - PLWriter plWriter; - int match = 0; + rc = fts3DeclareVtab(p); + if( rc!=SQLITE_OK ) goto fts3_init_out; - plrInit(&plReader, &dlReader); + *ppVTab = &p->base; - while( !plrAtEnd(&plReader) ){ - if( iColumn==-1 || plrColumn(&plReader)==iColumn ){ - if( !match ){ - plwInit(&plWriter, &dlWriter, dlrDocid(&dlReader)); - match = 1; - } - plwAdd(&plWriter, plrColumn(&plReader), plrPosition(&plReader), - plrStartOffset(&plReader), plrEndOffset(&plReader)); - } - plrStep(&plReader); - } - if( match ){ - plwTerminate(&plWriter); - plwDestroy(&plWriter); +fts3_init_out: + assert( p || (pTokenizer && rc!=SQLITE_OK) ); + if( rc!=SQLITE_OK ){ + if( p ){ + fts3DisconnectMethod((sqlite3_vtab *)p); + }else{ + pTokenizer->pModule->xDestroy(pTokenizer); } - - plrDestroy(&plReader); - dlrStep(&dlReader); } - dlwDestroy(&dlWriter); - dlrDestroy(&dlReader); + return rc; +} + +/* +** The xConnect() and xCreate() methods for the virtual table. All the +** work is done in function fts3InitVtab(). +*/ +static int fts3ConnectMethod( + sqlite3 *db, /* Database connection */ + void *pAux, /* Pointer to tokenizer hash table */ + int argc, /* Number of elements in argv array */ + const char * const *argv, /* xCreate/xConnect argument array */ + sqlite3_vtab **ppVtab, /* OUT: New sqlite3_vtab object */ + char **pzErr /* OUT: sqlite3_malloc'd error message */ +){ + return fts3InitVtab(0, db, pAux, argc, argv, ppVtab, pzErr); +} +static int fts3CreateMethod( + sqlite3 *db, /* Database connection */ + void *pAux, /* Pointer to tokenizer hash table */ + int argc, /* Number of elements in argv array */ + const char * const *argv, /* xCreate/xConnect argument array */ + sqlite3_vtab **ppVtab, /* OUT: New sqlite3_vtab object */ + char **pzErr /* OUT: sqlite3_malloc'd error message */ +){ + return fts3InitVtab(1, db, pAux, argc, argv, ppVtab, pzErr); } -/* Used by docListMerge() to keep doclists in the ascending order by -** docid, then ascending order by age (so the newest comes first). +/* +** Implementation of the xBestIndex method for FTS3 tables. There +** are three possible strategies, in order of preference: +** +** 1. Direct lookup by rowid or docid. +** 2. Full-text search using a MATCH operator on a non-docid column. +** 3. Linear scan of %_content table. */ -typedef struct OrderedDLReader { - DLReader *pReader; +static int fts3BestIndexMethod(sqlite3_vtab *pVTab, sqlite3_index_info *pInfo){ + Fts3Table *p = (Fts3Table *)pVTab; + int i; /* Iterator variable */ + int iCons = -1; /* Index of constraint to use */ - /* TODO(shess) If we assume that docListMerge pReaders is ordered by - ** age (which we do), then we could use pReader comparisons to break - ** ties. + /* By default use a full table scan. This is an expensive option, + ** so search through the constraints to see if a more efficient + ** strategy is possible. */ - int idx; -} OrderedDLReader; + pInfo->idxNum = FTS3_FULLSCAN_SEARCH; + pInfo->estimatedCost = 500000; + for(i=0; inConstraint; i++){ + struct sqlite3_index_constraint *pCons = &pInfo->aConstraint[i]; + if( pCons->usable==0 ) continue; -/* Order eof to end, then by docid asc, idx desc. */ -static int orderedDLReaderCmp(OrderedDLReader *r1, OrderedDLReader *r2){ - if( dlrAtEnd(r1->pReader) ){ - if( dlrAtEnd(r2->pReader) ) return 0; /* Both atEnd(). */ - return 1; /* Only r1 atEnd(). */ - } - if( dlrAtEnd(r2->pReader) ) return -1; /* Only r2 atEnd(). */ + /* A direct lookup on the rowid or docid column. Assign a cost of 1.0. */ + if( pCons->op==SQLITE_INDEX_CONSTRAINT_EQ + && (pCons->iColumn<0 || pCons->iColumn==p->nColumn+1 ) + ){ + pInfo->idxNum = FTS3_DOCID_SEARCH; + pInfo->estimatedCost = 1.0; + iCons = i; + } - if( dlrDocid(r1->pReader)pReader) ) return -1; - if( dlrDocid(r1->pReader)>dlrDocid(r2->pReader) ) return 1; + /* A MATCH constraint. Use a full-text search. + ** + ** If there is more than one MATCH constraint available, use the first + ** one encountered. If there is both a MATCH constraint and a direct + ** rowid/docid lookup, prefer the MATCH strategy. This is done even + ** though the rowid/docid lookup is faster than a MATCH query, selecting + ** it would lead to an "unable to use function MATCH in the requested + ** context" error. + */ + if( pCons->op==SQLITE_INDEX_CONSTRAINT_MATCH + && pCons->iColumn>=0 && pCons->iColumn<=p->nColumn + ){ + pInfo->idxNum = FTS3_FULLTEXT_SEARCH + pCons->iColumn; + pInfo->estimatedCost = 2.0; + iCons = i; + break; + } + } - /* Descending on idx. */ - return r2->idx-r1->idx; + if( iCons>=0 ){ + pInfo->aConstraintUsage[iCons].argvIndex = 1; + pInfo->aConstraintUsage[iCons].omit = 1; + } + return SQLITE_OK; } -/* Bubble p[0] to appropriate place in p[1..n-1]. Assumes that -** p[1..n-1] is already sorted. -*/ -/* TODO(shess) Is this frequent enough to warrant a binary search? -** Before implementing that, instrument the code to check. In most -** current usage, I expect that p[0] will be less than p[1] a very -** high proportion of the time. +/* +** Implementation of xOpen method. */ -static void orderedDLReaderReorder(OrderedDLReader *p, int n){ - while( n>1 && orderedDLReaderCmp(p, p+1)>0 ){ - OrderedDLReader tmp = p[0]; - p[0] = p[1]; - p[1] = tmp; - n--; - p++; - } -} +static int fts3OpenMethod(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCsr){ + sqlite3_vtab_cursor *pCsr; /* Allocated cursor */ -/* Given an array of doclist readers, merge their doclist elements -** into out in sorted order (by docid), dropping elements from older -** readers when there is a duplicate docid. pReaders is assumed to be -** ordered by age, oldest first. -*/ -/* TODO(shess) nReaders must be <= MERGE_COUNT. This should probably -** be fixed. -*/ -static void docListMerge(DataBuffer *out, - DLReader *pReaders, int nReaders){ - OrderedDLReader readers[MERGE_COUNT]; - DLWriter writer; - int i, n; - const char *pStart = 0; - int nStart = 0; - sqlite_int64 iFirstDocid = 0, iLastDocid = 0; + UNUSED_PARAMETER(pVTab); - assert( nReaders>0 ); - if( nReaders==1 ){ - dataBufferAppend(out, dlrDocData(pReaders), dlrAllDataBytes(pReaders)); - return; + /* Allocate a buffer large enough for an Fts3Cursor structure. If the + ** allocation succeeds, zero it and return SQLITE_OK. Otherwise, + ** if the allocation fails, return SQLITE_NOMEM. + */ + *ppCsr = pCsr = (sqlite3_vtab_cursor *)sqlite3_malloc(sizeof(Fts3Cursor)); + if( !pCsr ){ + return SQLITE_NOMEM; } + memset(pCsr, 0, sizeof(Fts3Cursor)); + return SQLITE_OK; +} - assert( nReaders<=MERGE_COUNT ); - n = 0; - for(i=0; i0 ){ - orderedDLReaderReorder(readers+i, nReaders-i); - } - dlwInit(&writer, pReaders[0].iType, out); - while( !dlrAtEnd(readers[0].pReader) ){ - sqlite_int64 iDocid = dlrDocid(readers[0].pReader); +/* +** Close the cursor. For additional information see the documentation +** on the xClose method of the virtual table interface. +*/ +static int fulltextClose(sqlite3_vtab_cursor *pCursor){ + Fts3Cursor *pCsr = (Fts3Cursor *)pCursor; + sqlite3_finalize(pCsr->pStmt); + sqlite3Fts3ExprFree(pCsr->pExpr); + sqlite3_free(pCsr->aDoclist); + sqlite3_free(pCsr->aMatchinfo); + sqlite3_free(pCsr); + return SQLITE_OK; +} - /* If this is a continuation of the current buffer to copy, extend - ** that buffer. memcpy() seems to be more efficient if it has a - ** lots of data to copy. - */ - if( dlrDocData(readers[0].pReader)==pStart+nStart ){ - nStart += dlrDocDataBytes(readers[0].pReader); +static int fts3CursorSeek(sqlite3_context *pContext, Fts3Cursor *pCsr){ + if( pCsr->isRequireSeek ){ + pCsr->isRequireSeek = 0; + sqlite3_bind_int64(pCsr->pStmt, 1, pCsr->iPrevId); + if( SQLITE_ROW==sqlite3_step(pCsr->pStmt) ){ + return SQLITE_OK; }else{ - if( pStart!=0 ){ - dlwAppend(&writer, pStart, nStart, iFirstDocid, iLastDocid); + int rc = sqlite3_reset(pCsr->pStmt); + if( rc==SQLITE_OK ){ + /* If no row was found and no error has occured, then the %_content + ** table is missing a row that is present in the full-text index. + ** The data structures are corrupt. + */ + rc = SQLITE_CORRUPT; } - pStart = dlrDocData(readers[0].pReader); - nStart = dlrDocDataBytes(readers[0].pReader); - iFirstDocid = iDocid; + pCsr->isEof = 1; + if( pContext ){ + sqlite3_result_error_code(pContext, rc); + } + return rc; } - iLastDocid = iDocid; - dlrStep(readers[0].pReader); + }else{ + return SQLITE_OK; + } +} - /* Drop all of the older elements with the same docid. */ - for(i=1; i0 ){ - orderedDLReaderReorder(readers+i, nReaders-i); + if( pCsr->aDoclist==0 ){ + if( SQLITE_ROW!=sqlite3_step(pCsr->pStmt) ){ + pCsr->isEof = 1; + rc = sqlite3_reset(pCsr->pStmt); } + }else if( pCsr->pNextId>=&pCsr->aDoclist[pCsr->nDoclist] ){ + pCsr->isEof = 1; + }else{ + sqlite3_reset(pCsr->pStmt); + fts3GetDeltaVarint(&pCsr->pNextId, &pCsr->iPrevId); + pCsr->isRequireSeek = 1; + pCsr->isMatchinfoOk = 1; } - - /* Copy over any remaining elements. */ - if( nStart>0 ) dlwAppend(&writer, pStart, nStart, iFirstDocid, iLastDocid); - dlwDestroy(&writer); + return rc; } -/* Helper function for posListUnion(). Compares the current position -** between left and right, returning as standard C idiom of <0 if -** left0 if left>right, and 0 if left==right. "End" always -** compares greater. -*/ -static int posListCmp(PLReader *pLeft, PLReader *pRight){ - assert( pLeft->iType==pRight->iType ); - if( pLeft->iType==DL_DOCIDS ) return 0; - - if( plrAtEnd(pLeft) ) return plrAtEnd(pRight) ? 0 : 1; - if( plrAtEnd(pRight) ) return -1; - if( plrColumn(pLeft)plrColumn(pRight) ) return 1; +/* +** The buffer pointed to by argument zNode (size nNode bytes) contains the +** root node of a b-tree segment. The segment is guaranteed to be at least +** one level high (i.e. the root node is not also a leaf). If successful, +** this function locates the leaf node of the segment that may contain the +** term specified by arguments zTerm and nTerm and writes its block number +** to *piLeaf. +** +** It is possible that the returned leaf node does not contain the specified +** term. However, if the segment does contain said term, it is stored on +** the identified leaf node. Because this function only inspects interior +** segment nodes (and never loads leaf nodes into memory), it is not possible +** to be sure. +** +** If an error occurs, an error code other than SQLITE_OK is returned. +*/ +static int fts3SelectLeaf( + Fts3Table *p, /* Virtual table handle */ + const char *zTerm, /* Term to select leaves for */ + int nTerm, /* Size of term zTerm in bytes */ + const char *zNode, /* Buffer containing segment interior node */ + int nNode, /* Size of buffer at zNode */ + sqlite3_int64 *piLeaf /* Selected leaf node */ +){ + int rc = SQLITE_OK; /* Return code */ + const char *zCsr = zNode; /* Cursor to iterate through node */ + const char *zEnd = &zCsr[nNode];/* End of interior node buffer */ + char *zBuffer = 0; /* Buffer to load terms into */ + int nAlloc = 0; /* Size of allocated buffer */ - if( plrPosition(pLeft)plrPosition(pRight) ) return 1; - if( pLeft->iType==DL_POSITIONS ) return 0; + while( 1 ){ + int isFirstTerm = 1; /* True when processing first term on page */ + int iHeight; /* Height of this node in tree */ + sqlite3_int64 iChild; /* Block id of child node to descend to */ + int nBlock; /* Size of child node in bytes */ - if( plrStartOffset(pLeft)plrStartOffset(pRight) ) return 1; + zCsr += sqlite3Fts3GetVarint32(zCsr, &iHeight); + zCsr += sqlite3Fts3GetVarint(zCsr, &iChild); + + while( zCsrnAlloc ){ + char *zNew; + nAlloc = (nPrefix+nSuffix) * 2; + zNew = (char *)sqlite3_realloc(zBuffer, nAlloc); + if( !zNew ){ + sqlite3_free(zBuffer); + return SQLITE_NOMEM; + } + zBuffer = zNew; + } + memcpy(&zBuffer[nPrefix], zCsr, nSuffix); + nBuffer = nPrefix + nSuffix; + zCsr += nSuffix; + + /* Compare the term we are searching for with the term just loaded from + ** the interior node. If the specified term is greater than or equal + ** to the term from the interior node, then all terms on the sub-tree + ** headed by node iChild are smaller than zTerm. No need to search + ** iChild. + ** + ** If the interior node term is larger than the specified term, then + ** the tree headed by iChild may contain the specified term. + */ + cmp = memcmp(zTerm, zBuffer, (nBuffer>nTerm ? nTerm : nBuffer)); + if( cmp<0 || (cmp==0 && nBuffer>nTerm) ) break; + iChild++; + }; - if( plrEndOffset(pLeft)plrEndOffset(pRight) ) return 1; + /* If (iHeight==1), the children of this interior node are leaves. The + ** specified term may be present on leaf node iChild. + */ + if( iHeight==1 ){ + *piLeaf = iChild; + break; + } - return 0; + /* Descend to interior node iChild. */ + rc = sqlite3Fts3ReadBlock(p, iChild, &zCsr, &nBlock); + if( rc!=SQLITE_OK ) break; + zEnd = &zCsr[nBlock]; + } + sqlite3_free(zBuffer); + return rc; } -/* Write the union of position lists in pLeft and pRight to pOut. -** "Union" in this case meaning "All unique position tuples". Should -** work with any doclist type, though both inputs and the output -** should be the same type. +/* +** This function is used to create delta-encoded serialized lists of FTS3 +** varints. Each call to this function appends a single varint to a list. */ -static void posListUnion(DLReader *pLeft, DLReader *pRight, DLWriter *pOut){ - PLReader left, right; - PLWriter writer; +static void fts3PutDeltaVarint( + char **pp, /* IN/OUT: Output pointer */ + sqlite3_int64 *piPrev, /* IN/OUT: Previous value written to list */ + sqlite3_int64 iVal /* Write this value to the list */ +){ + assert( iVal-*piPrev > 0 || (*piPrev==0 && iVal==0) ); + *pp += sqlite3Fts3PutVarint(*pp, iVal-*piPrev); + *piPrev = iVal; +} - assert( dlrDocid(pLeft)==dlrDocid(pRight) ); - assert( pLeft->iType==pRight->iType ); - assert( pLeft->iType==pOut->iType ); +/* +** When this function is called, *ppPoslist is assumed to point to the +** start of a position-list. +*/ +static void fts3PoslistCopy(char **pp, char **ppPoslist){ + char *pEnd = *ppPoslist; + char c = 0; - plrInit(&left, pLeft); - plrInit(&right, pRight); - plwInit(&writer, pOut, dlrDocid(pLeft)); + /* The end of a position list is marked by a zero encoded as an FTS3 + ** varint. A single 0x00 byte. Except, if the 0x00 byte is preceded by + ** a byte with the 0x80 bit set, then it is not a varint 0, but the tail + ** of some other, multi-byte, value. + ** + ** The following block moves pEnd to point to the first byte that is not + ** immediately preceded by a byte with the 0x80 bit set. Then increments + ** pEnd once more so that it points to the byte immediately following the + ** last byte in the position-list. + */ + while( *pEnd | c ) c = *pEnd++ & 0x80; + pEnd++; - while( !plrAtEnd(&left) || !plrAtEnd(&right) ){ - int c = posListCmp(&left, &right); - if( c<0 ){ - plwCopy(&writer, &left); - plrStep(&left); - }else if( c>0 ){ - plwCopy(&writer, &right); - plrStep(&right); - }else{ - plwCopy(&writer, &left); - plrStep(&left); - plrStep(&right); - } + if( pp ){ + int n = (int)(pEnd - *ppPoslist); + char *p = *pp; + memcpy(p, *ppPoslist, n); + p += n; + *pp = p; } + *ppPoslist = pEnd; +} - plwTerminate(&writer); - plwDestroy(&writer); - plrDestroy(&left); - plrDestroy(&right); +static void fts3ColumnlistCopy(char **pp, char **ppPoslist){ + char *pEnd = *ppPoslist; + char c = 0; + + /* A column-list is terminated by either a 0x01 or 0x00. */ + while( 0xFE & (*pEnd | c) ) c = *pEnd++ & 0x80; + if( pp ){ + int n = (int)(pEnd - *ppPoslist); + char *p = *pp; + memcpy(p, *ppPoslist, n); + p += n; + *pp = p; + } + *ppPoslist = pEnd; } -/* Write the union of doclists in pLeft and pRight to pOut. For -** docids in common between the inputs, the union of the position -** lists is written. Inputs and outputs are always type DL_DEFAULT. +/* +** Value used to signify the end of an offset-list. This is safe because +** it is not possible to have a document with 2^31 terms. */ -static void docListUnion( - const char *pLeft, int nLeft, - const char *pRight, int nRight, - DataBuffer *pOut /* Write the combined doclist here */ -){ - DLReader left, right; - DLWriter writer; +#define OFFSET_LIST_END 0x7fffffff - if( nLeft==0 ){ - if( nRight!=0) dataBufferAppend(pOut, pRight, nRight); - return; - } - if( nRight==0 ){ - dataBufferAppend(pOut, pLeft, nLeft); - return; +/* +** This function is used to help parse offset-lists. When this function is +** called, *pp may point to the start of the next varint in the offset-list +** being parsed, or it may point to 1 byte past the end of the offset-list +** (in which case **pp will be 0x00 or 0x01). +** +** If *pp points past the end of the current offset list, set *pi to +** OFFSET_LIST_END and return. Otherwise, read the next varint from *pp, +** increment the current value of *pi by the value read, and set *pp to +** point to the next value before returning. +*/ +static void fts3ReadNextPos( + char **pp, /* IN/OUT: Pointer into offset-list buffer */ + sqlite3_int64 *pi /* IN/OUT: Value read from offset-list */ +){ + if( **pp&0xFE ){ + fts3GetDeltaVarint(pp, pi); + *pi -= 2; + }else{ + *pi = OFFSET_LIST_END; } +} - dlrInit(&left, DL_DEFAULT, pLeft, nLeft); - dlrInit(&right, DL_DEFAULT, pRight, nRight); - dlwInit(&writer, DL_DEFAULT, pOut); - - while( !dlrAtEnd(&left) || !dlrAtEnd(&right) ){ - if( dlrAtEnd(&right) ){ - dlwCopy(&writer, &left); - dlrStep(&left); - }else if( dlrAtEnd(&left) ){ - dlwCopy(&writer, &right); - dlrStep(&right); - }else if( dlrDocid(&left)dlrDocid(&right) ){ - dlwCopy(&writer, &right); - dlrStep(&right); - }else{ - posListUnion(&left, &right, &writer); - dlrStep(&left); - dlrStep(&right); - } +/* +** If parameter iCol is not 0, write an 0x01 byte followed by the value of +** iCol encoded as a varint to *pp. +** +** Set *pp to point to the byte just after the last byte written before +** returning (do not modify it if iCol==0). Return the total number of bytes +** written (0 if iCol==0). +*/ +static int fts3PutColNumber(char **pp, int iCol){ + int n = 0; /* Number of bytes written */ + if( iCol ){ + char *p = *pp; /* Output pointer */ + n = 1 + sqlite3Fts3PutVarint(&p[1], iCol); + *p = 0x01; + *pp = &p[n]; } - - dlrDestroy(&left); - dlrDestroy(&right); - dlwDestroy(&writer); + return n; } -/* -** This function is used as part of the implementation of phrase and -** NEAR matching. -** -** pLeft and pRight are DLReaders positioned to the same docid in -** lists of type DL_POSITION. This function writes an entry to the -** DLWriter pOut for each position in pRight that is less than -** (nNear+1) greater (but not equal to or smaller) than a position -** in pLeft. For example, if nNear is 0, and the positions contained -** by pLeft and pRight are: -** -** pLeft: 5 10 15 20 -** pRight: 6 9 17 21 -** -** then the docid is added to pOut. If pOut is of type DL_POSITIONS, -** then a positionids "6" and "21" are also added to pOut. -** -** If boolean argument isSaveLeft is true, then positionids are copied -** from pLeft instead of pRight. In the example above, the positions "5" -** and "20" would be added instead of "6" and "21". -*/ -static void posListPhraseMerge( - DLReader *pLeft, - DLReader *pRight, - int nNear, - int isSaveLeft, - DLWriter *pOut +/* +** +*/ +static void fts3PoslistMerge( + char **pp, /* Output buffer */ + char **pp1, /* Left input list */ + char **pp2 /* Right input list */ ){ - PLReader left, right; - PLWriter writer; - int match = 0; - - assert( dlrDocid(pLeft)==dlrDocid(pRight) ); - assert( pOut->iType!=DL_POSITIONS_OFFSETS ); - - plrInit(&left, pLeft); - plrInit(&right, pRight); - - while( !plrAtEnd(&left) && !plrAtEnd(&right) ){ - if( plrColumn(&left)plrColumn(&right) ){ - plrStep(&right); - }else if( plrPosition(&left)>=plrPosition(&right) ){ - plrStep(&right); - }else{ - if( (plrPosition(&right)-plrPosition(&left))<=(nNear+1) ){ - if( !match ){ - plwInit(&writer, pOut, dlrDocid(pLeft)); - match = 1; - } - if( !isSaveLeft ){ - plwAdd(&writer, plrColumn(&right), plrPosition(&right), 0, 0); + char *p = *pp; + char *p1 = *pp1; + char *p2 = *pp2; + + while( *p1 || *p2 ){ + int iCol1; + int iCol2; + + if( *p1==0x01 ) sqlite3Fts3GetVarint32(&p1[1], &iCol1); + else if( *p1==0x00 ) iCol1 = OFFSET_LIST_END; + else iCol1 = 0; + + if( *p2==0x01 ) sqlite3Fts3GetVarint32(&p2[1], &iCol2); + else if( *p2==0x00 ) iCol2 = OFFSET_LIST_END; + else iCol2 = 0; + + if( iCol1==iCol2 ){ + sqlite3_int64 i1 = 0; + sqlite3_int64 i2 = 0; + sqlite3_int64 iPrev = 0; + int n = fts3PutColNumber(&p, iCol1); + p1 += n; + p2 += n; + + /* At this point, both p1 and p2 point to the start of offset-lists. + ** An offset-list is a list of non-negative delta-encoded varints, each + ** incremented by 2 before being stored. Each list is terminated by a 0 + ** or 1 value (0x00 or 0x01). The following block merges the two lists + ** and writes the results to buffer p. p is left pointing to the byte + ** after the list written. No terminator (0x00 or 0x01) is written to + ** the output. + */ + fts3GetDeltaVarint(&p1, &i1); + fts3GetDeltaVarint(&p2, &i2); + do { + fts3PutDeltaVarint(&p, &iPrev, (i10) -** and write the results into pOut. -** -** A phrase intersection means that two documents only match -** if pLeft.iPos+1==pRight.iPos. -** -** A NEAR intersection means that two documents only match if -** (abs(pLeft.iPos-pRight.iPos)iPos1 && iPos2<=iPos1+nToken ){ + sqlite3_int64 iSave; + if( !pp ){ + fts3PoslistCopy(0, &p2); + fts3PoslistCopy(0, &p1); + *pp1 = p1; + *pp2 = p2; + return 1; } - plwTerminate(&plwriter); + iSave = isSaveLeft ? iPos1 : iPos2; + fts3PutDeltaVarint(&p, &iPrev, iSave+2); iPrev -= 2; + pSave = 0; + } + if( (!isSaveLeft && iPos2<=(iPos1+nToken)) || iPos2<=iPos1 ){ + if( (*p2&0xFE)==0 ) break; + fts3GetDeltaVarint(&p2, &iPos2); iPos2 -= 2; + }else{ + if( (*p1&0xFE)==0 ) break; + fts3GetDeltaVarint(&p1, &iPos1); iPos1 -= 2; } - dataBufferDestroy(&one); - dataBufferDestroy(&two); } - dlrStep(&left); - dlrStep(&right); - } - } - - dlrDestroy(&left); - dlrDestroy(&right); - dlwDestroy(&writer); -} -/* We have two DL_DOCIDS doclists: pLeft and pRight. -** Write the intersection of these two doclists into pOut as a -** DL_DOCIDS doclist. -*/ -static void docListAndMerge( - const char *pLeft, int nLeft, - const char *pRight, int nRight, - DataBuffer *pOut /* Write the combined doclist here */ -){ - DLReader left, right; - DLWriter writer; + if( pSave ){ + assert( pp && p ); + p = pSave; + } - if( nLeft==0 || nRight==0 ) return; + fts3ColumnlistCopy(0, &p1); + fts3ColumnlistCopy(0, &p2); + assert( (*p1&0xFE)==0 && (*p2&0xFE)==0 ); + if( 0==*p1 || 0==*p2 ) break; - dlrInit(&left, DL_DOCIDS, pLeft, nLeft); - dlrInit(&right, DL_DOCIDS, pRight, nRight); - dlwInit(&writer, DL_DOCIDS, pOut); + p1++; + p1 += sqlite3Fts3GetVarint32(p1, &iCol1); + p2++; + p2 += sqlite3Fts3GetVarint32(p2, &iCol2); + } - while( !dlrAtEnd(&left) && !dlrAtEnd(&right) ){ - if( dlrDocid(&left) D */ +#define MERGE_AND 3 /* D + D -> D */ +#define MERGE_OR 4 /* D + D -> D */ +#define MERGE_POS_OR 5 /* P + P -> P */ +#define MERGE_PHRASE 6 /* P + P -> D */ +#define MERGE_POS_PHRASE 7 /* P + P -> P */ +#define MERGE_NEAR 8 /* P + P -> D */ +#define MERGE_POS_NEAR 9 /* P + P -> P */ + +/* +** Merge the two doclists passed in buffer a1 (size n1 bytes) and a2 +** (size n2 bytes). The output is written to pre-allocated buffer aBuffer, +** which is guaranteed to be large enough to hold the results. The number +** of bytes written to aBuffer is stored in *pnBuffer before returning. +** +** If successful, SQLITE_OK is returned. Otherwise, if a malloc error +** occurs while allocating a temporary buffer as part of the merge operation, +** SQLITE_NOMEM is returned. */ -static void docListExceptMerge( - const char *pLeft, int nLeft, - const char *pRight, int nRight, - DataBuffer *pOut /* Write the combined doclist here */ +static int fts3DoclistMerge( + int mergetype, /* One of the MERGE_XXX constants */ + int nParam1, /* Used by MERGE_NEAR and MERGE_POS_NEAR */ + int nParam2, /* Used by MERGE_NEAR and MERGE_POS_NEAR */ + char *aBuffer, /* Pre-allocated output buffer */ + int *pnBuffer, /* OUT: Bytes written to aBuffer */ + char *a1, /* Buffer containing first doclist */ + int n1, /* Size of buffer a1 */ + char *a2, /* Buffer containing second doclist */ + int n2 /* Size of buffer a2 */ ){ - DLReader left, right; - DLWriter writer; + sqlite3_int64 i1 = 0; + sqlite3_int64 i2 = 0; + sqlite3_int64 iPrev = 0; + + char *p = aBuffer; + char *p1 = a1; + char *p2 = a2; + char *pEnd1 = &a1[n1]; + char *pEnd2 = &a2[n2]; + + assert( mergetype==MERGE_OR || mergetype==MERGE_POS_OR + || mergetype==MERGE_AND || mergetype==MERGE_NOT + || mergetype==MERGE_PHRASE || mergetype==MERGE_POS_PHRASE + || mergetype==MERGE_NEAR || mergetype==MERGE_POS_NEAR + ); - if( nLeft==0 ) return; - if( nRight==0 ){ - dataBufferAppend(pOut, pLeft, nLeft); - return; + if( !aBuffer ){ + *pnBuffer = 0; + return SQLITE_NOMEM; } - dlrInit(&left, DL_DOCIDS, pLeft, nLeft); - dlrInit(&right, DL_DOCIDS, pRight, nRight); - dlwInit(&writer, DL_DOCIDS, pOut); + /* Read the first docid from each doclist */ + fts3GetDeltaVarint2(&p1, pEnd1, &i1); + fts3GetDeltaVarint2(&p2, pEnd2, &i2); + + switch( mergetype ){ + case MERGE_OR: + case MERGE_POS_OR: + while( p1 || p2 ){ + if( p2 && p1 && i1==i2 ){ + fts3PutDeltaVarint(&p, &iPrev, i1); + if( mergetype==MERGE_POS_OR ) fts3PoslistMerge(&p, &p1, &p2); + fts3GetDeltaVarint2(&p1, pEnd1, &i1); + fts3GetDeltaVarint2(&p2, pEnd2, &i2); + }else if( !p2 || (p1 && i1 0", - /* SEGDIR_DELETE */ "delete from %_segdir where level = ?", - - /* NOTE(shess): The first three results of the following two - ** statements must match. - */ - /* SEGDIR_SELECT_SEGMENT */ - "select start_block, leaves_end_block, root from %_segdir " - " where level = ? and idx = ?", - /* SEGDIR_SELECT_ALL */ - "select start_block, leaves_end_block, root from %_segdir " - " order by level desc, idx asc", - /* SEGDIR_DELETE_ALL */ "delete from %_segdir", - /* SEGDIR_COUNT */ "select count(*), ifnull(max(level),0) from %_segdir", -}; - -/* -** A connection to a fulltext index is an instance of the following -** structure. The xCreate and xConnect methods create an instance -** of this structure and xDestroy and xDisconnect free that instance. -** All other methods receive a pointer to the structure as one of their -** arguments. -*/ -struct fulltext_vtab { - sqlite3_vtab base; /* Base class used by SQLite core */ - sqlite3 *db; /* The database connection */ - const char *zDb; /* logical database name */ - const char *zName; /* virtual table name */ - int nColumn; /* number of columns in virtual table */ - char **azColumn; /* column names. malloced */ - char **azContentColumn; /* column names in content table; malloced */ - sqlite3_tokenizer *pTokenizer; /* tokenizer for inserts and queries */ - - /* Precompiled statements which we keep as long as the table is - ** open. - */ - sqlite3_stmt *pFulltextStatements[MAX_STMT]; - - /* Precompiled statements used for segment merges. We run a - ** separate select across the leaf level of each tree being merged. - */ - sqlite3_stmt *pLeafSelectStmts[MERGE_COUNT]; - /* The statement used to prepare pLeafSelectStmts. */ -#define LEAF_SELECT \ - "select block from %_segments where blockid between ? and ? order by blockid" - - /* These buffer pending index updates during transactions. - ** nPendingData estimates the memory size of the pending data. It - ** doesn't include the hash-bucket overhead, nor any malloc - ** overhead. When nPendingData exceeds kPendingThreshold, the - ** buffer is flushed even before the transaction closes. - ** pendingTerms stores the data, and is only valid when nPendingData - ** is >=0 (nPendingData<0 means pendingTerms has not been - ** initialized). iPrevDocid is the last docid written, used to make - ** certain we're inserting in sorted order. - */ - int nPendingData; -#define kPendingThreshold (1*1024*1024) - sqlite_int64 iPrevDocid; - fts3Hash pendingTerms; +/* +** A pointer to an instance of this structure is used as the context +** argument to sqlite3Fts3SegReaderIterate() +*/ +typedef struct TermSelect TermSelect; +struct TermSelect { + int isReqPos; + char *aOutput; /* Malloc'd output buffer */ + int nOutput; /* Size of output in bytes */ }; /* -** When the core wants to do a query, it create a cursor using a -** call to xOpen. This structure is an instance of a cursor. It -** is destroyed by xClose. +** This function is used as the sqlite3Fts3SegReaderIterate() callback when +** querying the full-text index for a doclist associated with a term or +** term-prefix. */ -typedef struct fulltext_cursor { - sqlite3_vtab_cursor base; /* Base class used by SQLite core */ - QueryType iCursorType; /* Copy of sqlite3_index_info.idxNum */ - sqlite3_stmt *pStmt; /* Prepared statement in use by the cursor */ - int eof; /* True if at End Of Results */ - Fts3Expr *pExpr; /* Parsed MATCH query string */ - Snippet snippet; /* Cached snippet for the current row */ - int iColumn; /* Column being searched */ - DataBuffer result; /* Doclist results from fulltextQuery */ - DLReader reader; /* Result reader if result not empty */ -} fulltext_cursor; - -static fulltext_vtab *cursor_vtab(fulltext_cursor *c){ - return (fulltext_vtab *) c->base.pVtab; -} - -static const sqlite3_module fts3Module; /* forward declaration */ - -/* Return a dynamically generated statement of the form - * insert into %_content (docid, ...) values (?, ...) - */ -static const char *contentInsertStatement(fulltext_vtab *v){ - StringBuffer sb; - int i; - - initStringBuffer(&sb); - append(&sb, "insert into %_content (docid, "); - appendList(&sb, v->nColumn, v->azContentColumn); - append(&sb, ") values (?"); - for(i=0; inColumn; ++i) - append(&sb, ", ?"); - append(&sb, ")"); - return stringBufferData(&sb); -} - -/* Return a dynamically generated statement of the form - * select from %_content where docid = ? - */ -static const char *contentSelectStatement(fulltext_vtab *v){ - StringBuffer sb; - initStringBuffer(&sb); - append(&sb, "SELECT "); - appendList(&sb, v->nColumn, v->azContentColumn); - append(&sb, " FROM %_content WHERE docid = ?"); - return stringBufferData(&sb); -} - -/* Return a dynamically generated statement of the form - * update %_content set [col_0] = ?, [col_1] = ?, ... - * where docid = ? - */ -static const char *contentUpdateStatement(fulltext_vtab *v){ - StringBuffer sb; - int i; +static int fts3TermSelectCb( + Fts3Table *p, /* Virtual table object */ + void *pContext, /* Pointer to TermSelect structure */ + char *zTerm, + int nTerm, + char *aDoclist, + int nDoclist +){ + TermSelect *pTS = (TermSelect *)pContext; + int nNew = pTS->nOutput + nDoclist; + char *aNew = sqlite3_malloc(nNew); - initStringBuffer(&sb); - append(&sb, "update %_content set "); - for(i=0; inColumn; ++i) { - if( i>0 ){ - append(&sb, ", "); - } - append(&sb, v->azContentColumn[i]); - append(&sb, " = ?"); - } - append(&sb, " where docid = ?"); - return stringBufferData(&sb); -} + UNUSED_PARAMETER(p); + UNUSED_PARAMETER(zTerm); + UNUSED_PARAMETER(nTerm); -/* Puts a freshly-prepared statement determined by iStmt in *ppStmt. -** If the indicated statement has never been prepared, it is prepared -** and cached, otherwise the cached version is reset. -*/ -static int sql_get_statement(fulltext_vtab *v, fulltext_statement iStmt, - sqlite3_stmt **ppStmt){ - assert( iStmtpFulltextStatements[iStmt]==NULL ){ - const char *zStmt; - int rc; - switch( iStmt ){ - case CONTENT_INSERT_STMT: - zStmt = contentInsertStatement(v); break; - case CONTENT_SELECT_STMT: - zStmt = contentSelectStatement(v); break; - case CONTENT_UPDATE_STMT: - zStmt = contentUpdateStatement(v); break; - default: - zStmt = fulltext_zStatement[iStmt]; - } - rc = sql_prepare(v->db, v->zDb, v->zName, &v->pFulltextStatements[iStmt], - zStmt); - if( zStmt != fulltext_zStatement[iStmt]) sqlite3_free((void *) zStmt); - if( rc!=SQLITE_OK ) return rc; - } else { - int rc = sqlite3_reset(v->pFulltextStatements[iStmt]); - if( rc!=SQLITE_OK ) return rc; + if( !aNew ){ + return SQLITE_NOMEM; } - *ppStmt = v->pFulltextStatements[iStmt]; - return SQLITE_OK; -} - -/* Like sqlite3_step(), but convert SQLITE_DONE to SQLITE_OK and -** SQLITE_ROW to SQLITE_ERROR. Useful for statements like UPDATE, -** where we expect no results. -*/ -static int sql_single_step(sqlite3_stmt *s){ - int rc = sqlite3_step(s); - return (rc==SQLITE_DONE) ? SQLITE_OK : rc; -} - -/* Like sql_get_statement(), but for special replicated LEAF_SELECT -** statements. idx -1 is a special case for an uncached version of -** the statement (used in the optimize implementation). -*/ -/* TODO(shess) Write version for generic statements and then share -** that between the cached-statement functions. -*/ -static int sql_get_leaf_statement(fulltext_vtab *v, int idx, - sqlite3_stmt **ppStmt){ - assert( idx>=-1 && idxdb, v->zDb, v->zName, ppStmt, LEAF_SELECT); - }else if( v->pLeafSelectStmts[idx]==NULL ){ - int rc = sql_prepare(v->db, v->zDb, v->zName, &v->pLeafSelectStmts[idx], - LEAF_SELECT); - if( rc!=SQLITE_OK ) return rc; + if( pTS->nOutput==0 ){ + /* If this is the first term selected, copy the doclist to the output + ** buffer using memcpy(). TODO: Add a way to transfer control of the + ** aDoclist buffer from the caller so as to avoid the memcpy(). + */ + memcpy(aNew, aDoclist, nDoclist); }else{ - int rc = sqlite3_reset(v->pLeafSelectStmts[idx]); - if( rc!=SQLITE_OK ) return rc; + /* The output buffer is not empty. Merge doclist aDoclist with the + ** existing output. This can only happen with prefix-searches (as + ** searches for exact terms return exactly one doclist). + */ + int mergetype = (pTS->isReqPos ? MERGE_POS_OR : MERGE_OR); + fts3DoclistMerge(mergetype, 0, 0, + aNew, &nNew, pTS->aOutput, pTS->nOutput, aDoclist, nDoclist + ); } - *ppStmt = v->pLeafSelectStmts[idx]; + sqlite3_free(pTS->aOutput); + pTS->aOutput = aNew; + pTS->nOutput = nNew; + return SQLITE_OK; } -/* insert into %_content (docid, ...) values ([docid], [pValues]) -** If the docid contains SQL NULL, then a unique docid will be -** generated. +/* +** This function retreives the doclist for the specified term (or term +** prefix) from the database. +** +** The returned doclist may be in one of two formats, depending on the +** value of parameter isReqPos. If isReqPos is zero, then the doclist is +** a sorted list of delta-compressed docids. If isReqPos is non-zero, +** then the returned list is in the same format as is stored in the +** database without the found length specifier at the start of on-disk +** doclists. */ -static int content_insert(fulltext_vtab *v, sqlite3_value *docid, - sqlite3_value **pValues){ - sqlite3_stmt *s; +static int fts3TermSelect( + Fts3Table *p, /* Virtual table handle */ + int iColumn, /* Column to query (or -ve for all columns) */ + const char *zTerm, /* Term to query for */ + int nTerm, /* Size of zTerm in bytes */ + int isPrefix, /* True for a prefix search */ + int isReqPos, /* True to include position lists in output */ + int *pnOut, /* OUT: Size of buffer at *ppOut */ + char **ppOut /* OUT: Malloced result buffer */ +){ int i; - int rc = sql_get_statement(v, CONTENT_INSERT_STMT, &s); - if( rc!=SQLITE_OK ) return rc; + TermSelect tsc; + Fts3SegFilter filter; /* Segment term filter configuration */ + Fts3SegReader **apSegment; /* Array of segments to read data from */ + int nSegment = 0; /* Size of apSegment array */ + int nAlloc = 16; /* Allocated size of segment array */ + int rc; /* Return code */ + sqlite3_stmt *pStmt = 0; /* SQL statement to scan %_segdir table */ + int iAge = 0; /* Used to assign ages to segments */ + + apSegment = (Fts3SegReader **)sqlite3_malloc(sizeof(Fts3SegReader*)*nAlloc); + if( !apSegment ) return SQLITE_NOMEM; + rc = sqlite3Fts3SegReaderPending(p, zTerm, nTerm, isPrefix, &apSegment[0]); + if( rc!=SQLITE_OK ) goto finished; + if( apSegment[0] ){ + nSegment = 1; + } + + /* Loop through the entire %_segdir table. For each segment, create a + ** Fts3SegReader to iterate through the subset of the segment leaves + ** that may contain a term that matches zTerm/nTerm. For non-prefix + ** searches, this is always a single leaf. For prefix searches, this + ** may be a contiguous block of leaves. + ** + ** The code in this loop does not actually load any leaves into memory + ** (unless the root node happens to be a leaf). It simply examines the + ** b-tree structure to determine which leaves need to be inspected. + */ + rc = sqlite3Fts3AllSegdirs(p, &pStmt); + while( rc==SQLITE_OK && SQLITE_ROW==(rc = sqlite3_step(pStmt)) ){ + Fts3SegReader *pNew = 0; + int nRoot = sqlite3_column_bytes(pStmt, 4); + char const *zRoot = sqlite3_column_blob(pStmt, 4); + if( sqlite3_column_int64(pStmt, 1)==0 ){ + /* The entire segment is stored on the root node (which must be a + ** leaf). Do not bother inspecting any data in this case, just + ** create a Fts3SegReader to scan the single leaf. + */ + rc = sqlite3Fts3SegReaderNew(p, iAge, 0, 0, 0, zRoot, nRoot, &pNew); + }else{ + int rc2; /* Return value of sqlite3Fts3ReadBlock() */ + sqlite3_int64 i1; /* Blockid of leaf that may contain zTerm */ + rc = fts3SelectLeaf(p, zTerm, nTerm, zRoot, nRoot, &i1); + if( rc==SQLITE_OK ){ + sqlite3_int64 i2 = sqlite3_column_int64(pStmt, 2); + rc = sqlite3Fts3SegReaderNew(p, iAge, i1, i2, 0, 0, 0, &pNew); + } - rc = sqlite3_bind_value(s, 1, docid); - if( rc!=SQLITE_OK ) return rc; + /* The following call to ReadBlock() serves to reset the SQL statement + ** used to retrieve blocks of data from the %_segments table. If it is + ** not reset here, then it may remain classified as an active statement + ** by SQLite, which may lead to "DROP TABLE" or "DETACH" commands + ** failing. + */ + rc2 = sqlite3Fts3ReadBlock(p, 0, 0, 0); + if( rc==SQLITE_OK ){ + rc = rc2; + } + } + iAge++; - for(i=0; inColumn; ++i){ - rc = sqlite3_bind_value(s, 2+i, pValues[i]); - if( rc!=SQLITE_OK ) return rc; + /* If a new Fts3SegReader was allocated, add it to the apSegment array. */ + assert( pNew!=0 || rc!=SQLITE_OK ); + if( pNew ){ + if( nSegment==nAlloc ){ + Fts3SegReader **pArray; + nAlloc += 16; + pArray = (Fts3SegReader **)sqlite3_realloc( + apSegment, nAlloc*sizeof(Fts3SegReader *) + ); + if( !pArray ){ + sqlite3Fts3SegReaderFree(p, pNew); + rc = SQLITE_NOMEM; + goto finished; + } + apSegment = pArray; + } + apSegment[nSegment++] = pNew; + } } - - return sql_single_step(s); -} - -/* update %_content set col0 = pValues[0], col1 = pValues[1], ... - * where docid = [iDocid] */ -static int content_update(fulltext_vtab *v, sqlite3_value **pValues, - sqlite_int64 iDocid){ - sqlite3_stmt *s; - int i; - int rc = sql_get_statement(v, CONTENT_UPDATE_STMT, &s); - if( rc!=SQLITE_OK ) return rc; - - for(i=0; inColumn; ++i){ - rc = sqlite3_bind_value(s, 1+i, pValues[i]); - if( rc!=SQLITE_OK ) return rc; + if( rc!=SQLITE_DONE ){ + assert( rc!=SQLITE_OK ); + goto finished; } - rc = sqlite3_bind_int64(s, 1+v->nColumn, iDocid); - if( rc!=SQLITE_OK ) return rc; + memset(&tsc, 0, sizeof(TermSelect)); + tsc.isReqPos = isReqPos; - return sql_single_step(s); -} + filter.flags = FTS3_SEGMENT_IGNORE_EMPTY + | (isPrefix ? FTS3_SEGMENT_PREFIX : 0) + | (isReqPos ? FTS3_SEGMENT_REQUIRE_POS : 0) + | (iColumnnColumn ? FTS3_SEGMENT_COLUMN_FILTER : 0); + filter.iCol = iColumn; + filter.zTerm = zTerm; + filter.nTerm = nTerm; -static void freeStringArray(int nString, const char **pString){ - int i; + rc = sqlite3Fts3SegReaderIterate(p, apSegment, nSegment, &filter, + fts3TermSelectCb, (void *)&tsc + ); - for (i=0 ; i < nString ; ++i) { - if( pString[i]!=NULL ) sqlite3_free((void *) pString[i]); + if( rc==SQLITE_OK ){ + *ppOut = tsc.aOutput; + *pnOut = tsc.nOutput; + }else{ + sqlite3_free(tsc.aOutput); } - sqlite3_free((void *) pString); -} -/* select * from %_content where docid = [iDocid] - * The caller must delete the returned array and all strings in it. - * null fields will be NULL in the returned array. - * - * TODO: Perhaps we should return pointer/length strings here for consistency - * with other code which uses pointer/length. */ -static int content_select(fulltext_vtab *v, sqlite_int64 iDocid, - const char ***pValues){ - sqlite3_stmt *s; - const char **values; - int i; - int rc; +finished: + sqlite3_reset(pStmt); + for(i=0; iiColumn; + int isTermPos = (pPhrase->nToken>1 || isReqPos); - rc = sqlite3_bind_int64(s, 1, iDocid); - if( rc!=SQLITE_OK ) return rc; + for(ii=0; iinToken; ii++){ + struct PhraseToken *pTok = &pPhrase->aToken[ii]; + char *z = pTok->z; /* Next token of the phrase */ + int n = pTok->n; /* Size of z in bytes */ + int isPrefix = pTok->isPrefix;/* True if token is a prefix */ + char *pList; /* Pointer to token doclist */ + int nList; /* Size of buffer at pList */ - rc = sqlite3_step(s); - if( rc!=SQLITE_ROW ) return rc; + rc = fts3TermSelect(p, iCol, z, n, isPrefix, isTermPos, &nList, &pList); + if( rc!=SQLITE_OK ) break; - values = (const char **) sqlite3_malloc(v->nColumn * sizeof(const char *)); - for(i=0; inColumn; ++i){ - if( sqlite3_column_type(s, i)==SQLITE_NULL ){ - values[i] = NULL; + if( ii==0 ){ + pOut = pList; + nOut = nList; }else{ - values[i] = string_dup((char*)sqlite3_column_text(s, i)); + /* Merge the new term list and the current output. If this is the + ** last term in the phrase, and positions are not required in the + ** output of this function, the positions can be dropped as part + ** of this merge. Either way, the result of this merge will be + ** smaller than nList bytes. The code in fts3DoclistMerge() is written + ** so that it is safe to use pList as the output as well as an input + ** in this case. + */ + int mergetype = MERGE_POS_PHRASE; + if( ii==pPhrase->nToken-1 && !isReqPos ){ + mergetype = MERGE_PHRASE; + } + fts3DoclistMerge(mergetype, 0, 0, pList, &nOut, pOut, nOut, pList, nList); + sqlite3_free(pOut); + pOut = pList; } + assert( nOut==0 || pOut!=0 ); } - /* We expect only one row. We must execute another sqlite3_step() - * to complete the iteration; otherwise the table will remain locked. */ - rc = sqlite3_step(s); - if( rc==SQLITE_DONE ){ - *pValues = values; - return SQLITE_OK; + if( rc==SQLITE_OK ){ + *paOut = pOut; + *pnOut = nOut; + }else{ + sqlite3_free(pOut); } - - freeStringArray(v->nColumn, values); return rc; } -/* delete from %_content where docid = [iDocid ] */ -static int content_delete(fulltext_vtab *v, sqlite_int64 iDocid){ - sqlite3_stmt *s; - int rc = sql_get_statement(v, CONTENT_DELETE_STMT, &s); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_bind_int64(s, 1, iDocid); - if( rc!=SQLITE_OK ) return rc; - - return sql_single_step(s); -} - -/* Returns SQLITE_ROW if any rows exist in %_content, SQLITE_DONE if -** no rows exist, and any error in case of failure. +/* +** Evaluate the full-text expression pExpr against fts3 table pTab. Store +** the resulting doclist in *paOut and *pnOut. */ -static int content_exists(fulltext_vtab *v){ - sqlite3_stmt *s; - int rc = sql_get_statement(v, CONTENT_EXISTS_STMT, &s); - if( rc!=SQLITE_OK ) return rc; +static int evalFts3Expr( + Fts3Table *p, /* Virtual table handle */ + Fts3Expr *pExpr, /* Parsed fts3 expression */ + char **paOut, /* OUT: Pointer to malloc'd result buffer */ + int *pnOut, /* OUT: Size of buffer at *paOut */ + int isReqPos /* Require positions in output buffer */ +){ + int rc = SQLITE_OK; /* Return code */ - rc = sqlite3_step(s); - if( rc!=SQLITE_ROW ) return rc; + /* Zero the output parameters. */ + *paOut = 0; + *pnOut = 0; - /* We expect only one row. We must execute another sqlite3_step() - * to complete the iteration; otherwise the table will remain locked. */ - rc = sqlite3_step(s); - if( rc==SQLITE_DONE ) return SQLITE_ROW; - if( rc==SQLITE_ROW ) return SQLITE_ERROR; - return rc; -} + if( pExpr ){ + assert( pExpr->eType==FTSQUERY_PHRASE + || pExpr->eType==FTSQUERY_NEAR + || isReqPos==0 + ); + if( pExpr->eType==FTSQUERY_PHRASE ){ + rc = fts3PhraseSelect(p, pExpr->pPhrase, + isReqPos || (pExpr->pParent && pExpr->pParent->eType==FTSQUERY_NEAR), + paOut, pnOut + ); + }else{ + char *aLeft; + char *aRight; + int nLeft; + int nRight; -/* insert into %_segments values ([pData]) -** returns assigned blockid in *piBlockid -*/ -static int block_insert(fulltext_vtab *v, const char *pData, int nData, - sqlite_int64 *piBlockid){ - sqlite3_stmt *s; - int rc = sql_get_statement(v, BLOCK_INSERT_STMT, &s); - if( rc!=SQLITE_OK ) return rc; + if( 0==(rc = evalFts3Expr(p, pExpr->pRight, &aRight, &nRight, isReqPos)) + && 0==(rc = evalFts3Expr(p, pExpr->pLeft, &aLeft, &nLeft, isReqPos)) + ){ + assert( pExpr->eType==FTSQUERY_NEAR || pExpr->eType==FTSQUERY_OR + || pExpr->eType==FTSQUERY_AND || pExpr->eType==FTSQUERY_NOT + ); + switch( pExpr->eType ){ + case FTSQUERY_NEAR: { + Fts3Expr *pLeft; + Fts3Expr *pRight; + int mergetype = isReqPos ? MERGE_POS_NEAR : MERGE_NEAR; + int nParam1; + int nParam2; + char *aBuffer; + + if( pExpr->pParent && pExpr->pParent->eType==FTSQUERY_NEAR ){ + mergetype = MERGE_POS_NEAR; + } + pLeft = pExpr->pLeft; + while( pLeft->eType==FTSQUERY_NEAR ){ + pLeft=pLeft->pRight; + } + pRight = pExpr->pRight; + assert( pRight->eType==FTSQUERY_PHRASE ); + assert( pLeft->eType==FTSQUERY_PHRASE ); - rc = sqlite3_bind_blob(s, 1, pData, nData, SQLITE_STATIC); - if( rc!=SQLITE_OK ) return rc; + nParam1 = pExpr->nNear+1; + nParam2 = nParam1+pLeft->pPhrase->nToken+pRight->pPhrase->nToken-2; + aBuffer = sqlite3_malloc(nLeft+nRight+1); + rc = fts3DoclistMerge(mergetype, nParam1, nParam2, aBuffer, + pnOut, aLeft, nLeft, aRight, nRight + ); + if( rc!=SQLITE_OK ){ + sqlite3_free(aBuffer); + }else{ + *paOut = aBuffer; + } + sqlite3_free(aLeft); + break; + } + + case FTSQUERY_OR: { + /* Allocate a buffer for the output. The maximum size is the + ** sum of the sizes of the two input buffers. The +1 term is + ** so that a buffer of zero bytes is never allocated - this can + ** cause fts3DoclistMerge() to incorrectly return SQLITE_NOMEM. + */ + char *aBuffer = sqlite3_malloc(nRight+nLeft+1); + rc = fts3DoclistMerge(MERGE_OR, 0, 0, aBuffer, pnOut, + aLeft, nLeft, aRight, nRight + ); + *paOut = aBuffer; + sqlite3_free(aLeft); + break; + } - rc = sqlite3_step(s); - if( rc==SQLITE_ROW ) return SQLITE_ERROR; - if( rc!=SQLITE_DONE ) return rc; + default: { + assert( FTSQUERY_NOT==MERGE_NOT && FTSQUERY_AND==MERGE_AND ); + fts3DoclistMerge(pExpr->eType, 0, 0, aLeft, pnOut, + aLeft, nLeft, aRight, nRight + ); + *paOut = aLeft; + break; + } + } + } + sqlite3_free(aRight); + } + } - /* blockid column is an alias for rowid. */ - *piBlockid = sqlite3_last_insert_rowid(v->db); - return SQLITE_OK; + return rc; } -/* delete from %_segments -** where blockid between [iStartBlockid] and [iEndBlockid] +/* +** This is the xFilter interface for the virtual table. See +** the virtual table xFilter method documentation for additional +** information. +** +** If idxNum==FTS3_FULLSCAN_SEARCH then do a full table scan against +** the %_content table. +** +** If idxNum==FTS3_DOCID_SEARCH then do a docid lookup for a single entry +** in the %_content table. ** -** Deletes the range of blocks, inclusive, used to delete the blocks -** which form a segment. +** If idxNum>=FTS3_FULLTEXT_SEARCH then use the full text index. The +** column on the left-hand side of the MATCH operator is column +** number idxNum-FTS3_FULLTEXT_SEARCH, 0 indexed. argv[0] is the right-hand +** side of the MATCH operator. */ -static int block_delete(fulltext_vtab *v, - sqlite_int64 iStartBlockid, sqlite_int64 iEndBlockid){ - sqlite3_stmt *s; - int rc = sql_get_statement(v, BLOCK_DELETE_STMT, &s); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_bind_int64(s, 1, iStartBlockid); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_bind_int64(s, 2, iEndBlockid); - if( rc!=SQLITE_OK ) return rc; - - return sql_single_step(s); -} - -/* Returns SQLITE_ROW with *pidx set to the maximum segment idx found -** at iLevel. Returns SQLITE_DONE if there are no segments at -** iLevel. Otherwise returns an error. +/* TODO(shess) Upgrade the cursor initialization and destruction to +** account for fts3FilterMethod() being called multiple times on the +** same cursor. The current solution is very fragile. Apply fix to +** fts3 as appropriate. */ -static int segdir_max_index(fulltext_vtab *v, int iLevel, int *pidx){ - sqlite3_stmt *s; - int rc = sql_get_statement(v, SEGDIR_MAX_INDEX_STMT, &s); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_bind_int(s, 1, iLevel); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_step(s); - /* Should always get at least one row due to how max() works. */ - if( rc==SQLITE_DONE ) return SQLITE_DONE; - if( rc!=SQLITE_ROW ) return rc; - - /* NULL means that there were no inputs to max(). */ - if( SQLITE_NULL==sqlite3_column_type(s, 0) ){ - rc = sqlite3_step(s); - if( rc==SQLITE_ROW ) return SQLITE_ERROR; - return rc; +static int fts3FilterMethod( + sqlite3_vtab_cursor *pCursor, /* The cursor used for this query */ + int idxNum, /* Strategy index */ + const char *idxStr, /* Unused */ + int nVal, /* Number of elements in apVal */ + sqlite3_value **apVal /* Arguments for the indexing scheme */ +){ + const char *azSql[] = { + "SELECT * FROM %Q.'%q_content' WHERE docid = ?", /* non-full-table-scan */ + "SELECT * FROM %Q.'%q_content'", /* full-table-scan */ + }; + int rc; /* Return code */ + char *zSql; /* SQL statement used to access %_content */ + Fts3Table *p = (Fts3Table *)pCursor->pVtab; + Fts3Cursor *pCsr = (Fts3Cursor *)pCursor; + + UNUSED_PARAMETER(idxStr); + UNUSED_PARAMETER(nVal); + + assert( idxNum>=0 && idxNum<=(FTS3_FULLTEXT_SEARCH+p->nColumn) ); + assert( nVal==0 || nVal==1 ); + assert( (nVal==0)==(idxNum==FTS3_FULLSCAN_SEARCH) ); + + /* In case the cursor has been used before, clear it now. */ + sqlite3_finalize(pCsr->pStmt); + sqlite3_free(pCsr->aDoclist); + sqlite3Fts3ExprFree(pCsr->pExpr); + memset(&pCursor[1], 0, sizeof(Fts3Cursor)-sizeof(sqlite3_vtab_cursor)); + + /* Compile a SELECT statement for this cursor. For a full-table-scan, the + ** statement loops through all rows of the %_content table. For a + ** full-text query or docid lookup, the statement retrieves a single + ** row by docid. + */ + zSql = sqlite3_mprintf(azSql[idxNum==FTS3_FULLSCAN_SEARCH], p->zDb, p->zName); + if( !zSql ){ + rc = SQLITE_NOMEM; + }else{ + rc = sqlite3_prepare_v2(p->db, zSql, -1, &pCsr->pStmt, 0); + sqlite3_free(zSql); } - - *pidx = sqlite3_column_int(s, 0); - - /* We expect only one row. We must execute another sqlite3_step() - * to complete the iteration; otherwise the table will remain locked. */ - rc = sqlite3_step(s); - if( rc==SQLITE_ROW ) return SQLITE_ERROR; - if( rc!=SQLITE_DONE ) return rc; - return SQLITE_ROW; -} - -/* insert into %_segdir values ( -** [iLevel], [idx], -** [iStartBlockid], [iLeavesEndBlockid], [iEndBlockid], -** [pRootData] -** ) -*/ -static int segdir_set(fulltext_vtab *v, int iLevel, int idx, - sqlite_int64 iStartBlockid, - sqlite_int64 iLeavesEndBlockid, - sqlite_int64 iEndBlockid, - const char *pRootData, int nRootData){ - sqlite3_stmt *s; - int rc = sql_get_statement(v, SEGDIR_SET_STMT, &s); if( rc!=SQLITE_OK ) return rc; + pCsr->eSearch = (i16)idxNum; - rc = sqlite3_bind_int(s, 1, iLevel); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_bind_int(s, 2, idx); - if( rc!=SQLITE_OK ) return rc; + if( idxNum==FTS3_DOCID_SEARCH ){ + rc = sqlite3_bind_value(pCsr->pStmt, 1, apVal[0]); + }else if( idxNum!=FTS3_FULLSCAN_SEARCH ){ + int iCol = idxNum-FTS3_FULLTEXT_SEARCH; + const char *zQuery = (const char *)sqlite3_value_text(apVal[0]); - rc = sqlite3_bind_int64(s, 3, iStartBlockid); - if( rc!=SQLITE_OK ) return rc; + if( zQuery==0 && sqlite3_value_type(apVal[0])!=SQLITE_NULL ){ + return SQLITE_NOMEM; + } - rc = sqlite3_bind_int64(s, 4, iLeavesEndBlockid); - if( rc!=SQLITE_OK ) return rc; + rc = sqlite3Fts3ExprParse(p->pTokenizer, p->azColumn, p->nColumn, + iCol, zQuery, -1, &pCsr->pExpr + ); + if( rc!=SQLITE_OK ) return rc; - rc = sqlite3_bind_int64(s, 5, iEndBlockid); - if( rc!=SQLITE_OK ) return rc; + rc = evalFts3Expr(p, pCsr->pExpr, &pCsr->aDoclist, &pCsr->nDoclist, 0); + pCsr->pNextId = pCsr->aDoclist; + pCsr->iPrevId = 0; + } - rc = sqlite3_bind_blob(s, 6, pRootData, nRootData, SQLITE_STATIC); if( rc!=SQLITE_OK ) return rc; - - return sql_single_step(s); + return fts3NextMethod(pCursor); } -/* Queries %_segdir for the block span of the segments in level -** iLevel. Returns SQLITE_DONE if there are no blocks for iLevel, -** SQLITE_ROW if there are blocks, else an error. +/* +** This is the xEof method of the virtual table. SQLite calls this +** routine to find out if it has reached the end of a result set. */ -static int segdir_span(fulltext_vtab *v, int iLevel, - sqlite_int64 *piStartBlockid, - sqlite_int64 *piEndBlockid){ - sqlite3_stmt *s; - int rc = sql_get_statement(v, SEGDIR_SPAN_STMT, &s); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_bind_int(s, 1, iLevel); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_step(s); - if( rc==SQLITE_DONE ) return SQLITE_DONE; /* Should never happen */ - if( rc!=SQLITE_ROW ) return rc; - - /* This happens if all segments at this level are entirely inline. */ - if( SQLITE_NULL==sqlite3_column_type(s, 0) ){ - /* We expect only one row. We must execute another sqlite3_step() - * to complete the iteration; otherwise the table will remain locked. */ - int rc2 = sqlite3_step(s); - if( rc2==SQLITE_ROW ) return SQLITE_ERROR; - return rc2; - } - - *piStartBlockid = sqlite3_column_int64(s, 0); - *piEndBlockid = sqlite3_column_int64(s, 1); - - /* We expect only one row. We must execute another sqlite3_step() - * to complete the iteration; otherwise the table will remain locked. */ - rc = sqlite3_step(s); - if( rc==SQLITE_ROW ) return SQLITE_ERROR; - if( rc!=SQLITE_DONE ) return rc; - return SQLITE_ROW; +static int fts3EofMethod(sqlite3_vtab_cursor *pCursor){ + return ((Fts3Cursor *)pCursor)->isEof; } -/* Delete the segment blocks and segment directory records for all -** segments at iLevel. +/* +** This is the xRowid method. The SQLite core calls this routine to +** retrieve the rowid for the current row of the result set. fts3 +** exposes %_content.docid as the rowid for the virtual table. The +** rowid should be written to *pRowid. */ -static int segdir_delete(fulltext_vtab *v, int iLevel){ - sqlite3_stmt *s; - sqlite_int64 iStartBlockid, iEndBlockid; - int rc = segdir_span(v, iLevel, &iStartBlockid, &iEndBlockid); - if( rc!=SQLITE_ROW && rc!=SQLITE_DONE ) return rc; - - if( rc==SQLITE_ROW ){ - rc = block_delete(v, iStartBlockid, iEndBlockid); - if( rc!=SQLITE_OK ) return rc; +static int fts3RowidMethod(sqlite3_vtab_cursor *pCursor, sqlite_int64 *pRowid){ + Fts3Cursor *pCsr = (Fts3Cursor *) pCursor; + if( pCsr->aDoclist ){ + *pRowid = pCsr->iPrevId; + }else{ + *pRowid = sqlite3_column_int64(pCsr->pStmt, 0); } - - /* Delete the segment directory itself. */ - rc = sql_get_statement(v, SEGDIR_DELETE_STMT, &s); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_bind_int64(s, 1, iLevel); - if( rc!=SQLITE_OK ) return rc; - - return sql_single_step(s); + return SQLITE_OK; } -/* Delete entire fts index, SQLITE_OK on success, relevant error on -** failure. +/* +** This is the xColumn method, called by SQLite to request a value from +** the row that the supplied cursor currently points to. */ -static int segdir_delete_all(fulltext_vtab *v){ - sqlite3_stmt *s; - int rc = sql_get_statement(v, SEGDIR_DELETE_ALL_STMT, &s); - if( rc!=SQLITE_OK ) return rc; +static int fts3ColumnMethod( + sqlite3_vtab_cursor *pCursor, /* Cursor to retrieve value from */ + sqlite3_context *pContext, /* Context for sqlite3_result_xxx() calls */ + int iCol /* Index of column to read value from */ +){ + int rc; /* Return Code */ + Fts3Cursor *pCsr = (Fts3Cursor *) pCursor; + Fts3Table *p = (Fts3Table *)pCursor->pVtab; - rc = sql_single_step(s); - if( rc!=SQLITE_OK ) return rc; + /* The column value supplied by SQLite must be in range. */ + assert( iCol>=0 && iCol<=p->nColumn+1 ); - rc = sql_get_statement(v, BLOCK_DELETE_ALL_STMT, &s); - if( rc!=SQLITE_OK ) return rc; + if( iCol==p->nColumn+1 ){ + /* This call is a request for the "docid" column. Since "docid" is an + ** alias for "rowid", use the xRowid() method to obtain the value. + */ + sqlite3_int64 iRowid; + rc = fts3RowidMethod(pCursor, &iRowid); + sqlite3_result_int64(pContext, iRowid); + }else if( iCol==p->nColumn ){ + /* The extra column whose name is the same as the table. + ** Return a blob which is a pointer to the cursor. + */ + sqlite3_result_blob(pContext, &pCsr, sizeof(pCsr), SQLITE_TRANSIENT); + rc = SQLITE_OK; + }else{ + rc = fts3CursorSeek(0, pCsr); + if( rc==SQLITE_OK ){ + sqlite3_result_value(pContext, sqlite3_column_value(pCsr->pStmt, iCol+1)); + } + } + return rc; +} - return sql_single_step(s); +/* +** This function is the implementation of the xUpdate callback used by +** FTS3 virtual tables. It is invoked by SQLite each time a row is to be +** inserted, updated or deleted. +*/ +static int fts3UpdateMethod( + sqlite3_vtab *pVtab, /* Virtual table handle */ + int nArg, /* Size of argument array */ + sqlite3_value **apVal, /* Array of arguments */ + sqlite_int64 *pRowid /* OUT: The affected (or effected) rowid */ +){ + return sqlite3Fts3UpdateMethod(pVtab, nArg, apVal, pRowid); } -/* Returns SQLITE_OK with *pnSegments set to the number of entries in -** %_segdir and *piMaxLevel set to the highest level which has a -** segment. Otherwise returns the SQLite error which caused failure. +/* +** Implementation of xSync() method. Flush the contents of the pending-terms +** hash-table to the database. */ -static int segdir_count(fulltext_vtab *v, int *pnSegments, int *piMaxLevel){ - sqlite3_stmt *s; - int rc = sql_get_statement(v, SEGDIR_COUNT_STMT, &s); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_step(s); - /* TODO(shess): This case should not be possible? Should stronger - ** measures be taken if it happens? - */ - if( rc==SQLITE_DONE ){ - *pnSegments = 0; - *piMaxLevel = 0; - return SQLITE_OK; - } - if( rc!=SQLITE_ROW ) return rc; - - *pnSegments = sqlite3_column_int(s, 0); - *piMaxLevel = sqlite3_column_int(s, 1); - - /* We expect only one row. We must execute another sqlite3_step() - * to complete the iteration; otherwise the table will remain locked. */ - rc = sqlite3_step(s); - if( rc==SQLITE_DONE ) return SQLITE_OK; - if( rc==SQLITE_ROW ) return SQLITE_ERROR; - return rc; +static int fts3SyncMethod(sqlite3_vtab *pVtab){ + return sqlite3Fts3PendingTermsFlush((Fts3Table *)pVtab); } -/* TODO(shess) clearPendingTerms() is far down the file because -** writeZeroSegment() is far down the file because LeafWriter is far -** down the file. Consider refactoring the code to move the non-vtab -** code above the vtab code so that we don't need this forward -** reference. +/* +** Implementation of xBegin() method. This is a no-op. */ -static int clearPendingTerms(fulltext_vtab *v); +static int fts3BeginMethod(sqlite3_vtab *pVtab){ + UNUSED_PARAMETER(pVtab); + assert( ((Fts3Table *)pVtab)->nPendingData==0 ); + return SQLITE_OK; +} /* -** Free the memory used to contain a fulltext_vtab structure. +** Implementation of xCommit() method. This is a no-op. The contents of +** the pending-terms hash-table have already been flushed into the database +** by fts3SyncMethod(). */ -static void fulltext_vtab_destroy(fulltext_vtab *v){ - int iStmt, i; - - FTSTRACE(("FTS3 Destroy %p\n", v)); - for( iStmt=0; iStmtpFulltextStatements[iStmt]!=NULL ){ - sqlite3_finalize(v->pFulltextStatements[iStmt]); - v->pFulltextStatements[iStmt] = NULL; - } - } - - for( i=0; ipLeafSelectStmts[i]!=NULL ){ - sqlite3_finalize(v->pLeafSelectStmts[i]); - v->pLeafSelectStmts[i] = NULL; - } - } - - if( v->pTokenizer!=NULL ){ - v->pTokenizer->pModule->xDestroy(v->pTokenizer); - v->pTokenizer = NULL; - } - - clearPendingTerms(v); - - sqlite3_free(v->azColumn); - for(i = 0; i < v->nColumn; ++i) { - sqlite3_free(v->azContentColumn[i]); - } - sqlite3_free(v->azContentColumn); - sqlite3_free(v); +static int fts3CommitMethod(sqlite3_vtab *pVtab){ + UNUSED_PARAMETER(pVtab); + assert( ((Fts3Table *)pVtab)->nPendingData==0 ); + return SQLITE_OK; } /* -** Token types for parsing the arguments to xConnect or xCreate. +** Implementation of xRollback(). Discard the contents of the pending-terms +** hash-table. Any changes made to the database are reverted by SQLite. */ -#define TOKEN_EOF 0 /* End of file */ -#define TOKEN_SPACE 1 /* Any kind of whitespace */ -#define TOKEN_ID 2 /* An identifier */ -#define TOKEN_STRING 3 /* A string literal */ -#define TOKEN_PUNCT 4 /* A single punctuation character */ +static int fts3RollbackMethod(sqlite3_vtab *pVtab){ + sqlite3Fts3PendingTermsClear((Fts3Table *)pVtab); + return SQLITE_OK; +} /* -** If X is a character that can be used in an identifier then -** ftsIdChar(X) will be true. Otherwise it is false. -** -** For ASCII, any character with the high-order bit set is -** allowed in an identifier. For 7-bit characters, -** isFtsIdChar[X] must be 1. -** -** Ticket #1066. the SQL standard does not allow '$' in the -** middle of identfiers. But many SQL implementations do. -** SQLite will allow '$' in identifiers for compatibility. -** But the feature is undocumented. +** Load the doclist associated with expression pExpr to pExpr->aDoclist. +** The loaded doclist contains positions as well as the document ids. +** This is used by the matchinfo(), snippet() and offsets() auxillary +** functions. */ -static const char isFtsIdChar[] = { -/* x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF */ - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 2x */ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, /* 3x */ - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 4x */ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, /* 5x */ - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 6x */ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, /* 7x */ -}; -#define ftsIdChar(C) (((c=C)&0x80)!=0 || (c>0x1f && isFtsIdChar[c-0x20])) - +SQLITE_PRIVATE int sqlite3Fts3ExprLoadDoclist(Fts3Table *pTab, Fts3Expr *pExpr){ + return evalFts3Expr(pTab, pExpr, &pExpr->aDoclist, &pExpr->nDoclist, 1); +} /* -** Return the length of the token that begins at z[0]. -** Store the token type in *tokenType before returning. +** After ExprLoadDoclist() (see above) has been called, this function is +** used to iterate through the position lists that make up the doclist +** stored in pExpr->aDoclist. */ -static int ftsGetToken(const char *z, int *tokenType){ - int i, c; - switch( *z ){ - case 0: { - *tokenType = TOKEN_EOF; - return 0; - } - case ' ': case '\t': case '\n': case '\f': case '\r': { - for(i=1; safe_isspace(z[i]); i++){} - *tokenType = TOKEN_SPACE; - return i; - } - case '`': - case '\'': - case '"': { - int delim = z[0]; - for(i=1; (c=z[i])!=0; i++){ - if( c==delim ){ - if( z[i+1]==delim ){ - i++; - }else{ - break; +SQLITE_PRIVATE char *sqlite3Fts3FindPositions( + Fts3Expr *pExpr, /* Access this expressions doclist */ + sqlite3_int64 iDocid, /* Docid associated with requested pos-list */ + int iCol /* Column of requested pos-list */ +){ + assert( pExpr->isLoaded ); + if( pExpr->aDoclist ){ + char *pEnd = &pExpr->aDoclist[pExpr->nDoclist]; + char *pCsr = pExpr->pCurrent; + + assert( pCsr ); + while( pCsriCurrentiCurrent); + pExpr->pCurrent = pCsr; + }else{ + if( pExpr->iCurrent==iDocid ){ + int iThis = 0; + if( iCol<0 ){ + /* If iCol is negative, return a pointer to the start of the + ** position-list (instead of a pointer to the start of a list + ** of offsets associated with a specific column). + */ + return pCsr; } + while( iThis0 ){ - n = ftsGetToken(z, &e); - if( e!=TOKEN_SPACE ){ - aToken[nToken].z = z; - aToken[nToken].n = n; - nToken++; - totalSize += n+1; - } - z += n; - } - azToken = (char**)sqlite3_malloc( nToken*sizeof(char*) + totalSize ); - zCopy = (char*)&azToken[nToken]; - nToken--; - for(i=0; i=1 ); + + if( nVal>4 ){ + sqlite3_result_error(pContext, + "wrong number of arguments to function snippet()", -1); + return; } - for(i=1, j=0; z[i]; i++){ - if( z[i]==quote ){ - if( z[i+1]==quote ){ - z[j++] = quote; - i++; - }else{ - z[j++] = 0; - break; - } - }else{ - z[j++] = z[i]; - } + if( fts3FunctionArg(pContext, "snippet", apVal[0], &pCsr) ) return; + + switch( nVal ){ + case 4: zEllipsis = (const char*)sqlite3_value_text(apVal[3]); + case 3: zEnd = (const char*)sqlite3_value_text(apVal[2]); + case 2: zStart = (const char*)sqlite3_value_text(apVal[1]); + } + if( !zEllipsis || !zEnd || !zStart ){ + sqlite3_result_error_nomem(pContext); + }else if( SQLITE_OK==fts3CursorSeek(pContext, pCsr) ){ + sqlite3Fts3Snippet(pContext, pCsr, zStart, zEnd, zEllipsis); } } /* -** The input azIn is a NULL-terminated list of tokens. Remove the first -** token and all punctuation tokens. Remove the quotes from -** around string literal tokens. -** -** Example: -** -** input: tokenize chinese ( 'simplifed' , 'mixed' ) -** output: chinese simplifed mixed -** -** Another example: -** -** input: delimiters ( '[' , ']' , '...' ) -** output: [ ] ... +** Implementation of the snippet2() function for FTS3 */ -static void tokenListToIdList(char **azIn){ - int i, j; - if( azIn ){ - for(i=0, j=-1; azIn[i]; i++){ - if( safe_isalnum(azIn[i][0]) || azIn[i][1] ){ - dequoteString(azIn[i]); - if( j>=0 ){ - azIn[j] = azIn[i]; - } - j++; - } - } - azIn[j] = 0; +static void fts3Snippet2Func( + sqlite3_context *pContext, /* SQLite function call context */ + int nVal, /* Size of apVal[] array */ + sqlite3_value **apVal /* Array of arguments */ +){ + Fts3Cursor *pCsr; /* Cursor handle passed through apVal[0] */ + const char *zStart = ""; + const char *zEnd = ""; + const char *zEllipsis = "..."; + int iCol = -1; + int nToken = 10; + + /* There must be at least one argument passed to this function (otherwise + ** the non-overloaded version would have been called instead of this one). + */ + assert( nVal>=1 ); + + if( nVal>6 ){ + sqlite3_result_error(pContext, + "wrong number of arguments to function snippet()", -1); + return; } -} + if( fts3FunctionArg(pContext, "snippet", apVal[0], &pCsr) ) return; + switch( nVal ){ + case 6: nToken = sqlite3_value_int(apVal[5]); + case 5: iCol = sqlite3_value_int(apVal[4]); + case 4: zEllipsis = (const char*)sqlite3_value_text(apVal[3]); + case 3: zEnd = (const char*)sqlite3_value_text(apVal[2]); + case 2: zStart = (const char*)sqlite3_value_text(apVal[1]); + } + if( !zEllipsis || !zEnd || !zStart ){ + sqlite3_result_error_nomem(pContext); + }else if( SQLITE_OK==fts3CursorSeek(pContext, pCsr) ){ + sqlite3Fts3Snippet2(pContext, pCsr, zStart, zEnd, zEllipsis, iCol, nToken); + } +} /* -** Find the first alphanumeric token in the string zIn. Null-terminate -** this token. Remove any quotation marks. And return a pointer to -** the result. +** Implementation of the offsets() function for FTS3 */ -static char *firstToken(char *zIn, char **pzTail){ - int n, ttype; - while(1){ - n = ftsGetToken(zIn, &ttype); - if( ttype==TOKEN_SPACE ){ - zIn += n; - }else if( ttype==TOKEN_EOF ){ - *pzTail = zIn; - return 0; - }else{ - zIn[n] = 0; - *pzTail = &zIn[1]; - dequoteString(zIn); - return zIn; - } +static void fts3OffsetsFunc( + sqlite3_context *pContext, /* SQLite function call context */ + int nVal, /* Size of argument array */ + sqlite3_value **apVal /* Array of arguments */ +){ + Fts3Cursor *pCsr; /* Cursor handle passed through apVal[0] */ + + UNUSED_PARAMETER(nVal); + + assert( nVal==1 ); + if( fts3FunctionArg(pContext, "offsets", apVal[0], &pCsr) ) return; + assert( pCsr ); + if( SQLITE_OK==fts3CursorSeek(pContext, pCsr) ){ + sqlite3Fts3Offsets(pContext, pCsr); } - /*NOTREACHED*/ } -/* Return true if... +/* +** Implementation of the special optimize() function for FTS3. This +** function merges all segments in the database to a single segment. +** Example usage is: ** -** * s begins with the string t, ignoring case -** * s is longer than t -** * The first character of s beyond t is not a alphanumeric -** -** Ignore leading space in *s. +** SELECT optimize(t) FROM t LIMIT 1; ** -** To put it another way, return true if the first token of -** s[] is t[]. +** where 't' is the name of an FTS3 table. */ -static int startsWith(const char *s, const char *t){ - while( safe_isspace(*s) ){ s++; } - while( *t ){ - if( safe_tolower(*s++)!=safe_tolower(*t++) ) return 0; +static void fts3OptimizeFunc( + sqlite3_context *pContext, /* SQLite function call context */ + int nVal, /* Size of argument array */ + sqlite3_value **apVal /* Array of arguments */ +){ + int rc; /* Return code */ + Fts3Table *p; /* Virtual table handle */ + Fts3Cursor *pCursor; /* Cursor handle passed through apVal[0] */ + + UNUSED_PARAMETER(nVal); + + assert( nVal==1 ); + if( fts3FunctionArg(pContext, "optimize", apVal[0], &pCursor) ) return; + p = (Fts3Table *)pCursor->base.pVtab; + assert( p ); + + rc = sqlite3Fts3Optimize(p); + + switch( rc ){ + case SQLITE_OK: + sqlite3_result_text(pContext, "Index optimized", -1, SQLITE_STATIC); + break; + case SQLITE_DONE: + sqlite3_result_text(pContext, "Index already optimal", -1, SQLITE_STATIC); + break; + default: + sqlite3_result_error_code(pContext, rc); + break; } - return *s!='_' && !safe_isalnum(*s); } /* -** An instance of this structure defines the "spec" of a -** full text index. This structure is populated by parseSpec -** and use by fulltextConnect and fulltextCreate. +** Implementation of the matchinfo() function for FTS3 */ -typedef struct TableSpec { - const char *zDb; /* Logical database name */ - const char *zName; /* Name of the full-text index */ - int nColumn; /* Number of columns to be indexed */ - char **azColumn; /* Original names of columns to be indexed */ - char **azContentColumn; /* Column names for %_content */ - char **azTokenizer; /* Name of tokenizer and its arguments */ -} TableSpec; +static void fts3MatchinfoFunc( + sqlite3_context *pContext, /* SQLite function call context */ + int nVal, /* Size of argument array */ + sqlite3_value **apVal /* Array of arguments */ +){ + Fts3Cursor *pCsr; /* Cursor handle passed through apVal[0] */ + + if( nVal!=1 ){ + sqlite3_result_error(pContext, + "wrong number of arguments to function matchinfo()", -1); + return; + } + + if( SQLITE_OK==fts3FunctionArg(pContext, "matchinfo", apVal[0], &pCsr) ){ + sqlite3Fts3Matchinfo(pContext, pCsr); + } +} /* -** Reclaim all of the memory used by a TableSpec +** This routine implements the xFindFunction method for the FTS3 +** virtual table. */ -static void clearTableSpec(TableSpec *p) { - sqlite3_free(p->azColumn); - sqlite3_free(p->azContentColumn); - sqlite3_free(p->azTokenizer); -} +static int fts3FindFunctionMethod( + sqlite3_vtab *pVtab, /* Virtual table handle */ + int nArg, /* Number of SQL function arguments */ + const char *zName, /* Name of SQL function */ + void (**pxFunc)(sqlite3_context*,int,sqlite3_value**), /* OUT: Result */ + void **ppArg /* Unused */ +){ + struct Overloaded { + const char *zName; + void (*xFunc)(sqlite3_context*,int,sqlite3_value**); + } aOverload[] = { + { "snippet", fts3SnippetFunc }, + { "snippet2", fts3Snippet2Func }, + { "offsets", fts3OffsetsFunc }, + { "optimize", fts3OptimizeFunc }, + { "matchinfo", fts3MatchinfoFunc }, + }; + int i; /* Iterator variable */ -/* Parse a CREATE VIRTUAL TABLE statement, which looks like this: - * - * CREATE VIRTUAL TABLE email - * USING fts3(subject, body, tokenize mytokenizer(myarg)) - * - * We return parsed information in a TableSpec structure. - * - */ -static int parseSpec(TableSpec *pSpec, int argc, const char *const*argv, - char**pzErr){ - int i, n; - char *z, *zDummy; - char **azArg; - const char *zTokenizer = 0; /* argv[] entry describing the tokenizer */ - - assert( argc>=3 ); - /* Current interface: - ** argv[0] - module name - ** argv[1] - database name - ** argv[2] - table name - ** argv[3..] - columns, optionally followed by tokenizer specification - ** and snippet delimiters specification. - */ + UNUSED_PARAMETER(pVtab); + UNUSED_PARAMETER(nArg); + UNUSED_PARAMETER(ppArg); - /* Make a copy of the complete argv[][] array in a single allocation. - ** The argv[][] array is read-only and transient. We can write to the - ** copy in order to modify things and the copy is persistent. - */ - CLEAR(pSpec); - for(i=n=0; izDb = azArg[1]; - pSpec->zName = azArg[2]; - pSpec->nColumn = 0; - pSpec->azColumn = azArg; - zTokenizer = "tokenize simple"; - for(i=3; inColumn] = firstToken(azArg[i], &zDummy); - pSpec->nColumn++; + for(i=0; inColumn==0 ){ - azArg[0] = "content"; - pSpec->nColumn = 1; - } - /* - ** Construct the list of content column names. - ** - ** Each content column name will be of the form cNNAAAA - ** where NN is the column number and AAAA is the sanitized - ** column name. "sanitized" means that special characters are - ** converted to "_". The cNN prefix guarantees that all column - ** names are unique. - ** - ** The AAAA suffix is not strictly necessary. It is included - ** for the convenience of people who might examine the generated - ** %_content table and wonder what the columns are used for. - */ - pSpec->azContentColumn = sqlite3_malloc( pSpec->nColumn * sizeof(char *) ); - if( pSpec->azContentColumn==0 ){ - clearTableSpec(pSpec); - return SQLITE_NOMEM; - } - for(i=0; inColumn; i++){ - char *p; - pSpec->azContentColumn[i] = sqlite3_mprintf("c%d%s", i, azArg[i]); - for (p = pSpec->azContentColumn[i]; *p ; ++p) { - if( !safe_isalnum(*p) ) *p = '_'; - } + /* No function of the specified name was found. Return 0. */ + return 0; +} + +/* +** Implementation of FTS3 xRename method. Rename an fts3 table. +*/ +static int fts3RenameMethod( + sqlite3_vtab *pVtab, /* Virtual table handle */ + const char *zName /* New name of table */ +){ + Fts3Table *p = (Fts3Table *)pVtab; + int rc = SQLITE_NOMEM; /* Return Code */ + char *zSql; /* SQL script to run to rename tables */ + + zSql = sqlite3_mprintf( + "ALTER TABLE %Q.'%q_content' RENAME TO '%q_content';" + "ALTER TABLE %Q.'%q_segments' RENAME TO '%q_segments';" + "ALTER TABLE %Q.'%q_segdir' RENAME TO '%q_segdir';" + , p->zDb, p->zName, zName + , p->zDb, p->zName, zName + , p->zDb, p->zName, zName + ); + if( zSql ){ + rc = sqlite3_exec(p->db, zSql, 0, 0, 0); + sqlite3_free(zSql); } + return rc; +} - /* - ** Parse the tokenizer specification string. - */ - pSpec->azTokenizer = tokenizeString(zTokenizer, &n); - tokenListToIdList(pSpec->azTokenizer); +static const sqlite3_module fts3Module = { + /* iVersion */ 0, + /* xCreate */ fts3CreateMethod, + /* xConnect */ fts3ConnectMethod, + /* xBestIndex */ fts3BestIndexMethod, + /* xDisconnect */ fts3DisconnectMethod, + /* xDestroy */ fts3DestroyMethod, + /* xOpen */ fts3OpenMethod, + /* xClose */ fulltextClose, + /* xFilter */ fts3FilterMethod, + /* xNext */ fts3NextMethod, + /* xEof */ fts3EofMethod, + /* xColumn */ fts3ColumnMethod, + /* xRowid */ fts3RowidMethod, + /* xUpdate */ fts3UpdateMethod, + /* xBegin */ fts3BeginMethod, + /* xSync */ fts3SyncMethod, + /* xCommit */ fts3CommitMethod, + /* xRollback */ fts3RollbackMethod, + /* xFindFunction */ fts3FindFunctionMethod, + /* xRename */ fts3RenameMethod, +}; - return SQLITE_OK; +/* +** This function is registered as the module destructor (called when an +** FTS3 enabled database connection is closed). It frees the memory +** allocated for the tokenizer hash table. +*/ +static void hashDestroy(void *p){ + Fts3Hash *pHash = (Fts3Hash *)p; + sqlite3Fts3HashClear(pHash); + sqlite3_free(pHash); } /* -** Generate a CREATE TABLE statement that describes the schema of -** the virtual table. Return a pointer to this schema string. +** The fts3 built-in tokenizers - "simple" and "porter" - are implemented +** in files fts3_tokenizer1.c and fts3_porter.c respectively. The following +** two forward declarations are for functions declared in these files +** used to retrieve the respective implementations. ** -** Space is obtained from sqlite3_mprintf() and should be freed -** using sqlite3_free(). +** Calling sqlite3Fts3SimpleTokenizerModule() sets the value pointed +** to by the argument to point a the "simple" tokenizer implementation. +** Function ...PorterTokenizerModule() sets *pModule to point to the +** porter tokenizer/stemmer implementation. */ -static char *fulltextSchema( - int nColumn, /* Number of columns */ - const char *const* azColumn, /* List of columns */ - const char *zTableName /* Name of the table */ -){ - int i; - char *zSchema, *zNext; - const char *zSep = "("; - zSchema = sqlite3_mprintf("CREATE TABLE x"); - for(i=0; ibase */ - v->db = db; - v->zDb = spec->zDb; /* Freed when azColumn is freed */ - v->zName = spec->zName; /* Freed when azColumn is freed */ - v->nColumn = spec->nColumn; - v->azContentColumn = spec->azContentColumn; - spec->azContentColumn = 0; - v->azColumn = spec->azColumn; - spec->azColumn = 0; - - if( spec->azTokenizer==0 ){ - return SQLITE_NOMEM; - } +SQLITE_PRIVATE void sqlite3Fts3SimpleTokenizerModule(sqlite3_tokenizer_module const**ppModule); +SQLITE_PRIVATE void sqlite3Fts3PorterTokenizerModule(sqlite3_tokenizer_module const**ppModule); +SQLITE_PRIVATE void sqlite3Fts3IcuTokenizerModule(sqlite3_tokenizer_module const**ppModule); - zTok = spec->azTokenizer[0]; - if( !zTok ){ - zTok = "simple"; - } - nTok = strlen(zTok)+1; +/* +** Initialise the fts3 extension. If this extension is built as part +** of the sqlite library, then this function is called directly by +** SQLite. If fts3 is built as a dynamically loadable extension, this +** function is called by the sqlite3_extension_init() entry point. +*/ +SQLITE_PRIVATE int sqlite3Fts3Init(sqlite3 *db){ + int rc = SQLITE_OK; + Fts3Hash *pHash = 0; + const sqlite3_tokenizer_module *pSimple = 0; + const sqlite3_tokenizer_module *pPorter = 0; - m = (sqlite3_tokenizer_module *)sqlite3Fts3HashFind(pHash, zTok, nTok); - if( !m ){ - *pzErr = sqlite3_mprintf("unknown tokenizer: %s", spec->azTokenizer[0]); - rc = SQLITE_ERROR; - goto err; - } +#ifdef SQLITE_ENABLE_ICU + const sqlite3_tokenizer_module *pIcu = 0; + sqlite3Fts3IcuTokenizerModule(&pIcu); +#endif - for(n=0; spec->azTokenizer[n]; n++){} - if( n ){ - rc = m->xCreate(n-1, (const char*const*)&spec->azTokenizer[1], - &v->pTokenizer); + sqlite3Fts3SimpleTokenizerModule(&pSimple); + sqlite3Fts3PorterTokenizerModule(&pPorter); + + /* Allocate and initialise the hash-table used to store tokenizers. */ + pHash = sqlite3_malloc(sizeof(Fts3Hash)); + if( !pHash ){ + rc = SQLITE_NOMEM; }else{ - rc = m->xCreate(0, 0, &v->pTokenizer); + sqlite3Fts3HashInit(pHash, FTS3_HASH_STRING, 1); } - if( rc!=SQLITE_OK ) goto err; - v->pTokenizer->pModule = m; - - /* TODO: verify the existence of backing tables foo_content, foo_term */ - schema = fulltextSchema(v->nColumn, (const char*const*)v->azColumn, - spec->zName); - rc = sqlite3_declare_vtab(db, schema); - sqlite3_free(schema); - if( rc!=SQLITE_OK ) goto err; - - memset(v->pFulltextStatements, 0, sizeof(v->pFulltextStatements)); - - /* Indicate that the buffer is not live. */ - v->nPendingData = -1; + /* Load the built-in tokenizers into the hash table */ + if( rc==SQLITE_OK ){ + if( sqlite3Fts3HashInsert(pHash, "simple", 7, (void *)pSimple) + || sqlite3Fts3HashInsert(pHash, "porter", 7, (void *)pPorter) +#ifdef SQLITE_ENABLE_ICU + || (pIcu && sqlite3Fts3HashInsert(pHash, "icu", 4, (void *)pIcu)) +#endif + ){ + rc = SQLITE_NOMEM; + } + } - *ppVTab = &v->base; - FTSTRACE(("FTS3 Connect %p\n", v)); +#ifdef SQLITE_TEST + if( rc==SQLITE_OK ){ + rc = sqlite3Fts3ExprInitTestInterface(db); + } +#endif - return rc; + /* Create the virtual table wrapper around the hash-table and overload + ** the two scalar functions. If this is successful, register the + ** module with sqlite. + */ + if( SQLITE_OK==rc + && SQLITE_OK==(rc = sqlite3Fts3InitHashTable(db, pHash, "fts3_tokenizer")) + && SQLITE_OK==(rc = sqlite3_overload_function(db, "snippet", -1)) + && SQLITE_OK==(rc = sqlite3_overload_function(db, "snippet2", -1)) + && SQLITE_OK==(rc = sqlite3_overload_function(db, "offsets", 1)) + && SQLITE_OK==(rc = sqlite3_overload_function(db, "matchinfo", -1)) + && SQLITE_OK==(rc = sqlite3_overload_function(db, "optimize", 1)) + ){ + return sqlite3_create_module_v2( + db, "fts3", &fts3Module, (void *)pHash, hashDestroy + ); + } -err: - fulltext_vtab_destroy(v); + /* An error has occurred. Delete the hash table and return the error code. */ + assert( rc!=SQLITE_OK ); + if( pHash ){ + sqlite3Fts3HashClear(pHash); + sqlite3_free(pHash); + } return rc; } -static int fulltextConnect( - sqlite3 *db, - void *pAux, - int argc, const char *const*argv, - sqlite3_vtab **ppVTab, - char **pzErr +#if !SQLITE_CORE +SQLITE_API int sqlite3_extension_init( + sqlite3 *db, + char **pzErrMsg, + const sqlite3_api_routines *pApi ){ - TableSpec spec; - int rc = parseSpec(&spec, argc, argv, pzErr); - if( rc!=SQLITE_OK ) return rc; - - rc = constructVtab(db, (fts3Hash *)pAux, &spec, ppVTab, pzErr); - clearTableSpec(&spec); - return rc; + SQLITE_EXTENSION_INIT2(pApi) + return sqlite3Fts3Init(db); } +#endif + +#endif -/* The %_content table holds the text of each document, with -** the docid column exposed as the SQLite rowid for the table. +/************** End of fts3.c ************************************************/ +/************** Begin file fts3_expr.c ***************************************/ +/* +** 2008 Nov 28 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +****************************************************************************** +** +** This module contains code that implements a parser for fts3 query strings +** (the right-hand argument to the MATCH operator). Because the supported +** syntax is relatively simple, the whole tokenizer/parser system is +** hand-coded. */ -/* TODO(shess) This comment needs elaboration to match the updated -** code. Work it into the top-of-file comment at that time. +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) + +/* +** By default, this module parses the legacy syntax that has been +** traditionally used by fts3. Or, if SQLITE_ENABLE_FTS3_PARENTHESIS +** is defined, then it uses the new syntax. The differences between +** the new and the old syntaxes are: +** +** a) The new syntax supports parenthesis. The old does not. +** +** b) The new syntax supports the AND and NOT operators. The old does not. +** +** c) The old syntax supports the "-" token qualifier. This is not +** supported by the new syntax (it is replaced by the NOT operator). +** +** d) When using the old syntax, the OR operator has a greater precedence +** than an implicit AND. When using the new, both implicity and explicit +** AND operators have a higher precedence than OR. +** +** If compiled with SQLITE_TEST defined, then this module exports the +** symbol "int sqlite3_fts3_enable_parentheses". Setting this variable +** to zero causes the module to use the old syntax. If it is set to +** non-zero the new syntax is activated. This is so both syntaxes can +** be tested using a single build of testfixture. +** +** The following describes the syntax supported by the fts3 MATCH +** operator in a similar format to that used by the lemon parser +** generator. This module does not use actually lemon, it uses a +** custom parser. +** +** query ::= andexpr (OR andexpr)*. +** +** andexpr ::= notexpr (AND? notexpr)*. +** +** notexpr ::= nearexpr (NOT nearexpr|-TOKEN)*. +** notexpr ::= LP query RP. +** +** nearexpr ::= phrase (NEAR distance_opt nearexpr)*. +** +** distance_opt ::= . +** distance_opt ::= / INTEGER. +** +** phrase ::= TOKEN. +** phrase ::= COLUMN:TOKEN. +** phrase ::= "TOKEN TOKEN TOKEN...". */ -static int fulltextCreate(sqlite3 *db, void *pAux, - int argc, const char * const *argv, - sqlite3_vtab **ppVTab, char **pzErr){ - int rc; - TableSpec spec; - StringBuffer schema; - FTSTRACE(("FTS3 Create\n")); - rc = parseSpec(&spec, argc, argv, pzErr); - if( rc!=SQLITE_OK ) return rc; +#ifdef SQLITE_TEST +SQLITE_API int sqlite3_fts3_enable_parentheses = 0; +#else +# ifdef SQLITE_ENABLE_FTS3_PARENTHESIS +# define sqlite3_fts3_enable_parentheses 1 +# else +# define sqlite3_fts3_enable_parentheses 0 +# endif +#endif - initStringBuffer(&schema); - append(&schema, "CREATE TABLE %_content("); - append(&schema, " docid INTEGER PRIMARY KEY,"); - appendList(&schema, spec.nColumn, spec.azContentColumn); - append(&schema, ")"); - rc = sql_exec(db, spec.zDb, spec.zName, stringBufferData(&schema)); - stringBufferDestroy(&schema); - if( rc!=SQLITE_OK ) goto out; - - rc = sql_exec(db, spec.zDb, spec.zName, - "create table %_segments(" - " blockid INTEGER PRIMARY KEY," - " block blob" - ");" - ); - if( rc!=SQLITE_OK ) goto out; - - rc = sql_exec(db, spec.zDb, spec.zName, - "create table %_segdir(" - " level integer," - " idx integer," - " start_block integer," - " leaves_end_block integer," - " end_block integer," - " root blob," - " primary key(level, idx)" - ");"); - if( rc!=SQLITE_OK ) goto out; - - rc = constructVtab(db, (fts3Hash *)pAux, &spec, ppVTab, pzErr); - -out: - clearTableSpec(&spec); - return rc; -} +/* +** Default span for NEAR operators. +*/ +#define SQLITE_FTS3_DEFAULT_NEAR_PARAM 10 -/* Decide how to handle an SQL query. */ -static int fulltextBestIndex(sqlite3_vtab *pVTab, sqlite3_index_info *pInfo){ - fulltext_vtab *v = (fulltext_vtab *)pVTab; - int i; - FTSTRACE(("FTS3 BestIndex\n")); - - for(i=0; inConstraint; ++i){ - const struct sqlite3_index_constraint *pConstraint; - pConstraint = &pInfo->aConstraint[i]; - if( pConstraint->usable ) { - if( (pConstraint->iColumn==-1 || pConstraint->iColumn==v->nColumn+1) && - pConstraint->op==SQLITE_INDEX_CONSTRAINT_EQ ){ - pInfo->idxNum = QUERY_DOCID; /* lookup by docid */ - FTSTRACE(("FTS3 QUERY_DOCID\n")); - } else if( pConstraint->iColumn>=0 && pConstraint->iColumn<=v->nColumn && - pConstraint->op==SQLITE_INDEX_CONSTRAINT_MATCH ){ - /* full-text search */ - pInfo->idxNum = QUERY_FULLTEXT + pConstraint->iColumn; - FTSTRACE(("FTS3 QUERY_FULLTEXT %d\n", pConstraint->iColumn)); - } else continue; - - pInfo->aConstraintUsage[i].argvIndex = 1; - pInfo->aConstraintUsage[i].omit = 1; - - /* An arbitrary value for now. - * TODO: Perhaps docid matches should be considered cheaper than - * full-text searches. */ - pInfo->estimatedCost = 1.0; - return SQLITE_OK; - } - } - pInfo->idxNum = QUERY_GENERIC; - return SQLITE_OK; -} +typedef struct ParseContext ParseContext; +struct ParseContext { + sqlite3_tokenizer *pTokenizer; /* Tokenizer module */ + const char **azCol; /* Array of column names for fts3 table */ + int nCol; /* Number of entries in azCol[] */ + int iDefaultCol; /* Default column to query */ + sqlite3_context *pCtx; /* Write error message here */ + int nNest; /* Number of nested brackets */ +}; -static int fulltextDisconnect(sqlite3_vtab *pVTab){ - FTSTRACE(("FTS3 Disconnect %p\n", pVTab)); - fulltext_vtab_destroy((fulltext_vtab *)pVTab); - return SQLITE_OK; +/* +** This function is equivalent to the standard isspace() function. +** +** The standard isspace() can be awkward to use safely, because although it +** is defined to accept an argument of type int, its behaviour when passed +** an integer that falls outside of the range of the unsigned char type +** is undefined (and sometimes, "undefined" means segfault). This wrapper +** is defined to accept an argument of type char, and always returns 0 for +** any values that fall outside of the range of the unsigned char type (i.e. +** negative values). +*/ +static int fts3isspace(char c){ + return (c&0x80)==0 ? isspace(c) : 0; } -static int fulltextDestroy(sqlite3_vtab *pVTab){ - fulltext_vtab *v = (fulltext_vtab *)pVTab; +/* +** Extract the next token from buffer z (length n) using the tokenizer +** and other information (column names etc.) in pParse. Create an Fts3Expr +** structure of type FTSQUERY_PHRASE containing a phrase consisting of this +** single token and set *ppExpr to point to it. If the end of the buffer is +** reached before a token is found, set *ppExpr to zero. It is the +** responsibility of the caller to eventually deallocate the allocated +** Fts3Expr structure (if any) by passing it to sqlite3_free(). +** +** Return SQLITE_OK if successful, or SQLITE_NOMEM if a memory allocation +** fails. +*/ +static int getNextToken( + ParseContext *pParse, /* fts3 query parse context */ + int iCol, /* Value for Fts3Phrase.iColumn */ + const char *z, int n, /* Input string */ + Fts3Expr **ppExpr, /* OUT: expression */ + int *pnConsumed /* OUT: Number of bytes consumed */ +){ + sqlite3_tokenizer *pTokenizer = pParse->pTokenizer; + sqlite3_tokenizer_module const *pModule = pTokenizer->pModule; int rc; + sqlite3_tokenizer_cursor *pCursor; + Fts3Expr *pRet = 0; + int nConsumed = 0; - FTSTRACE(("FTS3 Destroy %p\n", pVTab)); - rc = sql_exec(v->db, v->zDb, v->zName, - "drop table if exists %_content;" - "drop table if exists %_segments;" - "drop table if exists %_segdir;" - ); - if( rc!=SQLITE_OK ) return rc; + rc = pModule->xOpen(pTokenizer, z, n, &pCursor); + if( rc==SQLITE_OK ){ + const char *zToken; + int nToken, iStart, iEnd, iPosition; + int nByte; /* total space to allocate */ - fulltext_vtab_destroy((fulltext_vtab *)pVTab); - return SQLITE_OK; -} + pCursor->pTokenizer = pTokenizer; + rc = pModule->xNext(pCursor, &zToken, &nToken, &iStart, &iEnd, &iPosition); -static int fulltextOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){ - fulltext_cursor *c; + if( rc==SQLITE_OK ){ + nByte = sizeof(Fts3Expr) + sizeof(Fts3Phrase) + nToken; + pRet = (Fts3Expr *)sqlite3_malloc(nByte); + if( !pRet ){ + rc = SQLITE_NOMEM; + }else{ + memset(pRet, 0, nByte); + pRet->eType = FTSQUERY_PHRASE; + pRet->pPhrase = (Fts3Phrase *)&pRet[1]; + pRet->pPhrase->nToken = 1; + pRet->pPhrase->iColumn = iCol; + pRet->pPhrase->aToken[0].n = nToken; + pRet->pPhrase->aToken[0].z = (char *)&pRet->pPhrase[1]; + memcpy(pRet->pPhrase->aToken[0].z, zToken, nToken); - c = (fulltext_cursor *) sqlite3_malloc(sizeof(fulltext_cursor)); - if( c ){ - memset(c, 0, sizeof(fulltext_cursor)); - /* sqlite will initialize c->base */ - *ppCursor = &c->base; - FTSTRACE(("FTS3 Open %p: %p\n", pVTab, c)); - return SQLITE_OK; - }else{ - return SQLITE_NOMEM; + if( iEndpPhrase->aToken[0].isPrefix = 1; + iEnd++; + } + if( !sqlite3_fts3_enable_parentheses && iStart>0 && z[iStart-1]=='-' ){ + pRet->pPhrase->isNot = 1; + } + } + nConsumed = iEnd; + } + + pModule->xClose(pCursor); } + + *pnConsumed = nConsumed; + *ppExpr = pRet; + return rc; } -/* Free all of the dynamically allocated memory held by the -** Snippet -*/ -static void snippetClear(Snippet *p){ - sqlite3_free(p->aMatch); - sqlite3_free(p->zOffset); - sqlite3_free(p->zSnippet); - CLEAR(p); -} /* -** Append a single entry to the p->aMatch[] log. +** Enlarge a memory allocation. If an out-of-memory allocation occurs, +** then free the old allocation. */ -static void snippetAppendMatch( - Snippet *p, /* Append the entry to this snippet */ - int iCol, int iTerm, /* The column and query term */ - int iToken, /* Matching token in document */ - int iStart, int nByte /* Offset and size of the match */ -){ - int i; - struct snippetMatch *pMatch; - if( p->nMatch+1>=p->nAlloc ){ - p->nAlloc = p->nAlloc*2 + 10; - p->aMatch = sqlite3_realloc(p->aMatch, p->nAlloc*sizeof(p->aMatch[0]) ); - if( p->aMatch==0 ){ - p->nMatch = 0; - p->nAlloc = 0; - return; - } +static void *fts3ReallocOrFree(void *pOrig, int nNew){ + void *pRet = sqlite3_realloc(pOrig, nNew); + if( !pRet ){ + sqlite3_free(pOrig); } - i = p->nMatch++; - pMatch = &p->aMatch[i]; - pMatch->iCol = iCol; - pMatch->iTerm = iTerm; - pMatch->iToken = iToken; - pMatch->iStart = iStart; - pMatch->nByte = nByte; + return pRet; } /* -** Sizing information for the circular buffer used in snippetOffsetsOfColumn() -*/ -#define FTS3_ROTOR_SZ (32) -#define FTS3_ROTOR_MASK (FTS3_ROTOR_SZ-1) - -/* -** Function to iterate through the tokens of a compiled expression. +** Buffer zInput, length nInput, contains the contents of a quoted string +** that appeared as part of an fts3 query expression. Neither quote character +** is included in the buffer. This function attempts to tokenize the entire +** input buffer and create an Fts3Expr structure of type FTSQUERY_PHRASE +** containing the results. ** -** Except, skip all tokens on the right-hand side of a NOT operator. -** This function is used to find tokens as part of snippet and offset -** generation and we do nt want snippets and offsets to report matches -** for tokens on the RHS of a NOT. +** If successful, SQLITE_OK is returned and *ppExpr set to point at the +** allocated Fts3Expr structure. Otherwise, either SQLITE_NOMEM (out of memory +** error) or SQLITE_ERROR (tokenization error) is returned and *ppExpr set +** to 0. */ -static int fts3NextExprToken(Fts3Expr **ppExpr, int *piToken){ - Fts3Expr *p = *ppExpr; - int iToken = *piToken; - if( iToken<0 ){ - /* In this case the expression p is the root of an expression tree. - ** Move to the first token in the expression tree. - */ - while( p->pLeft ){ - p = p->pLeft; - } - iToken = 0; - }else{ - assert(p && p->eType==FTSQUERY_PHRASE ); - if( iToken<(p->pPhrase->nToken-1) ){ - iToken++; - }else{ - iToken = 0; - while( p->pParent && p->pParent->pLeft!=p ){ - assert( p->pParent->pRight==p ); - p = p->pParent; - } - p = p->pParent; - if( p ){ - assert( p->pRight!=0 ); - p = p->pRight; - while( p->pLeft ){ - p = p->pLeft; +static int getNextString( + ParseContext *pParse, /* fts3 query parse context */ + const char *zInput, int nInput, /* Input string */ + Fts3Expr **ppExpr /* OUT: expression */ +){ + sqlite3_tokenizer *pTokenizer = pParse->pTokenizer; + sqlite3_tokenizer_module const *pModule = pTokenizer->pModule; + int rc; + Fts3Expr *p = 0; + sqlite3_tokenizer_cursor *pCursor = 0; + char *zTemp = 0; + int nTemp = 0; + + rc = pModule->xOpen(pTokenizer, zInput, nInput, &pCursor); + if( rc==SQLITE_OK ){ + int ii; + pCursor->pTokenizer = pTokenizer; + for(ii=0; rc==SQLITE_OK; ii++){ + const char *zToken; + int nToken, iBegin, iEnd, iPos; + rc = pModule->xNext(pCursor, &zToken, &nToken, &iBegin, &iEnd, &iPos); + if( rc==SQLITE_OK ){ + int nByte = sizeof(Fts3Expr) + sizeof(Fts3Phrase); + p = fts3ReallocOrFree(p, nByte+ii*sizeof(struct PhraseToken)); + zTemp = fts3ReallocOrFree(zTemp, nTemp + nToken); + if( !p || !zTemp ){ + goto no_mem; + } + if( ii==0 ){ + memset(p, 0, nByte); + p->pPhrase = (Fts3Phrase *)&p[1]; + } + p->pPhrase = (Fts3Phrase *)&p[1]; + p->pPhrase->nToken = ii+1; + p->pPhrase->aToken[ii].n = nToken; + memcpy(&zTemp[nTemp], zToken, nToken); + nTemp += nToken; + if( iEndpPhrase->aToken[ii].isPrefix = 1; + }else{ + p->pPhrase->aToken[ii].isPrefix = 0; } } } + + pModule->xClose(pCursor); + pCursor = 0; + } + + if( rc==SQLITE_DONE ){ + int jj; + char *zNew = NULL; + int nNew = 0; + int nByte = sizeof(Fts3Expr) + sizeof(Fts3Phrase); + nByte += (p?(p->pPhrase->nToken-1):0) * sizeof(struct PhraseToken); + p = fts3ReallocOrFree(p, nByte + nTemp); + if( !p ){ + goto no_mem; + } + if( zTemp ){ + zNew = &(((char *)p)[nByte]); + memcpy(zNew, zTemp, nTemp); + }else{ + memset(p, 0, nByte+nTemp); + } + p->pPhrase = (Fts3Phrase *)&p[1]; + for(jj=0; jjpPhrase->nToken; jj++){ + p->pPhrase->aToken[jj].z = &zNew[nNew]; + nNew += p->pPhrase->aToken[jj].n; + } + sqlite3_free(zTemp); + p->eType = FTSQUERY_PHRASE; + p->pPhrase->iColumn = pParse->iDefaultCol; + rc = SQLITE_OK; } *ppExpr = p; - *piToken = iToken; - return p?1:0; + return rc; +no_mem: + + if( pCursor ){ + pModule->xClose(pCursor); + } + sqlite3_free(zTemp); + sqlite3_free(p); + *ppExpr = 0; + return SQLITE_NOMEM; } /* -** Return TRUE if the expression node pExpr is located beneath the -** RHS of a NOT operator. +** Function getNextNode(), which is called by fts3ExprParse(), may itself +** call fts3ExprParse(). So this forward declaration is required. */ -static int fts3ExprBeneathNot(Fts3Expr *p){ - Fts3Expr *pParent; - while( p ){ - pParent = p->pParent; - if( pParent && pParent->eType==FTSQUERY_NOT && pParent->pRight==p ){ - return 1; - } - p = pParent; - } - return 0; -} +static int fts3ExprParse(ParseContext *, const char *, int, Fts3Expr **, int *); /* -** Add entries to pSnippet->aMatch[] for every match that occurs against -** document zDoc[0..nDoc-1] which is stored in column iColumn. +** The output variable *ppExpr is populated with an allocated Fts3Expr +** structure, or set to 0 if the end of the input buffer is reached. +** +** Returns an SQLite error code. SQLITE_OK if everything works, SQLITE_NOMEM +** if a malloc failure occurs, or SQLITE_ERROR if a parse error is encountered. +** If SQLITE_ERROR is returned, pContext is populated with an error message. */ -static void snippetOffsetsOfColumn( - fulltext_cursor *pCur, /* The fulltest search cursor */ - Snippet *pSnippet, /* The Snippet object to be filled in */ - int iColumn, /* Index of fulltext table column */ - const char *zDoc, /* Text of the fulltext table column */ - int nDoc /* Length of zDoc in bytes */ -){ - const sqlite3_tokenizer_module *pTModule; /* The tokenizer module */ - sqlite3_tokenizer *pTokenizer; /* The specific tokenizer */ - sqlite3_tokenizer_cursor *pTCursor; /* Tokenizer cursor */ - fulltext_vtab *pVtab; /* The full text index */ - int nColumn; /* Number of columns in the index */ - int i, j; /* Loop counters */ - int rc; /* Return code */ - unsigned int match, prevMatch; /* Phrase search bitmasks */ - const char *zToken; /* Next token from the tokenizer */ - int nToken; /* Size of zToken */ - int iBegin, iEnd, iPos; /* Offsets of beginning and end */ - - /* The following variables keep a circular buffer of the last - ** few tokens */ - unsigned int iRotor = 0; /* Index of current token */ - int iRotorBegin[FTS3_ROTOR_SZ]; /* Beginning offset of token */ - int iRotorLen[FTS3_ROTOR_SZ]; /* Length of token */ - - pVtab = cursor_vtab(pCur); - nColumn = pVtab->nColumn; - pTokenizer = pVtab->pTokenizer; - pTModule = pTokenizer->pModule; - rc = pTModule->xOpen(pTokenizer, zDoc, nDoc, &pTCursor); - if( rc ) return; - pTCursor->pTokenizer = pTokenizer; +static int getNextNode( + ParseContext *pParse, /* fts3 query parse context */ + const char *z, int n, /* Input string */ + Fts3Expr **ppExpr, /* OUT: expression */ + int *pnConsumed /* OUT: Number of bytes consumed */ +){ + static const struct Fts3Keyword { + char *z; /* Keyword text */ + unsigned char n; /* Length of the keyword */ + unsigned char parenOnly; /* Only valid in paren mode */ + unsigned char eType; /* Keyword code */ + } aKeyword[] = { + { "OR" , 2, 0, FTSQUERY_OR }, + { "AND", 3, 1, FTSQUERY_AND }, + { "NOT", 3, 1, FTSQUERY_NOT }, + { "NEAR", 4, 0, FTSQUERY_NEAR } + }; + int ii; + int iCol; + int iColLen; + int rc; + Fts3Expr *pRet = 0; - prevMatch = 0; - while( !pTModule->xNext(pTCursor, &zToken, &nToken, &iBegin, &iEnd, &iPos) ){ - Fts3Expr *pIter = pCur->pExpr; - int iIter = -1; - iRotorBegin[iRotor&FTS3_ROTOR_MASK] = iBegin; - iRotorLen[iRotor&FTS3_ROTOR_MASK] = iEnd-iBegin; - match = 0; - for(i=0; i<(FTS3_ROTOR_SZ-1) && fts3NextExprToken(&pIter, &iIter); i++){ - int nPhrase; /* Number of tokens in current phrase */ - struct PhraseToken *pToken; /* Current token */ - int iCol; /* Column index */ + const char *zInput = z; + int nInput = n; - if( fts3ExprBeneathNot(pIter) ) continue; - nPhrase = pIter->pPhrase->nToken; - pToken = &pIter->pPhrase->aToken[iIter]; - iCol = pIter->pPhrase->iColumn; - if( iCol>=0 && iColn>nToken ) continue; - if( !pToken->isPrefix && pToken->nn<=nToken ); - if( memcmp(pToken->z, zToken, pToken->n) ) continue; - if( iIter>0 && (prevMatch & (1<=0; j--){ - int k = (iRotor-j) & FTS3_ROTOR_MASK; - snippetAppendMatch(pSnippet, iColumn, i-j, iPos-j, - iRotorBegin[k], iRotorLen[k]); - } - } - } - prevMatch = match<<1; - iRotor++; + /* Skip over any whitespace before checking for a keyword, an open or + ** close bracket, or a quoted string. + */ + while( nInput>0 && fts3isspace(*zInput) ){ + nInput--; + zInput++; + } + if( nInput==0 ){ + return SQLITE_DONE; } - pTModule->xClose(pTCursor); -} -/* -** Remove entries from the pSnippet structure to account for the NEAR -** operator. When this is called, pSnippet contains the list of token -** offsets produced by treating all NEAR operators as AND operators. -** This function removes any entries that should not be present after -** accounting for the NEAR restriction. For example, if the queried -** document is: -** -** "A B C D E A" -** -** and the query is: -** -** A NEAR/0 E -** -** then when this function is called the Snippet contains token offsets -** 0, 4 and 5. This function removes the "0" entry (because the first A -** is not near enough to an E). -** -** When this function is called, the value pointed to by parameter piLeft is -** the integer id of the left-most token in the expression tree headed by -** pExpr. This function increments *piLeft by the total number of tokens -** in the expression tree headed by pExpr. -** -** Return 1 if any trimming occurs. Return 0 if no trimming is required. -*/ -static int trimSnippetOffsets( - Fts3Expr *pExpr, /* The search expression */ - Snippet *pSnippet, /* The set of snippet offsets to be trimmed */ - int *piLeft /* Index of left-most token in pExpr */ -){ - if( pExpr ){ - if( trimSnippetOffsets(pExpr->pLeft, pSnippet, piLeft) ){ - return 1; + /* See if we are dealing with a keyword. */ + for(ii=0; ii<(int)(sizeof(aKeyword)/sizeof(struct Fts3Keyword)); ii++){ + const struct Fts3Keyword *pKey = &aKeyword[ii]; + + if( (pKey->parenOnly & ~sqlite3_fts3_enable_parentheses)!=0 ){ + continue; } - switch( pExpr->eType ){ - case FTSQUERY_PHRASE: - *piLeft += pExpr->pPhrase->nToken; - break; - case FTSQUERY_NEAR: { - /* The right-hand-side of a NEAR operator is always a phrase. The - ** left-hand-side is either a phrase or an expression tree that is - ** itself headed by a NEAR operator. The following initializations - ** set local variable iLeft to the token number of the left-most - ** token in the right-hand phrase, and iRight to the right most - ** token in the same phrase. For example, if we had: - ** - ** MATCH '"abc def" NEAR/2 "ghi jkl"' - ** - ** then iLeft will be set to 2 (token number of ghi) and nToken will - ** be set to 4. - */ - Fts3Expr *pLeft = pExpr->pLeft; - Fts3Expr *pRight = pExpr->pRight; - int iLeft = *piLeft; - int nNear = pExpr->nNear; - int nToken = pRight->pPhrase->nToken; - int jj, ii; - if( pLeft->eType==FTSQUERY_NEAR ){ - pLeft = pLeft->pRight; - } - assert( pRight->eType==FTSQUERY_PHRASE ); - assert( pLeft->eType==FTSQUERY_PHRASE ); - nToken += pLeft->pPhrase->nToken; + if( nInput>=pKey->n && 0==memcmp(zInput, pKey->z, pKey->n) ){ + int nNear = SQLITE_FTS3_DEFAULT_NEAR_PARAM; + int nKey = pKey->n; + char cNext; - for(ii=0; iinMatch; ii++){ - struct snippetMatch *p = &pSnippet->aMatch[ii]; - if( p->iTerm==iLeft ){ - int isOk = 0; - /* Snippet ii is an occurence of query term iLeft in the document. - ** It occurs at position (p->iToken) of the document. We now - ** search for an instance of token (iLeft-1) somewhere in the - ** range (p->iToken - nNear)...(p->iToken + nNear + nToken) within - ** the set of snippetMatch structures. If one is found, proceed. - ** If one cannot be found, then remove snippets ii..(ii+N-1) - ** from the matching snippets, where N is the number of tokens - ** in phrase pRight->pPhrase. - */ - for(jj=0; isOk==0 && jjnMatch; jj++){ - struct snippetMatch *p2 = &pSnippet->aMatch[jj]; - if( p2->iTerm==(iLeft-1) ){ - if( p2->iToken>=(p->iToken-nNear-1) - && p2->iToken<(p->iToken+nNear+nToken) - ){ - isOk = 1; - } - } - } - if( !isOk ){ - int kk; - for(kk=0; kkpPhrase->nToken; kk++){ - pSnippet->aMatch[kk+ii].iTerm = -2; - } - return 1; - } - } - if( p->iTerm==(iLeft-1) ){ - int isOk = 0; - for(jj=0; isOk==0 && jjnMatch; jj++){ - struct snippetMatch *p2 = &pSnippet->aMatch[jj]; - if( p2->iTerm==iLeft ){ - if( p2->iToken<=(p->iToken+nNear+1) - && p2->iToken>(p->iToken-nNear-nToken) - ){ - isOk = 1; - } - } - } - if( !isOk ){ - int kk; - for(kk=0; kkpPhrase->nToken; kk++){ - pSnippet->aMatch[ii-kk].iTerm = -2; - } - return 1; - } + /* If this is a "NEAR" keyword, check for an explicit nearness. */ + if( pKey->eType==FTSQUERY_NEAR ){ + assert( nKey==4 ); + if( zInput[4]=='/' && zInput[5]>='0' && zInput[5]<='9' ){ + nNear = 0; + for(nKey=5; zInput[nKey]>='0' && zInput[nKey]<='9'; nKey++){ + nNear = nNear * 10 + (zInput[nKey] - '0'); } } - break; } - } - if( trimSnippetOffsets(pExpr->pRight, pSnippet, piLeft) ){ - return 1; - } - } - return 0; -} - -/* -** Compute all offsets for the current row of the query. -** If the offsets have already been computed, this routine is a no-op. -*/ -static void snippetAllOffsets(fulltext_cursor *p){ - int nColumn; - int iColumn, i; - int iFirst, iLast; - int iTerm = 0; - fulltext_vtab *pFts = cursor_vtab(p); - - if( p->snippet.nMatch || p->pExpr==0 ){ - return; - } - nColumn = pFts->nColumn; - iColumn = (p->iCursorType - QUERY_FULLTEXT); - if( iColumn<0 || iColumn>=nColumn ){ - /* Look for matches over all columns of the full-text index */ - iFirst = 0; - iLast = nColumn-1; - }else{ - /* Look for matches in the iColumn-th column of the index only */ - iFirst = iColumn; - iLast = iColumn; - } - for(i=iFirst; i<=iLast; i++){ - const char *zDoc; - int nDoc; - zDoc = (const char*)sqlite3_column_text(p->pStmt, i+1); - nDoc = sqlite3_column_bytes(p->pStmt, i+1); - snippetOffsetsOfColumn(p, &p->snippet, i, zDoc, nDoc); - } - - while( trimSnippetOffsets(p->pExpr, &p->snippet, &iTerm) ){ - iTerm = 0; - } -} + /* At this point this is probably a keyword. But for that to be true, + ** the next byte must contain either whitespace, an open or close + ** parenthesis, a quote character, or EOF. + */ + cNext = zInput[nKey]; + if( fts3isspace(cNext) + || cNext=='"' || cNext=='(' || cNext==')' || cNext==0 + ){ + pRet = (Fts3Expr *)sqlite3_malloc(sizeof(Fts3Expr)); + if( !pRet ){ + return SQLITE_NOMEM; + } + memset(pRet, 0, sizeof(Fts3Expr)); + pRet->eType = pKey->eType; + pRet->nNear = nNear; + *ppExpr = pRet; + *pnConsumed = (int)((zInput - z) + nKey); + return SQLITE_OK; + } -/* -** Convert the information in the aMatch[] array of the snippet -** into the string zOffset[0..nOffset-1]. This string is used as -** the return of the SQL offsets() function. -*/ -static void snippetOffsetText(Snippet *p){ - int i; - int cnt = 0; - StringBuffer sb; - char zBuf[200]; - if( p->zOffset ) return; - initStringBuffer(&sb); - for(i=0; inMatch; i++){ - struct snippetMatch *pMatch = &p->aMatch[i]; - if( pMatch->iTerm>=0 ){ - /* If snippetMatch.iTerm is less than 0, then the match was - ** discarded as part of processing the NEAR operator (see the - ** trimSnippetOffsetsForNear() function for details). Ignore - ** it in this case + /* Turns out that wasn't a keyword after all. This happens if the + ** user has supplied a token such as "ORacle". Continue. */ - zBuf[0] = ' '; - sqlite3_snprintf(sizeof(zBuf)-1, &zBuf[cnt>0], "%d %d %d %d", - pMatch->iCol, pMatch->iTerm, pMatch->iStart, pMatch->nByte); - append(&sb, zBuf); - cnt++; } } - p->zOffset = stringBufferData(&sb); - p->nOffset = stringBufferLength(&sb); -} -/* -** zDoc[0..nDoc-1] is phrase of text. aMatch[0..nMatch-1] are a set -** of matching words some of which might be in zDoc. zDoc is column -** number iCol. -** -** iBreak is suggested spot in zDoc where we could begin or end an -** excerpt. Return a value similar to iBreak but possibly adjusted -** to be a little left or right so that the break point is better. -*/ -static int wordBoundary( - int iBreak, /* The suggested break point */ - const char *zDoc, /* Document text */ - int nDoc, /* Number of bytes in zDoc[] */ - struct snippetMatch *aMatch, /* Matching words */ - int nMatch, /* Number of entries in aMatch[] */ - int iCol /* The column number for zDoc[] */ -){ - int i; - if( iBreak<=10 ){ - return 0; - } - if( iBreak>=nDoc-10 ){ - return nDoc; - } - for(i=0; i0 && aMatch[i-1].iStart+aMatch[i-1].nByte>=iBreak ){ - return aMatch[i-1].iStart; - } - } - for(i=1; i<=10; i++){ - if( safe_isspace(zDoc[iBreak-i]) ){ - return iBreak - i + 1; + /* Check for an open bracket. */ + if( sqlite3_fts3_enable_parentheses ){ + if( *zInput=='(' ){ + int nConsumed; + int rc; + pParse->nNest++; + rc = fts3ExprParse(pParse, &zInput[1], nInput-1, ppExpr, &nConsumed); + if( rc==SQLITE_OK && !*ppExpr ){ + rc = SQLITE_DONE; + } + *pnConsumed = (int)((zInput - z) + 1 + nConsumed); + return rc; } - if( safe_isspace(zDoc[iBreak+i]) ){ - return iBreak + i + 1; + + /* Check for a close bracket. */ + if( *zInput==')' ){ + pParse->nNest--; + *pnConsumed = (int)((zInput - z) + 1); + return SQLITE_DONE; } } - return iBreak; -} - - -/* -** Allowed values for Snippet.aMatch[].snStatus -*/ -#define SNIPPET_IGNORE 0 /* It is ok to omit this match from the snippet */ -#define SNIPPET_DESIRED 1 /* We want to include this match in the snippet */ - -/* -** Generate the text of a snippet. -*/ -static void snippetText( - fulltext_cursor *pCursor, /* The cursor we need the snippet for */ - const char *zStartMark, /* Markup to appear before each match */ - const char *zEndMark, /* Markup to appear after each match */ - const char *zEllipsis /* Ellipsis mark */ -){ - int i, j; - struct snippetMatch *aMatch; - int nMatch; - int nDesired; - StringBuffer sb; - int tailCol; - int tailOffset; - int iCol; - int nDoc; - const char *zDoc; - int iStart, iEnd; - int tailEllipsis = 0; - int iMatch; - - - sqlite3_free(pCursor->snippet.zSnippet); - pCursor->snippet.zSnippet = 0; - aMatch = pCursor->snippet.aMatch; - nMatch = pCursor->snippet.nMatch; - initStringBuffer(&sb); - - for(i=0; i0; i++){ - if( aMatch[i].snStatus!=SNIPPET_DESIRED ) continue; - nDesired--; - iCol = aMatch[i].iCol; - zDoc = (const char*)sqlite3_column_text(pCursor->pStmt, iCol+1); - nDoc = sqlite3_column_bytes(pCursor->pStmt, iCol+1); - iStart = aMatch[i].iStart - 40; - iStart = wordBoundary(iStart, zDoc, nDoc, aMatch, nMatch, iCol); - if( iStart<=10 ){ - iStart = 0; - } - if( iCol==tailCol && iStart<=tailOffset+20 ){ - iStart = tailOffset; - } - if( (iCol!=tailCol && tailCol>=0) || iStart!=tailOffset ){ - trimWhiteSpace(&sb); - appendWhiteSpace(&sb); - append(&sb, zEllipsis); - appendWhiteSpace(&sb); - } - iEnd = aMatch[i].iStart + aMatch[i].nByte + 40; - iEnd = wordBoundary(iEnd, zDoc, nDoc, aMatch, nMatch, iCol); - if( iEnd>=nDoc-10 ){ - iEnd = nDoc; - tailEllipsis = 0; - }else{ - tailEllipsis = 1; - } - while( iMatchiDefaultCol; + iColLen = 0; + for(ii=0; iinCol; ii++){ + const char *zStr = pParse->azCol[ii]; + int nStr = (int)strlen(zStr); + if( nInput>nStr && zInput[nStr]==':' + && sqlite3_strnicmp(zStr, zInput, nStr)==0 + ){ + iCol = ii; + iColLen = (int)((zInput - z) + nStr + 1); + break; } - tailCol = iCol; - tailOffset = iEnd; } - trimWhiteSpace(&sb); - if( tailEllipsis ){ - appendWhiteSpace(&sb); - append(&sb, zEllipsis); - } - pCursor->snippet.zSnippet = stringBufferData(&sb); - pCursor->snippet.nSnippet = stringBufferLength(&sb); + rc = getNextToken(pParse, iCol, &z[iColLen], n-iColLen, ppExpr, pnConsumed); + *pnConsumed += iColLen; + return rc; } - /* -** Close the cursor. For additional information see the documentation -** on the xClose method of the virtual table interface. +** The argument is an Fts3Expr structure for a binary operator (any type +** except an FTSQUERY_PHRASE). Return an integer value representing the +** precedence of the operator. Lower values have a higher precedence (i.e. +** group more tightly). For example, in the C language, the == operator +** groups more tightly than ||, and would therefore have a higher precedence. +** +** When using the new fts3 query syntax (when SQLITE_ENABLE_FTS3_PARENTHESIS +** is defined), the order of the operators in precedence from highest to +** lowest is: +** +** NEAR +** NOT +** AND (including implicit ANDs) +** OR +** +** Note that when using the old query syntax, the OR operator has a higher +** precedence than the AND operator. */ -static int fulltextClose(sqlite3_vtab_cursor *pCursor){ - fulltext_cursor *c = (fulltext_cursor *) pCursor; - FTSTRACE(("FTS3 Close %p\n", c)); - sqlite3_finalize(c->pStmt); - sqlite3Fts3ExprFree(c->pExpr); - snippetClear(&c->snippet); - if( c->result.nData!=0 ){ - dlrDestroy(&c->reader); - } - dataBufferDestroy(&c->result); - sqlite3_free(c); - return SQLITE_OK; -} - -static int fulltextNext(sqlite3_vtab_cursor *pCursor){ - fulltext_cursor *c = (fulltext_cursor *) pCursor; - int rc; - - FTSTRACE(("FTS3 Next %p\n", pCursor)); - snippetClear(&c->snippet); - if( c->iCursorType < QUERY_FULLTEXT ){ - /* TODO(shess) Handle SQLITE_SCHEMA AND SQLITE_BUSY. */ - rc = sqlite3_step(c->pStmt); - switch( rc ){ - case SQLITE_ROW: - c->eof = 0; - return SQLITE_OK; - case SQLITE_DONE: - c->eof = 1; - return SQLITE_OK; - default: - c->eof = 1; - return rc; - } - } else { /* full-text query */ - rc = sqlite3_reset(c->pStmt); - if( rc!=SQLITE_OK ) return rc; - - if( c->result.nData==0 || dlrAtEnd(&c->reader) ){ - c->eof = 1; - return SQLITE_OK; - } - rc = sqlite3_bind_int64(c->pStmt, 1, dlrDocid(&c->reader)); - dlrStep(&c->reader); - if( rc!=SQLITE_OK ) return rc; - /* TODO(shess) Handle SQLITE_SCHEMA AND SQLITE_BUSY. */ - rc = sqlite3_step(c->pStmt); - if( rc==SQLITE_ROW ){ /* the case we expect */ - c->eof = 0; - return SQLITE_OK; - } - /* an error occurred; abort */ - return rc==SQLITE_DONE ? SQLITE_ERROR : rc; +static int opPrecedence(Fts3Expr *p){ + assert( p->eType!=FTSQUERY_PHRASE ); + if( sqlite3_fts3_enable_parentheses ){ + return p->eType; + }else if( p->eType==FTSQUERY_NEAR ){ + return 1; + }else if( p->eType==FTSQUERY_OR ){ + return 2; } + assert( p->eType==FTSQUERY_AND ); + return 3; } - -/* TODO(shess) If we pushed LeafReader to the top of the file, or to -** another file, term_select() could be pushed above -** docListOfTerm(). -*/ -static int termSelect(fulltext_vtab *v, int iColumn, - const char *pTerm, int nTerm, int isPrefix, - DocListType iType, DataBuffer *out); - -/* -** Return a DocList corresponding to the phrase *pPhrase. -** -** The resulting DL_DOCIDS doclist is stored in pResult, which is -** overwritten. +/* +** Argument ppHead contains a pointer to the current head of a query +** expression tree being parsed. pPrev is the expression node most recently +** inserted into the tree. This function adds pNew, which is always a binary +** operator node, into the expression tree based on the relative precedence +** of pNew and the existing nodes of the tree. This may result in the head +** of the tree changing, in which case *ppHead is set to the new root node. */ -static int docListOfPhrase( - fulltext_vtab *pTab, /* The full text index */ - Fts3Phrase *pPhrase, /* Phrase to return a doclist corresponding to */ - DocListType eListType, /* Either DL_DOCIDS or DL_POSITIONS */ - DataBuffer *pResult /* Write the result here */ +static void insertBinaryOperator( + Fts3Expr **ppHead, /* Pointer to the root node of a tree */ + Fts3Expr *pPrev, /* Node most recently inserted into the tree */ + Fts3Expr *pNew /* New binary node to insert into expression tree */ ){ - int ii; - int rc = SQLITE_OK; - int iCol = pPhrase->iColumn; - DocListType eType = eListType; - assert( eType==DL_POSITIONS || eType==DL_DOCIDS ); - if( pPhrase->nToken>1 ){ - eType = DL_POSITIONS; + Fts3Expr *pSplit = pPrev; + while( pSplit->pParent && opPrecedence(pSplit->pParent)<=opPrecedence(pNew) ){ + pSplit = pSplit->pParent; } - /* This code should never be called with buffered updates. */ - assert( pTab->nPendingData<0 ); - - for(ii=0; rc==SQLITE_OK && iinToken; ii++){ - DataBuffer tmp; - struct PhraseToken *p = &pPhrase->aToken[ii]; - rc = termSelect(pTab, iCol, p->z, p->n, p->isPrefix, eType, &tmp); - if( rc==SQLITE_OK ){ - if( ii==0 ){ - *pResult = tmp; - }else{ - DataBuffer res = *pResult; - dataBufferInit(pResult, 0); - if( ii==(pPhrase->nToken-1) ){ - eType = eListType; - } - docListPhraseMerge( - res.pData, res.nData, tmp.pData, tmp.nData, 0, 0, eType, pResult - ); - dataBufferDestroy(&res); - dataBufferDestroy(&tmp); - } - } + if( pSplit->pParent ){ + assert( pSplit->pParent->pRight==pSplit ); + pSplit->pParent->pRight = pNew; + pNew->pParent = pSplit->pParent; + }else{ + *ppHead = pNew; } - - return rc; + pNew->pLeft = pSplit; + pSplit->pParent = pNew; } /* -** Evaluate the full-text expression pExpr against fts3 table pTab. Write -** the results into pRes. +** Parse the fts3 query expression found in buffer z, length n. This function +** returns either when the end of the buffer is reached or an unmatched +** closing bracket - ')' - is encountered. +** +** If successful, SQLITE_OK is returned, *ppExpr is set to point to the +** parsed form of the expression and *pnConsumed is set to the number of +** bytes read from buffer z. Otherwise, *ppExpr is set to 0 and SQLITE_NOMEM +** (out of memory error) or SQLITE_ERROR (parse error) is returned. */ -static int evalFts3Expr( - fulltext_vtab *pTab, /* Fts3 Virtual table object */ - Fts3Expr *pExpr, /* Parsed fts3 expression */ - DataBuffer *pRes /* OUT: Write results of the expression here */ +static int fts3ExprParse( + ParseContext *pParse, /* fts3 query parse context */ + const char *z, int n, /* Text of MATCH query */ + Fts3Expr **ppExpr, /* OUT: Parsed query structure */ + int *pnConsumed /* OUT: Number of bytes consumed */ ){ + Fts3Expr *pRet = 0; + Fts3Expr *pPrev = 0; + Fts3Expr *pNotBranch = 0; /* Only used in legacy parse mode */ + int nIn = n; + const char *zIn = z; int rc = SQLITE_OK; + int isRequirePhrase = 1; - /* Initialize the output buffer. If this is an empty query (pExpr==0), - ** this is all that needs to be done. Empty queries produce empty - ** result sets. - */ - dataBufferInit(pRes, 0); - - if( pExpr ){ - if( pExpr->eType==FTSQUERY_PHRASE ){ - DocListType eType = DL_DOCIDS; - if( pExpr->pParent && pExpr->pParent->eType==FTSQUERY_NEAR ){ - eType = DL_POSITIONS; - } - rc = docListOfPhrase(pTab, pExpr->pPhrase, eType, pRes); - }else{ - DataBuffer lhs; - DataBuffer rhs; + while( rc==SQLITE_OK ){ + Fts3Expr *p = 0; + int nByte = 0; + rc = getNextNode(pParse, zIn, nIn, &p, &nByte); + if( rc==SQLITE_OK ){ + int isPhrase; - dataBufferInit(&rhs, 0); - if( SQLITE_OK==(rc = evalFts3Expr(pTab, pExpr->pLeft, &lhs)) - && SQLITE_OK==(rc = evalFts3Expr(pTab, pExpr->pRight, &rhs)) + if( !sqlite3_fts3_enable_parentheses + && p->eType==FTSQUERY_PHRASE && p->pPhrase->isNot ){ - switch( pExpr->eType ){ - case FTSQUERY_NEAR: { - int nToken; - Fts3Expr *pLeft; - DocListType eType = DL_DOCIDS; - if( pExpr->pParent && pExpr->pParent->eType==FTSQUERY_NEAR ){ - eType = DL_POSITIONS; - } - pLeft = pExpr->pLeft; - while( pLeft->eType==FTSQUERY_NEAR ){ - pLeft=pLeft->pRight; - } - assert( pExpr->pRight->eType==FTSQUERY_PHRASE ); - assert( pLeft->eType==FTSQUERY_PHRASE ); - nToken = pLeft->pPhrase->nToken + pExpr->pRight->pPhrase->nToken; - docListPhraseMerge(lhs.pData, lhs.nData, rhs.pData, rhs.nData, - pExpr->nNear+1, nToken, eType, pRes - ); - break; - } - case FTSQUERY_NOT: { - docListExceptMerge(lhs.pData, lhs.nData, rhs.pData, rhs.nData,pRes); - break; - } - case FTSQUERY_AND: { - docListAndMerge(lhs.pData, lhs.nData, rhs.pData, rhs.nData, pRes); - break; + /* Create an implicit NOT operator. */ + Fts3Expr *pNot = sqlite3_malloc(sizeof(Fts3Expr)); + if( !pNot ){ + sqlite3Fts3ExprFree(p); + rc = SQLITE_NOMEM; + goto exprparse_out; + } + memset(pNot, 0, sizeof(Fts3Expr)); + pNot->eType = FTSQUERY_NOT; + pNot->pRight = p; + if( pNotBranch ){ + pNot->pLeft = pNotBranch; + } + pNotBranch = pNot; + p = pPrev; + }else{ + int eType = p->eType; + assert( eType!=FTSQUERY_PHRASE || !p->pPhrase->isNot ); + isPhrase = (eType==FTSQUERY_PHRASE || p->pLeft); + + /* The isRequirePhrase variable is set to true if a phrase or + ** an expression contained in parenthesis is required. If a + ** binary operator (AND, OR, NOT or NEAR) is encounted when + ** isRequirePhrase is set, this is a syntax error. + */ + if( !isPhrase && isRequirePhrase ){ + sqlite3Fts3ExprFree(p); + rc = SQLITE_ERROR; + goto exprparse_out; + } + + if( isPhrase && !isRequirePhrase ){ + /* Insert an implicit AND operator. */ + Fts3Expr *pAnd; + assert( pRet && pPrev ); + pAnd = sqlite3_malloc(sizeof(Fts3Expr)); + if( !pAnd ){ + sqlite3Fts3ExprFree(p); + rc = SQLITE_NOMEM; + goto exprparse_out; } - case FTSQUERY_OR: { - docListOrMerge(lhs.pData, lhs.nData, rhs.pData, rhs.nData, pRes); - break; + memset(pAnd, 0, sizeof(Fts3Expr)); + pAnd->eType = FTSQUERY_AND; + insertBinaryOperator(&pRet, pPrev, pAnd); + pPrev = pAnd; + } + + /* This test catches attempts to make either operand of a NEAR + ** operator something other than a phrase. For example, either of + ** the following: + ** + ** (bracketed expression) NEAR phrase + ** phrase NEAR (bracketed expression) + ** + ** Return an error in either case. + */ + if( pPrev && ( + (eType==FTSQUERY_NEAR && !isPhrase && pPrev->eType!=FTSQUERY_PHRASE) + || (eType!=FTSQUERY_PHRASE && isPhrase && pPrev->eType==FTSQUERY_NEAR) + )){ + sqlite3Fts3ExprFree(p); + rc = SQLITE_ERROR; + goto exprparse_out; + } + + if( isPhrase ){ + if( pRet ){ + assert( pPrev && pPrev->pLeft && pPrev->pRight==0 ); + pPrev->pRight = p; + p->pParent = pPrev; + }else{ + pRet = p; } + }else{ + insertBinaryOperator(&pRet, pPrev, p); } + isRequirePhrase = !isPhrase; } - dataBufferDestroy(&lhs); - dataBufferDestroy(&rhs); + assert( nByte>0 ); } + assert( rc!=SQLITE_OK || (nByte>0 && nByte<=nIn) ); + nIn -= nByte; + zIn += nByte; + pPrev = p; } - return rc; -} - -/* TODO(shess) Refactor the code to remove this forward decl. */ -static int flushPendingTerms(fulltext_vtab *v); - -/* Perform a full-text query using the search expression in -** zInput[0..nInput-1]. Return a list of matching documents -** in pResult. -** -** Queries must match column iColumn. Or if iColumn>=nColumn -** they are allowed to match against any column. -*/ -static int fulltextQuery( - fulltext_vtab *v, /* The full text index */ - int iColumn, /* Match against this column by default */ - const char *zInput, /* The query string */ - int nInput, /* Number of bytes in zInput[] */ - DataBuffer *pResult, /* Write the result doclist here */ - Fts3Expr **ppExpr /* Put parsed query string here */ -){ - int rc; - - /* TODO(shess) Instead of flushing pendingTerms, we could query for - ** the relevant term and merge the doclist into what we receive from - ** the database. Wait and see if this is a common issue, first. - ** - ** A good reason not to flush is to not generate update-related - ** error codes from here. - */ + if( rc==SQLITE_DONE && pRet && isRequirePhrase ){ + rc = SQLITE_ERROR; + } - /* Flush any buffered updates before executing the query. */ - rc = flushPendingTerms(v); - if( rc!=SQLITE_OK ){ - return rc; + if( rc==SQLITE_DONE ){ + rc = SQLITE_OK; + if( !sqlite3_fts3_enable_parentheses && pNotBranch ){ + if( !pRet ){ + rc = SQLITE_ERROR; + }else{ + Fts3Expr *pIter = pNotBranch; + while( pIter->pLeft ){ + pIter = pIter->pLeft; + } + pIter->pLeft = pRet; + pRet = pNotBranch; + } + } } + *pnConsumed = n - nIn; - /* Parse the query passed to the MATCH operator. */ - rc = sqlite3Fts3ExprParse(v->pTokenizer, - v->azColumn, v->nColumn, iColumn, zInput, nInput, ppExpr - ); +exprparse_out: if( rc!=SQLITE_OK ){ - assert( 0==(*ppExpr) ); - return rc; + sqlite3Fts3ExprFree(pRet); + sqlite3Fts3ExprFree(pNotBranch); + pRet = 0; } - - return evalFts3Expr(v, *ppExpr, pResult); + *ppExpr = pRet; + return rc; } /* -** This is the xFilter interface for the virtual table. See -** the virtual table xFilter method documentation for additional -** information. +** Parameters z and n contain a pointer to and length of a buffer containing +** an fts3 query expression, respectively. This function attempts to parse the +** query expression and create a tree of Fts3Expr structures representing the +** parsed expression. If successful, *ppExpr is set to point to the head +** of the parsed expression tree and SQLITE_OK is returned. If an error +** occurs, either SQLITE_NOMEM (out-of-memory error) or SQLITE_ERROR (parse +** error) is returned and *ppExpr is set to 0. ** -** If idxNum==QUERY_GENERIC then do a full table scan against -** the %_content table. +** If parameter n is a negative number, then z is assumed to point to a +** nul-terminated string and the length is determined using strlen(). ** -** If idxNum==QUERY_DOCID then do a docid lookup for a single entry -** in the %_content table. +** The first parameter, pTokenizer, is passed the fts3 tokenizer module to +** use to normalize query tokens while parsing the expression. The azCol[] +** array, which is assumed to contain nCol entries, should contain the names +** of each column in the target fts3 table, in order from left to right. +** Column names must be nul-terminated strings. ** -** If idxNum>=QUERY_FULLTEXT then use the full text index. The -** column on the left-hand side of the MATCH operator is column -** number idxNum-QUERY_FULLTEXT, 0 indexed. argv[0] is the right-hand -** side of the MATCH operator. -*/ -/* TODO(shess) Upgrade the cursor initialization and destruction to -** account for fulltextFilter() being called multiple times on the -** same cursor. The current solution is very fragile. Apply fix to -** fts3 as appropriate. +** The iDefaultCol parameter should be passed the index of the table column +** that appears on the left-hand-side of the MATCH operator (the default +** column to match against for tokens for which a column name is not explicitly +** specified as part of the query string), or -1 if tokens may by default +** match any table column. */ -static int fulltextFilter( - sqlite3_vtab_cursor *pCursor, /* The cursor used for this query */ - int idxNum, const char *idxStr, /* Which indexing scheme to use */ - int argc, sqlite3_value **argv /* Arguments for the indexing scheme */ +SQLITE_PRIVATE int sqlite3Fts3ExprParse( + sqlite3_tokenizer *pTokenizer, /* Tokenizer module */ + char **azCol, /* Array of column names for fts3 table */ + int nCol, /* Number of entries in azCol[] */ + int iDefaultCol, /* Default column to query */ + const char *z, int n, /* Text of MATCH query */ + Fts3Expr **ppExpr /* OUT: Parsed query structure */ ){ - fulltext_cursor *c = (fulltext_cursor *) pCursor; - fulltext_vtab *v = cursor_vtab(c); + int nParsed; int rc; - - FTSTRACE(("FTS3 Filter %p\n",pCursor)); - - /* If the cursor has a statement that was not prepared according to - ** idxNum, clear it. I believe all calls to fulltextFilter with a - ** given cursor will have the same idxNum , but in this case it's - ** easy to be safe. - */ - if( c->pStmt && c->iCursorType!=idxNum ){ - sqlite3_finalize(c->pStmt); - c->pStmt = NULL; - } - - /* Get a fresh statement appropriate to idxNum. */ - /* TODO(shess): Add a prepared-statement cache in the vt structure. - ** The cache must handle multiple open cursors. Easier to cache the - ** statement variants at the vt to reduce malloc/realloc/free here. - ** Or we could have a StringBuffer variant which allowed stack - ** construction for small values. - */ - if( !c->pStmt ){ - StringBuffer sb; - initStringBuffer(&sb); - append(&sb, "SELECT docid, "); - appendList(&sb, v->nColumn, v->azContentColumn); - append(&sb, " FROM %_content"); - if( idxNum!=QUERY_GENERIC ) append(&sb, " WHERE docid = ?"); - rc = sql_prepare(v->db, v->zDb, v->zName, &c->pStmt, - stringBufferData(&sb)); - stringBufferDestroy(&sb); - if( rc!=SQLITE_OK ) return rc; - c->iCursorType = idxNum; - }else{ - sqlite3_reset(c->pStmt); - assert( c->iCursorType==idxNum ); + ParseContext sParse; + sParse.pTokenizer = pTokenizer; + sParse.azCol = (const char **)azCol; + sParse.nCol = nCol; + sParse.iDefaultCol = iDefaultCol; + sParse.nNest = 0; + if( z==0 ){ + *ppExpr = 0; + return SQLITE_OK; } - - switch( idxNum ){ - case QUERY_GENERIC: - break; - - case QUERY_DOCID: - rc = sqlite3_bind_int64(c->pStmt, 1, sqlite3_value_int64(argv[0])); - if( rc!=SQLITE_OK ) return rc; - break; - - default: /* full-text search */ - { - int iCol = idxNum-QUERY_FULLTEXT; - const char *zQuery = (const char *)sqlite3_value_text(argv[0]); - assert( idxNum<=QUERY_FULLTEXT+v->nColumn); - assert( argc==1 ); - if( c->result.nData!=0 ){ - /* This case happens if the same cursor is used repeatedly. */ - dlrDestroy(&c->reader); - dataBufferReset(&c->result); - }else{ - dataBufferInit(&c->result, 0); - } - rc = fulltextQuery(v, iCol, zQuery, -1, &c->result, &c->pExpr); - if( rc!=SQLITE_OK ) return rc; - if( c->result.nData!=0 ){ - dlrInit(&c->reader, DL_DOCIDS, c->result.pData, c->result.nData); - } - break; - } + if( n<0 ){ + n = (int)strlen(z); } + rc = fts3ExprParse(&sParse, z, n, ppExpr, &nParsed); - return fulltextNext(pCursor); -} + /* Check for mismatched parenthesis */ + if( rc==SQLITE_OK && sParse.nNest ){ + rc = SQLITE_ERROR; + sqlite3Fts3ExprFree(*ppExpr); + *ppExpr = 0; + } -/* This is the xEof method of the virtual table. The SQLite core -** calls this routine to find out if it has reached the end of -** a query's results set. -*/ -static int fulltextEof(sqlite3_vtab_cursor *pCursor){ - fulltext_cursor *c = (fulltext_cursor *) pCursor; - return c->eof; + return rc; } -/* This is the xColumn method of the virtual table. The SQLite -** core calls this method during a query when it needs the value -** of a column from the virtual table. This method needs to use -** one of the sqlite3_result_*() routines to store the requested -** value back in the pContext. +/* +** Free a parsed fts3 query expression allocated by sqlite3Fts3ExprParse(). */ -static int fulltextColumn(sqlite3_vtab_cursor *pCursor, - sqlite3_context *pContext, int idxCol){ - fulltext_cursor *c = (fulltext_cursor *) pCursor; - fulltext_vtab *v = cursor_vtab(c); - - if( idxColnColumn ){ - sqlite3_value *pVal = sqlite3_column_value(c->pStmt, idxCol+1); - sqlite3_result_value(pContext, pVal); - }else if( idxCol==v->nColumn ){ - /* The extra column whose name is the same as the table. - ** Return a blob which is a pointer to the cursor - */ - sqlite3_result_blob(pContext, &c, sizeof(c), SQLITE_TRANSIENT); - }else if( idxCol==v->nColumn+1 ){ - /* The docid column, which is an alias for rowid. */ - sqlite3_value *pVal = sqlite3_column_value(c->pStmt, 0); - sqlite3_result_value(pContext, pVal); +SQLITE_PRIVATE void sqlite3Fts3ExprFree(Fts3Expr *p){ + if( p ){ + sqlite3Fts3ExprFree(p->pLeft); + sqlite3Fts3ExprFree(p->pRight); + sqlite3_free(p->aDoclist); + sqlite3_free(p); } - return SQLITE_OK; } -/* This is the xRowid method. The SQLite core calls this routine to -** retrieve the rowid for the current row of the result set. fts3 -** exposes %_content.docid as the rowid for the virtual table. The -** rowid should be written to *pRowid. +/**************************************************************************** +***************************************************************************** +** Everything after this point is just test code. */ -static int fulltextRowid(sqlite3_vtab_cursor *pCursor, sqlite_int64 *pRowid){ - fulltext_cursor *c = (fulltext_cursor *) pCursor; - *pRowid = sqlite3_column_int64(c->pStmt, 0); - return SQLITE_OK; -} +#ifdef SQLITE_TEST -/* Add all terms in [zText] to pendingTerms table. If [iColumn] > 0, -** we also store positions and offsets in the hash table using that -** column number. + +/* +** Function to query the hash-table of tokenizers (see README.tokenizers). */ -static int buildTerms(fulltext_vtab *v, sqlite_int64 iDocid, - const char *zText, int iColumn){ - sqlite3_tokenizer *pTokenizer = v->pTokenizer; - sqlite3_tokenizer_cursor *pCursor; - const char *pToken; - int nTokenBytes; - int iStartOffset, iEndOffset, iPosition; +static int queryTestTokenizer( + sqlite3 *db, + const char *zName, + const sqlite3_tokenizer_module **pp +){ int rc; + sqlite3_stmt *pStmt; + const char zSql[] = "SELECT fts3_tokenizer(?)"; - rc = pTokenizer->pModule->xOpen(pTokenizer, zText, -1, &pCursor); - if( rc!=SQLITE_OK ) return rc; - - pCursor->pTokenizer = pTokenizer; - while( SQLITE_OK==(rc=pTokenizer->pModule->xNext(pCursor, - &pToken, &nTokenBytes, - &iStartOffset, &iEndOffset, - &iPosition)) ){ - DLCollector *p; - int nData; /* Size of doclist before our update. */ - - /* Positions can't be negative; we use -1 as a terminator - * internally. Token can't be NULL or empty. */ - if( iPosition<0 || pToken == NULL || nTokenBytes == 0 ){ - rc = SQLITE_ERROR; - break; - } - - p = fts3HashFind(&v->pendingTerms, pToken, nTokenBytes); - if( p==NULL ){ - nData = 0; - p = dlcNew(iDocid, DL_DEFAULT); - fts3HashInsert(&v->pendingTerms, pToken, nTokenBytes, p); + *pp = 0; + rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); + if( rc!=SQLITE_OK ){ + return rc; + } - /* Overhead for our hash table entry, the key, and the value. */ - v->nPendingData += sizeof(struct fts3HashElem)+sizeof(*p)+nTokenBytes; - }else{ - nData = p->b.nData; - if( p->dlw.iPrevDocid!=iDocid ) dlcNext(p, iDocid); - } - if( iColumn>=0 ){ - dlcAddPos(p, iColumn, iPosition, iStartOffset, iEndOffset); + sqlite3_bind_text(pStmt, 1, zName, -1, SQLITE_STATIC); + if( SQLITE_ROW==sqlite3_step(pStmt) ){ + if( sqlite3_column_type(pStmt, 0)==SQLITE_BLOB ){ + memcpy((void *)pp, sqlite3_column_blob(pStmt, 0), sizeof(*pp)); } - - /* Accumulate data added by dlcNew or dlcNext, and dlcAddPos. */ - v->nPendingData += p->b.nData-nData; } - /* TODO(shess) Check return? Should this be able to cause errors at - ** this point? Actually, same question about sqlite3_finalize(), - ** though one could argue that failure there means that the data is - ** not durable. *ponder* - */ - pTokenizer->pModule->xClose(pCursor); - if( SQLITE_DONE == rc ) return SQLITE_OK; - return rc; -} - -/* Add doclists for all terms in [pValues] to pendingTerms table. */ -static int insertTerms(fulltext_vtab *v, sqlite_int64 iDocid, - sqlite3_value **pValues){ - int i; - for(i = 0; i < v->nColumn ; ++i){ - char *zText = (char*)sqlite3_value_text(pValues[i]); - int rc = buildTerms(v, iDocid, zText, i); - if( rc!=SQLITE_OK ) return rc; - } - return SQLITE_OK; + return sqlite3_finalize(pStmt); } -/* Add empty doclists for all terms in the given row's content to -** pendingTerms. +/* +** This function is part of the test interface for the query parser. It +** writes a text representation of the query expression pExpr into the +** buffer pointed to by argument zBuf. It is assumed that zBuf is large +** enough to store the required text representation. */ -static int deleteTerms(fulltext_vtab *v, sqlite_int64 iDocid){ - const char **pValues; - int i, rc; - - /* TODO(shess) Should we allow such tables at all? */ - if( DL_DEFAULT==DL_DOCIDS ) return SQLITE_ERROR; - - rc = content_select(v, iDocid, &pValues); - if( rc!=SQLITE_OK ) return rc; +static void exprToString(Fts3Expr *pExpr, char *zBuf){ + switch( pExpr->eType ){ + case FTSQUERY_PHRASE: { + Fts3Phrase *pPhrase = pExpr->pPhrase; + int i; + zBuf += sprintf(zBuf, "PHRASE %d %d", pPhrase->iColumn, pPhrase->isNot); + for(i=0; inToken; i++){ + zBuf += sprintf(zBuf," %.*s",pPhrase->aToken[i].n,pPhrase->aToken[i].z); + zBuf += sprintf(zBuf,"%s", (pPhrase->aToken[i].isPrefix?"+":"")); + } + return; + } - for(i = 0 ; i < v->nColumn; ++i) { - rc = buildTerms(v, iDocid, pValues[i], -1); - if( rc!=SQLITE_OK ) break; + case FTSQUERY_NEAR: + zBuf += sprintf(zBuf, "NEAR/%d ", pExpr->nNear); + break; + case FTSQUERY_NOT: + zBuf += sprintf(zBuf, "NOT "); + break; + case FTSQUERY_AND: + zBuf += sprintf(zBuf, "AND "); + break; + case FTSQUERY_OR: + zBuf += sprintf(zBuf, "OR "); + break; } - freeStringArray(v->nColumn, pValues); - return SQLITE_OK; -} - -/* TODO(shess) Refactor the code to remove this forward decl. */ -static int initPendingTerms(fulltext_vtab *v, sqlite_int64 iDocid); - -/* Insert a row into the %_content table; set *piDocid to be the ID of the -** new row. Add doclists for terms to pendingTerms. -*/ -static int index_insert(fulltext_vtab *v, sqlite3_value *pRequestDocid, - sqlite3_value **pValues, sqlite_int64 *piDocid){ - int rc; - - rc = content_insert(v, pRequestDocid, pValues); /* execute an SQL INSERT */ - if( rc!=SQLITE_OK ) return rc; - - /* docid column is an alias for rowid. */ - *piDocid = sqlite3_last_insert_rowid(v->db); - rc = initPendingTerms(v, *piDocid); - if( rc!=SQLITE_OK ) return rc; - - return insertTerms(v, *piDocid, pValues); -} - -/* Delete a row from the %_content table; add empty doclists for terms -** to pendingTerms. -*/ -static int index_delete(fulltext_vtab *v, sqlite_int64 iRow){ - int rc = initPendingTerms(v, iRow); - if( rc!=SQLITE_OK ) return rc; - - rc = deleteTerms(v, iRow); - if( rc!=SQLITE_OK ) return rc; - - return content_delete(v, iRow); /* execute an SQL DELETE */ -} - -/* Update a row in the %_content table; add delete doclists to -** pendingTerms for old terms not in the new data, add insert doclists -** to pendingTerms for terms in the new data. -*/ -static int index_update(fulltext_vtab *v, sqlite_int64 iRow, - sqlite3_value **pValues){ - int rc = initPendingTerms(v, iRow); - if( rc!=SQLITE_OK ) return rc; - - /* Generate an empty doclist for each term that previously appeared in this - * row. */ - rc = deleteTerms(v, iRow); - if( rc!=SQLITE_OK ) return rc; - - rc = content_update(v, pValues, iRow); /* execute an SQL UPDATE */ - if( rc!=SQLITE_OK ) return rc; + zBuf += sprintf(zBuf, "{"); + exprToString(pExpr->pLeft, zBuf); + zBuf += strlen(zBuf); + zBuf += sprintf(zBuf, "} "); - /* Now add positions for terms which appear in the updated row. */ - return insertTerms(v, iRow, pValues); + zBuf += sprintf(zBuf, "{"); + exprToString(pExpr->pRight, zBuf); + zBuf += strlen(zBuf); + zBuf += sprintf(zBuf, "}"); } -/*******************************************************************/ -/* InteriorWriter is used to collect terms and block references into -** interior nodes in %_segments. See commentary at top of file for -** format. -*/ - -/* How large interior nodes can grow. */ -#define INTERIOR_MAX 2048 - -/* Minimum number of terms per interior node (except the root). This -** prevents large terms from making the tree too skinny - must be >0 -** so that the tree always makes progress. Note that the min tree -** fanout will be INTERIOR_MIN_TERMS+1. -*/ -#define INTERIOR_MIN_TERMS 7 -#if INTERIOR_MIN_TERMS<1 -# error INTERIOR_MIN_TERMS must be greater than 0. -#endif - -/* ROOT_MAX controls how much data is stored inline in the segment -** directory. -*/ -/* TODO(shess) Push ROOT_MAX down to whoever is writing things. It's -** only here so that interiorWriterRootInfo() and leafWriterRootInfo() -** can both see it, but if the caller passed it in, we wouldn't even -** need a define. -*/ -#define ROOT_MAX 1024 -#if ROOT_MAX, , , ...); +** +** The first argument, , is the name of the fts3 tokenizer used +** to parse the query expression (see README.tokenizers). The second argument +** is the query expression to parse. Each subsequent argument is the name +** of a column of the fts3 table that the query expression may refer to. +** For example: +** +** SELECT fts3_exprtest('simple', 'Bill col2:Bloggs', 'col1', 'col2'); */ -typedef struct InteriorBlock { - DataBuffer term; /* Leftmost term in block's subtree. */ - DataBuffer data; /* Accumulated data for the block. */ - struct InteriorBlock *next; -} InteriorBlock; - -static InteriorBlock *interiorBlockNew(int iHeight, sqlite_int64 iChildBlock, - const char *pTerm, int nTerm){ - InteriorBlock *block = sqlite3_malloc(sizeof(InteriorBlock)); - char c[VARINT_MAX+VARINT_MAX]; - int n; - - if( block ){ - memset(block, 0, sizeof(*block)); - dataBufferInit(&block->term, 0); - dataBufferReplace(&block->term, pTerm, nTerm); +static void fts3ExprTest( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + sqlite3_tokenizer_module const *pModule = 0; + sqlite3_tokenizer *pTokenizer = 0; + int rc; + char **azCol = 0; + const char *zExpr; + int nExpr; + int nCol; + int ii; + Fts3Expr *pExpr; + sqlite3 *db = sqlite3_context_db_handle(context); - n = fts3PutVarint(c, iHeight); - n += fts3PutVarint(c+n, iChildBlock); - dataBufferInit(&block->data, INTERIOR_MAX); - dataBufferReplace(&block->data, c, n); + if( argc<3 ){ + sqlite3_result_error(context, + "Usage: fts3_exprtest(tokenizer, expr, col1, ...", -1 + ); + return; } - return block; -} -#ifndef NDEBUG -/* Verify that the data is readable as an interior node. */ -static void interiorBlockValidate(InteriorBlock *pBlock){ - const char *pData = pBlock->data.pData; - int nData = pBlock->data.nData; - int n, iDummy; - sqlite_int64 iBlockid; - - assert( nData>0 ); - assert( pData!=0 ); - assert( pData+nData>pData ); - - /* Must lead with height of node as a varint(n), n>0 */ - n = fts3GetVarint32(pData, &iDummy); - assert( n>0 ); - assert( iDummy>0 ); - assert( n0 ); - assert( n<=nData ); - pData += n; - nData -= n; - - /* Zero or more terms of positive length */ - if( nData!=0 ){ - /* First term is not delta-encoded. */ - n = fts3GetVarint32(pData, &iDummy); - assert( n>0 ); - assert( iDummy>0 ); - assert( n+iDummy>0); - assert( n+iDummy<=nData ); - pData += n+iDummy; - nData -= n+iDummy; - - /* Following terms delta-encoded. */ - while( nData!=0 ){ - /* Length of shared prefix. */ - n = fts3GetVarint32(pData, &iDummy); - assert( n>0 ); - assert( iDummy>=0 ); - assert( n0 ); - assert( iDummy>0 ); - assert( n+iDummy>0); - assert( n+iDummy<=nData ); - pData += n+iDummy; - nData -= n+iDummy; - } - } -} -#define ASSERT_VALID_INTERIOR_BLOCK(x) interiorBlockValidate(x) -#else -#define ASSERT_VALID_INTERIOR_BLOCK(x) assert( 1 ) -#endif - -typedef struct InteriorWriter { - int iHeight; /* from 0 at leaves. */ - InteriorBlock *first, *last; - struct InteriorWriter *parentWriter; - - DataBuffer term; /* Last term written to block "last". */ - sqlite_int64 iOpeningChildBlock; /* First child block in block "last". */ -#ifndef NDEBUG - sqlite_int64 iLastChildBlock; /* for consistency checks. */ -#endif -} InteriorWriter; - -/* Initialize an interior node where pTerm[nTerm] marks the leftmost -** term in the tree. iChildBlock is the leftmost child block at the -** next level down the tree. -*/ -static void interiorWriterInit(int iHeight, const char *pTerm, int nTerm, - sqlite_int64 iChildBlock, - InteriorWriter *pWriter){ - InteriorBlock *block; - assert( iHeight>0 ); - CLEAR(pWriter); - - pWriter->iHeight = iHeight; - pWriter->iOpeningChildBlock = iChildBlock; -#ifndef NDEBUG - pWriter->iLastChildBlock = iChildBlock; -#endif - block = interiorBlockNew(iHeight, iChildBlock, pTerm, nTerm); - pWriter->last = pWriter->first = block; - ASSERT_VALID_INTERIOR_BLOCK(pWriter->last); - dataBufferInit(&pWriter->term, 0); -} - -/* Append the child node rooted at iChildBlock to the interior node, -** with pTerm[nTerm] as the leftmost term in iChildBlock's subtree. -*/ -static void interiorWriterAppend(InteriorWriter *pWriter, - const char *pTerm, int nTerm, - sqlite_int64 iChildBlock){ - char c[VARINT_MAX+VARINT_MAX]; - int n, nPrefix = 0; - - ASSERT_VALID_INTERIOR_BLOCK(pWriter->last); - - /* The first term written into an interior node is actually - ** associated with the second child added (the first child was added - ** in interiorWriterInit, or in the if clause at the bottom of this - ** function). That term gets encoded straight up, with nPrefix left - ** at 0. - */ - if( pWriter->term.nData==0 ){ - n = fts3PutVarint(c, nTerm); - }else{ - while( nPrefixterm.nData && - pTerm[nPrefix]==pWriter->term.pData[nPrefix] ){ - nPrefix++; - } - - n = fts3PutVarint(c, nPrefix); - n += fts3PutVarint(c+n, nTerm-nPrefix); + rc = queryTestTokenizer(db, + (const char *)sqlite3_value_text(argv[0]), &pModule); + if( rc==SQLITE_NOMEM ){ + sqlite3_result_error_nomem(context); + goto exprtest_out; + }else if( !pModule ){ + sqlite3_result_error(context, "No such tokenizer module", -1); + goto exprtest_out; } -#ifndef NDEBUG - pWriter->iLastChildBlock++; -#endif - assert( pWriter->iLastChildBlock==iChildBlock ); - - /* Overflow to a new block if the new term makes the current block - ** too big, and the current block already has enough terms. - */ - if( pWriter->last->data.nData+n+nTerm-nPrefix>INTERIOR_MAX && - iChildBlock-pWriter->iOpeningChildBlock>INTERIOR_MIN_TERMS ){ - pWriter->last->next = interiorBlockNew(pWriter->iHeight, iChildBlock, - pTerm, nTerm); - pWriter->last = pWriter->last->next; - pWriter->iOpeningChildBlock = iChildBlock; - dataBufferReset(&pWriter->term); - }else{ - dataBufferAppend2(&pWriter->last->data, c, n, - pTerm+nPrefix, nTerm-nPrefix); - dataBufferReplace(&pWriter->term, pTerm, nTerm); + rc = pModule->xCreate(0, 0, &pTokenizer); + assert( rc==SQLITE_NOMEM || rc==SQLITE_OK ); + if( rc==SQLITE_NOMEM ){ + sqlite3_result_error_nomem(context); + goto exprtest_out; } - ASSERT_VALID_INTERIOR_BLOCK(pWriter->last); -} - -/* Free the space used by pWriter, including the linked-list of -** InteriorBlocks, and parentWriter, if present. -*/ -static int interiorWriterDestroy(InteriorWriter *pWriter){ - InteriorBlock *block = pWriter->first; + pTokenizer->pModule = pModule; - while( block!=NULL ){ - InteriorBlock *b = block; - block = block->next; - dataBufferDestroy(&b->term); - dataBufferDestroy(&b->data); - sqlite3_free(b); + zExpr = (const char *)sqlite3_value_text(argv[1]); + nExpr = sqlite3_value_bytes(argv[1]); + nCol = argc-2; + azCol = (char **)sqlite3_malloc(nCol*sizeof(char *)); + if( !azCol ){ + sqlite3_result_error_nomem(context); + goto exprtest_out; } - if( pWriter->parentWriter!=NULL ){ - interiorWriterDestroy(pWriter->parentWriter); - sqlite3_free(pWriter->parentWriter); + for(ii=0; iiterm); - SCRAMBLE(pWriter); - return SQLITE_OK; -} - -/* If pWriter can fit entirely in ROOT_MAX, return it as the root info -** directly, leaving *piEndBlockid unchanged. Otherwise, flush -** pWriter to %_segments, building a new layer of interior nodes, and -** recursively ask for their root into. -*/ -static int interiorWriterRootInfo(fulltext_vtab *v, InteriorWriter *pWriter, - char **ppRootInfo, int *pnRootInfo, - sqlite_int64 *piEndBlockid){ - InteriorBlock *block = pWriter->first; - sqlite_int64 iBlockid = 0; - int rc; - /* If we can fit the segment inline */ - if( block==pWriter->last && block->data.nDatadata.pData; - *pnRootInfo = block->data.nData; - return SQLITE_OK; + rc = sqlite3Fts3ExprParse( + pTokenizer, azCol, nCol, nCol, zExpr, nExpr, &pExpr + ); + if( rc==SQLITE_NOMEM ){ + sqlite3_result_error_nomem(context); + goto exprtest_out; + }else if( rc==SQLITE_OK ){ + char zBuf[4096]; + exprToString(pExpr, zBuf); + sqlite3_result_text(context, zBuf, -1, SQLITE_TRANSIENT); + sqlite3Fts3ExprFree(pExpr); + }else{ + sqlite3_result_error(context, "Error parsing expression", -1); } - /* Flush the first block to %_segments, and create a new level of - ** interior node. - */ - ASSERT_VALID_INTERIOR_BLOCK(block); - rc = block_insert(v, block->data.pData, block->data.nData, &iBlockid); - if( rc!=SQLITE_OK ) return rc; - *piEndBlockid = iBlockid; - - pWriter->parentWriter = sqlite3_malloc(sizeof(*pWriter->parentWriter)); - interiorWriterInit(pWriter->iHeight+1, - block->term.pData, block->term.nData, - iBlockid, pWriter->parentWriter); - - /* Flush additional blocks and append to the higher interior - ** node. - */ - for(block=block->next; block!=NULL; block=block->next){ - ASSERT_VALID_INTERIOR_BLOCK(block); - rc = block_insert(v, block->data.pData, block->data.nData, &iBlockid); - if( rc!=SQLITE_OK ) return rc; - *piEndBlockid = iBlockid; - - interiorWriterAppend(pWriter->parentWriter, - block->term.pData, block->term.nData, iBlockid); +exprtest_out: + if( pModule && pTokenizer ){ + rc = pModule->xDestroy(pTokenizer); } - - /* Parent node gets the chance to be the root. */ - return interiorWriterRootInfo(v, pWriter->parentWriter, - ppRootInfo, pnRootInfo, piEndBlockid); + sqlite3_free(azCol); } -/****************************************************************/ -/* InteriorReader is used to read off the data from an interior node -** (see comment at top of file for the format). +/* +** Register the query expression parser test function fts3_exprtest() +** with database connection db. */ -typedef struct InteriorReader { - const char *pData; - int nData; - - DataBuffer term; /* previous term, for decoding term delta. */ - - sqlite_int64 iBlockid; -} InteriorReader; - -static void interiorReaderDestroy(InteriorReader *pReader){ - dataBufferDestroy(&pReader->term); - SCRAMBLE(pReader); +SQLITE_PRIVATE int sqlite3Fts3ExprInitTestInterface(sqlite3* db){ + return sqlite3_create_function( + db, "fts3_exprtest", -1, SQLITE_UTF8, 0, fts3ExprTest, 0, 0 + ); } -/* TODO(shess) The assertions are great, but what if we're in NDEBUG -** and the blob is empty or otherwise contains suspect data? +#endif +#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */ + +/************** End of fts3_expr.c *******************************************/ +/************** Begin file fts3_hash.c ***************************************/ +/* +** 2001 September 22 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** This is the implementation of generic hash-tables used in SQLite. +** We've modified it slightly to serve as a standalone hash table +** implementation for the full-text indexing module. */ -static void interiorReaderInit(const char *pData, int nData, - InteriorReader *pReader){ - int n, nTerm; - /* Require at least the leading flag byte */ - assert( nData>0 ); - assert( pData[0]!='\0' ); +/* +** The code in this file is only compiled if: +** +** * The FTS3 module is being built as an extension +** (in which case SQLITE_CORE is not defined), or +** +** * The FTS3 module is being built into the core of +** SQLite (in which case SQLITE_ENABLE_FTS3 is defined). +*/ +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) - CLEAR(pReader); - /* Decode the base blockid, and set the cursor to the first term. */ - n = fts3GetVarint(pData+1, &pReader->iBlockid); - assert( 1+n<=nData ); - pReader->pData = pData+1+n; - pReader->nData = nData-(1+n); - /* A single-child interior node (such as when a leaf node was too - ** large for the segment directory) won't have any terms. - ** Otherwise, decode the first term. - */ - if( pReader->nData==0 ){ - dataBufferInit(&pReader->term, 0); - }else{ - n = fts3GetVarint32(pReader->pData, &nTerm); - dataBufferInit(&pReader->term, nTerm); - dataBufferReplace(&pReader->term, pReader->pData+n, nTerm); - assert( n+nTerm<=pReader->nData ); - pReader->pData += n+nTerm; - pReader->nData -= n+nTerm; +/* +** Malloc and Free functions +*/ +static void *fts3HashMalloc(int n){ + void *p = sqlite3_malloc(n); + if( p ){ + memset(p, 0, n); } + return p; } - -static int interiorReaderAtEnd(InteriorReader *pReader){ - return pReader->term.nData==0; -} - -static sqlite_int64 interiorReaderCurrentBlockid(InteriorReader *pReader){ - return pReader->iBlockid; +static void fts3HashFree(void *p){ + sqlite3_free(p); } -static int interiorReaderTermBytes(InteriorReader *pReader){ - assert( !interiorReaderAtEnd(pReader) ); - return pReader->term.nData; -} -static const char *interiorReaderTerm(InteriorReader *pReader){ - assert( !interiorReaderAtEnd(pReader) ); - return pReader->term.pData; +/* Turn bulk memory into a hash table object by initializing the +** fields of the Hash structure. +** +** "pNew" is a pointer to the hash table that is to be initialized. +** keyClass is one of the constants +** FTS3_HASH_BINARY or FTS3_HASH_STRING. The value of keyClass +** determines what kind of key the hash table will use. "copyKey" is +** true if the hash table should make its own private copy of keys and +** false if it should just use the supplied pointer. +*/ +SQLITE_PRIVATE void sqlite3Fts3HashInit(Fts3Hash *pNew, char keyClass, char copyKey){ + assert( pNew!=0 ); + assert( keyClass>=FTS3_HASH_STRING && keyClass<=FTS3_HASH_BINARY ); + pNew->keyClass = keyClass; + pNew->copyKey = copyKey; + pNew->first = 0; + pNew->count = 0; + pNew->htsize = 0; + pNew->ht = 0; } -/* Step forward to the next term in the node. */ -static void interiorReaderStep(InteriorReader *pReader){ - assert( !interiorReaderAtEnd(pReader) ); - - /* If the last term has been read, signal eof, else construct the - ** next term. - */ - if( pReader->nData==0 ){ - dataBufferReset(&pReader->term); - }else{ - int n, nPrefix, nSuffix; - - n = fts3GetVarint32(pReader->pData, &nPrefix); - n += fts3GetVarint32(pReader->pData+n, &nSuffix); - - /* Truncate the current term and append suffix data. */ - pReader->term.nData = nPrefix; - dataBufferAppend(&pReader->term, pReader->pData+n, nSuffix); +/* Remove all entries from a hash table. Reclaim all memory. +** Call this routine to delete a hash table or to reset a hash table +** to the empty state. +*/ +SQLITE_PRIVATE void sqlite3Fts3HashClear(Fts3Hash *pH){ + Fts3HashElem *elem; /* For looping over all elements of the table */ - assert( n+nSuffix<=pReader->nData ); - pReader->pData += n+nSuffix; - pReader->nData -= n+nSuffix; + assert( pH!=0 ); + elem = pH->first; + pH->first = 0; + fts3HashFree(pH->ht); + pH->ht = 0; + pH->htsize = 0; + while( elem ){ + Fts3HashElem *next_elem = elem->next; + if( pH->copyKey && elem->pKey ){ + fts3HashFree(elem->pKey); + } + fts3HashFree(elem); + elem = next_elem; } - pReader->iBlockid++; + pH->count = 0; } -/* Compare the current term to pTerm[nTerm], returning strcmp-style -** results. If isPrefix, equality means equal through nTerm bytes. +/* +** Hash and comparison functions when the mode is FTS3_HASH_STRING */ -static int interiorReaderTermCmp(InteriorReader *pReader, - const char *pTerm, int nTerm, int isPrefix){ - const char *pReaderTerm = interiorReaderTerm(pReader); - int nReaderTerm = interiorReaderTermBytes(pReader); - int c, n = nReaderTerm0 ) return -1; - if( nTerm>0 ) return 1; - return 0; +static int fts3StrHash(const void *pKey, int nKey){ + const char *z = (const char *)pKey; + int h = 0; + if( nKey<=0 ) nKey = (int) strlen(z); + while( nKey > 0 ){ + h = (h<<3) ^ h ^ *z++; + nKey--; } + return h & 0x7fffffff; +} +static int fts3StrCompare(const void *pKey1, int n1, const void *pKey2, int n2){ + if( n1!=n2 ) return 1; + return strncmp((const char*)pKey1,(const char*)pKey2,n1); +} - c = memcmp(pReaderTerm, pTerm, n); - if( c!=0 ) return c; - if( isPrefix && n==nTerm ) return 0; - return nReaderTerm - nTerm; +/* +** Hash and comparison functions when the mode is FTS3_HASH_BINARY +*/ +static int fts3BinHash(const void *pKey, int nKey){ + int h = 0; + const char *z = (const char *)pKey; + while( nKey-- > 0 ){ + h = (h<<3) ^ h ^ *(z++); + } + return h & 0x7fffffff; +} +static int fts3BinCompare(const void *pKey1, int n1, const void *pKey2, int n2){ + if( n1!=n2 ) return 1; + return memcmp(pKey1,pKey2,n1); } -/****************************************************************/ -/* LeafWriter is used to collect terms and associated doclist data -** into leaf blocks in %_segments (see top of file for format info). -** Expected usage is: -** -** LeafWriter writer; -** leafWriterInit(0, 0, &writer); -** while( sorted_terms_left_to_process ){ -** // data is doclist data for that term. -** rc = leafWriterStep(v, &writer, pTerm, nTerm, pData, nData); -** if( rc!=SQLITE_OK ) goto err; -** } -** rc = leafWriterFinalize(v, &writer); -**err: -** leafWriterDestroy(&writer); -** return rc; +/* +** Return a pointer to the appropriate hash function given the key class. ** -** leafWriterStep() may write a collected leaf out to %_segments. -** leafWriterFinalize() finishes writing any buffered data and stores -** a root node in %_segdir. leafWriterDestroy() frees all buffers and -** InteriorWriters allocated as part of writing this segment. +** The C syntax in this function definition may be unfamilar to some +** programmers, so we provide the following additional explanation: ** -** TODO(shess) Document leafWriterStepMerge(). +** The name of the function is "ftsHashFunction". The function takes a +** single parameter "keyClass". The return value of ftsHashFunction() +** is a pointer to another function. Specifically, the return value +** of ftsHashFunction() is a pointer to a function that takes two parameters +** with types "const void*" and "int" and returns an "int". */ - -/* Put terms with data this big in their own block. */ -#define STANDALONE_MIN 1024 - -/* Keep leaf blocks below this size. */ -#define LEAF_MAX 2048 - -typedef struct LeafWriter { - int iLevel; - int idx; - sqlite_int64 iStartBlockid; /* needed to create the root info */ - sqlite_int64 iEndBlockid; /* when we're done writing. */ - - DataBuffer term; /* previous encoded term */ - DataBuffer data; /* encoding buffer */ - - /* bytes of first term in the current node which distinguishes that - ** term from the last term of the previous node. - */ - int nTermDistinct; - - InteriorWriter parentWriter; /* if we overflow */ - int has_parent; -} LeafWriter; - -static void leafWriterInit(int iLevel, int idx, LeafWriter *pWriter){ - CLEAR(pWriter); - pWriter->iLevel = iLevel; - pWriter->idx = idx; - - dataBufferInit(&pWriter->term, 32); - - /* Start out with a reasonably sized block, though it can grow. */ - dataBufferInit(&pWriter->data, LEAF_MAX); -} - -#ifndef NDEBUG -/* Verify that the data is readable as a leaf node. */ -static void leafNodeValidate(const char *pData, int nData){ - int n, iDummy; - - if( nData==0 ) return; - assert( nData>0 ); - assert( pData!=0 ); - assert( pData+nData>pData ); - - /* Must lead with a varint(0) */ - n = fts3GetVarint32(pData, &iDummy); - assert( iDummy==0 ); - assert( n>0 ); - assert( n0 ); - assert( iDummy>0 ); - assert( n+iDummy>0 ); - assert( n+iDummy0 ); - assert( iDummy>0 ); - assert( n+iDummy>0 ); - assert( n+iDummy<=nData ); - ASSERT_VALID_DOCLIST(DL_DEFAULT, pData+n, iDummy, NULL); - pData += n+iDummy; - nData -= n+iDummy; - - /* Verify that trailing terms and doclists also are readable. */ - while( nData!=0 ){ - n = fts3GetVarint32(pData, &iDummy); - assert( n>0 ); - assert( iDummy>=0 ); - assert( n0 ); - assert( iDummy>0 ); - assert( n+iDummy>0 ); - assert( n+iDummy0 ); - assert( iDummy>0 ); - assert( n+iDummy>0 ); - assert( n+iDummy<=nData ); - ASSERT_VALID_DOCLIST(DL_DEFAULT, pData+n, iDummy, NULL); - pData += n+iDummy; - nData -= n+iDummy; +static int (*ftsHashFunction(int keyClass))(const void*,int){ + if( keyClass==FTS3_HASH_STRING ){ + return &fts3StrHash; + }else{ + assert( keyClass==FTS3_HASH_BINARY ); + return &fts3BinHash; } } -#define ASSERT_VALID_LEAF_NODE(p, n) leafNodeValidate(p, n) -#else -#define ASSERT_VALID_LEAF_NODE(p, n) assert( 1 ) -#endif -/* Flush the current leaf node to %_segments, and adding the resulting -** blockid and the starting term to the interior node which will -** contain it. +/* +** Return a pointer to the appropriate hash function given the key class. +** +** For help in interpreted the obscure C code in the function definition, +** see the header comment on the previous function. */ -static int leafWriterInternalFlush(fulltext_vtab *v, LeafWriter *pWriter, - int iData, int nData){ - sqlite_int64 iBlockid = 0; - const char *pStartingTerm; - int nStartingTerm, rc, n; - - /* Must have the leading varint(0) flag, plus at least some - ** valid-looking data. - */ - assert( nData>2 ); - assert( iData>=0 ); - assert( iData+nData<=pWriter->data.nData ); - ASSERT_VALID_LEAF_NODE(pWriter->data.pData+iData, nData); - - rc = block_insert(v, pWriter->data.pData+iData, nData, &iBlockid); - if( rc!=SQLITE_OK ) return rc; - assert( iBlockid!=0 ); - - /* Reconstruct the first term in the leaf for purposes of building - ** the interior node. - */ - n = fts3GetVarint32(pWriter->data.pData+iData+1, &nStartingTerm); - pStartingTerm = pWriter->data.pData+iData+1+n; - assert( pWriter->data.nData>iData+1+n+nStartingTerm ); - assert( pWriter->nTermDistinct>0 ); - assert( pWriter->nTermDistinct<=nStartingTerm ); - nStartingTerm = pWriter->nTermDistinct; - - if( pWriter->has_parent ){ - interiorWriterAppend(&pWriter->parentWriter, - pStartingTerm, nStartingTerm, iBlockid); +static int (*ftsCompareFunction(int keyClass))(const void*,int,const void*,int){ + if( keyClass==FTS3_HASH_STRING ){ + return &fts3StrCompare; }else{ - interiorWriterInit(1, pStartingTerm, nStartingTerm, iBlockid, - &pWriter->parentWriter); - pWriter->has_parent = 1; + assert( keyClass==FTS3_HASH_BINARY ); + return &fts3BinCompare; } +} - /* Track the span of this segment's leaf nodes. */ - if( pWriter->iEndBlockid==0 ){ - pWriter->iEndBlockid = pWriter->iStartBlockid = iBlockid; +/* Link an element into the hash table +*/ +static void fts3HashInsertElement( + Fts3Hash *pH, /* The complete hash table */ + struct _fts3ht *pEntry, /* The entry into which pNew is inserted */ + Fts3HashElem *pNew /* The element to be inserted */ +){ + Fts3HashElem *pHead; /* First element already in pEntry */ + pHead = pEntry->chain; + if( pHead ){ + pNew->next = pHead; + pNew->prev = pHead->prev; + if( pHead->prev ){ pHead->prev->next = pNew; } + else { pH->first = pNew; } + pHead->prev = pNew; }else{ - pWriter->iEndBlockid++; - assert( iBlockid==pWriter->iEndBlockid ); + pNew->next = pH->first; + if( pH->first ){ pH->first->prev = pNew; } + pNew->prev = 0; + pH->first = pNew; } - - return SQLITE_OK; + pEntry->count++; + pEntry->chain = pNew; } -static int leafWriterFlush(fulltext_vtab *v, LeafWriter *pWriter){ - int rc = leafWriterInternalFlush(v, pWriter, 0, pWriter->data.nData); - if( rc!=SQLITE_OK ) return rc; - - /* Re-initialize the output buffer. */ - dataBufferReset(&pWriter->data); - return SQLITE_OK; -} -/* Fetch the root info for the segment. If the entire leaf fits -** within ROOT_MAX, then it will be returned directly, otherwise it -** will be flushed and the root info will be returned from the -** interior node. *piEndBlockid is set to the blockid of the last -** interior or leaf node written to disk (0 if none are written at -** all). -*/ -static int leafWriterRootInfo(fulltext_vtab *v, LeafWriter *pWriter, - char **ppRootInfo, int *pnRootInfo, - sqlite_int64 *piEndBlockid){ - /* we can fit the segment entirely inline */ - if( !pWriter->has_parent && pWriter->data.nDatadata.pData; - *pnRootInfo = pWriter->data.nData; - *piEndBlockid = 0; - return SQLITE_OK; - } +/* Resize the hash table so that it cantains "new_size" buckets. +** "new_size" must be a power of 2. The hash table might fail +** to resize if sqliteMalloc() fails. +** +** Return non-zero if a memory allocation error occurs. +*/ +static int fts3Rehash(Fts3Hash *pH, int new_size){ + struct _fts3ht *new_ht; /* The new hash table */ + Fts3HashElem *elem, *next_elem; /* For looping over existing elements */ + int (*xHash)(const void*,int); /* The hash function */ - /* Flush remaining leaf data. */ - if( pWriter->data.nData>0 ){ - int rc = leafWriterFlush(v, pWriter); - if( rc!=SQLITE_OK ) return rc; + assert( (new_size & (new_size-1))==0 ); + new_ht = (struct _fts3ht *)fts3HashMalloc( new_size*sizeof(struct _fts3ht) ); + if( new_ht==0 ) return 1; + fts3HashFree(pH->ht); + pH->ht = new_ht; + pH->htsize = new_size; + xHash = ftsHashFunction(pH->keyClass); + for(elem=pH->first, pH->first=0; elem; elem = next_elem){ + int h = (*xHash)(elem->pKey, elem->nKey) & (new_size-1); + next_elem = elem->next; + fts3HashInsertElement(pH, &new_ht[h], elem); } - - /* We must have flushed a leaf at some point. */ - assert( pWriter->has_parent ); - - /* Tenatively set the end leaf blockid as the end blockid. If the - ** interior node can be returned inline, this will be the final - ** blockid, otherwise it will be overwritten by - ** interiorWriterRootInfo(). - */ - *piEndBlockid = pWriter->iEndBlockid; - - return interiorWriterRootInfo(v, &pWriter->parentWriter, - ppRootInfo, pnRootInfo, piEndBlockid); + return 0; } -/* Collect the rootInfo data and store it into the segment directory. -** This has the effect of flushing the segment's leaf data to -** %_segments, and also flushing any interior nodes to %_segments. +/* This function (for internal use only) locates an element in an +** hash table that matches the given key. The hash for this key has +** already been computed and is passed as the 4th parameter. */ -static int leafWriterFinalize(fulltext_vtab *v, LeafWriter *pWriter){ - sqlite_int64 iEndBlockid; - char *pRootInfo; - int rc, nRootInfo; - - rc = leafWriterRootInfo(v, pWriter, &pRootInfo, &nRootInfo, &iEndBlockid); - if( rc!=SQLITE_OK ) return rc; - - /* Don't bother storing an entirely empty segment. */ - if( iEndBlockid==0 && nRootInfo==0 ) return SQLITE_OK; - - return segdir_set(v, pWriter->iLevel, pWriter->idx, - pWriter->iStartBlockid, pWriter->iEndBlockid, - iEndBlockid, pRootInfo, nRootInfo); -} +static Fts3HashElem *fts3FindElementByHash( + const Fts3Hash *pH, /* The pH to be searched */ + const void *pKey, /* The key we are searching for */ + int nKey, + int h /* The hash for this key. */ +){ + Fts3HashElem *elem; /* Used to loop thru the element list */ + int count; /* Number of elements left to test */ + int (*xCompare)(const void*,int,const void*,int); /* comparison function */ -static void leafWriterDestroy(LeafWriter *pWriter){ - if( pWriter->has_parent ) interiorWriterDestroy(&pWriter->parentWriter); - dataBufferDestroy(&pWriter->term); - dataBufferDestroy(&pWriter->data); + if( pH->ht ){ + struct _fts3ht *pEntry = &pH->ht[h]; + elem = pEntry->chain; + count = pEntry->count; + xCompare = ftsCompareFunction(pH->keyClass); + while( count-- && elem ){ + if( (*xCompare)(elem->pKey,elem->nKey,pKey,nKey)==0 ){ + return elem; + } + elem = elem->next; + } + } + return 0; } -/* Encode a term into the leafWriter, delta-encoding as appropriate. -** Returns the length of the new term which distinguishes it from the -** previous term, which can be used to set nTermDistinct when a node -** boundary is crossed. +/* Remove a single entry from the hash table given a pointer to that +** element and a hash on the element's key. */ -static int leafWriterEncodeTerm(LeafWriter *pWriter, - const char *pTerm, int nTerm){ - char c[VARINT_MAX+VARINT_MAX]; - int n, nPrefix = 0; - - assert( nTerm>0 ); - while( nPrefixterm.nData && - pTerm[nPrefix]==pWriter->term.pData[nPrefix] ){ - nPrefix++; - /* Failing this implies that the terms weren't in order. */ - assert( nPrefixdata.nData==0 ){ - /* Encode the node header and leading term as: - ** varint(0) - ** varint(nTerm) - ** char pTerm[nTerm] - */ - n = fts3PutVarint(c, '\0'); - n += fts3PutVarint(c+n, nTerm); - dataBufferAppend2(&pWriter->data, c, n, pTerm, nTerm); +static void fts3RemoveElementByHash( + Fts3Hash *pH, /* The pH containing "elem" */ + Fts3HashElem* elem, /* The element to be removed from the pH */ + int h /* Hash value for the element */ +){ + struct _fts3ht *pEntry; + if( elem->prev ){ + elem->prev->next = elem->next; }else{ - /* Delta-encode the term as: - ** varint(nPrefix) - ** varint(nSuffix) - ** char pTermSuffix[nSuffix] - */ - n = fts3PutVarint(c, nPrefix); - n += fts3PutVarint(c+n, nTerm-nPrefix); - dataBufferAppend2(&pWriter->data, c, n, pTerm+nPrefix, nTerm-nPrefix); + pH->first = elem->next; + } + if( elem->next ){ + elem->next->prev = elem->prev; + } + pEntry = &pH->ht[h]; + if( pEntry->chain==elem ){ + pEntry->chain = elem->next; + } + pEntry->count--; + if( pEntry->count<=0 ){ + pEntry->chain = 0; + } + if( pH->copyKey && elem->pKey ){ + fts3HashFree(elem->pKey); + } + fts3HashFree( elem ); + pH->count--; + if( pH->count<=0 ){ + assert( pH->first==0 ); + assert( pH->count==0 ); + fts3HashClear(pH); } - dataBufferReplace(&pWriter->term, pTerm, nTerm); - - return nPrefix+1; } -/* Used to avoid a memmove when a large amount of doclist data is in -** the buffer. This constructs a node and term header before -** iDoclistData and flushes the resulting complete node using -** leafWriterInternalFlush(). -*/ -static int leafWriterInlineFlush(fulltext_vtab *v, LeafWriter *pWriter, - const char *pTerm, int nTerm, - int iDoclistData){ - char c[VARINT_MAX+VARINT_MAX]; - int iData, n = fts3PutVarint(c, 0); - n += fts3PutVarint(c+n, nTerm); - - /* There should always be room for the header. Even if pTerm shared - ** a substantial prefix with the previous term, the entire prefix - ** could be constructed from earlier data in the doclist, so there - ** should be room. - */ - assert( iDoclistData>=n+nTerm ); - - iData = iDoclistData-(n+nTerm); - memcpy(pWriter->data.pData+iData, c, n); - memcpy(pWriter->data.pData+iData+n, pTerm, nTerm); +SQLITE_PRIVATE Fts3HashElem *sqlite3Fts3HashFindElem( + const Fts3Hash *pH, + const void *pKey, + int nKey +){ + int h; /* A hash on key */ + int (*xHash)(const void*,int); /* The hash function */ - return leafWriterInternalFlush(v, pWriter, iData, pWriter->data.nData-iData); + if( pH==0 || pH->ht==0 ) return 0; + xHash = ftsHashFunction(pH->keyClass); + assert( xHash!=0 ); + h = (*xHash)(pKey,nKey); + assert( (pH->htsize & (pH->htsize-1))==0 ); + return fts3FindElementByHash(pH,pKey,nKey, h & (pH->htsize-1)); } -/* Push pTerm[nTerm] along with the doclist data to the leaf layer of -** %_segments. +/* +** Attempt to locate an element of the hash table pH with a key +** that matches pKey,nKey. Return the data for this element if it is +** found, or NULL if there is no match. */ -static int leafWriterStepMerge(fulltext_vtab *v, LeafWriter *pWriter, - const char *pTerm, int nTerm, - DLReader *pReaders, int nReaders){ - char c[VARINT_MAX+VARINT_MAX]; - int iTermData = pWriter->data.nData, iDoclistData; - int i, nData, n, nActualData, nActual, rc, nTermDistinct; +SQLITE_PRIVATE void *sqlite3Fts3HashFind(const Fts3Hash *pH, const void *pKey, int nKey){ + Fts3HashElem *pElem; /* The element that matches key (if any) */ - ASSERT_VALID_LEAF_NODE(pWriter->data.pData, pWriter->data.nData); - nTermDistinct = leafWriterEncodeTerm(pWriter, pTerm, nTerm); - - /* Remember nTermDistinct if opening a new node. */ - if( iTermData==0 ) pWriter->nTermDistinct = nTermDistinct; - - iDoclistData = pWriter->data.nData; - - /* Estimate the length of the merged doclist so we can leave space - ** to encode it. - */ - for(i=0, nData=0; idata, c, n); - - docListMerge(&pWriter->data, pReaders, nReaders); - ASSERT_VALID_DOCLIST(DL_DEFAULT, - pWriter->data.pData+iDoclistData+n, - pWriter->data.nData-iDoclistData-n, NULL); - - /* The actual amount of doclist data at this point could be smaller - ** than the length we encoded. Additionally, the space required to - ** encode this length could be smaller. For small doclists, this is - ** not a big deal, we can just use memmove() to adjust things. - */ - nActualData = pWriter->data.nData-(iDoclistData+n); - nActual = fts3PutVarint(c, nActualData); - assert( nActualData<=nData ); - assert( nActual<=n ); + pElem = sqlite3Fts3HashFindElem(pH, pKey, nKey); + return pElem ? pElem->data : 0; +} - /* If the new doclist is big enough for force a standalone leaf - ** node, we can immediately flush it inline without doing the - ** memmove(). - */ - /* TODO(shess) This test matches leafWriterStep(), which does this - ** test before it knows the cost to varint-encode the term and - ** doclist lengths. At some point, change to - ** pWriter->data.nData-iTermData>STANDALONE_MIN. - */ - if( nTerm+nActualData>STANDALONE_MIN ){ - /* Push leaf node from before this term. */ - if( iTermData>0 ){ - rc = leafWriterInternalFlush(v, pWriter, 0, iTermData); - if( rc!=SQLITE_OK ) return rc; +/* Insert an element into the hash table pH. The key is pKey,nKey +** and the data is "data". +** +** If no element exists with a matching key, then a new +** element is created. A copy of the key is made if the copyKey +** flag is set. NULL is returned. +** +** If another element already exists with the same key, then the +** new data replaces the old data and the old data is returned. +** The key is not copied in this instance. If a malloc fails, then +** the new data is returned and the hash table is unchanged. +** +** If the "data" parameter to this function is NULL, then the +** element corresponding to "key" is removed from the hash table. +*/ +SQLITE_PRIVATE void *sqlite3Fts3HashInsert( + Fts3Hash *pH, /* The hash table to insert into */ + const void *pKey, /* The key */ + int nKey, /* Number of bytes in the key */ + void *data /* The data */ +){ + int hraw; /* Raw hash value of the key */ + int h; /* the hash of the key modulo hash table size */ + Fts3HashElem *elem; /* Used to loop thru the element list */ + Fts3HashElem *new_elem; /* New element added to the pH */ + int (*xHash)(const void*,int); /* The hash function */ - pWriter->nTermDistinct = nTermDistinct; + assert( pH!=0 ); + xHash = ftsHashFunction(pH->keyClass); + assert( xHash!=0 ); + hraw = (*xHash)(pKey, nKey); + assert( (pH->htsize & (pH->htsize-1))==0 ); + h = hraw & (pH->htsize-1); + elem = fts3FindElementByHash(pH,pKey,nKey,h); + if( elem ){ + void *old_data = elem->data; + if( data==0 ){ + fts3RemoveElementByHash(pH,elem,h); + }else{ + elem->data = data; } - - /* Fix the encoded doclist length. */ - iDoclistData += n - nActual; - memcpy(pWriter->data.pData+iDoclistData, c, nActual); - - /* Push the standalone leaf node. */ - rc = leafWriterInlineFlush(v, pWriter, pTerm, nTerm, iDoclistData); - if( rc!=SQLITE_OK ) return rc; - - /* Leave the node empty. */ - dataBufferReset(&pWriter->data); - - return rc; + return old_data; } - - /* At this point, we know that the doclist was small, so do the - ** memmove if indicated. - */ - if( nActualdata.pData+iDoclistData+nActual, - pWriter->data.pData+iDoclistData+n, - pWriter->data.nData-(iDoclistData+n)); - pWriter->data.nData -= n-nActual; + if( data==0 ) return 0; + if( (pH->htsize==0 && fts3Rehash(pH,8)) + || (pH->count>=pH->htsize && fts3Rehash(pH, pH->htsize*2)) + ){ + pH->count = 0; + return data; } - - /* Replace written length with actual length. */ - memcpy(pWriter->data.pData+iDoclistData, c, nActual); - - /* If the node is too large, break things up. */ - /* TODO(shess) This test matches leafWriterStep(), which does this - ** test before it knows the cost to varint-encode the term and - ** doclist lengths. At some point, change to - ** pWriter->data.nData>LEAF_MAX. - */ - if( iTermData+nTerm+nActualData>LEAF_MAX ){ - /* Flush out the leading data as a node */ - rc = leafWriterInternalFlush(v, pWriter, 0, iTermData); - if( rc!=SQLITE_OK ) return rc; - - pWriter->nTermDistinct = nTermDistinct; - - /* Rebuild header using the current term */ - n = fts3PutVarint(pWriter->data.pData, 0); - n += fts3PutVarint(pWriter->data.pData+n, nTerm); - memcpy(pWriter->data.pData+n, pTerm, nTerm); - n += nTerm; - - /* There should always be room, because the previous encoding - ** included all data necessary to construct the term. - */ - assert( ndata.nData-iDoclistDatadata.pData+n, - pWriter->data.pData+iDoclistData, - pWriter->data.nData-iDoclistData); - pWriter->data.nData -= iDoclistData-n; + assert( pH->htsize>0 ); + new_elem = (Fts3HashElem*)fts3HashMalloc( sizeof(Fts3HashElem) ); + if( new_elem==0 ) return data; + if( pH->copyKey && pKey!=0 ){ + new_elem->pKey = fts3HashMalloc( nKey ); + if( new_elem->pKey==0 ){ + fts3HashFree(new_elem); + return data; + } + memcpy((void*)new_elem->pKey, pKey, nKey); + }else{ + new_elem->pKey = (void*)pKey; } - ASSERT_VALID_LEAF_NODE(pWriter->data.pData, pWriter->data.nData); - - return SQLITE_OK; -} - -/* Push pTerm[nTerm] along with the doclist data to the leaf layer of -** %_segments. -*/ -/* TODO(shess) Revise writeZeroSegment() so that doclists are -** constructed directly in pWriter->data. -*/ -static int leafWriterStep(fulltext_vtab *v, LeafWriter *pWriter, - const char *pTerm, int nTerm, - const char *pData, int nData){ - int rc; - DLReader reader; - - dlrInit(&reader, DL_DEFAULT, pData, nData); - rc = leafWriterStepMerge(v, pWriter, pTerm, nTerm, &reader, 1); - dlrDestroy(&reader); - - return rc; + new_elem->nKey = nKey; + pH->count++; + assert( pH->htsize>0 ); + assert( (pH->htsize & (pH->htsize-1))==0 ); + h = hraw & (pH->htsize-1); + fts3HashInsertElement(pH, &pH->ht[h], new_elem); + new_elem->data = data; + return 0; } +#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */ -/****************************************************************/ -/* LeafReader is used to iterate over an individual leaf node. */ -typedef struct LeafReader { - DataBuffer term; /* copy of current term. */ +/************** End of fts3_hash.c *******************************************/ +/************** Begin file fts3_porter.c *************************************/ +/* +** 2006 September 30 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** Implementation of the full-text-search tokenizer that implements +** a Porter stemmer. +*/ - const char *pData; /* data for current term. */ - int nData; -} LeafReader; +/* +** The code in this file is only compiled if: +** +** * The FTS3 module is being built as an extension +** (in which case SQLITE_CORE is not defined), or +** +** * The FTS3 module is being built into the core of +** SQLite (in which case SQLITE_ENABLE_FTS3 is defined). +*/ +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) -static void leafReaderDestroy(LeafReader *pReader){ - dataBufferDestroy(&pReader->term); - SCRAMBLE(pReader); -} -static int leafReaderAtEnd(LeafReader *pReader){ - return pReader->nData<=0; -} -/* Access the current term. */ -static int leafReaderTermBytes(LeafReader *pReader){ - return pReader->term.nData; -} -static const char *leafReaderTerm(LeafReader *pReader){ - assert( pReader->term.nData>0 ); - return pReader->term.pData; -} -/* Access the doclist data for the current term. */ -static int leafReaderDataBytes(LeafReader *pReader){ - int nData; - assert( pReader->term.nData>0 ); - fts3GetVarint32(pReader->pData, &nData); - return nData; -} -static const char *leafReaderData(LeafReader *pReader){ - int n, nData; - assert( pReader->term.nData>0 ); - n = fts3GetVarint32(pReader->pData, &nData); - return pReader->pData+n; -} +/* +** Class derived from sqlite3_tokenizer +*/ +typedef struct porter_tokenizer { + sqlite3_tokenizer base; /* Base class */ +} porter_tokenizer; -static void leafReaderInit(const char *pData, int nData, - LeafReader *pReader){ - int nTerm, n; +/* +** Class derived from sqlit3_tokenizer_cursor +*/ +typedef struct porter_tokenizer_cursor { + sqlite3_tokenizer_cursor base; + const char *zInput; /* input we are tokenizing */ + int nInput; /* size of the input */ + int iOffset; /* current position in zInput */ + int iToken; /* index of next token to be returned */ + char *zToken; /* storage for current token */ + int nAllocated; /* space allocated to zToken buffer */ +} porter_tokenizer_cursor; - assert( nData>0 ); - assert( pData[0]=='\0' ); - CLEAR(pReader); +/* +** Create a new tokenizer instance. +*/ +static int porterCreate( + int argc, const char * const *argv, + sqlite3_tokenizer **ppTokenizer +){ + porter_tokenizer *t; - /* Read the first term, skipping the header byte. */ - n = fts3GetVarint32(pData+1, &nTerm); - dataBufferInit(&pReader->term, nTerm); - dataBufferReplace(&pReader->term, pData+1+n, nTerm); + UNUSED_PARAMETER(argc); + UNUSED_PARAMETER(argv); - /* Position after the first term. */ - assert( 1+n+nTermpData = pData+1+n+nTerm; - pReader->nData = nData-1-n-nTerm; + t = (porter_tokenizer *) sqlite3_malloc(sizeof(*t)); + if( t==NULL ) return SQLITE_NOMEM; + memset(t, 0, sizeof(*t)); + *ppTokenizer = &t->base; + return SQLITE_OK; } -/* Step the reader forward to the next term. */ -static void leafReaderStep(LeafReader *pReader){ - int n, nData, nPrefix, nSuffix; - assert( !leafReaderAtEnd(pReader) ); +/* +** Destroy a tokenizer +*/ +static int porterDestroy(sqlite3_tokenizer *pTokenizer){ + sqlite3_free(pTokenizer); + return SQLITE_OK; +} - /* Skip previous entry's data block. */ - n = fts3GetVarint32(pReader->pData, &nData); - assert( n+nData<=pReader->nData ); - pReader->pData += n+nData; - pReader->nData -= n+nData; +/* +** Prepare to begin tokenizing a particular string. The input +** string to be tokenized is zInput[0..nInput-1]. A cursor +** used to incrementally tokenize this string is returned in +** *ppCursor. +*/ +static int porterOpen( + sqlite3_tokenizer *pTokenizer, /* The tokenizer */ + const char *zInput, int nInput, /* String to be tokenized */ + sqlite3_tokenizer_cursor **ppCursor /* OUT: Tokenization cursor */ +){ + porter_tokenizer_cursor *c; - if( !leafReaderAtEnd(pReader) ){ - /* Construct the new term using a prefix from the old term plus a - ** suffix from the leaf data. - */ - n = fts3GetVarint32(pReader->pData, &nPrefix); - n += fts3GetVarint32(pReader->pData+n, &nSuffix); - assert( n+nSuffixnData ); - pReader->term.nData = nPrefix; - dataBufferAppend(&pReader->term, pReader->pData+n, nSuffix); + UNUSED_PARAMETER(pTokenizer); - pReader->pData += n+nSuffix; - pReader->nData -= n+nSuffix; - } -} + c = (porter_tokenizer_cursor *) sqlite3_malloc(sizeof(*c)); + if( c==NULL ) return SQLITE_NOMEM; -/* strcmp-style comparison of pReader's current term against pTerm. -** If isPrefix, equality means equal through nTerm bytes. -*/ -static int leafReaderTermCmp(LeafReader *pReader, - const char *pTerm, int nTerm, int isPrefix){ - int c, n = pReader->term.nDataterm.nData : nTerm; - if( n==0 ){ - if( pReader->term.nData>0 ) return -1; - if(nTerm>0 ) return 1; - return 0; + c->zInput = zInput; + if( zInput==0 ){ + c->nInput = 0; + }else if( nInput<0 ){ + c->nInput = (int)strlen(zInput); + }else{ + c->nInput = nInput; } + c->iOffset = 0; /* start tokenizing at the beginning */ + c->iToken = 0; + c->zToken = NULL; /* no space allocated, yet. */ + c->nAllocated = 0; - c = memcmp(pReader->term.pData, pTerm, n); - if( c!=0 ) return c; - if( isPrefix && n==nTerm ) return 0; - return pReader->term.nData - nTerm; + *ppCursor = &c->base; + return SQLITE_OK; } - -/****************************************************************/ -/* LeavesReader wraps LeafReader to allow iterating over the entire -** leaf layer of the tree. +/* +** Close a tokenization cursor previously opened by a call to +** porterOpen() above. */ -typedef struct LeavesReader { - int idx; /* Index within the segment. */ - - sqlite3_stmt *pStmt; /* Statement we're streaming leaves from. */ - int eof; /* we've seen SQLITE_DONE from pStmt. */ - - LeafReader leafReader; /* reader for the current leaf. */ - DataBuffer rootData; /* root data for inline. */ -} LeavesReader; - -/* Access the current term. */ -static int leavesReaderTermBytes(LeavesReader *pReader){ - assert( !pReader->eof ); - return leafReaderTermBytes(&pReader->leafReader); -} -static const char *leavesReaderTerm(LeavesReader *pReader){ - assert( !pReader->eof ); - return leafReaderTerm(&pReader->leafReader); +static int porterClose(sqlite3_tokenizer_cursor *pCursor){ + porter_tokenizer_cursor *c = (porter_tokenizer_cursor *) pCursor; + sqlite3_free(c->zToken); + sqlite3_free(c); + return SQLITE_OK; } +/* +** Vowel or consonant +*/ +static const char cType[] = { + 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 2, 1 +}; -/* Access the doclist data for the current term. */ -static int leavesReaderDataBytes(LeavesReader *pReader){ - assert( !pReader->eof ); - return leafReaderDataBytes(&pReader->leafReader); -} -static const char *leavesReaderData(LeavesReader *pReader){ - assert( !pReader->eof ); - return leafReaderData(&pReader->leafReader); +/* +** isConsonant() and isVowel() determine if their first character in +** the string they point to is a consonant or a vowel, according +** to Porter ruls. +** +** A consonate is any letter other than 'a', 'e', 'i', 'o', or 'u'. +** 'Y' is a consonant unless it follows another consonant, +** in which case it is a vowel. +** +** In these routine, the letters are in reverse order. So the 'y' rule +** is that 'y' is a consonant unless it is followed by another +** consonent. +*/ +static int isVowel(const char*); +static int isConsonant(const char *z){ + int j; + char x = *z; + if( x==0 ) return 0; + assert( x>='a' && x<='z' ); + j = cType[x-'a']; + if( j<2 ) return j; + return z[1]==0 || isVowel(z + 1); } - -static int leavesReaderAtEnd(LeavesReader *pReader){ - return pReader->eof; +static int isVowel(const char *z){ + int j; + char x = *z; + if( x==0 ) return 0; + assert( x>='a' && x<='z' ); + j = cType[x-'a']; + if( j<2 ) return 1-j; + return isConsonant(z + 1); } -/* loadSegmentLeaves() may not read all the way to SQLITE_DONE, thus -** leaving the statement handle open, which locks the table. -*/ -/* TODO(shess) This "solution" is not satisfactory. Really, there -** should be check-in function for all statement handles which -** arranges to call sqlite3_reset(). This most likely will require -** modification to control flow all over the place, though, so for now -** just punt. +/* +** Let any sequence of one or more vowels be represented by V and let +** C be sequence of one or more consonants. Then every word can be +** represented as: +** +** [C] (VC){m} [V] +** +** In prose: A word is an optional consonant followed by zero or +** vowel-consonant pairs followed by an optional vowel. "m" is the +** number of vowel consonant pairs. This routine computes the value +** of m for the first i bytes of a word. +** +** Return true if the m-value for z is 1 or more. In other words, +** return true if z contains at least one vowel that is followed +** by a consonant. ** -** Note the the current system assumes that segment merges will run to -** completion, which is why this particular probably hasn't arisen in -** this case. Probably a brittle assumption. +** In this routine z[] is in reverse order. So we are really looking +** for an instance of of a consonant followed by a vowel. */ -static int leavesReaderReset(LeavesReader *pReader){ - return sqlite3_reset(pReader->pStmt); +static int m_gt_0(const char *z){ + while( isVowel(z) ){ z++; } + if( *z==0 ) return 0; + while( isConsonant(z) ){ z++; } + return *z!=0; } -static void leavesReaderDestroy(LeavesReader *pReader){ - /* If idx is -1, that means we're using a non-cached statement - ** handle in the optimize() case, so we need to release it. - */ - if( pReader->pStmt!=NULL && pReader->idx==-1 ){ - sqlite3_finalize(pReader->pStmt); - } - leafReaderDestroy(&pReader->leafReader); - dataBufferDestroy(&pReader->rootData); - SCRAMBLE(pReader); +/* Like mgt0 above except we are looking for a value of m which is +** exactly 1 +*/ +static int m_eq_1(const char *z){ + while( isVowel(z) ){ z++; } + if( *z==0 ) return 0; + while( isConsonant(z) ){ z++; } + if( *z==0 ) return 0; + while( isVowel(z) ){ z++; } + if( *z==0 ) return 1; + while( isConsonant(z) ){ z++; } + return *z==0; } -/* Initialize pReader with the given root data (if iStartBlockid==0 -** the leaf data was entirely contained in the root), or from the -** stream of blocks between iStartBlockid and iEndBlockid, inclusive. +/* Like mgt0 above except we are looking for a value of m>1 instead +** or m>0 */ -static int leavesReaderInit(fulltext_vtab *v, - int idx, - sqlite_int64 iStartBlockid, - sqlite_int64 iEndBlockid, - const char *pRootData, int nRootData, - LeavesReader *pReader){ - CLEAR(pReader); - pReader->idx = idx; - - dataBufferInit(&pReader->rootData, 0); - if( iStartBlockid==0 ){ - /* Entire leaf level fit in root data. */ - dataBufferReplace(&pReader->rootData, pRootData, nRootData); - leafReaderInit(pReader->rootData.pData, pReader->rootData.nData, - &pReader->leafReader); - }else{ - sqlite3_stmt *s; - int rc = sql_get_leaf_statement(v, idx, &s); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_bind_int64(s, 1, iStartBlockid); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_bind_int64(s, 2, iEndBlockid); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_step(s); - if( rc==SQLITE_DONE ){ - pReader->eof = 1; - return SQLITE_OK; - } - if( rc!=SQLITE_ROW ) return rc; - - pReader->pStmt = s; - leafReaderInit(sqlite3_column_blob(pReader->pStmt, 0), - sqlite3_column_bytes(pReader->pStmt, 0), - &pReader->leafReader); - } - return SQLITE_OK; +static int m_gt_1(const char *z){ + while( isVowel(z) ){ z++; } + if( *z==0 ) return 0; + while( isConsonant(z) ){ z++; } + if( *z==0 ) return 0; + while( isVowel(z) ){ z++; } + if( *z==0 ) return 0; + while( isConsonant(z) ){ z++; } + return *z!=0; } -/* Step the current leaf forward to the next term. If we reach the -** end of the current leaf, step forward to the next leaf block. +/* +** Return TRUE if there is a vowel anywhere within z[0..n-1] */ -static int leavesReaderStep(fulltext_vtab *v, LeavesReader *pReader){ - assert( !leavesReaderAtEnd(pReader) ); - leafReaderStep(&pReader->leafReader); - - if( leafReaderAtEnd(&pReader->leafReader) ){ - int rc; - if( pReader->rootData.pData ){ - pReader->eof = 1; - return SQLITE_OK; - } - rc = sqlite3_step(pReader->pStmt); - if( rc!=SQLITE_ROW ){ - pReader->eof = 1; - return rc==SQLITE_DONE ? SQLITE_OK : rc; - } - leafReaderDestroy(&pReader->leafReader); - leafReaderInit(sqlite3_column_blob(pReader->pStmt, 0), - sqlite3_column_bytes(pReader->pStmt, 0), - &pReader->leafReader); - } - return SQLITE_OK; +static int hasVowel(const char *z){ + while( isConsonant(z) ){ z++; } + return *z!=0; } -/* Order LeavesReaders by their term, ignoring idx. Readers at eof -** always sort to the end. +/* +** Return TRUE if the word ends in a double consonant. +** +** The text is reversed here. So we are really looking at +** the first two characters of z[]. */ -static int leavesReaderTermCmp(LeavesReader *lr1, LeavesReader *lr2){ - if( leavesReaderAtEnd(lr1) ){ - if( leavesReaderAtEnd(lr2) ) return 0; - return 1; - } - if( leavesReaderAtEnd(lr2) ) return -1; - - return leafReaderTermCmp(&lr1->leafReader, - leavesReaderTerm(lr2), leavesReaderTermBytes(lr2), - 0); +static int doubleConsonant(const char *z){ + return isConsonant(z) && z[0]==z[1]; } -/* Similar to leavesReaderTermCmp(), with additional ordering by idx -** so that older segments sort before newer segments. +/* +** Return TRUE if the word ends with three letters which +** are consonant-vowel-consonent and where the final consonant +** is not 'w', 'x', or 'y'. +** +** The word is reversed here. So we are really checking the +** first three letters and the first one cannot be in [wxy]. */ -static int leavesReaderCmp(LeavesReader *lr1, LeavesReader *lr2){ - int c = leavesReaderTermCmp(lr1, lr2); - if( c!=0 ) return c; - return lr1->idx-lr2->idx; +static int star_oh(const char *z){ + return + isConsonant(z) && + z[0]!='w' && z[0]!='x' && z[0]!='y' && + isVowel(z+1) && + isConsonant(z+2); } -/* Assume that pLr[1]..pLr[nLr] are sorted. Bubble pLr[0] into its -** sorted position. +/* +** If the word ends with zFrom and xCond() is true for the stem +** of the word that preceeds the zFrom ending, then change the +** ending to zTo. +** +** The input word *pz and zFrom are both in reverse order. zTo +** is in normal order. +** +** Return TRUE if zFrom matches. Return FALSE if zFrom does not +** match. Not that TRUE is returned even if xCond() fails and +** no substitution occurs. */ -static void leavesReaderReorder(LeavesReader *pLr, int nLr){ - while( nLr>1 && leavesReaderCmp(pLr, pLr+1)>0 ){ - LeavesReader tmp = pLr[0]; - pLr[0] = pLr[1]; - pLr[1] = tmp; - nLr--; - pLr++; +static int stem( + char **pz, /* The word being stemmed (Reversed) */ + const char *zFrom, /* If the ending matches this... (Reversed) */ + const char *zTo, /* ... change the ending to this (not reversed) */ + int (*xCond)(const char*) /* Condition that must be true */ +){ + char *z = *pz; + while( *zFrom && *zFrom==*z ){ z++; zFrom++; } + if( *zFrom!=0 ) return 0; + if( xCond && !xCond(z) ) return 1; + while( *zTo ){ + *(--z) = *(zTo++); } + *pz = z; + return 1; } -/* Initializes pReaders with the segments from level iLevel, returning -** the number of segments in *piReaders. Leaves pReaders in sorted -** order. +/* +** This is the fallback stemmer used when the porter stemmer is +** inappropriate. The input word is copied into the output with +** US-ASCII case folding. If the input word is too long (more +** than 20 bytes if it contains no digits or more than 6 bytes if +** it contains digits) then word is truncated to 20 or 6 bytes +** by taking 10 or 3 bytes from the beginning and end. */ -static int leavesReadersInit(fulltext_vtab *v, int iLevel, - LeavesReader *pReaders, int *piReaders){ - sqlite3_stmt *s; - int i, rc = sql_get_statement(v, SEGDIR_SELECT_LEVEL_STMT, &s); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_bind_int(s, 1, iLevel); - if( rc!=SQLITE_OK ) return rc; - - i = 0; - while( (rc = sqlite3_step(s))==SQLITE_ROW ){ - sqlite_int64 iStart = sqlite3_column_int64(s, 0); - sqlite_int64 iEnd = sqlite3_column_int64(s, 1); - const char *pRootData = sqlite3_column_blob(s, 2); - int nRootData = sqlite3_column_bytes(s, 2); - - assert( i0 ){ - leavesReaderDestroy(&pReaders[i]); +static void copy_stemmer(const char *zIn, int nIn, char *zOut, int *pnOut){ + int i, mx, j; + int hasDigit = 0; + for(i=0; i='A' && c<='Z' ){ + zOut[i] = c - 'A' + 'a'; + }else{ + if( c>='0' && c<='9' ) hasDigit = 1; + zOut[i] = c; } - return rc; - } - - *piReaders = i; - - /* Leave our results sorted by term, then age. */ - while( i-- ){ - leavesReaderReorder(pReaders+i, *piReaders-i); } - return SQLITE_OK; -} - -/* Merge doclists from pReaders[nReaders] into a single doclist, which -** is written to pWriter. Assumes pReaders is ordered oldest to -** newest. -*/ -/* TODO(shess) Consider putting this inline in segmentMerge(). */ -static int leavesReadersMerge(fulltext_vtab *v, - LeavesReader *pReaders, int nReaders, - LeafWriter *pWriter){ - DLReader dlReaders[MERGE_COUNT]; - const char *pTerm = leavesReaderTerm(pReaders); - int i, nTerm = leavesReaderTermBytes(pReaders); - - assert( nReaders<=MERGE_COUNT ); - - for(i=0; imx*2 ){ + for(j=mx, i=nIn-mx; i=sizeof(zReverse)-7 ){ + /* The word is too big or too small for the porter stemmer. + ** Fallback to the copy stemmer */ + copy_stemmer(zIn, nIn, zOut, pnOut); + return; + } + for(i=0, j=sizeof(zReverse)-6; i='A' && c<='Z' ){ + zReverse[j] = c + 'a' - 'A'; + }else if( c>='a' && c<='z' ){ + zReverse[j] = c; }else{ - (*pidx)++; + /* The use of a character not in [a-zA-Z] means that we fallback + ** to the copy stemmer */ + copy_stemmer(zIn, nIn, zOut, pnOut); + return; } - }else{ - return rc; } - return SQLITE_OK; -} + memset(&zReverse[sizeof(zReverse)-5], 0, 5); + z = &zReverse[j+1]; -/* Merge MERGE_COUNT segments at iLevel into a new segment at -** iLevel+1. If iLevel+1 is already full of segments, those will be -** merged to make room. -*/ -static int segmentMerge(fulltext_vtab *v, int iLevel){ - LeafWriter writer; - LeavesReader lrs[MERGE_COUNT]; - int i, rc, idx = 0; - /* Determine the next available segment index at the next level, - ** merging as necessary. - */ - rc = segdirNextIndex(v, iLevel+1, &idx); - if( rc!=SQLITE_OK ) return rc; + /* Step 1a */ + if( z[0]=='s' ){ + if( + !stem(&z, "sess", "ss", 0) && + !stem(&z, "sei", "i", 0) && + !stem(&z, "ss", "ss", 0) + ){ + z++; + } + } - /* TODO(shess) This assumes that we'll always see exactly - ** MERGE_COUNT segments to merge at a given level. That will be - ** broken if we allow the developer to request preemptive or - ** deferred merging. - */ - memset(&lrs, '\0', sizeof(lrs)); - rc = leavesReadersInit(v, iLevel, lrs, &i); - if( rc!=SQLITE_OK ) return rc; - assert( i==MERGE_COUNT ); + /* Step 1b */ + z2 = z; + if( stem(&z, "dee", "ee", m_gt_0) ){ + /* Do nothing. The work was all in the test */ + }else if( + (stem(&z, "gni", "", hasVowel) || stem(&z, "de", "", hasVowel)) + && z!=z2 + ){ + if( stem(&z, "ta", "ate", 0) || + stem(&z, "lb", "ble", 0) || + stem(&z, "zi", "ize", 0) ){ + /* Do nothing. The work was all in the test */ + }else if( doubleConsonant(z) && (*z!='l' && *z!='s' && *z!='z') ){ + z++; + }else if( m_eq_1(z) && star_oh(z) ){ + *(--z) = 'e'; + } + } - leafWriterInit(iLevel+1, idx, &writer); + /* Step 1c */ + if( z[0]=='y' && hasVowel(z+1) ){ + z[0] = 'i'; + } - /* Since leavesReaderReorder() pushes readers at eof to the end, - ** when the first reader is empty, all will be empty. - */ - while( !leavesReaderAtEnd(lrs) ){ - /* Figure out how many readers share their next term. */ - for(i=1; i0 ){ - rc = leavesReaderStep(v, lrs+i); - if( rc!=SQLITE_OK ) goto err; + /* Step 4 */ + switch( z[1] ){ + case 'a': + if( z[0]=='l' && m_gt_1(z+2) ){ + z += 2; + } + break; + case 'c': + if( z[0]=='e' && z[2]=='n' && (z[3]=='a' || z[3]=='e') && m_gt_1(z+4) ){ + z += 4; + } + break; + case 'e': + if( z[0]=='r' && m_gt_1(z+2) ){ + z += 2; + } + break; + case 'i': + if( z[0]=='c' && m_gt_1(z+2) ){ + z += 2; + } + break; + case 'l': + if( z[0]=='e' && z[2]=='b' && (z[3]=='a' || z[3]=='i') && m_gt_1(z+4) ){ + z += 4; + } + break; + case 'n': + if( z[0]=='t' ){ + if( z[2]=='a' ){ + if( m_gt_1(z+3) ){ + z += 3; + } + }else if( z[2]=='e' ){ + stem(&z, "tneme", "", m_gt_1) || + stem(&z, "tnem", "", m_gt_1) || + stem(&z, "tne", "", m_gt_1); + } + } + break; + case 'o': + if( z[0]=='u' ){ + if( m_gt_1(z+2) ){ + z += 2; + } + }else if( z[3]=='s' || z[3]=='t' ){ + stem(&z, "noi", "", m_gt_1); + } + break; + case 's': + if( z[0]=='m' && z[2]=='i' && m_gt_1(z+3) ){ + z += 3; + } + break; + case 't': + stem(&z, "eta", "", m_gt_1) || + stem(&z, "iti", "", m_gt_1); + break; + case 'u': + if( z[0]=='s' && z[2]=='o' && m_gt_1(z+3) ){ + z += 3; + } + break; + case 'v': + case 'z': + if( z[0]=='e' && z[2]=='i' && m_gt_1(z+3) ){ + z += 3; + } + break; + } - /* Reorder by term, then by age. */ - leavesReaderReorder(lrs+i, MERGE_COUNT-i); + /* Step 5a */ + if( z[0]=='e' ){ + if( m_gt_1(z+1) ){ + z++; + }else if( m_eq_1(z+1) && !star_oh(z+1) ){ + z++; } } - for(i=0; i0 ); - - for(rc=SQLITE_OK; rc==SQLITE_OK && !leavesReaderAtEnd(pReader); - rc=leavesReaderStep(v, pReader)){ - /* TODO(shess) Really want leavesReaderTermCmp(), but that name is - ** already taken to compare the terms of two LeavesReaders. Think - ** on a better name. [Meanwhile, break encapsulation rather than - ** use a confusing name.] - */ - int c = leafReaderTermCmp(&pReader->leafReader, pTerm, nTerm, isPrefix); - if( c>0 ) break; /* Past any possible matches. */ - if( c==0 ){ - const char *pData = leavesReaderData(pReader); - int iBuffer, nData = leavesReaderDataBytes(pReader); - - /* Find the first empty buffer. */ - for(iBuffer=0; iBuffer0 ){ - assert(pBuffers!=NULL); - memcpy(p, pBuffers, nBuffers*sizeof(*pBuffers)); - sqlite3_free(pBuffers); - } - pBuffers = p; - } - dataBufferInit(&(pBuffers[nBuffers]), 0); - nBuffers++; - } - - /* At this point, must have an empty at iBuffer. */ - assert(iBufferzInput; - /* Handle position 0 specially to avoid need to prime pAcc - ** with pData/nData. - */ - dataBufferSwap(p, pAcc); - docListAccumulateUnion(pAcc, pData, nData); + while( c->iOffsetnInput ){ + int iStartOffset, ch; - /* Accumulate remaining doclists into pAcc. */ - for(++p; ppData, p->nData); + /* Scan past delimiter characters */ + while( c->iOffsetnInput && isDelim(z[c->iOffset]) ){ + c->iOffset++; + } - /* dataBufferReset() could allow a large doclist to blow up - ** our memory requirements. - */ - if( p->nCapacity<1024 ){ - dataBufferReset(p); - }else{ - dataBufferDestroy(p); - dataBufferInit(p, 0); - } - } - } + /* Count non-delimiter characters. */ + iStartOffset = c->iOffset; + while( c->iOffsetnInput && !isDelim(z[c->iOffset]) ){ + c->iOffset++; } - } - /* Union all the doclists together into *out. */ - /* TODO(shess) What if *out is big? Sigh. */ - if( rc==SQLITE_OK && nBuffers>0 ){ - int iBuffer; - for(iBuffer=0; iBuffer0 ){ - if( out->nData==0 ){ - dataBufferSwap(out, &(pBuffers[iBuffer])); - }else{ - docListAccumulateUnion(out, pBuffers[iBuffer].pData, - pBuffers[iBuffer].nData); - } + if( c->iOffset>iStartOffset ){ + int n = c->iOffset-iStartOffset; + if( n>c->nAllocated ){ + c->nAllocated = n+20; + c->zToken = sqlite3_realloc(c->zToken, c->nAllocated); + if( c->zToken==NULL ) return SQLITE_NOMEM; } + porter_stemmer(&z[iStartOffset], n, c->zToken, pnBytes); + *pzToken = c->zToken; + *piStartOffset = iStartOffset; + *piEndOffset = c->iOffset; + *piPosition = c->iToken++; + return SQLITE_OK; } } - - while( nBuffers-- ){ - dataBufferDestroy(&(pBuffers[nBuffers])); - } - if( pBuffers!=NULL ) sqlite3_free(pBuffers); - - return rc; -} - -/* Call loadSegmentLeavesInt() with pData/nData as input. */ -static int loadSegmentLeaf(fulltext_vtab *v, const char *pData, int nData, - const char *pTerm, int nTerm, int isPrefix, - DataBuffer *out){ - LeavesReader reader; - int rc; - - assert( nData>1 ); - assert( *pData=='\0' ); - rc = leavesReaderInit(v, 0, 0, 0, pData, nData, &reader); - if( rc!=SQLITE_OK ) return rc; - - rc = loadSegmentLeavesInt(v, &reader, pTerm, nTerm, isPrefix, out); - leavesReaderReset(&reader); - leavesReaderDestroy(&reader); - return rc; + return SQLITE_DONE; } -/* Call loadSegmentLeavesInt() with the leaf nodes from iStartLeaf to -** iEndLeaf (inclusive) as input, and merge the resulting doclist into -** out. +/* +** The set of routines that implement the porter-stemmer tokenizer */ -static int loadSegmentLeaves(fulltext_vtab *v, - sqlite_int64 iStartLeaf, sqlite_int64 iEndLeaf, - const char *pTerm, int nTerm, int isPrefix, - DataBuffer *out){ - int rc; - LeavesReader reader; - - assert( iStartLeaf<=iEndLeaf ); - rc = leavesReaderInit(v, 0, iStartLeaf, iEndLeaf, NULL, 0, &reader); - if( rc!=SQLITE_OK ) return rc; - - rc = loadSegmentLeavesInt(v, &reader, pTerm, nTerm, isPrefix, out); - leavesReaderReset(&reader); - leavesReaderDestroy(&reader); - return rc; -} +static const sqlite3_tokenizer_module porterTokenizerModule = { + 0, + porterCreate, + porterDestroy, + porterOpen, + porterClose, + porterNext, +}; -/* Taking pData/nData as an interior node, find the sequence of child -** nodes which could include pTerm/nTerm/isPrefix. Note that the -** interior node terms logically come between the blocks, so there is -** one more blockid than there are terms (that block contains terms >= -** the last interior-node term). -*/ -/* TODO(shess) The calling code may already know that the end child is -** not worth calculating, because the end may be in a later sibling -** node. Consider whether breaking symmetry is worthwhile. I suspect -** it is not worthwhile. +/* +** Allocate a new porter tokenizer. Return a pointer to the new +** tokenizer in *ppModule */ -static void getChildrenContaining(const char *pData, int nData, - const char *pTerm, int nTerm, int isPrefix, - sqlite_int64 *piStartChild, - sqlite_int64 *piEndChild){ - InteriorReader reader; +SQLITE_PRIVATE void sqlite3Fts3PorterTokenizerModule( + sqlite3_tokenizer_module const**ppModule +){ + *ppModule = &porterTokenizerModule; +} - assert( nData>1 ); - assert( *pData!='\0' ); - interiorReaderInit(pData, nData, &reader); +#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */ - /* Scan for the first child which could contain pTerm/nTerm. */ - while( !interiorReaderAtEnd(&reader) ){ - if( interiorReaderTermCmp(&reader, pTerm, nTerm, 0)>0 ) break; - interiorReaderStep(&reader); - } - *piStartChild = interiorReaderCurrentBlockid(&reader); +/************** End of fts3_porter.c *****************************************/ +/************** Begin file fts3_tokenizer.c **********************************/ +/* +** 2007 June 22 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +****************************************************************************** +** +** This is part of an SQLite module implementing full-text search. +** This particular file implements the generic tokenizer interface. +*/ - /* Keep scanning to find a term greater than our term, using prefix - ** comparison if indicated. If isPrefix is false, this will be the - ** same blockid as the starting block. - */ - while( !interiorReaderAtEnd(&reader) ){ - if( interiorReaderTermCmp(&reader, pTerm, nTerm, isPrefix)>0 ) break; - interiorReaderStep(&reader); - } - *piEndChild = interiorReaderCurrentBlockid(&reader); +/* +** The code in this file is only compiled if: +** +** * The FTS3 module is being built as an extension +** (in which case SQLITE_CORE is not defined), or +** +** * The FTS3 module is being built into the core of +** SQLite (in which case SQLITE_ENABLE_FTS3 is defined). +*/ +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) - interiorReaderDestroy(&reader); +#ifndef SQLITE_CORE + SQLITE_EXTENSION_INIT1 +#endif - /* Children must ascend, and if !prefix, both must be the same. */ - assert( *piEndChild>=*piStartChild ); - assert( isPrefix || *piStartChild==*piEndChild ); -} -/* Read block at iBlockid and pass it with other params to -** getChildrenContaining(). +/* +** Implementation of the SQL scalar function for accessing the underlying +** hash table. This function may be called as follows: +** +** SELECT (); +** SELECT (, ); +** +** where is the name passed as the second argument +** to the sqlite3Fts3InitHashTable() function (e.g. 'fts3_tokenizer'). +** +** If the argument is specified, it must be a blob value +** containing a pointer to be stored as the hash data corresponding +** to the string . If is not specified, then +** the string must already exist in the has table. Otherwise, +** an error is returned. +** +** Whether or not the argument is specified, the value returned +** is a blob containing the pointer stored as the hash data corresponding +** to string (after the hash-table is updated, if applicable). */ -static int loadAndGetChildrenContaining( - fulltext_vtab *v, - sqlite_int64 iBlockid, - const char *pTerm, int nTerm, int isPrefix, - sqlite_int64 *piStartChild, sqlite_int64 *piEndChild +static void scalarFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv ){ - sqlite3_stmt *s = NULL; - int rc; - - assert( iBlockid!=0 ); - assert( pTerm!=NULL ); - assert( nTerm!=0 ); /* TODO(shess) Why not allow this? */ - assert( piStartChild!=NULL ); - assert( piEndChild!=NULL ); - - rc = sql_get_statement(v, BLOCK_SELECT_STMT, &s); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_bind_int64(s, 1, iBlockid); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_step(s); - if( rc==SQLITE_DONE ) return SQLITE_ERROR; - if( rc!=SQLITE_ROW ) return rc; + Fts3Hash *pHash; + void *pPtr = 0; + const unsigned char *zName; + int nName; - getChildrenContaining(sqlite3_column_blob(s, 0), sqlite3_column_bytes(s, 0), - pTerm, nTerm, isPrefix, piStartChild, piEndChild); + assert( argc==1 || argc==2 ); - /* We expect only one row. We must execute another sqlite3_step() - * to complete the iteration; otherwise the table will remain - * locked. */ - rc = sqlite3_step(s); - if( rc==SQLITE_ROW ) return SQLITE_ERROR; - if( rc!=SQLITE_DONE ) return rc; + pHash = (Fts3Hash *)sqlite3_user_data(context); - return SQLITE_OK; -} + zName = sqlite3_value_text(argv[0]); + nName = sqlite3_value_bytes(argv[0])+1; -/* Traverse the tree represented by pData[nData] looking for -** pTerm[nTerm], placing its doclist into *out. This is internal to -** loadSegment() to make error-handling cleaner. -*/ -static int loadSegmentInt(fulltext_vtab *v, const char *pData, int nData, - sqlite_int64 iLeavesEnd, - const char *pTerm, int nTerm, int isPrefix, - DataBuffer *out){ - /* Special case where root is a leaf. */ - if( *pData=='\0' ){ - return loadSegmentLeaf(v, pData, nData, pTerm, nTerm, isPrefix, out); + if( argc==2 ){ + void *pOld; + int n = sqlite3_value_bytes(argv[1]); + if( n!=sizeof(pPtr) ){ + sqlite3_result_error(context, "argument type mismatch", -1); + return; + } + pPtr = *(void **)sqlite3_value_blob(argv[1]); + pOld = sqlite3Fts3HashInsert(pHash, (void *)zName, nName, pPtr); + if( pOld==pPtr ){ + sqlite3_result_error(context, "out of memory", -1); + return; + } }else{ - int rc; - sqlite_int64 iStartChild, iEndChild; + pPtr = sqlite3Fts3HashFind(pHash, zName, nName); + if( !pPtr ){ + char *zErr = sqlite3_mprintf("unknown tokenizer: %s", zName); + sqlite3_result_error(context, zErr, -1); + sqlite3_free(zErr); + return; + } + } - /* Process pData as an interior node, then loop down the tree - ** until we find the set of leaf nodes to scan for the term. - */ - getChildrenContaining(pData, nData, pTerm, nTerm, isPrefix, - &iStartChild, &iEndChild); - while( iStartChild>iLeavesEnd ){ - sqlite_int64 iNextStart, iNextEnd; - rc = loadAndGetChildrenContaining(v, iStartChild, pTerm, nTerm, isPrefix, - &iNextStart, &iNextEnd); - if( rc!=SQLITE_OK ) return rc; + sqlite3_result_blob(context, (void *)&pPtr, sizeof(pPtr), SQLITE_TRANSIENT); +} - /* If we've branched, follow the end branch, too. */ - if( iStartChild!=iEndChild ){ - sqlite_int64 iDummy; - rc = loadAndGetChildrenContaining(v, iEndChild, pTerm, nTerm, isPrefix, - &iDummy, &iNextEnd); - if( rc!=SQLITE_OK ) return rc; +static int fts3IsIdChar(char c){ + static const char isFtsIdChar[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 1x */ + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 2x */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, /* 3x */ + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 4x */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, /* 5x */ + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 6x */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, /* 7x */ + }; + return (c&0x80 || isFtsIdChar[(int)(c)]); +} + +SQLITE_PRIVATE const char *sqlite3Fts3NextToken(const char *zStr, int *pn){ + const char *z1; + const char *z2 = 0; + + /* Find the start of the next token. */ + z1 = zStr; + while( z2==0 ){ + char c = *z1; + switch( c ){ + case '\0': return 0; /* No more tokens here */ + case '\'': + case '"': + case '`': { + z2 = z1; + while( *++z2 && (*z2!=c || *++z2==c) ); + break; } + case '[': + z2 = &z1[1]; + while( *z2 && z2[0]!=']' ) z2++; + if( *z2 ) z2++; + break; - assert( iNextStart<=iNextEnd ); - iStartChild = iNextStart; - iEndChild = iNextEnd; + default: + if( fts3IsIdChar(*z1) ){ + z2 = &z1[1]; + while( fts3IsIdChar(*z2) ) z2++; + }else{ + z1++; + } } - assert( iStartChild<=iLeavesEnd ); - assert( iEndChild<=iLeavesEnd ); - - /* Scan through the leaf segments for doclists. */ - return loadSegmentLeaves(v, iStartChild, iEndChild, - pTerm, nTerm, isPrefix, out); } + + *pn = (int)(z2-z1); + return z1; } -/* Call loadSegmentInt() to collect the doclist for pTerm/nTerm, then -** merge its doclist over *out (any duplicate doclists read from the -** segment rooted at pData will overwrite those in *out). -*/ -/* TODO(shess) Consider changing this to determine the depth of the -** leaves using either the first characters of interior nodes (when -** ==1, we're one level above the leaves), or the first character of -** the root (which will describe the height of the tree directly). -** Either feels somewhat tricky to me. -*/ -/* TODO(shess) The current merge is likely to be slow for large -** doclists (though it should process from newest/smallest to -** oldest/largest, so it may not be that bad). It might be useful to -** modify things to allow for N-way merging. This could either be -** within a segment, with pairwise merges across segments, or across -** all segments at once. -*/ -static int loadSegment(fulltext_vtab *v, const char *pData, int nData, - sqlite_int64 iLeavesEnd, - const char *pTerm, int nTerm, int isPrefix, - DataBuffer *out){ - DataBuffer result; +SQLITE_PRIVATE int sqlite3Fts3InitTokenizer( + Fts3Hash *pHash, /* Tokenizer hash table */ + const char *zArg, /* Possible tokenizer specification */ + sqlite3_tokenizer **ppTok, /* OUT: Tokenizer (if applicable) */ + const char **pzTokenizer, /* OUT: Set to zArg if is tokenizer */ + char **pzErr /* OUT: Set to malloced error message */ +){ int rc; + char *z = (char *)zArg; + int n; + char *zCopy; + char *zEnd; /* Pointer to nul-term of zCopy */ + sqlite3_tokenizer_module *m; - assert( nData>1 ); + if( !z ){ + zCopy = sqlite3_mprintf("simple"); + }else{ + if( sqlite3_strnicmp(z, "tokenize", 8) || fts3IsIdChar(z[8])){ + return SQLITE_OK; + } + zCopy = sqlite3_mprintf("%s", &z[8]); + *pzTokenizer = zArg; + } + if( !zCopy ){ + return SQLITE_NOMEM; + } - /* This code should never be called with buffered updates. */ - assert( v->nPendingData<0 ); + zEnd = &zCopy[strlen(zCopy)]; - dataBufferInit(&result, 0); - rc = loadSegmentInt(v, pData, nData, iLeavesEnd, - pTerm, nTerm, isPrefix, &result); - if( rc==SQLITE_OK && result.nData>0 ){ - if( out->nData==0 ){ - DataBuffer tmp = *out; - *out = result; - result = tmp; - }else{ - DataBuffer merged; - DLReader readers[2]; + z = (char *)sqlite3Fts3NextToken(zCopy, &n); + z[n] = '\0'; + sqlite3Fts3Dequote(z); - dlrInit(&readers[0], DL_DEFAULT, out->pData, out->nData); - dlrInit(&readers[1], DL_DEFAULT, result.pData, result.nData); - dataBufferInit(&merged, out->nData+result.nData); - docListMerge(&merged, readers, 2); - dataBufferDestroy(out); - *out = merged; - dlrDestroy(&readers[0]); - dlrDestroy(&readers[1]); + m = (sqlite3_tokenizer_module *)sqlite3Fts3HashFind(pHash, z, (int)strlen(z)+1); + if( !m ){ + *pzErr = sqlite3_mprintf("unknown tokenizer: %s", z); + rc = SQLITE_ERROR; + }else{ + char const **aArg = 0; + int iArg = 0; + z = &z[n+1]; + while( zxCreate(iArg, aArg, ppTok); + assert( rc!=SQLITE_OK || *ppTok ); + if( rc!=SQLITE_OK ){ + *pzErr = sqlite3_mprintf("unknown tokenizer"); + }else{ + (*ppTok)->pModule = m; } + sqlite3_free((void *)aArg); } - dataBufferDestroy(&result); + + sqlite3_free(zCopy); return rc; } -/* Scan the database and merge together the posting lists for the term -** into *out. -*/ -static int termSelect( - fulltext_vtab *v, - int iColumn, - const char *pTerm, int nTerm, /* Term to query for */ - int isPrefix, /* True for a prefix search */ - DocListType iType, - DataBuffer *out /* Write results here */ -){ - DataBuffer doclist; - sqlite3_stmt *s; - int rc = sql_get_statement(v, SEGDIR_SELECT_ALL_STMT, &s); - if( rc!=SQLITE_OK ) return rc; - /* This code should never be called with buffered updates. */ - assert( v->nPendingData<0 ); +#ifdef SQLITE_TEST - dataBufferInit(&doclist, 0); - dataBufferInit(out, 0); - /* Traverse the segments from oldest to newest so that newer doclist - ** elements for given docids overwrite older elements. - */ - while( (rc = sqlite3_step(s))==SQLITE_ROW ){ - const char *pData = sqlite3_column_blob(s, 2); - const int nData = sqlite3_column_bytes(s, 2); - const sqlite_int64 iLeavesEnd = sqlite3_column_int64(s, 1); - rc = loadSegment(v, pData, nData, iLeavesEnd, pTerm, nTerm, isPrefix, - &doclist); - if( rc!=SQLITE_OK ) goto err; - } - if( rc==SQLITE_DONE ){ - if( doclist.nData!=0 ){ - /* TODO(shess) The old term_select_all() code applied the column - ** restrict as we merged segments, leading to smaller buffers. - ** This is probably worthwhile to bring back, once the new storage - ** system is checked in. - */ - if( iColumn==v->nColumn) iColumn = -1; - docListTrim(DL_DEFAULT, doclist.pData, doclist.nData, - iColumn, iType, out); - } - rc = SQLITE_OK; - } +/* +** Implementation of a special SQL scalar function for testing tokenizers +** designed to be used in concert with the Tcl testing framework. This +** function must be called with two arguments: +** +** SELECT (, ); +** SELECT (, ); +** +** where is the name passed as the second argument +** to the sqlite3Fts3InitHashTable() function (e.g. 'fts3_tokenizer') +** concatenated with the string '_test' (e.g. 'fts3_tokenizer_test'). +** +** The return value is a string that may be interpreted as a Tcl +** list. For each token in the , three elements are +** added to the returned list. The first is the token position, the +** second is the token text (folded, stemmed, etc.) and the third is the +** substring of associated with the token. For example, +** using the built-in "simple" tokenizer: +** +** SELECT fts_tokenizer_test('simple', 'I don't see how'); +** +** will return the string: +** +** "{0 i I 1 dont don't 2 see see 3 how how}" +** +*/ +static void testFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + Fts3Hash *pHash; + sqlite3_tokenizer_module *p; + sqlite3_tokenizer *pTokenizer = 0; + sqlite3_tokenizer_cursor *pCsr = 0; - err: - dataBufferDestroy(&doclist); - return rc; -} + const char *zErr = 0; -/****************************************************************/ -/* Used to hold hashtable data for sorting. */ -typedef struct TermData { - const char *pTerm; - int nTerm; - DLCollector *pCollector; -} TermData; + const char *zName; + int nName; + const char *zInput; + int nInput; -/* Orders TermData elements in strcmp fashion ( <0 for less-than, 0 -** for equal, >0 for greater-than). -*/ -static int termDataCmp(const void *av, const void *bv){ - const TermData *a = (const TermData *)av; - const TermData *b = (const TermData *)bv; - int n = a->nTermnTerm ? a->nTerm : b->nTerm; - int c = memcmp(a->pTerm, b->pTerm, n); - if( c!=0 ) return c; - return a->nTerm-b->nTerm; -} + const char *zArg = 0; -/* Order pTerms data by term, then write a new level 0 segment using -** LeafWriter. -*/ -static int writeZeroSegment(fulltext_vtab *v, fts3Hash *pTerms){ - fts3HashElem *e; - int idx, rc, i, n; - TermData *pData; - LeafWriter writer; - DataBuffer dl; + const char *zToken; + int nToken; + int iStart; + int iEnd; + int iPos; - /* Determine the next index at level 0, merging as necessary. */ - rc = segdirNextIndex(v, 0, &idx); - if( rc!=SQLITE_OK ) return rc; + Tcl_Obj *pRet; + + assert( argc==2 || argc==3 ); - n = fts3HashCount(pTerms); - pData = sqlite3_malloc(n*sizeof(TermData)); + nName = sqlite3_value_bytes(argv[0]); + zName = (const char *)sqlite3_value_text(argv[0]); + nInput = sqlite3_value_bytes(argv[argc-1]); + zInput = (const char *)sqlite3_value_text(argv[argc-1]); - for(i = 0, e = fts3HashFirst(pTerms); e; i++, e = fts3HashNext(e)){ - assert( i1 ) qsort(pData, n, sizeof(*pData), termDataCmp); + pHash = (Fts3Hash *)sqlite3_user_data(context); + p = (sqlite3_tokenizer_module *)sqlite3Fts3HashFind(pHash, zName, nName+1); - /* TODO(shess) Refactor so that we can write directly to the segment - ** DataBuffer, as happens for segment merges. - */ - leafWriterInit(0, idx, &writer); - dataBufferInit(&dl, 0); - for(i=0; inPendingData>=0 ){ - fts3HashElem *e; - for(e=fts3HashFirst(&v->pendingTerms); e; e=fts3HashNext(e)){ - dlcDelete(fts3HashData(e)); - } - fts3HashClear(&v->pendingTerms); - v->nPendingData = -1; + if( SQLITE_OK!=p->xCreate(zArg ? 1 : 0, &zArg, &pTokenizer) ){ + zErr = "error in xCreate()"; + goto finish; } - return SQLITE_OK; -} + pTokenizer->pModule = p; + if( SQLITE_OK!=p->xOpen(pTokenizer, zInput, nInput, &pCsr) ){ + zErr = "error in xOpen()"; + goto finish; + } + pCsr->pTokenizer = pTokenizer; -/* If pendingTerms has data, flush it to a level-zero segment, and -** free it. -*/ -static int flushPendingTerms(fulltext_vtab *v){ - if( v->nPendingData>=0 ){ - int rc = writeZeroSegment(v, &v->pendingTerms); - if( rc==SQLITE_OK ) clearPendingTerms(v); - return rc; + while( SQLITE_OK==p->xNext(pCsr, &zToken, &nToken, &iStart, &iEnd, &iPos) ){ + Tcl_ListObjAppendElement(0, pRet, Tcl_NewIntObj(iPos)); + Tcl_ListObjAppendElement(0, pRet, Tcl_NewStringObj(zToken, nToken)); + zToken = &zInput[iStart]; + nToken = iEnd-iStart; + Tcl_ListObjAppendElement(0, pRet, Tcl_NewStringObj(zToken, nToken)); } - return SQLITE_OK; -} -/* If pendingTerms is "too big", or docid is out of order, flush it. -** Regardless, be certain that pendingTerms is initialized for use. -*/ -static int initPendingTerms(fulltext_vtab *v, sqlite_int64 iDocid){ - /* TODO(shess) Explore whether partially flushing the buffer on - ** forced-flush would provide better performance. I suspect that if - ** we ordered the doclists by size and flushed the largest until the - ** buffer was half empty, that would let the less frequent terms - ** generate longer doclists. - */ - if( iDocid<=v->iPrevDocid || v->nPendingData>kPendingThreshold ){ - int rc = flushPendingTerms(v); - if( rc!=SQLITE_OK ) return rc; + if( SQLITE_OK!=p->xClose(pCsr) ){ + zErr = "error in xClose()"; + goto finish; } - if( v->nPendingData<0 ){ - fts3HashInit(&v->pendingTerms, FTS3_HASH_STRING, 1); - v->nPendingData = 0; + if( SQLITE_OK!=p->xDestroy(pTokenizer) ){ + zErr = "error in xDestroy()"; + goto finish; } - v->iPrevDocid = iDocid; - return SQLITE_OK; + +finish: + if( zErr ){ + sqlite3_result_error(context, zErr, -1); + }else{ + sqlite3_result_text(context, Tcl_GetString(pRet), -1, SQLITE_TRANSIENT); + } + Tcl_DecrRefCount(pRet); } -/* This function implements the xUpdate callback; it is the top-level entry - * point for inserting, deleting or updating a row in a full-text table. */ -static int fulltextUpdate(sqlite3_vtab *pVtab, int nArg, sqlite3_value **ppArg, - sqlite_int64 *pRowid){ - fulltext_vtab *v = (fulltext_vtab *) pVtab; +static +int registerTokenizer( + sqlite3 *db, + char *zName, + const sqlite3_tokenizer_module *p +){ int rc; + sqlite3_stmt *pStmt; + const char zSql[] = "SELECT fts3_tokenizer(?, ?)"; - FTSTRACE(("FTS3 Update %p\n", pVtab)); - - if( nArg<2 ){ - rc = index_delete(v, sqlite3_value_int64(ppArg[0])); - if( rc==SQLITE_OK ){ - /* If we just deleted the last row in the table, clear out the - ** index data. - */ - rc = content_exists(v); - if( rc==SQLITE_ROW ){ - rc = SQLITE_OK; - }else if( rc==SQLITE_DONE ){ - /* Clear the pending terms so we don't flush a useless level-0 - ** segment when the transaction closes. - */ - rc = clearPendingTerms(v); - if( rc==SQLITE_OK ){ - rc = segdir_delete_all(v); - } - } - } - } else if( sqlite3_value_type(ppArg[0]) != SQLITE_NULL ){ - /* An update: - * ppArg[0] = old rowid - * ppArg[1] = new rowid - * ppArg[2..2+v->nColumn-1] = values - * ppArg[2+v->nColumn] = value for magic column (we ignore this) - * ppArg[2+v->nColumn+1] = value for docid - */ - sqlite_int64 rowid = sqlite3_value_int64(ppArg[0]); - if( sqlite3_value_type(ppArg[1]) != SQLITE_INTEGER || - sqlite3_value_int64(ppArg[1]) != rowid ){ - rc = SQLITE_ERROR; /* we don't allow changing the rowid */ - }else if( sqlite3_value_type(ppArg[2+v->nColumn+1]) != SQLITE_INTEGER || - sqlite3_value_int64(ppArg[2+v->nColumn+1]) != rowid ){ - rc = SQLITE_ERROR; /* we don't allow changing the docid */ - }else{ - assert( nArg==2+v->nColumn+2); - rc = index_update(v, rowid, &ppArg[2]); - } - } else { - /* An insert: - * ppArg[1] = requested rowid - * ppArg[2..2+v->nColumn-1] = values - * ppArg[2+v->nColumn] = value for magic column (we ignore this) - * ppArg[2+v->nColumn+1] = value for docid - */ - sqlite3_value *pRequestDocid = ppArg[2+v->nColumn+1]; - assert( nArg==2+v->nColumn+2); - if( SQLITE_NULL != sqlite3_value_type(pRequestDocid) && - SQLITE_NULL != sqlite3_value_type(ppArg[1]) ){ - /* TODO(shess) Consider allowing this to work if the values are - ** identical. I'm inclined to discourage that usage, though, - ** given that both rowid and docid are special columns. Better - ** would be to define one or the other as the default winner, - ** but should it be fts3-centric (docid) or SQLite-centric - ** (rowid)? - */ - rc = SQLITE_ERROR; - }else{ - if( SQLITE_NULL == sqlite3_value_type(pRequestDocid) ){ - pRequestDocid = ppArg[1]; - } - rc = index_insert(v, pRequestDocid, &ppArg[2], pRowid); - } + rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); + if( rc!=SQLITE_OK ){ + return rc; } - return rc; -} + sqlite3_bind_text(pStmt, 1, zName, -1, SQLITE_STATIC); + sqlite3_bind_blob(pStmt, 2, &p, sizeof(p), SQLITE_STATIC); + sqlite3_step(pStmt); -static int fulltextSync(sqlite3_vtab *pVtab){ - FTSTRACE(("FTS3 xSync()\n")); - return flushPendingTerms((fulltext_vtab *)pVtab); + return sqlite3_finalize(pStmt); } -static int fulltextBegin(sqlite3_vtab *pVtab){ - fulltext_vtab *v = (fulltext_vtab *) pVtab; - FTSTRACE(("FTS3 xBegin()\n")); +static +int queryTokenizer( + sqlite3 *db, + char *zName, + const sqlite3_tokenizer_module **pp +){ + int rc; + sqlite3_stmt *pStmt; + const char zSql[] = "SELECT fts3_tokenizer(?)"; - /* Any buffered updates should have been cleared by the previous - ** transaction. - */ - assert( v->nPendingData<0 ); - return clearPendingTerms(v); -} + *pp = 0; + rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); + if( rc!=SQLITE_OK ){ + return rc; + } -static int fulltextCommit(sqlite3_vtab *pVtab){ - fulltext_vtab *v = (fulltext_vtab *) pVtab; - FTSTRACE(("FTS3 xCommit()\n")); + sqlite3_bind_text(pStmt, 1, zName, -1, SQLITE_STATIC); + if( SQLITE_ROW==sqlite3_step(pStmt) ){ + if( sqlite3_column_type(pStmt, 0)==SQLITE_BLOB ){ + memcpy((void *)pp, sqlite3_column_blob(pStmt, 0), sizeof(*pp)); + } + } - /* Buffered updates should have been cleared by fulltextSync(). */ - assert( v->nPendingData<0 ); - return clearPendingTerms(v); + return sqlite3_finalize(pStmt); } -static int fulltextRollback(sqlite3_vtab *pVtab){ - FTSTRACE(("FTS3 xRollback()\n")); - return clearPendingTerms((fulltext_vtab *)pVtab); -} +SQLITE_PRIVATE void sqlite3Fts3SimpleTokenizerModule(sqlite3_tokenizer_module const**ppModule); /* -** Implementation of the snippet() function for FTS3 +** Implementation of the scalar function fts3_tokenizer_internal_test(). +** This function is used for testing only, it is not included in the +** build unless SQLITE_TEST is defined. +** +** The purpose of this is to test that the fts3_tokenizer() function +** can be used as designed by the C-code in the queryTokenizer and +** registerTokenizer() functions above. These two functions are repeated +** in the README.tokenizer file as an example, so it is important to +** test them. +** +** To run the tests, evaluate the fts3_tokenizer_internal_test() scalar +** function with no arguments. An assert() will fail if a problem is +** detected. i.e.: +** +** SELECT fts3_tokenizer_internal_test(); +** */ -static void snippetFunc( - sqlite3_context *pContext, +static void intTestFunc( + sqlite3_context *context, int argc, sqlite3_value **argv ){ - fulltext_cursor *pCursor; - if( argc<1 ) return; - if( sqlite3_value_type(argv[0])!=SQLITE_BLOB || - sqlite3_value_bytes(argv[0])!=sizeof(pCursor) ){ - sqlite3_result_error(pContext, "illegal first argument to html_snippet",-1); - }else{ - const char *zStart = ""; - const char *zEnd = ""; - const char *zEllipsis = "..."; - memcpy(&pCursor, sqlite3_value_blob(argv[0]), sizeof(pCursor)); - if( argc>=2 ){ - zStart = (const char*)sqlite3_value_text(argv[1]); - if( argc>=3 ){ - zEnd = (const char*)sqlite3_value_text(argv[2]); - if( argc>=4 ){ - zEllipsis = (const char*)sqlite3_value_text(argv[3]); - } - } - } - snippetAllOffsets(pCursor); - snippetText(pCursor, zStart, zEnd, zEllipsis); - sqlite3_result_text(pContext, pCursor->snippet.zSnippet, - pCursor->snippet.nSnippet, SQLITE_STATIC); - } -} + int rc; + const sqlite3_tokenizer_module *p1; + const sqlite3_tokenizer_module *p2; + sqlite3 *db = (sqlite3 *)sqlite3_user_data(context); -/* -** Implementation of the offsets() function for FTS3 -*/ -static void snippetOffsetsFunc( - sqlite3_context *pContext, - int argc, - sqlite3_value **argv -){ - fulltext_cursor *pCursor; - if( argc<1 ) return; - if( sqlite3_value_type(argv[0])!=SQLITE_BLOB || - sqlite3_value_bytes(argv[0])!=sizeof(pCursor) ){ - sqlite3_result_error(pContext, "illegal first argument to offsets",-1); - }else{ - memcpy(&pCursor, sqlite3_value_blob(argv[0]), sizeof(pCursor)); - snippetAllOffsets(pCursor); - snippetOffsetText(&pCursor->snippet); - sqlite3_result_text(pContext, - pCursor->snippet.zOffset, pCursor->snippet.nOffset, - SQLITE_STATIC); - } -} + UNUSED_PARAMETER(argc); + UNUSED_PARAMETER(argv); -/* OptLeavesReader is nearly identical to LeavesReader, except that -** where LeavesReader is geared towards the merging of complete -** segment levels (with exactly MERGE_COUNT segments), OptLeavesReader -** is geared towards implementation of the optimize() function, and -** can merge all segments simultaneously. This version may be -** somewhat less efficient than LeavesReader because it merges into an -** accumulator rather than doing an N-way merge, but since segment -** size grows exponentially (so segment count logrithmically) this is -** probably not an immediate problem. -*/ -/* TODO(shess): Prove that assertion, or extend the merge code to -** merge tree fashion (like the prefix-searching code does). -*/ -/* TODO(shess): OptLeavesReader and LeavesReader could probably be -** merged with little or no loss of performance for LeavesReader. The -** merged code would need to handle >MERGE_COUNT segments, and would -** also need to be able to optionally optimize away deletes. -*/ -typedef struct OptLeavesReader { - /* Segment number, to order readers by age. */ - int segment; - LeavesReader reader; -} OptLeavesReader; + /* Test the query function */ + sqlite3Fts3SimpleTokenizerModule(&p1); + rc = queryTokenizer(db, "simple", &p2); + assert( rc==SQLITE_OK ); + assert( p1==p2 ); + rc = queryTokenizer(db, "nosuchtokenizer", &p2); + assert( rc==SQLITE_ERROR ); + assert( p2==0 ); + assert( 0==strcmp(sqlite3_errmsg(db), "unknown tokenizer: nosuchtokenizer") ); -static int optLeavesReaderAtEnd(OptLeavesReader *pReader){ - return leavesReaderAtEnd(&pReader->reader); -} -static int optLeavesReaderTermBytes(OptLeavesReader *pReader){ - return leavesReaderTermBytes(&pReader->reader); -} -static const char *optLeavesReaderData(OptLeavesReader *pReader){ - return leavesReaderData(&pReader->reader); -} -static int optLeavesReaderDataBytes(OptLeavesReader *pReader){ - return leavesReaderDataBytes(&pReader->reader); -} -static const char *optLeavesReaderTerm(OptLeavesReader *pReader){ - return leavesReaderTerm(&pReader->reader); -} -static int optLeavesReaderStep(fulltext_vtab *v, OptLeavesReader *pReader){ - return leavesReaderStep(v, &pReader->reader); -} -static int optLeavesReaderTermCmp(OptLeavesReader *lr1, OptLeavesReader *lr2){ - return leavesReaderTermCmp(&lr1->reader, &lr2->reader); -} -/* Order by term ascending, segment ascending (oldest to newest), with -** exhausted readers to the end. -*/ -static int optLeavesReaderCmp(OptLeavesReader *lr1, OptLeavesReader *lr2){ - int c = optLeavesReaderTermCmp(lr1, lr2); - if( c!=0 ) return c; - return lr1->segment-lr2->segment; -} -/* Bubble pLr[0] to appropriate place in pLr[1..nLr-1]. Assumes that -** pLr[1..nLr-1] is already sorted. -*/ -static void optLeavesReaderReorder(OptLeavesReader *pLr, int nLr){ - while( nLr>1 && optLeavesReaderCmp(pLr, pLr+1)>0 ){ - OptLeavesReader tmp = pLr[0]; - pLr[0] = pLr[1]; - pLr[1] = tmp; - nLr--; - pLr++; - } + /* Test the storage function */ + rc = registerTokenizer(db, "nosuchtokenizer", p1); + assert( rc==SQLITE_OK ); + rc = queryTokenizer(db, "nosuchtokenizer", &p2); + assert( rc==SQLITE_OK ); + assert( p2==p1 ); + + sqlite3_result_text(context, "ok", -1, SQLITE_STATIC); } -/* optimize() helper function. Put the readers in order and iterate -** through them, merging doclists for matching terms into pWriter. -** Returns SQLITE_OK on success, or the SQLite error code which -** prevented success. +#endif + +/* +** Set up SQL objects in database db used to access the contents of +** the hash table pointed to by argument pHash. The hash table must +** been initialised to use string keys, and to take a private copy +** of the key when a value is inserted. i.e. by a call similar to: +** +** sqlite3Fts3HashInit(pHash, FTS3_HASH_STRING, 1); +** +** This function adds a scalar function (see header comment above +** scalarFunc() in this file for details) and, if ENABLE_TABLE is +** defined at compilation time, a temporary virtual table (see header +** comment above struct HashTableVtab) to the database schema. Both +** provide read/write access to the contents of *pHash. +** +** The third argument to this function, zName, is used as the name +** of both the scalar and, if created, the virtual table. */ -static int optimizeInternal(fulltext_vtab *v, - OptLeavesReader *readers, int nReaders, - LeafWriter *pWriter){ - int i, rc = SQLITE_OK; - DataBuffer doclist, merged, tmp; +SQLITE_PRIVATE int sqlite3Fts3InitHashTable( + sqlite3 *db, + Fts3Hash *pHash, + const char *zName +){ + int rc = SQLITE_OK; + void *p = (void *)pHash; + const int any = SQLITE_ANY; - /* Order the readers. */ - i = nReaders; - while( i-- > 0 ){ - optLeavesReaderReorder(&readers[i], nReaders-i); +#ifdef SQLITE_TEST + char *zTest = 0; + char *zTest2 = 0; + void *pdb = (void *)db; + zTest = sqlite3_mprintf("%s_test", zName); + zTest2 = sqlite3_mprintf("%s_internal_test", zName); + if( !zTest || !zTest2 ){ + rc = SQLITE_NOMEM; } +#endif - dataBufferInit(&doclist, LEAF_MAX); - dataBufferInit(&merged, LEAF_MAX); - - /* Exhausted readers bubble to the end, so when the first reader is - ** at eof, all are at eof. - */ - while( !optLeavesReaderAtEnd(&readers[0]) ){ + if( SQLITE_OK!=rc + || SQLITE_OK!=(rc = sqlite3_create_function(db, zName, 1, any, p, scalarFunc, 0, 0)) + || SQLITE_OK!=(rc = sqlite3_create_function(db, zName, 2, any, p, scalarFunc, 0, 0)) +#ifdef SQLITE_TEST + || SQLITE_OK!=(rc = sqlite3_create_function(db, zTest, 2, any, p, testFunc, 0, 0)) + || SQLITE_OK!=(rc = sqlite3_create_function(db, zTest, 3, any, p, testFunc, 0, 0)) + || SQLITE_OK!=(rc = sqlite3_create_function(db, zTest2, 0, any, pdb, intTestFunc, 0, 0)) +#endif + ); - /* Figure out how many readers share the next term. */ - for(i=1; i 0 ){ - dlrDestroy(&dlReaders[nReaders]); - } +/* +** The code in this file is only compiled if: +** +** * The FTS3 module is being built as an extension +** (in which case SQLITE_CORE is not defined), or +** +** * The FTS3 module is being built into the core of +** SQLite (in which case SQLITE_ENABLE_FTS3 is defined). +*/ +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) - /* Accumulated doclist to reader 0 for next pass. */ - dlrInit(&dlReaders[0], DL_DEFAULT, doclist.pData, doclist.nData); - } - /* Destroy reader that was left in the pipeline. */ - dlrDestroy(&dlReaders[0]); - /* Trim deletions from the doclist. */ - dataBufferReset(&merged); - docListTrim(DL_DEFAULT, doclist.pData, doclist.nData, - -1, DL_DEFAULT, &merged); - } - /* Only pass doclists with hits (skip if all hits deleted). */ - if( merged.nData>0 ){ - rc = leafWriterStep(v, pWriter, - optLeavesReaderTerm(&readers[0]), - optLeavesReaderTermBytes(&readers[0]), - merged.pData, merged.nData); - if( rc!=SQLITE_OK ) goto err; - } +typedef struct simple_tokenizer { + sqlite3_tokenizer base; + char delim[128]; /* flag ASCII delimiters */ +} simple_tokenizer; - /* Step merged readers to next term and reorder. */ - while( i-- > 0 ){ - rc = optLeavesReaderStep(v, &readers[i]); - if( rc!=SQLITE_OK ) goto err; +typedef struct simple_tokenizer_cursor { + sqlite3_tokenizer_cursor base; + const char *pInput; /* input we are tokenizing */ + int nBytes; /* size of the input */ + int iOffset; /* current position in pInput */ + int iToken; /* index of next token to be returned */ + char *pToken; /* storage for current token */ + int nTokenAllocated; /* space allocated to zToken buffer */ +} simple_tokenizer_cursor; - optLeavesReaderReorder(&readers[i], nReaders-i); - } - } - err: - dataBufferDestroy(&doclist); - dataBufferDestroy(&merged); - return rc; +static int simpleDelim(simple_tokenizer *t, unsigned char c){ + return c<0x80 && t->delim[c]; } -/* Implement optimize() function for FTS3. optimize(t) merges all -** segments in the fts index into a single segment. 't' is the magic -** table-named column. +/* +** Create a new tokenizer instance. */ -static void optimizeFunc(sqlite3_context *pContext, - int argc, sqlite3_value **argv){ - fulltext_cursor *pCursor; - if( argc>1 ){ - sqlite3_result_error(pContext, "excess arguments to optimize()",-1); - }else if( sqlite3_value_type(argv[0])!=SQLITE_BLOB || - sqlite3_value_bytes(argv[0])!=sizeof(pCursor) ){ - sqlite3_result_error(pContext, "illegal first argument to optimize",-1); - }else{ - fulltext_vtab *v; - int i, rc, iMaxLevel; - OptLeavesReader *readers; - int nReaders; - LeafWriter writer; - sqlite3_stmt *s; - - memcpy(&pCursor, sqlite3_value_blob(argv[0]), sizeof(pCursor)); - v = cursor_vtab(pCursor); - - /* Flush any buffered updates before optimizing. */ - rc = flushPendingTerms(v); - if( rc!=SQLITE_OK ) goto err; - - rc = segdir_count(v, &nReaders, &iMaxLevel); - if( rc!=SQLITE_OK ) goto err; - if( nReaders==0 || nReaders==1 ){ - sqlite3_result_text(pContext, "Index already optimal", -1, - SQLITE_STATIC); - return; - } - - rc = sql_get_statement(v, SEGDIR_SELECT_ALL_STMT, &s); - if( rc!=SQLITE_OK ) goto err; - - readers = sqlite3_malloc(nReaders*sizeof(readers[0])); - if( readers==NULL ) goto err; - - /* Note that there will already be a segment at this position - ** until we call segdir_delete() on iMaxLevel. - */ - leafWriterInit(iMaxLevel, 0, &writer); - - i = 0; - while( (rc = sqlite3_step(s))==SQLITE_ROW ){ - sqlite_int64 iStart = sqlite3_column_int64(s, 0); - sqlite_int64 iEnd = sqlite3_column_int64(s, 1); - const char *pRootData = sqlite3_column_blob(s, 2); - int nRootData = sqlite3_column_bytes(s, 2); - - assert( i 0 ){ - leavesReaderDestroy(&readers[i].reader); - } - sqlite3_free(readers); + t = (simple_tokenizer *) sqlite3_malloc(sizeof(*t)); + if( t==NULL ) return SQLITE_NOMEM; + memset(t, 0, sizeof(*t)); - /* If we've successfully gotten to here, delete the old segments - ** and flush the interior structure of the new segment. - */ - if( rc==SQLITE_OK ){ - for( i=0; i<=iMaxLevel; i++ ){ - rc = segdir_delete(v, i); - if( rc!=SQLITE_OK ) break; + /* TODO(shess) Delimiters need to remain the same from run to run, + ** else we need to reindex. One solution would be a meta-table to + ** track such information in the database, then we'd only want this + ** information on the initial create. + */ + if( argc>1 ){ + int i, n = (int)strlen(argv[1]); + for(i=0; i=0x80 ){ + sqlite3_free(t); + return SQLITE_ERROR; } - - if( rc==SQLITE_OK ) rc = leafWriterFinalize(v, &writer); + t->delim[ch] = 1; } - - leafWriterDestroy(&writer); - - if( rc!=SQLITE_OK ) goto err; - - sqlite3_result_text(pContext, "Index optimized", -1, SQLITE_STATIC); - return; - - /* TODO(shess): Error-handling needs to be improved along the - ** lines of the dump_ functions. - */ - err: - { - char buf[512]; - sqlite3_snprintf(sizeof(buf), buf, "Error in optimize: %s", - sqlite3_errmsg(sqlite3_context_db_handle(pContext))); - sqlite3_result_error(pContext, buf, -1); + } else { + /* Mark non-alphanumeric ASCII characters as delimiters */ + int i; + for(i=1; i<0x80; i++){ + t->delim[i] = !isalnum(i) ? -1 : 0; } } -} - -#ifdef SQLITE_TEST -/* Generate an error of the form ": ". If msg is NULL, -** pull the error from the context's db handle. -*/ -static void generateError(sqlite3_context *pContext, - const char *prefix, const char *msg){ - char buf[512]; - if( msg==NULL ) msg = sqlite3_errmsg(sqlite3_context_db_handle(pContext)); - sqlite3_snprintf(sizeof(buf), buf, "%s: %s", prefix, msg); - sqlite3_result_error(pContext, buf, -1); -} - -/* Helper function to collect the set of terms in the segment into -** pTerms. The segment is defined by the leaf nodes between -** iStartBlockid and iEndBlockid, inclusive, or by the contents of -** pRootData if iStartBlockid is 0 (in which case the entire segment -** fit in a leaf). -*/ -static int collectSegmentTerms(fulltext_vtab *v, sqlite3_stmt *s, - fts3Hash *pTerms){ - const sqlite_int64 iStartBlockid = sqlite3_column_int64(s, 0); - const sqlite_int64 iEndBlockid = sqlite3_column_int64(s, 1); - const char *pRootData = sqlite3_column_blob(s, 2); - const int nRootData = sqlite3_column_bytes(s, 2); - LeavesReader reader; - int rc = leavesReaderInit(v, 0, iStartBlockid, iEndBlockid, - pRootData, nRootData, &reader); - if( rc!=SQLITE_OK ) return rc; - while( rc==SQLITE_OK && !leavesReaderAtEnd(&reader) ){ - const char *pTerm = leavesReaderTerm(&reader); - const int nTerm = leavesReaderTermBytes(&reader); - void *oldValue = sqlite3Fts3HashFind(pTerms, pTerm, nTerm); - void *newValue = (void *)((char *)oldValue+1); - - /* From the comment before sqlite3Fts3HashInsert in fts3_hash.c, - ** the data value passed is returned in case of malloc failure. - */ - if( newValue==sqlite3Fts3HashInsert(pTerms, pTerm, nTerm, newValue) ){ - rc = SQLITE_NOMEM; - }else{ - rc = leavesReaderStep(v, &reader); - } - } + *ppTokenizer = &t->base; + return SQLITE_OK; +} - leavesReaderDestroy(&reader); - return rc; +/* +** Destroy a tokenizer +*/ +static int simpleDestroy(sqlite3_tokenizer *pTokenizer){ + sqlite3_free(pTokenizer); + return SQLITE_OK; } -/* Helper function to build the result string for dump_terms(). */ -static int generateTermsResult(sqlite3_context *pContext, fts3Hash *pTerms){ - int iTerm, nTerms, nResultBytes, iByte; - char *result; - TermData *pData; - fts3HashElem *e; +/* +** Prepare to begin tokenizing a particular string. The input +** string to be tokenized is pInput[0..nBytes-1]. A cursor +** used to incrementally tokenize this string is returned in +** *ppCursor. +*/ +static int simpleOpen( + sqlite3_tokenizer *pTokenizer, /* The tokenizer */ + const char *pInput, int nBytes, /* String to be tokenized */ + sqlite3_tokenizer_cursor **ppCursor /* OUT: Tokenization cursor */ +){ + simple_tokenizer_cursor *c; - /* Iterate pTerms to generate an array of terms in pData for - ** sorting. - */ - nTerms = fts3HashCount(pTerms); - assert( nTerms>0 ); - pData = sqlite3_malloc(nTerms*sizeof(TermData)); - if( pData==NULL ) return SQLITE_NOMEM; + UNUSED_PARAMETER(pTokenizer); - nResultBytes = 0; - for(iTerm = 0, e = fts3HashFirst(pTerms); e; iTerm++, e = fts3HashNext(e)){ - nResultBytes += fts3HashKeysize(e)+1; /* Term plus trailing space */ - assert( iTerm0 ); /* nTerms>0, nResultsBytes must be, too. */ - result = sqlite3_malloc(nResultBytes); - if( result==NULL ){ - sqlite3_free(pData); - return SQLITE_NOMEM; + c->pInput = pInput; + if( pInput==0 ){ + c->nBytes = 0; + }else if( nBytes<0 ){ + c->nBytes = (int)strlen(pInput); + }else{ + c->nBytes = nBytes; } + c->iOffset = 0; /* start tokenizing at the beginning */ + c->iToken = 0; + c->pToken = NULL; /* no space allocated, yet. */ + c->nTokenAllocated = 0; - if( nTerms>1 ) qsort(pData, nTerms, sizeof(*pData), termDataCmp); - - /* Read the terms in order to build the result. */ - iByte = 0; - for(iTerm=0; iTermbase; + return SQLITE_OK; +} - /* Passes away ownership of result. */ - sqlite3_result_text(pContext, result, nResultBytes-1, sqlite3_free); - sqlite3_free(pData); +/* +** Close a tokenization cursor previously opened by a call to +** simpleOpen() above. +*/ +static int simpleClose(sqlite3_tokenizer_cursor *pCursor){ + simple_tokenizer_cursor *c = (simple_tokenizer_cursor *) pCursor; + sqlite3_free(c->pToken); + sqlite3_free(c); return SQLITE_OK; } -/* Implements dump_terms() for use in inspecting the fts3 index from -** tests. TEXT result containing the ordered list of terms joined by -** spaces. dump_terms(t, level, idx) dumps the terms for the segment -** specified by level, idx (in %_segdir), while dump_terms(t) dumps -** all terms in the index. In both cases t is the fts table's magic -** table-named column. +/* +** Extract the next token from a tokenization cursor. The cursor must +** have been opened by a prior call to simpleOpen(). */ -static void dumpTermsFunc( - sqlite3_context *pContext, - int argc, sqlite3_value **argv +static int simpleNext( + sqlite3_tokenizer_cursor *pCursor, /* Cursor returned by simpleOpen */ + const char **ppToken, /* OUT: *ppToken is the token text */ + int *pnBytes, /* OUT: Number of bytes in token */ + int *piStartOffset, /* OUT: Starting offset of token */ + int *piEndOffset, /* OUT: Ending offset of token */ + int *piPosition /* OUT: Position integer of token */ ){ - fulltext_cursor *pCursor; - if( argc!=3 && argc!=1 ){ - generateError(pContext, "dump_terms", "incorrect arguments"); - }else if( sqlite3_value_type(argv[0])!=SQLITE_BLOB || - sqlite3_value_bytes(argv[0])!=sizeof(pCursor) ){ - generateError(pContext, "dump_terms", "illegal first argument"); - }else{ - fulltext_vtab *v; - fts3Hash terms; - sqlite3_stmt *s = NULL; - int rc; - - memcpy(&pCursor, sqlite3_value_blob(argv[0]), sizeof(pCursor)); - v = cursor_vtab(pCursor); + simple_tokenizer_cursor *c = (simple_tokenizer_cursor *) pCursor; + simple_tokenizer *t = (simple_tokenizer *) pCursor->pTokenizer; + unsigned char *p = (unsigned char *)c->pInput; - /* If passed only the cursor column, get all segments. Otherwise - ** get the segment described by the following two arguments. - */ - if( argc==1 ){ - rc = sql_get_statement(v, SEGDIR_SELECT_ALL_STMT, &s); - }else{ - rc = sql_get_statement(v, SEGDIR_SELECT_SEGMENT_STMT, &s); - if( rc==SQLITE_OK ){ - rc = sqlite3_bind_int(s, 1, sqlite3_value_int(argv[1])); - if( rc==SQLITE_OK ){ - rc = sqlite3_bind_int(s, 2, sqlite3_value_int(argv[2])); - } - } - } + while( c->iOffsetnBytes ){ + int iStartOffset; - if( rc!=SQLITE_OK ){ - generateError(pContext, "dump_terms", NULL); - return; + /* Scan past delimiter characters */ + while( c->iOffsetnBytes && simpleDelim(t, p[c->iOffset]) ){ + c->iOffset++; } - /* Collect the terms for each segment. */ - sqlite3Fts3HashInit(&terms, FTS3_HASH_STRING, 1); - while( (rc = sqlite3_step(s))==SQLITE_ROW ){ - rc = collectSegmentTerms(v, s, &terms); - if( rc!=SQLITE_OK ) break; + /* Count non-delimiter characters. */ + iStartOffset = c->iOffset; + while( c->iOffsetnBytes && !simpleDelim(t, p[c->iOffset]) ){ + c->iOffset++; } - if( rc!=SQLITE_DONE ){ - sqlite3_reset(s); - generateError(pContext, "dump_terms", NULL); - }else{ - const int nTerms = fts3HashCount(&terms); - if( nTerms>0 ){ - rc = generateTermsResult(pContext, &terms); - if( rc==SQLITE_NOMEM ){ - generateError(pContext, "dump_terms", "out of memory"); - }else{ - assert( rc==SQLITE_OK ); - } - }else if( argc==3 ){ - /* The specific segment asked for could not be found. */ - generateError(pContext, "dump_terms", "segment not found"); - }else{ - /* No segments found. */ - /* TODO(shess): It should be impossible to reach this. This - ** case can only happen for an empty table, in which case - ** SQLite has no rows to call this function on. + if( c->iOffset>iStartOffset ){ + int i, n = c->iOffset-iStartOffset; + if( n>c->nTokenAllocated ){ + c->nTokenAllocated = n+20; + c->pToken = sqlite3_realloc(c->pToken, c->nTokenAllocated); + if( c->pToken==NULL ) return SQLITE_NOMEM; + } + for(i=0; ipToken[i] = (char)(ch<0x80 ? tolower(ch) : ch); } + *ppToken = c->pToken; + *pnBytes = n; + *piStartOffset = iStartOffset; + *piEndOffset = c->iOffset; + *piPosition = c->iToken++; + + return SQLITE_OK; } - sqlite3Fts3HashClear(&terms); } + return SQLITE_DONE; } -/* Expand the DL_DEFAULT doclist in pData into a text result in -** pContext. +/* +** The set of routines that implement the simple tokenizer */ -static void createDoclistResult(sqlite3_context *pContext, - const char *pData, int nData){ - DataBuffer dump; - DLReader dlReader; - - assert( pData!=NULL && nData>0 ); - - dataBufferInit(&dump, 0); - dlrInit(&dlReader, DL_DEFAULT, pData, nData); - for( ; !dlrAtEnd(&dlReader); dlrStep(&dlReader) ){ - char buf[256]; - PLReader plReader; - - plrInit(&plReader, &dlReader); - if( DL_DEFAULT==DL_DOCIDS || plrAtEnd(&plReader) ){ - sqlite3_snprintf(sizeof(buf), buf, "[%lld] ", dlrDocid(&dlReader)); - dataBufferAppend(&dump, buf, strlen(buf)); - }else{ - int iColumn = plrColumn(&plReader); - - sqlite3_snprintf(sizeof(buf), buf, "[%lld %d[", - dlrDocid(&dlReader), iColumn); - dataBufferAppend(&dump, buf, strlen(buf)); - - for( ; !plrAtEnd(&plReader); plrStep(&plReader) ){ - if( plrColumn(&plReader)!=iColumn ){ - iColumn = plrColumn(&plReader); - sqlite3_snprintf(sizeof(buf), buf, "] %d[", iColumn); - assert( dump.nData>0 ); - dump.nData--; /* Overwrite trailing space. */ - assert( dump.pData[dump.nData]==' '); - dataBufferAppend(&dump, buf, strlen(buf)); - } - if( DL_DEFAULT==DL_POSITIONS_OFFSETS ){ - sqlite3_snprintf(sizeof(buf), buf, "%d,%d,%d ", - plrPosition(&plReader), - plrStartOffset(&plReader), plrEndOffset(&plReader)); - }else if( DL_DEFAULT==DL_POSITIONS ){ - sqlite3_snprintf(sizeof(buf), buf, "%d ", plrPosition(&plReader)); - }else{ - assert( NULL=="Unhandled DL_DEFAULT value"); - } - dataBufferAppend(&dump, buf, strlen(buf)); - } - plrDestroy(&plReader); - - assert( dump.nData>0 ); - dump.nData--; /* Overwrite trailing space. */ - assert( dump.pData[dump.nData]==' '); - dataBufferAppend(&dump, "]] ", 3); - } - } - dlrDestroy(&dlReader); - - assert( dump.nData>0 ); - dump.nData--; /* Overwrite trailing space. */ - assert( dump.pData[dump.nData]==' '); - dump.pData[dump.nData] = '\0'; - assert( dump.nData>0 ); +static const sqlite3_tokenizer_module simpleTokenizerModule = { + 0, + simpleCreate, + simpleDestroy, + simpleOpen, + simpleClose, + simpleNext, +}; - /* Passes ownership of dump's buffer to pContext. */ - sqlite3_result_text(pContext, dump.pData, dump.nData, sqlite3_free); - dump.pData = NULL; - dump.nData = dump.nCapacity = 0; +/* +** Allocate a new simple tokenizer. Return a pointer to the new +** tokenizer in *ppModule +*/ +SQLITE_PRIVATE void sqlite3Fts3SimpleTokenizerModule( + sqlite3_tokenizer_module const**ppModule +){ + *ppModule = &simpleTokenizerModule; } -/* Implements dump_doclist() for use in inspecting the fts3 index from -** tests. TEXT result containing a string representation of the -** doclist for the indicated term. dump_doclist(t, term, level, idx) -** dumps the doclist for term from the segment specified by level, idx -** (in %_segdir), while dump_doclist(t, term) dumps the logical -** doclist for the term across all segments. The per-segment doclist -** can contain deletions, while the full-index doclist will not -** (deletions are omitted). +#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */ + +/************** End of fts3_tokenizer1.c *************************************/ +/************** Begin file fts3_write.c **************************************/ +/* +** 2009 Oct 23 ** -** Result formats differ with the setting of DL_DEFAULTS. Examples: +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. ** -** DL_DOCIDS: [1] [3] [7] -** DL_POSITIONS: [1 0[0 4] 1[17]] [3 1[5]] -** DL_POSITIONS_OFFSETS: [1 0[0,0,3 4,23,26] 1[17,102,105]] [3 1[5,20,23]] +****************************************************************************** ** -** In each case the number after the outer '[' is the docid. In the -** latter two cases, the number before the inner '[' is the column -** associated with the values within. For DL_POSITIONS the numbers -** within are the positions, for DL_POSITIONS_OFFSETS they are the -** position, the start offset, and the end offset. +** This file is part of the SQLite FTS3 extension module. Specifically, +** this file contains code to insert, update and delete rows from FTS3 +** tables. It also contains code to merge FTS3 b-tree segments. Some +** of the sub-routines used to merge segments are also used by the query +** code in fts3.c. */ -static void dumpDoclistFunc( - sqlite3_context *pContext, - int argc, sqlite3_value **argv -){ - fulltext_cursor *pCursor; - if( argc!=2 && argc!=4 ){ - generateError(pContext, "dump_doclist", "incorrect arguments"); - }else if( sqlite3_value_type(argv[0])!=SQLITE_BLOB || - sqlite3_value_bytes(argv[0])!=sizeof(pCursor) ){ - generateError(pContext, "dump_doclist", "illegal first argument"); - }else if( sqlite3_value_text(argv[1])==NULL || - sqlite3_value_text(argv[1])[0]=='\0' ){ - generateError(pContext, "dump_doclist", "empty second argument"); - }else{ - const char *pTerm = (const char *)sqlite3_value_text(argv[1]); - const int nTerm = strlen(pTerm); - fulltext_vtab *v; - int rc; - DataBuffer doclist; - - memcpy(&pCursor, sqlite3_value_blob(argv[0]), sizeof(pCursor)); - v = cursor_vtab(pCursor); - - dataBufferInit(&doclist, 0); - - /* termSelect() yields the same logical doclist that queries are - ** run against. - */ - if( argc==2 ){ - rc = termSelect(v, v->nColumn, pTerm, nTerm, 0, DL_DEFAULT, &doclist); - }else{ - sqlite3_stmt *s = NULL; - - /* Get our specific segment's information. */ - rc = sql_get_statement(v, SEGDIR_SELECT_SEGMENT_STMT, &s); - if( rc==SQLITE_OK ){ - rc = sqlite3_bind_int(s, 1, sqlite3_value_int(argv[2])); - if( rc==SQLITE_OK ){ - rc = sqlite3_bind_int(s, 2, sqlite3_value_int(argv[3])); - } - } - - if( rc==SQLITE_OK ){ - rc = sqlite3_step(s); - - if( rc==SQLITE_DONE ){ - dataBufferDestroy(&doclist); - generateError(pContext, "dump_doclist", "segment not found"); - return; - } - - /* Found a segment, load it into doclist. */ - if( rc==SQLITE_ROW ){ - const sqlite_int64 iLeavesEnd = sqlite3_column_int64(s, 1); - const char *pData = sqlite3_column_blob(s, 2); - const int nData = sqlite3_column_bytes(s, 2); - - /* loadSegment() is used by termSelect() to load each - ** segment's data. - */ - rc = loadSegment(v, pData, nData, iLeavesEnd, pTerm, nTerm, 0, - &doclist); - if( rc==SQLITE_OK ){ - rc = sqlite3_step(s); - - /* Should not have more than one matching segment. */ - if( rc!=SQLITE_DONE ){ - sqlite3_reset(s); - dataBufferDestroy(&doclist); - generateError(pContext, "dump_doclist", "invalid segdir"); - return; - } - rc = SQLITE_OK; - } - } - } - sqlite3_reset(s); - } +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) - if( rc==SQLITE_OK ){ - if( doclist.nData>0 ){ - createDoclistResult(pContext, doclist.pData, doclist.nData); - }else{ - /* TODO(shess): This can happen if the term is not present, or - ** if all instances of the term have been deleted and this is - ** an all-index dump. It may be interesting to distinguish - ** these cases. - */ - sqlite3_result_text(pContext, "", 0, SQLITE_STATIC); - } - }else if( rc==SQLITE_NOMEM ){ - /* Handle out-of-memory cases specially because if they are - ** generated in fts3 code they may not be reflected in the db - ** handle. - */ - /* TODO(shess): Handle this more comprehensively. - ** sqlite3ErrStr() has what I need, but is internal. - */ - generateError(pContext, "dump_doclist", "out of memory"); - }else{ - generateError(pContext, "dump_doclist", NULL); - } - dataBufferDestroy(&doclist); - } -} -#endif +typedef struct PendingList PendingList; +typedef struct SegmentNode SegmentNode; +typedef struct SegmentWriter SegmentWriter; /* -** This routine implements the xFindFunction method for the FTS3 -** virtual table. +** Data structure used while accumulating terms in the pending-terms hash +** table. The hash table entry maps from term (a string) to a malloc'd +** instance of this structure. */ -static int fulltextFindFunction( - sqlite3_vtab *pVtab, - int nArg, - const char *zName, - void (**pxFunc)(sqlite3_context*,int,sqlite3_value**), - void **ppArg -){ - if( strcmp(zName,"snippet")==0 ){ - *pxFunc = snippetFunc; - return 1; - }else if( strcmp(zName,"offsets")==0 ){ - *pxFunc = snippetOffsetsFunc; - return 1; - }else if( strcmp(zName,"optimize")==0 ){ - *pxFunc = optimizeFunc; - return 1; -#ifdef SQLITE_TEST - /* NOTE(shess): These functions are present only for testing - ** purposes. No particular effort is made to optimize their - ** execution or how they build their results. - */ - }else if( strcmp(zName,"dump_terms")==0 ){ - /* fprintf(stderr, "Found dump_terms\n"); */ - *pxFunc = dumpTermsFunc; - return 1; - }else if( strcmp(zName,"dump_doclist")==0 ){ - /* fprintf(stderr, "Found dump_doclist\n"); */ - *pxFunc = dumpDoclistFunc; - return 1; -#endif - } - return 0; -} +struct PendingList { + int nData; + char *aData; + int nSpace; + sqlite3_int64 iLastDocid; + sqlite3_int64 iLastCol; + sqlite3_int64 iLastPos; +}; /* -** Rename an fts3 table. -*/ -static int fulltextRename( - sqlite3_vtab *pVtab, - const char *zName -){ - fulltext_vtab *p = (fulltext_vtab *)pVtab; - int rc = SQLITE_NOMEM; - char *zSql = sqlite3_mprintf( - "ALTER TABLE %Q.'%q_content' RENAME TO '%q_content';" - "ALTER TABLE %Q.'%q_segments' RENAME TO '%q_segments';" - "ALTER TABLE %Q.'%q_segdir' RENAME TO '%q_segdir';" - , p->zDb, p->zName, zName - , p->zDb, p->zName, zName - , p->zDb, p->zName, zName - ); - if( zSql ){ - rc = sqlite3_exec(p->db, zSql, 0, 0, 0); - sqlite3_free(zSql); - } - return rc; -} - -static const sqlite3_module fts3Module = { - /* iVersion */ 0, - /* xCreate */ fulltextCreate, - /* xConnect */ fulltextConnect, - /* xBestIndex */ fulltextBestIndex, - /* xDisconnect */ fulltextDisconnect, - /* xDestroy */ fulltextDestroy, - /* xOpen */ fulltextOpen, - /* xClose */ fulltextClose, - /* xFilter */ fulltextFilter, - /* xNext */ fulltextNext, - /* xEof */ fulltextEof, - /* xColumn */ fulltextColumn, - /* xRowid */ fulltextRowid, - /* xUpdate */ fulltextUpdate, - /* xBegin */ fulltextBegin, - /* xSync */ fulltextSync, - /* xCommit */ fulltextCommit, - /* xRollback */ fulltextRollback, - /* xFindFunction */ fulltextFindFunction, - /* xRename */ fulltextRename, +** An instance of this structure is used to iterate through the terms on +** a contiguous set of segment b-tree leaf nodes. Although the details of +** this structure are only manipulated by code in this file, opaque handles +** of type Fts3SegReader* are also used by code in fts3.c to iterate through +** terms when querying the full-text index. See functions: +** +** sqlite3Fts3SegReaderNew() +** sqlite3Fts3SegReaderFree() +** sqlite3Fts3SegReaderIterate() +** +** Methods used to manipulate Fts3SegReader structures: +** +** fts3SegReaderNext() +** fts3SegReaderFirstDocid() +** fts3SegReaderNextDocid() +*/ +struct Fts3SegReader { + int iIdx; /* Index within level, or 0x7FFFFFFF for PT */ + sqlite3_int64 iStartBlock; + sqlite3_int64 iEndBlock; + sqlite3_stmt *pStmt; /* SQL Statement to access leaf nodes */ + char *aNode; /* Pointer to node data (or NULL) */ + int nNode; /* Size of buffer at aNode (or 0) */ + int nTermAlloc; /* Allocated size of zTerm buffer */ + Fts3HashElem **ppNextElem; + + /* Variables set by fts3SegReaderNext(). These may be read directly + ** by the caller. They are valid from the time SegmentReaderNew() returns + ** until SegmentReaderNext() returns something other than SQLITE_OK + ** (i.e. SQLITE_DONE). + */ + int nTerm; /* Number of bytes in current term */ + char *zTerm; /* Pointer to current term */ + char *aDoclist; /* Pointer to doclist of current entry */ + int nDoclist; /* Size of doclist in current entry */ + + /* The following variables are used to iterate through the current doclist */ + char *pOffsetList; + sqlite3_int64 iDocid; }; -static void hashDestroy(void *p){ - fts3Hash *pHash = (fts3Hash *)p; - sqlite3Fts3HashClear(pHash); - sqlite3_free(pHash); -} +#define fts3SegReaderIsPending(p) ((p)->ppNextElem!=0) /* -** The fts3 built-in tokenizers - "simple" and "porter" - are implemented -** in files fts3_tokenizer1.c and fts3_porter.c respectively. The following -** two forward declarations are for functions declared in these files -** used to retrieve the respective implementations. +** An instance of this structure is used to create a segment b-tree in the +** database. The internal details of this type are only accessed by the +** following functions: ** -** Calling sqlite3Fts3SimpleTokenizerModule() sets the value pointed -** to by the argument to point a the "simple" tokenizer implementation. -** Function ...PorterTokenizerModule() sets *pModule to point to the -** porter tokenizer/stemmer implementation. +** fts3SegWriterAdd() +** fts3SegWriterFlush() +** fts3SegWriterFree() */ -SQLITE_PRIVATE void sqlite3Fts3SimpleTokenizerModule(sqlite3_tokenizer_module const**ppModule); -SQLITE_PRIVATE void sqlite3Fts3PorterTokenizerModule(sqlite3_tokenizer_module const**ppModule); -SQLITE_PRIVATE void sqlite3Fts3IcuTokenizerModule(sqlite3_tokenizer_module const**ppModule); +struct SegmentWriter { + SegmentNode *pTree; /* Pointer to interior tree structure */ + sqlite3_int64 iFirst; /* First slot in %_segments written */ + sqlite3_int64 iFree; /* Next free slot in %_segments */ + char *zTerm; /* Pointer to previous term buffer */ + int nTerm; /* Number of bytes in zTerm */ + int nMalloc; /* Size of malloc'd buffer at zMalloc */ + char *zMalloc; /* Malloc'd space (possibly) used for zTerm */ + int nSize; /* Size of allocation at aData */ + int nData; /* Bytes of data in aData */ + char *aData; /* Pointer to block from malloc() */ +}; -SQLITE_PRIVATE int sqlite3Fts3InitHashTable(sqlite3 *, fts3Hash *, const char *); +/* +** Type SegmentNode is used by the following three functions to create +** the interior part of the segment b+-tree structures (everything except +** the leaf nodes). These functions and type are only ever used by code +** within the fts3SegWriterXXX() family of functions described above. +** +** fts3NodeAddTerm() +** fts3NodeWrite() +** fts3NodeFree() +*/ +struct SegmentNode { + SegmentNode *pParent; /* Parent node (or NULL for root node) */ + SegmentNode *pRight; /* Pointer to right-sibling */ + SegmentNode *pLeftmost; /* Pointer to left-most node of this depth */ + int nEntry; /* Number of terms written to node so far */ + char *zTerm; /* Pointer to previous term buffer */ + int nTerm; /* Number of bytes in zTerm */ + int nMalloc; /* Size of malloc'd buffer at zMalloc */ + char *zMalloc; /* Malloc'd space (possibly) used for zTerm */ + int nData; /* Bytes of valid data so far */ + char *aData; /* Node data */ +}; /* -** Initialise the fts3 extension. If this extension is built as part -** of the sqlite library, then this function is called directly by -** SQLite. If fts3 is built as a dynamically loadable extension, this -** function is called by the sqlite3_extension_init() entry point. -*/ -SQLITE_PRIVATE int sqlite3Fts3Init(sqlite3 *db){ +** Valid values for the second argument to fts3SqlStmt(). +*/ +#define SQL_DELETE_CONTENT 0 +#define SQL_IS_EMPTY 1 +#define SQL_DELETE_ALL_CONTENT 2 +#define SQL_DELETE_ALL_SEGMENTS 3 +#define SQL_DELETE_ALL_SEGDIR 4 +#define SQL_SELECT_CONTENT_BY_ROWID 5 +#define SQL_NEXT_SEGMENT_INDEX 6 +#define SQL_INSERT_SEGMENTS 7 +#define SQL_NEXT_SEGMENTS_ID 8 +#define SQL_INSERT_SEGDIR 9 +#define SQL_SELECT_LEVEL 10 +#define SQL_SELECT_ALL_LEVEL 11 +#define SQL_SELECT_LEVEL_COUNT 12 +#define SQL_SELECT_SEGDIR_COUNT_MAX 13 +#define SQL_DELETE_SEGDIR_BY_LEVEL 14 +#define SQL_DELETE_SEGMENTS_RANGE 15 +#define SQL_CONTENT_INSERT 16 +#define SQL_GET_BLOCK 17 + +/* +** This function is used to obtain an SQLite prepared statement handle +** for the statement identified by the second argument. If successful, +** *pp is set to the requested statement handle and SQLITE_OK returned. +** Otherwise, an SQLite error code is returned and *pp is set to 0. +** +** If argument apVal is not NULL, then it must point to an array with +** at least as many entries as the requested statement has bound +** parameters. The values are bound to the statements parameters before +** returning. +*/ +static int fts3SqlStmt( + Fts3Table *p, /* Virtual table handle */ + int eStmt, /* One of the SQL_XXX constants above */ + sqlite3_stmt **pp, /* OUT: Statement handle */ + sqlite3_value **apVal /* Values to bind to statement */ +){ + const char *azSql[] = { +/* 0 */ "DELETE FROM %Q.'%q_content' WHERE rowid = ?", +/* 1 */ "SELECT NOT EXISTS(SELECT docid FROM %Q.'%q_content' WHERE rowid!=?)", +/* 2 */ "DELETE FROM %Q.'%q_content'", +/* 3 */ "DELETE FROM %Q.'%q_segments'", +/* 4 */ "DELETE FROM %Q.'%q_segdir'", +/* 5 */ "SELECT * FROM %Q.'%q_content' WHERE rowid=?", +/* 6 */ "SELECT coalesce(max(idx)+1, 0) FROM %Q.'%q_segdir' WHERE level=?", +/* 7 */ "INSERT INTO %Q.'%q_segments'(blockid, block) VALUES(?, ?)", +/* 8 */ "SELECT coalesce(max(blockid)+1, 1) FROM %Q.'%q_segments'", +/* 9 */ "INSERT INTO %Q.'%q_segdir' VALUES(?,?,?,?,?,?)", + + /* Return segments in order from oldest to newest.*/ +/* 10 */ "SELECT idx, start_block, leaves_end_block, end_block, root " + "FROM %Q.'%q_segdir' WHERE level = ? ORDER BY idx ASC", +/* 11 */ "SELECT idx, start_block, leaves_end_block, end_block, root " + "FROM %Q.'%q_segdir' ORDER BY level DESC, idx ASC", + +/* 12 */ "SELECT count(*) FROM %Q.'%q_segdir' WHERE level = ?", +/* 13 */ "SELECT count(*), max(level) FROM %Q.'%q_segdir'", + +/* 14 */ "DELETE FROM %Q.'%q_segdir' WHERE level = ?", +/* 15 */ "DELETE FROM %Q.'%q_segments' WHERE blockid BETWEEN ? AND ?", +/* 16 */ "INSERT INTO %Q.'%q_content' VALUES(%z)", +/* 17 */ "SELECT block FROM %Q.'%q_segments' WHERE blockid = ?", + }; int rc = SQLITE_OK; - fts3Hash *pHash = 0; - const sqlite3_tokenizer_module *pSimple = 0; - const sqlite3_tokenizer_module *pPorter = 0; - const sqlite3_tokenizer_module *pIcu = 0; - - sqlite3Fts3SimpleTokenizerModule(&pSimple); - sqlite3Fts3PorterTokenizerModule(&pPorter); -#ifdef SQLITE_ENABLE_ICU - sqlite3Fts3IcuTokenizerModule(&pIcu); -#endif - - /* Allocate and initialise the hash-table used to store tokenizers. */ - pHash = sqlite3_malloc(sizeof(fts3Hash)); - if( !pHash ){ - rc = SQLITE_NOMEM; - }else{ - sqlite3Fts3HashInit(pHash, FTS3_HASH_STRING, 1); - } + sqlite3_stmt *pStmt; - /* Load the built-in tokenizers into the hash table */ - if( rc==SQLITE_OK ){ - if( sqlite3Fts3HashInsert(pHash, "simple", 7, (void *)pSimple) - || sqlite3Fts3HashInsert(pHash, "porter", 7, (void *)pPorter) - || (pIcu && sqlite3Fts3HashInsert(pHash, "icu", 4, (void *)pIcu)) - ){ + assert( SizeofArray(azSql)==SizeofArray(p->aStmt) ); + assert( eStmt=0 ); + + pStmt = p->aStmt[eStmt]; + if( !pStmt ){ + char *zSql; + if( eStmt==SQL_CONTENT_INSERT ){ + int i; /* Iterator variable */ + char *zVarlist; /* The "?, ?, ..." string */ + zVarlist = (char *)sqlite3_malloc(2*p->nColumn+2); + if( !zVarlist ){ + *pp = 0; + return SQLITE_NOMEM; + } + zVarlist[0] = '?'; + zVarlist[p->nColumn*2+1] = '\0'; + for(i=1; i<=p->nColumn; i++){ + zVarlist[i*2-1] = ','; + zVarlist[i*2] = '?'; + } + zSql = sqlite3_mprintf(azSql[eStmt], p->zDb, p->zName, zVarlist); + }else{ + zSql = sqlite3_mprintf(azSql[eStmt], p->zDb, p->zName); + } + if( !zSql ){ rc = SQLITE_NOMEM; + }else{ + rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, NULL); + sqlite3_free(zSql); + assert( rc==SQLITE_OK || pStmt==0 ); + p->aStmt[eStmt] = pStmt; } } - -#ifdef SQLITE_TEST - sqlite3Fts3ExprInitTestInterface(db); -#endif - - /* Create the virtual table wrapper around the hash-table and overload - ** the two scalar functions. If this is successful, register the - ** module with sqlite. - */ - if( SQLITE_OK==rc - && SQLITE_OK==(rc = sqlite3Fts3InitHashTable(db, pHash, "fts3_tokenizer")) - && SQLITE_OK==(rc = sqlite3_overload_function(db, "snippet", -1)) - && SQLITE_OK==(rc = sqlite3_overload_function(db, "offsets", -1)) - && SQLITE_OK==(rc = sqlite3_overload_function(db, "optimize", -1)) -#ifdef SQLITE_TEST - && SQLITE_OK==(rc = sqlite3_overload_function(db, "dump_terms", -1)) - && SQLITE_OK==(rc = sqlite3_overload_function(db, "dump_doclist", -1)) -#endif - ){ - return sqlite3_create_module_v2( - db, "fts3", &fts3Module, (void *)pHash, hashDestroy - ); - } - - /* An error has occurred. Delete the hash table and return the error code. */ - assert( rc!=SQLITE_OK ); - if( pHash ){ - sqlite3Fts3HashClear(pHash); - sqlite3_free(pHash); + if( apVal ){ + int i; + int nParam = sqlite3_bind_parameter_count(pStmt); + for(i=0; rc==SQLITE_OK && inSpace = 100; + p->aData = (char *)&p[1]; + p->nData = 0; + } + else if( p->nData+FTS3_VARINT_MAX+1>p->nSpace ){ + int nNew = p->nSpace * 2; + p = sqlite3_realloc(p, sizeof(*p) + nNew); + if( !p ){ + sqlite3_free(*pp); + *pp = 0; + return SQLITE_NOMEM; + } + p->nSpace = nNew; + p->aData = (char *)&p[1]; + } -typedef struct ParseContext ParseContext; -struct ParseContext { - sqlite3_tokenizer *pTokenizer; /* Tokenizer module */ - const char **azCol; /* Array of column names for fts3 table */ - int nCol; /* Number of entries in azCol[] */ - int iDefaultCol; /* Default column to query */ - sqlite3_context *pCtx; /* Write error message here */ - int nNest; /* Number of nested brackets */ -}; + /* Append the new serialized varint to the end of the list. */ + p->nData += sqlite3Fts3PutVarint(&p->aData[p->nData], i); + p->aData[p->nData] = '\0'; + *pp = p; + return SQLITE_OK; +} /* -** This function is equivalent to the standard isspace() function. +** Add a docid/column/position entry to a PendingList structure. Non-zero +** is returned if the structure is sqlite3_realloced as part of adding +** the entry. Otherwise, zero. ** -** The standard isspace() can be awkward to use safely, because although it -** is defined to accept an argument of type int, its behaviour when passed -** an integer that falls outside of the range of the unsigned char type -** is undefined (and sometimes, "undefined" means segfault). This wrapper -** is defined to accept an argument of type char, and always returns 0 for -** any values that fall outside of the range of the unsigned char type (i.e. -** negative values). +** If an OOM error occurs, *pRc is set to SQLITE_NOMEM before returning. +** Zero is always returned in this case. Otherwise, if no OOM error occurs, +** it is set to SQLITE_OK. */ -static int fts3isspace(char c){ - return (c&0x80)==0 ? isspace(c) : 0; +static int fts3PendingListAppend( + PendingList **pp, /* IN/OUT: PendingList structure */ + sqlite3_int64 iDocid, /* Docid for entry to add */ + sqlite3_int64 iCol, /* Column for entry to add */ + sqlite3_int64 iPos, /* Position of term for entry to add */ + int *pRc /* OUT: Return code */ +){ + PendingList *p = *pp; + int rc = SQLITE_OK; + + assert( !p || p->iLastDocid<=iDocid ); + + if( !p || p->iLastDocid!=iDocid ){ + sqlite3_int64 iDelta = iDocid - (p ? p->iLastDocid : 0); + if( p ){ + assert( p->nDatanSpace ); + assert( p->aData[p->nData]==0 ); + p->nData++; + } + if( SQLITE_OK!=(rc = fts3PendingListAppendVarint(&p, iDelta)) ){ + goto pendinglistappend_out; + } + p->iLastCol = -1; + p->iLastPos = 0; + p->iLastDocid = iDocid; + } + if( iCol>0 && p->iLastCol!=iCol ){ + if( SQLITE_OK!=(rc = fts3PendingListAppendVarint(&p, 1)) + || SQLITE_OK!=(rc = fts3PendingListAppendVarint(&p, iCol)) + ){ + goto pendinglistappend_out; + } + p->iLastCol = iCol; + p->iLastPos = 0; + } + if( iCol>=0 ){ + assert( iPos>p->iLastPos || (iPos==0 && p->iLastPos==0) ); + rc = fts3PendingListAppendVarint(&p, 2+iPos-p->iLastPos); + if( rc==SQLITE_OK ){ + p->iLastPos = iPos; + } + } + + pendinglistappend_out: + *pRc = rc; + if( p!=*pp ){ + *pp = p; + return 1; + } + return 0; } /* -** Extract the next token from buffer z (length n) using the tokenizer -** and other information (column names etc.) in pParse. Create an Fts3Expr -** structure of type FTSQUERY_PHRASE containing a phrase consisting of this -** single token and set *ppExpr to point to it. If the end of the buffer is -** reached before a token is found, set *ppExpr to zero. It is the -** responsibility of the caller to eventually deallocate the allocated -** Fts3Expr structure (if any) by passing it to sqlite3_free(). +** Tokenize the nul-terminated string zText and add all tokens to the +** pending-terms hash-table. The docid used is that currently stored in +** p->iPrevDocid, and the column is specified by argument iCol. ** -** Return SQLITE_OK if successful, or SQLITE_NOMEM if a memory allocation -** fails. +** If successful, SQLITE_OK is returned. Otherwise, an SQLite error code. */ -static int getNextToken( - ParseContext *pParse, /* fts3 query parse context */ - int iCol, /* Value for Fts3Phrase.iColumn */ - const char *z, int n, /* Input string */ - Fts3Expr **ppExpr, /* OUT: expression */ - int *pnConsumed /* OUT: Number of bytes consumed */ -){ - sqlite3_tokenizer *pTokenizer = pParse->pTokenizer; - sqlite3_tokenizer_module const *pModule = pTokenizer->pModule; +static int fts3PendingTermsAdd(Fts3Table *p, const char *zText, int iCol){ int rc; - sqlite3_tokenizer_cursor *pCursor; - Fts3Expr *pRet = 0; - int nConsumed = 0; + int iStart; + int iEnd; + int iPos; - rc = pModule->xOpen(pTokenizer, z, n, &pCursor); - if( rc==SQLITE_OK ){ - const char *zToken; - int nToken, iStart, iEnd, iPosition; - int nByte; /* total space to allocate */ + char const *zToken; + int nToken; - pCursor->pTokenizer = pTokenizer; - rc = pModule->xNext(pCursor, &zToken, &nToken, &iStart, &iEnd, &iPosition); + sqlite3_tokenizer *pTokenizer = p->pTokenizer; + sqlite3_tokenizer_module const *pModule = pTokenizer->pModule; + sqlite3_tokenizer_cursor *pCsr; + int (*xNext)(sqlite3_tokenizer_cursor *pCursor, + const char**,int*,int*,int*,int*); - if( rc==SQLITE_OK ){ - nByte = sizeof(Fts3Expr) + sizeof(Fts3Phrase) + nToken; - pRet = (Fts3Expr *)sqlite3_malloc(nByte); - if( !pRet ){ - rc = SQLITE_NOMEM; - }else{ - memset(pRet, 0, nByte); - pRet->eType = FTSQUERY_PHRASE; - pRet->pPhrase = (Fts3Phrase *)&pRet[1]; - pRet->pPhrase->nToken = 1; - pRet->pPhrase->iColumn = iCol; - pRet->pPhrase->aToken[0].n = nToken; - pRet->pPhrase->aToken[0].z = (char *)&pRet->pPhrase[1]; - memcpy(pRet->pPhrase->aToken[0].z, zToken, nToken); + assert( pTokenizer && pModule ); - if( iEndpPhrase->aToken[0].isPrefix = 1; - iEnd++; - } - if( !sqlite3_fts3_enable_parentheses && iStart>0 && z[iStart-1]=='-' ){ - pRet->pPhrase->isNot = 1; - } + rc = pModule->xOpen(pTokenizer, zText, -1, &pCsr); + if( rc!=SQLITE_OK ){ + return rc; + } + pCsr->pTokenizer = pTokenizer; + + xNext = pModule->xNext; + while( SQLITE_OK==rc + && SQLITE_OK==(rc = xNext(pCsr, &zToken, &nToken, &iStart, &iEnd, &iPos)) + ){ + PendingList *pList; + + /* Positions cannot be negative; we use -1 as a terminator internally. + ** Tokens must have a non-zero length. + */ + if( iPos<0 || !zToken || nToken<=0 ){ + rc = SQLITE_ERROR; + break; + } + + pList = (PendingList *)fts3HashFind(&p->pendingTerms, zToken, nToken); + if( pList ){ + p->nPendingData -= (pList->nData + nToken + sizeof(Fts3HashElem)); + } + if( fts3PendingListAppend(&pList, p->iPrevDocid, iCol, iPos, &rc) ){ + if( pList==fts3HashInsert(&p->pendingTerms, zToken, nToken, pList) ){ + /* Malloc failed while inserting the new entry. This can only + ** happen if there was no previous entry for this token. + */ + assert( 0==fts3HashFind(&p->pendingTerms, zToken, nToken) ); + sqlite3_free(pList); + rc = SQLITE_NOMEM; } - nConsumed = iEnd; } + if( rc==SQLITE_OK ){ + p->nPendingData += (pList->nData + nToken + sizeof(Fts3HashElem)); + } + } - pModule->xClose(pCursor); + pModule->xClose(pCsr); + return (rc==SQLITE_DONE ? SQLITE_OK : rc); +} + +/* +** Calling this function indicates that subsequent calls to +** fts3PendingTermsAdd() are to add term/position-list pairs for the +** contents of the document with docid iDocid. +*/ +static int fts3PendingTermsDocid(Fts3Table *p, sqlite_int64 iDocid){ + /* TODO(shess) Explore whether partially flushing the buffer on + ** forced-flush would provide better performance. I suspect that if + ** we ordered the doclists by size and flushed the largest until the + ** buffer was half empty, that would let the less frequent terms + ** generate longer doclists. + */ + if( iDocid<=p->iPrevDocid || p->nPendingData>p->nMaxPendingData ){ + int rc = sqlite3Fts3PendingTermsFlush(p); + if( rc!=SQLITE_OK ) return rc; } - - *pnConsumed = nConsumed; - *ppExpr = pRet; - return rc; + p->iPrevDocid = iDocid; + return SQLITE_OK; } +SQLITE_PRIVATE void sqlite3Fts3PendingTermsClear(Fts3Table *p){ + Fts3HashElem *pElem; + for(pElem=fts3HashFirst(&p->pendingTerms); pElem; pElem=fts3HashNext(pElem)){ + sqlite3_free(fts3HashData(pElem)); + } + fts3HashClear(&p->pendingTerms); + p->nPendingData = 0; +} /* -** Enlarge a memory allocation. If an out-of-memory allocation occurs, -** then free the old allocation. +** This function is called by the xUpdate() method as part of an INSERT +** operation. It adds entries for each term in the new record to the +** pendingTerms hash table. +** +** Argument apVal is the same as the similarly named argument passed to +** fts3InsertData(). Parameter iDocid is the docid of the new row. */ -void *fts3ReallocOrFree(void *pOrig, int nNew){ - void *pRet = sqlite3_realloc(pOrig, nNew); - if( !pRet ){ - sqlite3_free(pOrig); +static int fts3InsertTerms(Fts3Table *p, sqlite3_value **apVal){ + int i; /* Iterator variable */ + for(i=2; inColumn+2; i++){ + const char *zText = (const char *)sqlite3_value_text(apVal[i]); + if( zText ){ + int rc = fts3PendingTermsAdd(p, zText, i-2); + if( rc!=SQLITE_OK ){ + return rc; + } + } } - return pRet; + return SQLITE_OK; } /* -** Buffer zInput, length nInput, contains the contents of a quoted string -** that appeared as part of an fts3 query expression. Neither quote character -** is included in the buffer. This function attempts to tokenize the entire -** input buffer and create an Fts3Expr structure of type FTSQUERY_PHRASE -** containing the results. +** This function is called by the xUpdate() method for an INSERT operation. +** The apVal parameter is passed a copy of the apVal argument passed by +** SQLite to the xUpdate() method. i.e: ** -** If successful, SQLITE_OK is returned and *ppExpr set to point at the -** allocated Fts3Expr structure. Otherwise, either SQLITE_NOMEM (out of memory -** error) or SQLITE_ERROR (tokenization error) is returned and *ppExpr set -** to 0. -*/ -static int getNextString( - ParseContext *pParse, /* fts3 query parse context */ - const char *zInput, int nInput, /* Input string */ - Fts3Expr **ppExpr /* OUT: expression */ +** apVal[0] Not used for INSERT. +** apVal[1] rowid +** apVal[2] Left-most user-defined column +** ... +** apVal[p->nColumn+1] Right-most user-defined column +** apVal[p->nColumn+2] Hidden column with same name as table +** apVal[p->nColumn+3] Hidden "docid" column (alias for rowid) +*/ +static int fts3InsertData( + Fts3Table *p, /* Full-text table */ + sqlite3_value **apVal, /* Array of values to insert */ + sqlite3_int64 *piDocid /* OUT: Docid for row just inserted */ ){ - sqlite3_tokenizer *pTokenizer = pParse->pTokenizer; - sqlite3_tokenizer_module const *pModule = pTokenizer->pModule; - int rc; - Fts3Expr *p = 0; - sqlite3_tokenizer_cursor *pCursor = 0; - char *zTemp = 0; - int nTemp = 0; - - rc = pModule->xOpen(pTokenizer, zInput, nInput, &pCursor); - if( rc==SQLITE_OK ){ - int ii; - pCursor->pTokenizer = pTokenizer; - for(ii=0; rc==SQLITE_OK; ii++){ - const char *zToken; - int nToken, iBegin, iEnd, iPos; - rc = pModule->xNext(pCursor, &zToken, &nToken, &iBegin, &iEnd, &iPos); - if( rc==SQLITE_OK ){ - int nByte = sizeof(Fts3Expr) + sizeof(Fts3Phrase); - p = fts3ReallocOrFree(p, nByte+ii*sizeof(struct PhraseToken)); - zTemp = fts3ReallocOrFree(zTemp, nTemp + nToken); - if( !p || !zTemp ){ - goto no_mem; - } - if( ii==0 ){ - memset(p, 0, nByte); - p->pPhrase = (Fts3Phrase *)&p[1]; - } - p->pPhrase = (Fts3Phrase *)&p[1]; - p->pPhrase->nToken = ii+1; - p->pPhrase->aToken[ii].n = nToken; - memcpy(&zTemp[nTemp], zToken, nToken); - nTemp += nToken; - if( iEndpPhrase->aToken[ii].isPrefix = 1; - }else{ - p->pPhrase->aToken[ii].isPrefix = 0; - } - } - } + int rc; /* Return code */ + sqlite3_stmt *pContentInsert; /* INSERT INTO %_content VALUES(...) */ - pModule->xClose(pCursor); - pCursor = 0; + /* Locate the statement handle used to insert data into the %_content + ** table. The SQL for this statement is: + ** + ** INSERT INTO %_content VALUES(?, ?, ?, ...) + ** + ** The statement features N '?' variables, where N is the number of user + ** defined columns in the FTS3 table, plus one for the docid field. + */ + rc = fts3SqlStmt(p, SQL_CONTENT_INSERT, &pContentInsert, &apVal[1]); + if( rc!=SQLITE_OK ){ + return rc; } - if( rc==SQLITE_DONE ){ - int jj; - char *zNew; - int nNew = 0; - int nByte = sizeof(Fts3Expr) + sizeof(Fts3Phrase); - nByte += (p?(p->pPhrase->nToken-1):0) * sizeof(struct PhraseToken); - p = fts3ReallocOrFree(p, nByte + nTemp); - if( !p ){ - goto no_mem; - } - if( zTemp ){ - zNew = &(((char *)p)[nByte]); - memcpy(zNew, zTemp, nTemp); - }else{ - memset(p, 0, nByte+nTemp); - } - p->pPhrase = (Fts3Phrase *)&p[1]; - for(jj=0; jjpPhrase->nToken; jj++){ - p->pPhrase->aToken[jj].z = &zNew[nNew]; - nNew += p->pPhrase->aToken[jj].n; + /* There is a quirk here. The users INSERT statement may have specified + ** a value for the "rowid" field, for the "docid" field, or for both. + ** Which is a problem, since "rowid" and "docid" are aliases for the + ** same value. For example: + ** + ** INSERT INTO fts3tbl(rowid, docid) VALUES(1, 2); + ** + ** In FTS3, this is an error. It is an error to specify non-NULL values + ** for both docid and some other rowid alias. + */ + if( SQLITE_NULL!=sqlite3_value_type(apVal[3+p->nColumn]) ){ + if( SQLITE_NULL==sqlite3_value_type(apVal[0]) + && SQLITE_NULL!=sqlite3_value_type(apVal[1]) + ){ + /* A rowid/docid conflict. */ + return SQLITE_ERROR; } - sqlite3_free(zTemp); - p->eType = FTSQUERY_PHRASE; - p->pPhrase->iColumn = pParse->iDefaultCol; - rc = SQLITE_OK; + rc = sqlite3_bind_value(pContentInsert, 1, apVal[3+p->nColumn]); + if( rc!=SQLITE_OK ) return rc; } - *ppExpr = p; - return rc; -no_mem: + /* Execute the statement to insert the record. Set *piDocid to the + ** new docid value. + */ + sqlite3_step(pContentInsert); + rc = sqlite3_reset(pContentInsert); - if( pCursor ){ - pModule->xClose(pCursor); - } - sqlite3_free(zTemp); - sqlite3_free(p); - *ppExpr = 0; - return SQLITE_NOMEM; + *piDocid = sqlite3_last_insert_rowid(p->db); + return rc; } -/* -** Function getNextNode(), which is called by fts3ExprParse(), may itself -** call fts3ExprParse(). So this forward declaration is required. -*/ -static int fts3ExprParse(ParseContext *, const char *, int, Fts3Expr **, int *); + /* -** The output variable *ppExpr is populated with an allocated Fts3Expr -** structure, or set to 0 if the end of the input buffer is reached. -** -** Returns an SQLite error code. SQLITE_OK if everything works, SQLITE_NOMEM -** if a malloc failure occurs, or SQLITE_ERROR if a parse error is encountered. -** If SQLITE_ERROR is returned, pContext is populated with an error message. +** Remove all data from the FTS3 table. Clear the hash table containing +** pending terms. */ -static int getNextNode( - ParseContext *pParse, /* fts3 query parse context */ - const char *z, int n, /* Input string */ - Fts3Expr **ppExpr, /* OUT: expression */ - int *pnConsumed /* OUT: Number of bytes consumed */ -){ - static const struct Fts3Keyword { - char z[4]; /* Keyword text */ - unsigned char n; /* Length of the keyword */ - unsigned char parenOnly; /* Only valid in paren mode */ - unsigned char eType; /* Keyword code */ - } aKeyword[] = { - { "OR" , 2, 0, FTSQUERY_OR }, - { "AND", 3, 1, FTSQUERY_AND }, - { "NOT", 3, 1, FTSQUERY_NOT }, - { "NEAR", 4, 0, FTSQUERY_NEAR } - }; - int ii; - int iCol; - int iColLen; - int rc; - Fts3Expr *pRet = 0; +static int fts3DeleteAll(Fts3Table *p){ + int rc; /* Return code */ - const char *zInput = z; - int nInput = n; + /* Discard the contents of the pending-terms hash table. */ + sqlite3Fts3PendingTermsClear(p); - /* Skip over any whitespace before checking for a keyword, an open or - ** close bracket, or a quoted string. - */ - while( nInput>0 && fts3isspace(*zInput) ){ - nInput--; - zInput++; + /* Delete everything from the %_content, %_segments and %_segdir tables. */ + rc = fts3SqlExec(p, SQL_DELETE_ALL_CONTENT, 0); + if( rc==SQLITE_OK ){ + rc = fts3SqlExec(p, SQL_DELETE_ALL_SEGMENTS, 0); } - if( nInput==0 ){ - return SQLITE_DONE; + if( rc==SQLITE_OK ){ + rc = fts3SqlExec(p, SQL_DELETE_ALL_SEGDIR, 0); } + return rc; +} - /* See if we are dealing with a keyword. */ - for(ii=0; ii<(int)(sizeof(aKeyword)/sizeof(struct Fts3Keyword)); ii++){ - const struct Fts3Keyword *pKey = &aKeyword[ii]; +/* +** The first element in the apVal[] array is assumed to contain the docid +** (an integer) of a row about to be deleted. Remove all terms from the +** full-text index. +*/ +static int fts3DeleteTerms(Fts3Table *p, sqlite3_value **apVal){ + int rc; + sqlite3_stmt *pSelect; - if( (pKey->parenOnly & ~sqlite3_fts3_enable_parentheses)!=0 ){ - continue; + rc = fts3SqlStmt(p, SQL_SELECT_CONTENT_BY_ROWID, &pSelect, apVal); + if( rc==SQLITE_OK ){ + if( SQLITE_ROW==sqlite3_step(pSelect) ){ + int i; + for(i=1; i<=p->nColumn; i++){ + const char *zText = (const char *)sqlite3_column_text(pSelect, i); + rc = fts3PendingTermsAdd(p, zText, -1); + if( rc!=SQLITE_OK ){ + sqlite3_reset(pSelect); + return rc; + } + } } + rc = sqlite3_reset(pSelect); + }else{ + sqlite3_reset(pSelect); + } + return rc; +} - if( nInput>=pKey->n && 0==memcmp(zInput, pKey->z, pKey->n) ){ - int nNear = SQLITE_FTS3_DEFAULT_NEAR_PARAM; - int nKey = pKey->n; - char cNext; +/* +** Forward declaration to account for the circular dependency between +** functions fts3SegmentMerge() and fts3AllocateSegdirIdx(). +*/ +static int fts3SegmentMerge(Fts3Table *, int); - /* If this is a "NEAR" keyword, check for an explicit nearness. */ - if( pKey->eType==FTSQUERY_NEAR ){ - assert( nKey==4 ); - if( zInput[4]=='/' && zInput[5]>='0' && zInput[5]<='9' ){ - nNear = 0; - for(nKey=5; zInput[nKey]>='0' && zInput[nKey]<='9'; nKey++){ - nNear = nNear * 10 + (zInput[nKey] - '0'); - } - } - } +/* +** This function allocates a new level iLevel index in the segdir table. +** Usually, indexes are allocated within a level sequentially starting +** with 0, so the allocated index is one greater than the value returned +** by: +** +** SELECT max(idx) FROM %_segdir WHERE level = :iLevel +** +** However, if there are already FTS3_MERGE_COUNT indexes at the requested +** level, they are merged into a single level (iLevel+1) segment and the +** allocated index is 0. +** +** If successful, *piIdx is set to the allocated index slot and SQLITE_OK +** returned. Otherwise, an SQLite error code is returned. +*/ +static int fts3AllocateSegdirIdx(Fts3Table *p, int iLevel, int *piIdx){ + int rc; /* Return Code */ + sqlite3_stmt *pNextIdx; /* Query for next idx at level iLevel */ + int iNext = 0; /* Result of query pNextIdx */ - /* At this point this is probably a keyword. But for that to be true, - ** the next byte must contain either whitespace, an open or close - ** parenthesis, a quote character, or EOF. - */ - cNext = zInput[nKey]; - if( fts3isspace(cNext) - || cNext=='"' || cNext=='(' || cNext==')' || cNext==0 - ){ - pRet = (Fts3Expr *)sqlite3_malloc(sizeof(Fts3Expr)); - memset(pRet, 0, sizeof(Fts3Expr)); - pRet->eType = pKey->eType; - pRet->nNear = nNear; - *ppExpr = pRet; - *pnConsumed = (zInput - z) + nKey; - return SQLITE_OK; - } + /* Set variable iNext to the next available segdir index at level iLevel. */ + rc = fts3SqlStmt(p, SQL_NEXT_SEGMENT_INDEX, &pNextIdx, 0); + if( rc==SQLITE_OK ){ + sqlite3_bind_int(pNextIdx, 1, iLevel); + if( SQLITE_ROW==sqlite3_step(pNextIdx) ){ + iNext = sqlite3_column_int(pNextIdx, 0); + } + rc = sqlite3_reset(pNextIdx); + } - /* Turns out that wasn't a keyword after all. This happens if the - ** user has supplied a token such as "ORacle". Continue. - */ + if( rc==SQLITE_OK ){ + /* If iNext is FTS3_MERGE_COUNT, indicating that level iLevel is already + ** full, merge all segments in level iLevel into a single iLevel+1 + ** segment and allocate (newly freed) index 0 at level iLevel. Otherwise, + ** if iNext is less than FTS3_MERGE_COUNT, allocate index iNext. + */ + if( iNext>=FTS3_MERGE_COUNT ){ + rc = fts3SegmentMerge(p, iLevel); + *piIdx = 0; + }else{ + *piIdx = iNext; } } - /* Check for an open bracket. */ - if( sqlite3_fts3_enable_parentheses ){ - if( *zInput=='(' ){ - int nConsumed; - int rc; - pParse->nNest++; - rc = fts3ExprParse(pParse, &zInput[1], nInput-1, ppExpr, &nConsumed); - if( rc==SQLITE_OK && !*ppExpr ){ - rc = SQLITE_DONE; + return rc; +} + +/* +** Move the iterator passed as the first argument to the next term in the +** segment. If successful, SQLITE_OK is returned. If there is no next term, +** SQLITE_DONE. Otherwise, an SQLite error code. +*/ +static int fts3SegReaderNext(Fts3SegReader *pReader){ + char *pNext; /* Cursor variable */ + int nPrefix; /* Number of bytes in term prefix */ + int nSuffix; /* Number of bytes in term suffix */ + + if( !pReader->aDoclist ){ + pNext = pReader->aNode; + }else{ + pNext = &pReader->aDoclist[pReader->nDoclist]; + } + + if( !pNext || pNext>=&pReader->aNode[pReader->nNode] ){ + int rc; + if( fts3SegReaderIsPending(pReader) ){ + Fts3HashElem *pElem = *(pReader->ppNextElem); + if( pElem==0 ){ + pReader->aNode = 0; + }else{ + PendingList *pList = (PendingList *)fts3HashData(pElem); + pReader->zTerm = (char *)fts3HashKey(pElem); + pReader->nTerm = fts3HashKeysize(pElem); + pReader->nNode = pReader->nDoclist = pList->nData + 1; + pReader->aNode = pReader->aDoclist = pList->aData; + pReader->ppNextElem++; + assert( pReader->aNode ); } - *pnConsumed = (zInput - z) + 1 + nConsumed; - return rc; + return SQLITE_OK; } - - /* Check for a close bracket. */ - if( *zInput==')' ){ - pParse->nNest--; - *pnConsumed = (zInput - z) + 1; - return SQLITE_DONE; + if( !pReader->pStmt ){ + pReader->aNode = 0; + return SQLITE_OK; + } + rc = sqlite3_step(pReader->pStmt); + if( rc!=SQLITE_ROW ){ + pReader->aNode = 0; + return (rc==SQLITE_DONE ? SQLITE_OK : rc); } + pReader->nNode = sqlite3_column_bytes(pReader->pStmt, 0); + pReader->aNode = (char *)sqlite3_column_blob(pReader->pStmt, 0); + pNext = pReader->aNode; } + + pNext += sqlite3Fts3GetVarint32(pNext, &nPrefix); + pNext += sqlite3Fts3GetVarint32(pNext, &nSuffix); - /* See if we are dealing with a quoted phrase. If this is the case, then - ** search for the closing quote and pass the whole string to getNextString() - ** for processing. This is easy to do, as fts3 has no syntax for escaping - ** a quote character embedded in a string. - */ - if( *zInput=='"' ){ - for(ii=1; iipReader->nTermAlloc ){ + int nNew = (nPrefix+nSuffix)*2; + char *zNew = sqlite3_realloc(pReader->zTerm, nNew); + if( !zNew ){ + return SQLITE_NOMEM; } - return getNextString(pParse, &zInput[1], ii-1, ppExpr); + pReader->zTerm = zNew; + pReader->nTermAlloc = nNew; } + memcpy(&pReader->zTerm[nPrefix], pNext, nSuffix); + pReader->nTerm = nPrefix+nSuffix; + pNext += nSuffix; + pNext += sqlite3Fts3GetVarint32(pNext, &pReader->nDoclist); + assert( pNext<&pReader->aNode[pReader->nNode] ); + pReader->aDoclist = pNext; + pReader->pOffsetList = 0; + return SQLITE_OK; +} +/* +** Set the SegReader to point to the first docid in the doclist associated +** with the current term. +*/ +static void fts3SegReaderFirstDocid(Fts3SegReader *pReader){ + int n; + assert( pReader->aDoclist ); + assert( !pReader->pOffsetList ); + n = sqlite3Fts3GetVarint(pReader->aDoclist, &pReader->iDocid); + pReader->pOffsetList = &pReader->aDoclist[n]; +} - /* If control flows to this point, this must be a regular token, or - ** the end of the input. Read a regular token using the sqlite3_tokenizer - ** interface. Before doing so, figure out if there is an explicit - ** column specifier for the token. - ** - ** TODO: Strangely, it is not possible to associate a column specifier - ** with a quoted phrase, only with a single token. Not sure if this was - ** an implementation artifact or an intentional decision when fts3 was - ** first implemented. Whichever it was, this module duplicates the - ** limitation. +/* +** Advance the SegReader to point to the next docid in the doclist +** associated with the current term. +** +** If arguments ppOffsetList and pnOffsetList are not NULL, then +** *ppOffsetList is set to point to the first column-offset list +** in the doclist entry (i.e. immediately past the docid varint). +** *pnOffsetList is set to the length of the set of column-offset +** lists, not including the nul-terminator byte. For example: +*/ +static void fts3SegReaderNextDocid( + Fts3SegReader *pReader, + char **ppOffsetList, + int *pnOffsetList +){ + char *p = pReader->pOffsetList; + char c = 0; + + /* Pointer p currently points at the first byte of an offset list. The + ** following two lines advance it to point one byte past the end of + ** the same offset list. */ - iCol = pParse->iDefaultCol; - iColLen = 0; - for(ii=0; iinCol; ii++){ - const char *zStr = pParse->azCol[ii]; - int nStr = strlen(zStr); - if( nInput>nStr && zInput[nStr]==':' - && sqlite3_strnicmp(zStr, zInput, nStr)==0 - ){ - iCol = ii; - iColLen = ((zInput - z) + nStr + 1); - break; - } + while( *p | c ) c = *p++ & 0x80; + p++; + + /* If required, populate the output variables with a pointer to and the + ** size of the previous offset-list. + */ + if( ppOffsetList ){ + *ppOffsetList = pReader->pOffsetList; + *pnOffsetList = (int)(p - pReader->pOffsetList - 1); } - rc = getNextToken(pParse, iCol, &z[iColLen], n-iColLen, ppExpr, pnConsumed); - *pnConsumed += iColLen; - return rc; -} -/* -** The argument is an Fts3Expr structure for a binary operator (any type -** except an FTSQUERY_PHRASE). Return an integer value representing the -** precedence of the operator. Lower values have a higher precedence (i.e. -** group more tightly). For example, in the C language, the == operator -** groups more tightly than ||, and would therefore have a higher precedence. -** -** When using the new fts3 query syntax (when SQLITE_ENABLE_FTS3_PARENTHESIS -** is defined), the order of the operators in precedence from highest to -** lowest is: -** -** NEAR -** NOT -** AND (including implicit ANDs) -** OR -** -** Note that when using the old query syntax, the OR operator has a higher -** precedence than the AND operator. + /* If there are no more entries in the doclist, set pOffsetList to + ** NULL. Otherwise, set Fts3SegReader.iDocid to the next docid and + ** Fts3SegReader.pOffsetList to point to the next offset list before + ** returning. + */ + if( p>=&pReader->aDoclist[pReader->nDoclist] ){ + pReader->pOffsetList = 0; + }else{ + sqlite3_int64 iDelta; + pReader->pOffsetList = p + sqlite3Fts3GetVarint(p, &iDelta); + pReader->iDocid += iDelta; + } +} + +/* +** Free all allocations associated with the iterator passed as the +** second argument. */ -static int opPrecedence(Fts3Expr *p){ - assert( p->eType!=FTSQUERY_PHRASE ); - if( sqlite3_fts3_enable_parentheses ){ - return p->eType; - }else if( p->eType==FTSQUERY_NEAR ){ - return 1; - }else if( p->eType==FTSQUERY_OR ){ - return 2; +SQLITE_PRIVATE void sqlite3Fts3SegReaderFree(Fts3Table *p, Fts3SegReader *pReader){ + if( pReader ){ + if( pReader->pStmt ){ + /* Move the leaf-range SELECT statement to the aLeavesStmt[] array, + ** so that it can be reused when required by another query. + */ + assert( p->nLeavesStmtnLeavesTotal ); + sqlite3_reset(pReader->pStmt); + p->aLeavesStmt[p->nLeavesStmt++] = pReader->pStmt; + } + if( !fts3SegReaderIsPending(pReader) ){ + sqlite3_free(pReader->zTerm); + } + sqlite3_free(pReader); } - assert( p->eType==FTSQUERY_AND ); - return 3; } /* -** Argument ppHead contains a pointer to the current head of a query -** expression tree being parsed. pPrev is the expression node most recently -** inserted into the tree. This function adds pNew, which is always a binary -** operator node, into the expression tree based on the relative precedence -** of pNew and the existing nodes of the tree. This may result in the head -** of the tree changing, in which case *ppHead is set to the new root node. +** Allocate a new SegReader object. */ -static void insertBinaryOperator( - Fts3Expr **ppHead, /* Pointer to the root node of a tree */ - Fts3Expr *pPrev, /* Node most recently inserted into the tree */ - Fts3Expr *pNew /* New binary node to insert into expression tree */ +SQLITE_PRIVATE int sqlite3Fts3SegReaderNew( + Fts3Table *p, /* Virtual table handle */ + int iAge, /* Segment "age". */ + sqlite3_int64 iStartLeaf, /* First leaf to traverse */ + sqlite3_int64 iEndLeaf, /* Final leaf to traverse */ + sqlite3_int64 iEndBlock, /* Final block of segment */ + const char *zRoot, /* Buffer containing root node */ + int nRoot, /* Size of buffer containing root node */ + Fts3SegReader **ppReader /* OUT: Allocated Fts3SegReader */ ){ - Fts3Expr *pSplit = pPrev; - while( pSplit->pParent && opPrecedence(pSplit->pParent)<=opPrecedence(pNew) ){ - pSplit = pSplit->pParent; + int rc = SQLITE_OK; /* Return code */ + Fts3SegReader *pReader; /* Newly allocated SegReader object */ + int nExtra = 0; /* Bytes to allocate segment root node */ + + if( iStartLeaf==0 ){ + nExtra = nRoot; } - if( pSplit->pParent ){ - assert( pSplit->pParent->pRight==pSplit ); - pSplit->pParent->pRight = pNew; - pNew->pParent = pSplit->pParent; + pReader = (Fts3SegReader *)sqlite3_malloc(sizeof(Fts3SegReader) + nExtra); + if( !pReader ){ + return SQLITE_NOMEM; + } + memset(pReader, 0, sizeof(Fts3SegReader)); + pReader->iStartBlock = iStartLeaf; + pReader->iIdx = iAge; + pReader->iEndBlock = iEndBlock; + + if( nExtra ){ + /* The entire segment is stored in the root node. */ + pReader->aNode = (char *)&pReader[1]; + pReader->nNode = nRoot; + memcpy(pReader->aNode, zRoot, nRoot); }else{ - *ppHead = pNew; + /* If the text of the SQL statement to iterate through a contiguous + ** set of entries in the %_segments table has not yet been composed, + ** compose it now. + */ + if( !p->zSelectLeaves ){ + p->zSelectLeaves = sqlite3_mprintf( + "SELECT block FROM %Q.'%q_segments' WHERE blockid BETWEEN ? AND ? " + "ORDER BY blockid", p->zDb, p->zName + ); + if( !p->zSelectLeaves ){ + rc = SQLITE_NOMEM; + goto finished; + } + } + + /* If there are no free statements in the aLeavesStmt[] array, prepare + ** a new statement now. Otherwise, reuse a prepared statement from + ** aLeavesStmt[]. + */ + if( p->nLeavesStmt==0 ){ + if( p->nLeavesTotal==p->nLeavesAlloc ){ + int nNew = p->nLeavesAlloc + 16; + sqlite3_stmt **aNew = (sqlite3_stmt **)sqlite3_realloc( + p->aLeavesStmt, nNew*sizeof(sqlite3_stmt *) + ); + if( !aNew ){ + rc = SQLITE_NOMEM; + goto finished; + } + p->nLeavesAlloc = nNew; + p->aLeavesStmt = aNew; + } + rc = sqlite3_prepare_v2(p->db, p->zSelectLeaves, -1, &pReader->pStmt, 0); + if( rc!=SQLITE_OK ){ + goto finished; + } + p->nLeavesTotal++; + }else{ + pReader->pStmt = p->aLeavesStmt[--p->nLeavesStmt]; + } + + /* Bind the start and end leaf blockids to the prepared SQL statement. */ + sqlite3_bind_int64(pReader->pStmt, 1, iStartLeaf); + sqlite3_bind_int64(pReader->pStmt, 2, iEndLeaf); } - pNew->pLeft = pSplit; - pSplit->pParent = pNew; + rc = fts3SegReaderNext(pReader); + + finished: + if( rc==SQLITE_OK ){ + *ppReader = pReader; + }else{ + sqlite3Fts3SegReaderFree(p, pReader); + } + return rc; } /* -** Parse the fts3 query expression found in buffer z, length n. This function -** returns either when the end of the buffer is reached or an unmatched -** closing bracket - ')' - is encountered. -** -** If successful, SQLITE_OK is returned, *ppExpr is set to point to the -** parsed form of the expression and *pnConsumed is set to the number of -** bytes read from buffer z. Otherwise, *ppExpr is set to 0 and SQLITE_NOMEM -** (out of memory error) or SQLITE_ERROR (parse error) is returned. +** This is a comparison function used as a qsort() callback when sorting +** an array of pending terms by term. This occurs as part of flushing +** the contents of the pending-terms hash table to the database. */ -static int fts3ExprParse( - ParseContext *pParse, /* fts3 query parse context */ - const char *z, int n, /* Text of MATCH query */ - Fts3Expr **ppExpr, /* OUT: Parsed query structure */ - int *pnConsumed /* OUT: Number of bytes consumed */ -){ - Fts3Expr *pRet = 0; - Fts3Expr *pPrev = 0; - Fts3Expr *pNotBranch = 0; /* Only used in legacy parse mode */ - int nIn = n; - const char *zIn = z; - int rc = SQLITE_OK; - int isRequirePhrase = 1; - - while( rc==SQLITE_OK ){ - Fts3Expr *p = 0; - int nByte = 0; - rc = getNextNode(pParse, zIn, nIn, &p, &nByte); - if( rc==SQLITE_OK ){ - int isPhrase; +static int fts3CompareElemByTerm(const void *lhs, const void *rhs){ + char *z1 = fts3HashKey(*(Fts3HashElem **)lhs); + char *z2 = fts3HashKey(*(Fts3HashElem **)rhs); + int n1 = fts3HashKeysize(*(Fts3HashElem **)lhs); + int n2 = fts3HashKeysize(*(Fts3HashElem **)rhs); - if( !sqlite3_fts3_enable_parentheses - && p->eType==FTSQUERY_PHRASE && p->pPhrase->isNot - ){ - /* Create an implicit NOT operator. */ - Fts3Expr *pNot = sqlite3_malloc(sizeof(Fts3Expr)); - if( !pNot ){ - sqlite3Fts3ExprFree(p); - rc = SQLITE_NOMEM; - goto exprparse_out; - } - memset(pNot, 0, sizeof(Fts3Expr)); - pNot->eType = FTSQUERY_NOT; - pNot->pRight = p; - if( pNotBranch ){ - pNot->pLeft = pNotBranch; - } - pNotBranch = pNot; - p = pPrev; - }else{ - int eType = p->eType; - assert( eType!=FTSQUERY_PHRASE || !p->pPhrase->isNot ); - isPhrase = (eType==FTSQUERY_PHRASE || p->pLeft); + int n = (n1pendingTerms); pE; pE=fts3HashNext(pE)){ + char *zKey = (char *)fts3HashKey(pE); + int nKey = fts3HashKeysize(pE); + if( nTerm==0 || (nKey>=nTerm && 0==memcmp(zKey, zTerm, nTerm)) ){ + if( nElem==nAlloc ){ + Fts3HashElem **aElem2; + nAlloc += 16; + aElem2 = (Fts3HashElem **)sqlite3_realloc( + aElem, nAlloc*sizeof(Fts3HashElem *) + ); + if( !aElem2 ){ rc = SQLITE_NOMEM; - goto exprparse_out; - } - memset(pAnd, 0, sizeof(Fts3Expr)); - pAnd->eType = FTSQUERY_AND; - insertBinaryOperator(&pRet, pPrev, pAnd); - pPrev = pAnd; - } - - /* This test catches attempts to make either operand of a NEAR - ** operator something other than a phrase. For example, either of - ** the following: - ** - ** (bracketed expression) NEAR phrase - ** phrase NEAR (bracketed expression) - ** - ** Return an error in either case. - */ - if( pPrev && ( - (eType==FTSQUERY_NEAR && !isPhrase && pPrev->eType!=FTSQUERY_PHRASE) - || (eType!=FTSQUERY_PHRASE && isPhrase && pPrev->eType==FTSQUERY_NEAR) - )){ - sqlite3Fts3ExprFree(p); - rc = SQLITE_ERROR; - goto exprparse_out; - } - - if( isPhrase ){ - if( pRet ){ - assert( pPrev && pPrev->pLeft && pPrev->pRight==0 ); - pPrev->pRight = p; - p->pParent = pPrev; - }else{ - pRet = p; + nElem = 0; + break; } - }else{ - insertBinaryOperator(&pRet, pPrev, p); + aElem = aElem2; } - isRequirePhrase = !isPhrase; + aElem[nElem++] = pE; } - assert( nByte>0 ); } - assert( rc!=SQLITE_OK || (nByte>0 && nByte<=nIn) ); - nIn -= nByte; - zIn += nByte; - pPrev = p; - } - if( rc==SQLITE_DONE && pRet && isRequirePhrase ){ - rc = SQLITE_ERROR; + /* If more than one term matches the prefix, sort the Fts3HashElem + ** objects in term order using qsort(). This uses the same comparison + ** callback as is used when flushing terms to disk. + */ + if( nElem>1 ){ + qsort(aElem, nElem, sizeof(Fts3HashElem *), fts3CompareElemByTerm); + } + + }else{ + Fts3HashElem *pE = fts3HashFindElem(&p->pendingTerms, zTerm, nTerm); + if( pE ){ + aElem = &pE; + nElem = 1; + } } - if( rc==SQLITE_DONE ){ - rc = SQLITE_OK; - if( !sqlite3_fts3_enable_parentheses && pNotBranch ){ - if( !pRet ){ - rc = SQLITE_ERROR; - }else{ - Fts3Expr *pIter = pNotBranch; - while( pIter->pLeft ){ - pIter = pIter->pLeft; - } - pIter->pLeft = pRet; - pRet = pNotBranch; - } + if( nElem>0 ){ + int nByte = sizeof(Fts3SegReader) + (nElem+1)*sizeof(Fts3HashElem *); + pReader = (Fts3SegReader *)sqlite3_malloc(nByte); + if( !pReader ){ + rc = SQLITE_NOMEM; + }else{ + memset(pReader, 0, nByte); + pReader->iIdx = 0x7FFFFFFF; + pReader->ppNextElem = (Fts3HashElem **)&pReader[1]; + memcpy(pReader->ppNextElem, aElem, nElem*sizeof(Fts3HashElem *)); + fts3SegReaderNext(pReader); } } - *pnConsumed = n - nIn; -exprparse_out: - if( rc!=SQLITE_OK ){ - sqlite3Fts3ExprFree(pRet); - sqlite3Fts3ExprFree(pNotBranch); - pRet = 0; + if( isPrefix ){ + sqlite3_free(aElem); } - *ppExpr = pRet; + *ppReader = pReader; return rc; } + /* -** Parameters z and n contain a pointer to and length of a buffer containing -** an fts3 query expression, respectively. This function attempts to parse the -** query expression and create a tree of Fts3Expr structures representing the -** parsed expression. If successful, *ppExpr is set to point to the head -** of the parsed expression tree and SQLITE_OK is returned. If an error -** occurs, either SQLITE_NOMEM (out-of-memory error) or SQLITE_ERROR (parse -** error) is returned and *ppExpr is set to 0. +** The second argument to this function is expected to be a statement of +** the form: ** -** If parameter n is a negative number, then z is assumed to point to a -** nul-terminated string and the length is determined using strlen(). +** SELECT +** idx, -- col 0 +** start_block, -- col 1 +** leaves_end_block, -- col 2 +** end_block, -- col 3 +** root -- col 4 +** FROM %_segdir ... ** -** The first parameter, pTokenizer, is passed the fts3 tokenizer module to -** use to normalize query tokens while parsing the expression. The azCol[] -** array, which is assumed to contain nCol entries, should contain the names -** of each column in the target fts3 table, in order from left to right. -** Column names must be nul-terminated strings. +** This function allocates and initializes a Fts3SegReader structure to +** iterate through the terms stored in the segment identified by the +** current row that pStmt is pointing to. ** -** The iDefaultCol parameter should be passed the index of the table column -** that appears on the left-hand-side of the MATCH operator (the default -** column to match against for tokens for which a column name is not explicitly -** specified as part of the query string), or -1 if tokens may by default -** match any table column. +** If successful, the Fts3SegReader is left pointing to the first term +** in the segment and SQLITE_OK is returned. Otherwise, an SQLite error +** code is returned. */ -SQLITE_PRIVATE int sqlite3Fts3ExprParse( - sqlite3_tokenizer *pTokenizer, /* Tokenizer module */ - char **azCol, /* Array of column names for fts3 table */ - int nCol, /* Number of entries in azCol[] */ - int iDefaultCol, /* Default column to query */ - const char *z, int n, /* Text of MATCH query */ - Fts3Expr **ppExpr /* OUT: Parsed query structure */ +static int fts3SegReaderNew( + Fts3Table *p, /* Virtual table handle */ + sqlite3_stmt *pStmt, /* See above */ + int iAge, /* Segment "age". */ + Fts3SegReader **ppReader /* OUT: Allocated Fts3SegReader */ ){ - int nParsed; + return sqlite3Fts3SegReaderNew(p, iAge, + sqlite3_column_int64(pStmt, 1), + sqlite3_column_int64(pStmt, 2), + sqlite3_column_int64(pStmt, 3), + sqlite3_column_blob(pStmt, 4), + sqlite3_column_bytes(pStmt, 4), + ppReader + ); +} + +/* +** Compare the entries pointed to by two Fts3SegReader structures. +** Comparison is as follows: +** +** 1) EOF is greater than not EOF. +** +** 2) The current terms (if any) are compared using memcmp(). If one +** term is a prefix of another, the longer term is considered the +** larger. +** +** 3) By segment age. An older segment is considered larger. +*/ +static int fts3SegReaderCmp(Fts3SegReader *pLhs, Fts3SegReader *pRhs){ int rc; - ParseContext sParse; - sParse.pTokenizer = pTokenizer; - sParse.azCol = (const char **)azCol; - sParse.nCol = nCol; - sParse.iDefaultCol = iDefaultCol; - sParse.nNest = 0; - if( z==0 ){ - *ppExpr = 0; - return SQLITE_OK; - } - if( n<0 ){ - n = strlen(z); + if( pLhs->aNode && pRhs->aNode ){ + int rc2 = pLhs->nTerm - pRhs->nTerm; + if( rc2<0 ){ + rc = memcmp(pLhs->zTerm, pRhs->zTerm, pLhs->nTerm); + }else{ + rc = memcmp(pLhs->zTerm, pRhs->zTerm, pRhs->nTerm); + } + if( rc==0 ){ + rc = rc2; + } + }else{ + rc = (pLhs->aNode==0) - (pRhs->aNode==0); } - rc = fts3ExprParse(&sParse, z, n, ppExpr, &nParsed); - - /* Check for mismatched parenthesis */ - if( rc==SQLITE_OK && sParse.nNest ){ - rc = SQLITE_ERROR; - sqlite3Fts3ExprFree(*ppExpr); - *ppExpr = 0; + if( rc==0 ){ + rc = pRhs->iIdx - pLhs->iIdx; } - + assert( rc!=0 ); return rc; } /* -** Free a parsed fts3 query expression allocated by sqlite3Fts3ExprParse(). +** A different comparison function for SegReader structures. In this +** version, it is assumed that each SegReader points to an entry in +** a doclist for identical terms. Comparison is made as follows: +** +** 1) EOF (end of doclist in this case) is greater than not EOF. +** +** 2) By current docid. +** +** 3) By segment age. An older segment is considered larger. */ -SQLITE_PRIVATE void sqlite3Fts3ExprFree(Fts3Expr *p){ - if( p ){ - sqlite3Fts3ExprFree(p->pLeft); - sqlite3Fts3ExprFree(p->pRight); - sqlite3_free(p); +static int fts3SegReaderDoclistCmp(Fts3SegReader *pLhs, Fts3SegReader *pRhs){ + int rc = (pLhs->pOffsetList==0)-(pRhs->pOffsetList==0); + if( rc==0 ){ + if( pLhs->iDocid==pRhs->iDocid ){ + rc = pRhs->iIdx - pLhs->iIdx; + }else{ + rc = (pLhs->iDocid > pRhs->iDocid) ? 1 : -1; + } } + assert( pLhs->aNode && pRhs->aNode ); + return rc; } -/**************************************************************************** -***************************************************************************** -** Everything after this point is just test code. +/* +** Compare the term that the Fts3SegReader object passed as the first argument +** points to with the term specified by arguments zTerm and nTerm. +** +** If the pSeg iterator is already at EOF, return 0. Otherwise, return +** -ve if the pSeg term is less than zTerm/nTerm, 0 if the two terms are +** equal, or +ve if the pSeg term is greater than zTerm/nTerm. */ - -#ifdef SQLITE_TEST - +static int fts3SegReaderTermCmp( + Fts3SegReader *pSeg, /* Segment reader object */ + const char *zTerm, /* Term to compare to */ + int nTerm /* Size of term zTerm in bytes */ +){ + int res = 0; + if( pSeg->aNode ){ + if( pSeg->nTerm>nTerm ){ + res = memcmp(pSeg->zTerm, zTerm, nTerm); + }else{ + res = memcmp(pSeg->zTerm, zTerm, pSeg->nTerm); + } + if( res==0 ){ + res = pSeg->nTerm-nTerm; + } + } + return res; +} /* -** Function to query the hash-table of tokenizers (see README.tokenizers). +** Argument apSegment is an array of nSegment elements. It is known that +** the final (nSegment-nSuspect) members are already in sorted order +** (according to the comparison function provided). This function shuffles +** the array around until all entries are in sorted order. */ -static int queryTestTokenizer( - sqlite3 *db, - const char *zName, - const sqlite3_tokenizer_module **pp +static void fts3SegReaderSort( + Fts3SegReader **apSegment, /* Array to sort entries of */ + int nSegment, /* Size of apSegment array */ + int nSuspect, /* Unsorted entry count */ + int (*xCmp)(Fts3SegReader *, Fts3SegReader *) /* Comparison function */ ){ - int rc; - sqlite3_stmt *pStmt; - const char zSql[] = "SELECT fts3_tokenizer(?)"; + int i; /* Iterator variable */ - *pp = 0; - rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); - if( rc!=SQLITE_OK ){ - return rc; - } + assert( nSuspect<=nSegment ); - sqlite3_bind_text(pStmt, 1, zName, -1, SQLITE_STATIC); - if( SQLITE_ROW==sqlite3_step(pStmt) ){ - if( sqlite3_column_type(pStmt, 0)==SQLITE_BLOB ){ - memcpy(pp, sqlite3_column_blob(pStmt, 0), sizeof(*pp)); + if( nSuspect==nSegment ) nSuspect--; + for(i=nSuspect-1; i>=0; i--){ + int j; + for(j=i; j<(nSegment-1); j++){ + Fts3SegReader *pTmp; + if( xCmp(apSegment[j], apSegment[j+1])<0 ) break; + pTmp = apSegment[j+1]; + apSegment[j+1] = apSegment[j]; + apSegment[j] = pTmp; } } - return sqlite3_finalize(pStmt); +#ifndef NDEBUG + /* Check that the list really is sorted now. */ + for(i=0; i<(nSuspect-1); i++){ + assert( xCmp(apSegment[i], apSegment[i+1])<0 ); + } +#endif } -/* -** This function is part of the test interface for the query parser. It -** writes a text representation of the query expression pExpr into the -** buffer pointed to by argument zBuf. It is assumed that zBuf is large -** enough to store the required text representation. +/* +** Insert a record into the %_segments table. */ -static void exprToString(Fts3Expr *pExpr, char *zBuf){ - switch( pExpr->eType ){ - case FTSQUERY_PHRASE: { - Fts3Phrase *pPhrase = pExpr->pPhrase; - int i; - zBuf += sprintf(zBuf, "PHRASE %d %d", pPhrase->iColumn, pPhrase->isNot); - for(i=0; inToken; i++){ - zBuf += sprintf(zBuf," %.*s",pPhrase->aToken[i].n,pPhrase->aToken[i].z); - zBuf += sprintf(zBuf,"%s", (pPhrase->aToken[i].isPrefix?"+":"")); - } - return; - } - - case FTSQUERY_NEAR: - zBuf += sprintf(zBuf, "NEAR/%d ", pExpr->nNear); - break; - case FTSQUERY_NOT: - zBuf += sprintf(zBuf, "NOT "); - break; - case FTSQUERY_AND: - zBuf += sprintf(zBuf, "AND "); - break; - case FTSQUERY_OR: - zBuf += sprintf(zBuf, "OR "); - break; +static int fts3WriteSegment( + Fts3Table *p, /* Virtual table handle */ + sqlite3_int64 iBlock, /* Block id for new block */ + char *z, /* Pointer to buffer containing block data */ + int n /* Size of buffer z in bytes */ +){ + sqlite3_stmt *pStmt; + int rc = fts3SqlStmt(p, SQL_INSERT_SEGMENTS, &pStmt, 0); + if( rc==SQLITE_OK ){ + sqlite3_bind_int64(pStmt, 1, iBlock); + sqlite3_bind_blob(pStmt, 2, z, n, SQLITE_STATIC); + sqlite3_step(pStmt); + rc = sqlite3_reset(pStmt); } + return rc; +} - zBuf += sprintf(zBuf, "{"); - exprToString(pExpr->pLeft, zBuf); - zBuf += strlen(zBuf); - zBuf += sprintf(zBuf, "} "); - - zBuf += sprintf(zBuf, "{"); - exprToString(pExpr->pRight, zBuf); - zBuf += strlen(zBuf); - zBuf += sprintf(zBuf, "}"); +/* +** Insert a record into the %_segdir table. +*/ +static int fts3WriteSegdir( + Fts3Table *p, /* Virtual table handle */ + int iLevel, /* Value for "level" field */ + int iIdx, /* Value for "idx" field */ + sqlite3_int64 iStartBlock, /* Value for "start_block" field */ + sqlite3_int64 iLeafEndBlock, /* Value for "leaves_end_block" field */ + sqlite3_int64 iEndBlock, /* Value for "end_block" field */ + char *zRoot, /* Blob value for "root" field */ + int nRoot /* Number of bytes in buffer zRoot */ +){ + sqlite3_stmt *pStmt; + int rc = fts3SqlStmt(p, SQL_INSERT_SEGDIR, &pStmt, 0); + if( rc==SQLITE_OK ){ + sqlite3_bind_int(pStmt, 1, iLevel); + sqlite3_bind_int(pStmt, 2, iIdx); + sqlite3_bind_int64(pStmt, 3, iStartBlock); + sqlite3_bind_int64(pStmt, 4, iLeafEndBlock); + sqlite3_bind_int64(pStmt, 5, iEndBlock); + sqlite3_bind_blob(pStmt, 6, zRoot, nRoot, SQLITE_STATIC); + sqlite3_step(pStmt); + rc = sqlite3_reset(pStmt); + } + return rc; } /* -** This is the implementation of a scalar SQL function used to test the -** expression parser. It should be called as follows: -** -** fts3_exprtest(, , , ...); -** -** The first argument, , is the name of the fts3 tokenizer used -** to parse the query expression (see README.tokenizers). The second argument -** is the query expression to parse. Each subsequent argument is the name -** of a column of the fts3 table that the query expression may refer to. -** For example: +** Return the size of the common prefix (if any) shared by zPrev and +** zNext, in bytes. For example, ** -** SELECT fts3_exprtest('simple', 'Bill col2:Bloggs', 'col1', 'col2'); +** fts3PrefixCompress("abc", 3, "abcdef", 6) // returns 3 +** fts3PrefixCompress("abX", 3, "abcdef", 6) // returns 2 +** fts3PrefixCompress("abX", 3, "Xbcdef", 6) // returns 0 */ -static void fts3ExprTest( - sqlite3_context *context, - int argc, - sqlite3_value **argv +static int fts3PrefixCompress( + const char *zPrev, /* Buffer containing previous term */ + int nPrev, /* Size of buffer zPrev in bytes */ + const char *zNext, /* Buffer containing next term */ + int nNext /* Size of buffer zNext in bytes */ ){ - sqlite3_tokenizer_module const *pModule = 0; - sqlite3_tokenizer *pTokenizer = 0; + int n; + UNUSED_PARAMETER(nNext); + for(n=0; nnData; /* Current size of node in bytes */ + int nReq = nData; /* Required space after adding zTerm */ + int nPrefix; /* Number of bytes of prefix compression */ + int nSuffix; /* Suffix length */ + + nPrefix = fts3PrefixCompress(pTree->zTerm, pTree->nTerm, zTerm, nTerm); + nSuffix = nTerm-nPrefix; + + nReq += sqlite3Fts3VarintLen(nPrefix)+sqlite3Fts3VarintLen(nSuffix)+nSuffix; + if( nReq<=p->nNodeSize || !pTree->zTerm ){ + + if( nReq>p->nNodeSize ){ + /* An unusual case: this is the first term to be added to the node + ** and the static node buffer (p->nNodeSize bytes) is not large + ** enough. Use a separately malloced buffer instead This wastes + ** p->nNodeSize bytes, but since this scenario only comes about when + ** the database contain two terms that share a prefix of almost 2KB, + ** this is not expected to be a serious problem. + */ + assert( pTree->aData==(char *)&pTree[1] ); + pTree->aData = (char *)sqlite3_malloc(nReq); + if( !pTree->aData ){ + return SQLITE_NOMEM; + } + } - if( argc<3 ){ - sqlite3_result_error(context, - "Usage: fts3_exprtest(tokenizer, expr, col1, ...", -1 - ); - return; - } + if( pTree->zTerm ){ + /* There is no prefix-length field for first term in a node */ + nData += sqlite3Fts3PutVarint(&pTree->aData[nData], nPrefix); + } - rc = queryTestTokenizer(db, - (const char *)sqlite3_value_text(argv[0]), &pModule); - if( rc==SQLITE_NOMEM ){ - sqlite3_result_error_nomem(context); - goto exprtest_out; - }else if( !pModule ){ - sqlite3_result_error(context, "No such tokenizer module", -1); - goto exprtest_out; - } + nData += sqlite3Fts3PutVarint(&pTree->aData[nData], nSuffix); + memcpy(&pTree->aData[nData], &zTerm[nPrefix], nSuffix); + pTree->nData = nData + nSuffix; + pTree->nEntry++; - rc = pModule->xCreate(0, 0, &pTokenizer); - assert( rc==SQLITE_NOMEM || rc==SQLITE_OK ); - if( rc==SQLITE_NOMEM ){ - sqlite3_result_error_nomem(context); - goto exprtest_out; + if( isCopyTerm ){ + if( pTree->nMalloczMalloc, nTerm*2); + if( !zNew ){ + return SQLITE_NOMEM; + } + pTree->nMalloc = nTerm*2; + pTree->zMalloc = zNew; + } + pTree->zTerm = pTree->zMalloc; + memcpy(pTree->zTerm, zTerm, nTerm); + pTree->nTerm = nTerm; + }else{ + pTree->zTerm = (char *)zTerm; + pTree->nTerm = nTerm; + } + return SQLITE_OK; + } } - pTokenizer->pModule = pModule; - zExpr = (const char *)sqlite3_value_text(argv[1]); - nExpr = sqlite3_value_bytes(argv[1]); - nCol = argc-2; - azCol = (char **)sqlite3_malloc(nCol*sizeof(char *)); - if( !azCol ){ - sqlite3_result_error_nomem(context); - goto exprtest_out; - } - for(ii=0; iinNodeSize); + if( !pNew ){ + return SQLITE_NOMEM; } - - rc = sqlite3Fts3ExprParse( - pTokenizer, azCol, nCol, nCol, zExpr, nExpr, &pExpr - ); - if( rc==SQLITE_NOMEM ){ - sqlite3_result_error_nomem(context); - goto exprtest_out; - }else if( rc==SQLITE_OK ){ - char zBuf[4096]; - exprToString(pExpr, zBuf); - sqlite3_result_text(context, zBuf, -1, SQLITE_TRANSIENT); - sqlite3Fts3ExprFree(pExpr); + memset(pNew, 0, sizeof(SegmentNode)); + pNew->nData = 1 + FTS3_VARINT_MAX; + pNew->aData = (char *)&pNew[1]; + + if( pTree ){ + SegmentNode *pParent = pTree->pParent; + rc = fts3NodeAddTerm(p, &pParent, isCopyTerm, zTerm, nTerm); + if( pTree->pParent==0 ){ + pTree->pParent = pParent; + } + pTree->pRight = pNew; + pNew->pLeftmost = pTree->pLeftmost; + pNew->pParent = pParent; + pNew->zMalloc = pTree->zMalloc; + pNew->nMalloc = pTree->nMalloc; + pTree->zMalloc = 0; }else{ - sqlite3_result_error(context, "Error parsing expression", -1); + pNew->pLeftmost = pNew; + rc = fts3NodeAddTerm(p, &pNew, isCopyTerm, zTerm, nTerm); } -exprtest_out: - if( pModule && pTokenizer ){ - rc = pModule->xDestroy(pTokenizer); - } - sqlite3_free(azCol); + *ppTree = pNew; + return rc; } /* -** Register the query expression parser test function fts3_exprtest() -** with database connection db. +** Helper function for fts3NodeWrite(). */ -SQLITE_PRIVATE void sqlite3Fts3ExprInitTestInterface(sqlite3* db){ - sqlite3_create_function( - db, "fts3_exprtest", -1, SQLITE_UTF8, 0, fts3ExprTest, 0, 0 - ); +static int fts3TreeFinishNode( + SegmentNode *pTree, + int iHeight, + sqlite3_int64 iLeftChild +){ + int nStart; + assert( iHeight>=1 && iHeight<128 ); + nStart = FTS3_VARINT_MAX - sqlite3Fts3VarintLen(iLeftChild); + pTree->aData[nStart] = (char)iHeight; + sqlite3Fts3PutVarint(&pTree->aData[nStart+1], iLeftChild); + return nStart; } -#endif -#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */ - -/************** End of fts3_expr.c *******************************************/ -/************** Begin file fts3_hash.c ***************************************/ /* -** 2001 September 22 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: +** Write the buffer for the segment node pTree and all of its peers to the +** database. Then call this function recursively to write the parent of +** pTree and its peers to the database. ** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. +** Except, if pTree is a root node, do not write it to the database. Instead, +** set output variables *paRoot and *pnRoot to contain the root node. ** -************************************************************************* -** This is the implementation of generic hash-tables used in SQLite. -** We've modified it slightly to serve as a standalone hash table -** implementation for the full-text indexing module. +** If successful, SQLITE_OK is returned and output variable *piLast is +** set to the largest blockid written to the database (or zero if no +** blocks were written to the db). Otherwise, an SQLite error code is +** returned. +*/ +static int fts3NodeWrite( + Fts3Table *p, /* Virtual table handle */ + SegmentNode *pTree, /* SegmentNode handle */ + int iHeight, /* Height of this node in tree */ + sqlite3_int64 iLeaf, /* Block id of first leaf node */ + sqlite3_int64 iFree, /* Block id of next free slot in %_segments */ + sqlite3_int64 *piLast, /* OUT: Block id of last entry written */ + char **paRoot, /* OUT: Data for root node */ + int *pnRoot /* OUT: Size of root node in bytes */ +){ + int rc = SQLITE_OK; + + if( !pTree->pParent ){ + /* Root node of the tree. */ + int nStart = fts3TreeFinishNode(pTree, iHeight, iLeaf); + *piLast = iFree-1; + *pnRoot = pTree->nData - nStart; + *paRoot = &pTree->aData[nStart]; + }else{ + SegmentNode *pIter; + sqlite3_int64 iNextFree = iFree; + sqlite3_int64 iNextLeaf = iLeaf; + for(pIter=pTree->pLeftmost; pIter && rc==SQLITE_OK; pIter=pIter->pRight){ + int nStart = fts3TreeFinishNode(pIter, iHeight, iNextLeaf); + int nWrite = pIter->nData - nStart; + + rc = fts3WriteSegment(p, iNextFree, &pIter->aData[nStart], nWrite); + iNextFree++; + iNextLeaf += (pIter->nEntry+1); + } + if( rc==SQLITE_OK ){ + assert( iNextLeaf==iFree ); + rc = fts3NodeWrite( + p, pTree->pParent, iHeight+1, iFree, iNextFree, piLast, paRoot, pnRoot + ); + } + } + + return rc; +} + +/* +** Free all memory allocations associated with the tree pTree. */ +static void fts3NodeFree(SegmentNode *pTree){ + if( pTree ){ + SegmentNode *p = pTree->pLeftmost; + fts3NodeFree(p->pParent); + while( p ){ + SegmentNode *pRight = p->pRight; + if( p->aData!=(char *)&p[1] ){ + sqlite3_free(p->aData); + } + assert( pRight==0 || p->zMalloc==0 ); + sqlite3_free(p->zMalloc); + sqlite3_free(p); + p = pRight; + } + } +} /* -** The code in this file is only compiled if: -** -** * The FTS3 module is being built as an extension -** (in which case SQLITE_CORE is not defined), or +** Add a term to the segment being constructed by the SegmentWriter object +** *ppWriter. When adding the first term to a segment, *ppWriter should +** be passed NULL. This function will allocate a new SegmentWriter object +** and return it via the input/output variable *ppWriter in this case. ** -** * The FTS3 module is being built into the core of -** SQLite (in which case SQLITE_ENABLE_FTS3 is defined). +** If successful, SQLITE_OK is returned. Otherwise, an SQLite error code. */ -#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) +static int fts3SegWriterAdd( + Fts3Table *p, /* Virtual table handle */ + SegmentWriter **ppWriter, /* IN/OUT: SegmentWriter handle */ + int isCopyTerm, /* True if buffer zTerm must be copied */ + const char *zTerm, /* Pointer to buffer containing term */ + int nTerm, /* Size of term in bytes */ + const char *aDoclist, /* Pointer to buffer containing doclist */ + int nDoclist /* Size of doclist in bytes */ +){ + int nPrefix; /* Size of term prefix in bytes */ + int nSuffix; /* Size of term suffix in bytes */ + int nReq; /* Number of bytes required on leaf page */ + int nData; + SegmentWriter *pWriter = *ppWriter; + + if( !pWriter ){ + int rc; + sqlite3_stmt *pStmt; + + /* Allocate the SegmentWriter structure */ + pWriter = (SegmentWriter *)sqlite3_malloc(sizeof(SegmentWriter)); + if( !pWriter ) return SQLITE_NOMEM; + memset(pWriter, 0, sizeof(SegmentWriter)); + *ppWriter = pWriter; + + /* Allocate a buffer in which to accumulate data */ + pWriter->aData = (char *)sqlite3_malloc(p->nNodeSize); + if( !pWriter->aData ) return SQLITE_NOMEM; + pWriter->nSize = p->nNodeSize; + + /* Find the next free blockid in the %_segments table */ + rc = fts3SqlStmt(p, SQL_NEXT_SEGMENTS_ID, &pStmt, 0); + if( rc!=SQLITE_OK ) return rc; + if( SQLITE_ROW==sqlite3_step(pStmt) ){ + pWriter->iFree = sqlite3_column_int64(pStmt, 0); + pWriter->iFirst = pWriter->iFree; + } + rc = sqlite3_reset(pStmt); + if( rc!=SQLITE_OK ) return rc; + } + nData = pWriter->nData; + + nPrefix = fts3PrefixCompress(pWriter->zTerm, pWriter->nTerm, zTerm, nTerm); + nSuffix = nTerm-nPrefix; + + /* Figure out how many bytes are required by this new entry */ + nReq = sqlite3Fts3VarintLen(nPrefix) + /* varint containing prefix size */ + sqlite3Fts3VarintLen(nSuffix) + /* varint containing suffix size */ + nSuffix + /* Term suffix */ + sqlite3Fts3VarintLen(nDoclist) + /* Size of doclist */ + nDoclist; /* Doclist data */ + + if( nData>0 && nData+nReq>p->nNodeSize ){ + int rc; + + /* The current leaf node is full. Write it out to the database. */ + rc = fts3WriteSegment(p, pWriter->iFree++, pWriter->aData, nData); + if( rc!=SQLITE_OK ) return rc; + + /* Add the current term to the interior node tree. The term added to + ** the interior tree must: + ** + ** a) be greater than the largest term on the leaf node just written + ** to the database (still available in pWriter->zTerm), and + ** + ** b) be less than or equal to the term about to be added to the new + ** leaf node (zTerm/nTerm). + ** + ** In other words, it must be the prefix of zTerm 1 byte longer than + ** the common prefix (if any) of zTerm and pWriter->zTerm. + */ + assert( nPrefixpTree, isCopyTerm, zTerm, nPrefix+1); + if( rc!=SQLITE_OK ) return rc; + nData = 0; + pWriter->nTerm = 0; + + nPrefix = 0; + nSuffix = nTerm; + nReq = 1 + /* varint containing prefix size */ + sqlite3Fts3VarintLen(nTerm) + /* varint containing suffix size */ + nTerm + /* Term suffix */ + sqlite3Fts3VarintLen(nDoclist) + /* Size of doclist */ + nDoclist; /* Doclist data */ + } + + /* If the buffer currently allocated is too small for this entry, realloc + ** the buffer to make it large enough. + */ + if( nReq>pWriter->nSize ){ + char *aNew = sqlite3_realloc(pWriter->aData, nReq); + if( !aNew ) return SQLITE_NOMEM; + pWriter->aData = aNew; + pWriter->nSize = nReq; + } + assert( nData+nReq<=pWriter->nSize ); + + /* Append the prefix-compressed term and doclist to the buffer. */ + nData += sqlite3Fts3PutVarint(&pWriter->aData[nData], nPrefix); + nData += sqlite3Fts3PutVarint(&pWriter->aData[nData], nSuffix); + memcpy(&pWriter->aData[nData], &zTerm[nPrefix], nSuffix); + nData += nSuffix; + nData += sqlite3Fts3PutVarint(&pWriter->aData[nData], nDoclist); + memcpy(&pWriter->aData[nData], aDoclist, nDoclist); + pWriter->nData = nData + nDoclist; + + /* Save the current term so that it can be used to prefix-compress the next. + ** If the isCopyTerm parameter is true, then the buffer pointed to by + ** zTerm is transient, so take a copy of the term data. Otherwise, just + ** store a copy of the pointer. + */ + if( isCopyTerm ){ + if( nTerm>pWriter->nMalloc ){ + char *zNew = sqlite3_realloc(pWriter->zMalloc, nTerm*2); + if( !zNew ){ + return SQLITE_NOMEM; + } + pWriter->nMalloc = nTerm*2; + pWriter->zMalloc = zNew; + pWriter->zTerm = zNew; + } + assert( pWriter->zTerm==pWriter->zMalloc ); + memcpy(pWriter->zTerm, zTerm, nTerm); + }else{ + pWriter->zTerm = (char *)zTerm; + } + pWriter->nTerm = nTerm; + return SQLITE_OK; +} /* -** Malloc and Free functions +** Flush all data associated with the SegmentWriter object pWriter to the +** database. This function must be called after all terms have been added +** to the segment using fts3SegWriterAdd(). If successful, SQLITE_OK is +** returned. Otherwise, an SQLite error code. */ -static void *fts3HashMalloc(int n){ - void *p = sqlite3_malloc(n); - if( p ){ - memset(p, 0, n); +static int fts3SegWriterFlush( + Fts3Table *p, /* Virtual table handle */ + SegmentWriter *pWriter, /* SegmentWriter to flush to the db */ + int iLevel, /* Value for 'level' column of %_segdir */ + int iIdx /* Value for 'idx' column of %_segdir */ +){ + int rc; /* Return code */ + if( pWriter->pTree ){ + sqlite3_int64 iLast = 0; /* Largest block id written to database */ + sqlite3_int64 iLastLeaf; /* Largest leaf block id written to db */ + char *zRoot = NULL; /* Pointer to buffer containing root node */ + int nRoot = 0; /* Size of buffer zRoot */ + + iLastLeaf = pWriter->iFree; + rc = fts3WriteSegment(p, pWriter->iFree++, pWriter->aData, pWriter->nData); + if( rc==SQLITE_OK ){ + rc = fts3NodeWrite(p, pWriter->pTree, 1, + pWriter->iFirst, pWriter->iFree, &iLast, &zRoot, &nRoot); + } + if( rc==SQLITE_OK ){ + rc = fts3WriteSegdir( + p, iLevel, iIdx, pWriter->iFirst, iLastLeaf, iLast, zRoot, nRoot); + } + }else{ + /* The entire tree fits on the root node. Write it to the segdir table. */ + rc = fts3WriteSegdir( + p, iLevel, iIdx, 0, 0, 0, pWriter->aData, pWriter->nData); } - return p; -} -static void fts3HashFree(void *p){ - sqlite3_free(p); + return rc; } -/* Turn bulk memory into a hash table object by initializing the -** fields of the Hash structure. -** -** "pNew" is a pointer to the hash table that is to be initialized. -** keyClass is one of the constants -** FTS3_HASH_BINARY or FTS3_HASH_STRING. The value of keyClass -** determines what kind of key the hash table will use. "copyKey" is -** true if the hash table should make its own private copy of keys and -** false if it should just use the supplied pointer. +/* +** Release all memory held by the SegmentWriter object passed as the +** first argument. */ -SQLITE_PRIVATE void sqlite3Fts3HashInit(fts3Hash *pNew, int keyClass, int copyKey){ - assert( pNew!=0 ); - assert( keyClass>=FTS3_HASH_STRING && keyClass<=FTS3_HASH_BINARY ); - pNew->keyClass = keyClass; - pNew->copyKey = copyKey; - pNew->first = 0; - pNew->count = 0; - pNew->htsize = 0; - pNew->ht = 0; +static void fts3SegWriterFree(SegmentWriter *pWriter){ + if( pWriter ){ + sqlite3_free(pWriter->aData); + sqlite3_free(pWriter->zMalloc); + fts3NodeFree(pWriter->pTree); + sqlite3_free(pWriter); + } } -/* Remove all entries from a hash table. Reclaim all memory. -** Call this routine to delete a hash table or to reset a hash table -** to the empty state. +/* +** The first value in the apVal[] array is assumed to contain an integer. +** This function tests if there exist any documents with docid values that +** are different from that integer. i.e. if deleting the document with docid +** apVal[0] would mean the FTS3 table were empty. +** +** If successful, *pisEmpty is set to true if the table is empty except for +** document apVal[0], or false otherwise, and SQLITE_OK is returned. If an +** error occurs, an SQLite error code is returned. */ -SQLITE_PRIVATE void sqlite3Fts3HashClear(fts3Hash *pH){ - fts3HashElem *elem; /* For looping over all elements of the table */ - - assert( pH!=0 ); - elem = pH->first; - pH->first = 0; - fts3HashFree(pH->ht); - pH->ht = 0; - pH->htsize = 0; - while( elem ){ - fts3HashElem *next_elem = elem->next; - if( pH->copyKey && elem->pKey ){ - fts3HashFree(elem->pKey); +static int fts3IsEmpty(Fts3Table *p, sqlite3_value **apVal, int *pisEmpty){ + sqlite3_stmt *pStmt; + int rc; + rc = fts3SqlStmt(p, SQL_IS_EMPTY, &pStmt, apVal); + if( rc==SQLITE_OK ){ + if( SQLITE_ROW==sqlite3_step(pStmt) ){ + *pisEmpty = sqlite3_column_int(pStmt, 0); } - fts3HashFree(elem); - elem = next_elem; + rc = sqlite3_reset(pStmt); } - pH->count = 0; + return rc; } /* -** Hash and comparison functions when the mode is FTS3_HASH_STRING +** Set *pnSegment to the number of segments of level iLevel in the database. +** +** Return SQLITE_OK if successful, or an SQLite error code if not. */ -static int fts3StrHash(const void *pKey, int nKey){ - const char *z = (const char *)pKey; - int h = 0; - if( nKey<=0 ) nKey = (int) strlen(z); - while( nKey > 0 ){ - h = (h<<3) ^ h ^ *z++; - nKey--; +static int fts3SegmentCount(Fts3Table *p, int iLevel, int *pnSegment){ + sqlite3_stmt *pStmt; + int rc; + + assert( iLevel>=0 ); + rc = fts3SqlStmt(p, SQL_SELECT_LEVEL_COUNT, &pStmt, 0); + if( rc!=SQLITE_OK ) return rc; + sqlite3_bind_int(pStmt, 1, iLevel); + if( SQLITE_ROW==sqlite3_step(pStmt) ){ + *pnSegment = sqlite3_column_int(pStmt, 0); } - return h & 0x7fffffff; -} -static int fts3StrCompare(const void *pKey1, int n1, const void *pKey2, int n2){ - if( n1!=n2 ) return 1; - return strncmp((const char*)pKey1,(const char*)pKey2,n1); + return sqlite3_reset(pStmt); } /* -** Hash and comparison functions when the mode is FTS3_HASH_BINARY +** Set *pnSegment to the total number of segments in the database. Set +** *pnMax to the largest segment level in the database (segment levels +** are stored in the 'level' column of the %_segdir table). +** +** Return SQLITE_OK if successful, or an SQLite error code if not. */ -static int fts3BinHash(const void *pKey, int nKey){ - int h = 0; - const char *z = (const char *)pKey; - while( nKey-- > 0 ){ - h = (h<<3) ^ h ^ *(z++); +static int fts3SegmentCountMax(Fts3Table *p, int *pnSegment, int *pnMax){ + sqlite3_stmt *pStmt; + int rc; + + rc = fts3SqlStmt(p, SQL_SELECT_SEGDIR_COUNT_MAX, &pStmt, 0); + if( rc!=SQLITE_OK ) return rc; + if( SQLITE_ROW==sqlite3_step(pStmt) ){ + *pnSegment = sqlite3_column_int(pStmt, 0); + *pnMax = sqlite3_column_int(pStmt, 1); } - return h & 0x7fffffff; -} -static int fts3BinCompare(const void *pKey1, int n1, const void *pKey2, int n2){ - if( n1!=n2 ) return 1; - return memcmp(pKey1,pKey2,n1); + return sqlite3_reset(pStmt); } /* -** Return a pointer to the appropriate hash function given the key class. +** This function is used after merging multiple segments into a single large +** segment to delete the old, now redundant, segment b-trees. Specifically, +** it: +** +** 1) Deletes all %_segments entries for the segments associated with +** each of the SegReader objects in the array passed as the third +** argument, and ** -** The C syntax in this function definition may be unfamilar to some -** programmers, so we provide the following additional explanation: +** 2) deletes all %_segdir entries with level iLevel, or all %_segdir +** entries regardless of level if (iLevel<0). ** -** The name of the function is "ftsHashFunction". The function takes a -** single parameter "keyClass". The return value of ftsHashFunction() -** is a pointer to another function. Specifically, the return value -** of ftsHashFunction() is a pointer to a function that takes two parameters -** with types "const void*" and "int" and returns an "int". +** SQLITE_OK is returned if successful, otherwise an SQLite error code. */ -static int (*ftsHashFunction(int keyClass))(const void*,int){ - if( keyClass==FTS3_HASH_STRING ){ - return &fts3StrHash; +static int fts3DeleteSegdir( + Fts3Table *p, /* Virtual table handle */ + int iLevel, /* Level of %_segdir entries to delete */ + Fts3SegReader **apSegment, /* Array of SegReader objects */ + int nReader /* Size of array apSegment */ +){ + int rc; /* Return Code */ + int i; /* Iterator variable */ + sqlite3_stmt *pDelete; /* SQL statement to delete rows */ + + rc = fts3SqlStmt(p, SQL_DELETE_SEGMENTS_RANGE, &pDelete, 0); + for(i=0; rc==SQLITE_OK && iiStartBlock ){ + sqlite3_bind_int64(pDelete, 1, pSegment->iStartBlock); + sqlite3_bind_int64(pDelete, 2, pSegment->iEndBlock); + sqlite3_step(pDelete); + rc = sqlite3_reset(pDelete); + } + } + if( rc!=SQLITE_OK ){ + return rc; + } + + if( iLevel>=0 ){ + rc = fts3SqlStmt(p, SQL_DELETE_SEGDIR_BY_LEVEL, &pDelete, 0); + if( rc==SQLITE_OK ){ + sqlite3_bind_int(pDelete, 1, iLevel); + sqlite3_step(pDelete); + rc = sqlite3_reset(pDelete); + } }else{ - assert( keyClass==FTS3_HASH_BINARY ); - return &fts3BinHash; + rc = fts3SqlExec(p, SQL_DELETE_ALL_SEGDIR, 0); } + + return rc; } /* -** Return a pointer to the appropriate hash function given the key class. +** When this function is called, buffer *ppList (size *pnList bytes) contains +** a position list that may (or may not) feature multiple columns. This +** function adjusts the pointer *ppList and the length *pnList so that they +** identify the subset of the position list that corresponds to column iCol. ** -** For help in interpreted the obscure C code in the function definition, -** see the header comment on the previous function. +** If there are no entries in the input position list for column iCol, then +** *pnList is set to zero before returning. */ -static int (*ftsCompareFunction(int keyClass))(const void*,int,const void*,int){ - if( keyClass==FTS3_HASH_STRING ){ - return &fts3StrCompare; - }else{ - assert( keyClass==FTS3_HASH_BINARY ); - return &fts3BinCompare; +static void fts3ColumnFilter( + int iCol, /* Column to filter on */ + char **ppList, /* IN/OUT: Pointer to position list */ + int *pnList /* IN/OUT: Size of buffer *ppList in bytes */ +){ + char *pList = *ppList; + int nList = *pnList; + char *pEnd = &pList[nList]; + int iCurrent = 0; + char *p = pList; + + assert( iCol>=0 ); + while( 1 ){ + char c = 0; + while( pchain; - if( pHead ){ - pNew->next = pHead; - pNew->prev = pHead->prev; - if( pHead->prev ){ pHead->prev->next = pNew; } - else { pH->first = pNew; } - pHead->prev = pNew; - }else{ - pNew->next = pH->first; - if( pH->first ){ pH->first->prev = pNew; } - pNew->prev = 0; - pH->first = pNew; - } - pEntry->count++; - pEntry->chain = pNew; + SegmentWriter **ppW = (SegmentWriter **)pContext; + return fts3SegWriterAdd(p, ppW, 1, zTerm, nTerm, aDoclist, nDoclist); } - -/* Resize the hash table so that it cantains "new_size" buckets. -** "new_size" must be a power of 2. The hash table might fail -** to resize if sqliteMalloc() fails. +/* +** sqlite3Fts3SegReaderIterate() callback used when flushing the contents +** of the pending-terms hash table to the database. */ -static void fts3Rehash(fts3Hash *pH, int new_size){ - struct _fts3ht *new_ht; /* The new hash table */ - fts3HashElem *elem, *next_elem; /* For looping over existing elements */ - int (*xHash)(const void*,int); /* The hash function */ +static int fts3FlushCallback( + Fts3Table *p, /* FTS3 Virtual table handle */ + void *pContext, /* Pointer to SegmentWriter* to write with */ + char *zTerm, /* Term to write to the db */ + int nTerm, /* Number of bytes in zTerm */ + char *aDoclist, /* Doclist associated with zTerm */ + int nDoclist /* Number of bytes in doclist */ +){ + SegmentWriter **ppW = (SegmentWriter **)pContext; + return fts3SegWriterAdd(p, ppW, 0, zTerm, nTerm, aDoclist, nDoclist); +} + +/* +** This function is used to iterate through a contiguous set of terms +** stored in the full-text index. It merges data contained in one or +** more segments to support this. +** +** The second argument is passed an array of pointers to SegReader objects +** allocated with sqlite3Fts3SegReaderNew(). This function merges the range +** of terms selected by each SegReader. If a single term is present in +** more than one segment, the associated doclists are merged. For each +** term and (possibly merged) doclist in the merged range, the callback +** function xFunc is invoked with its arguments set as follows. +** +** arg 0: Copy of 'p' parameter passed to this function +** arg 1: Copy of 'pContext' parameter passed to this function +** arg 2: Pointer to buffer containing term +** arg 3: Size of arg 2 buffer in bytes +** arg 4: Pointer to buffer containing doclist +** arg 5: Size of arg 2 buffer in bytes +** +** The 4th argument to this function is a pointer to a structure of type +** Fts3SegFilter, defined in fts3Int.h. The contents of this structure +** further restrict the range of terms that callbacks are made for and +** modify the behaviour of this function. See comments above structure +** definition for details. +*/ +SQLITE_PRIVATE int sqlite3Fts3SegReaderIterate( + Fts3Table *p, /* Virtual table handle */ + Fts3SegReader **apSegment, /* Array of Fts3SegReader objects */ + int nSegment, /* Size of apSegment array */ + Fts3SegFilter *pFilter, /* Restrictions on range of iteration */ + int (*xFunc)(Fts3Table *, void *, char *, int, char *, int), /* Callback */ + void *pContext /* Callback context (2nd argument) */ +){ + int i; /* Iterator variable */ + char *aBuffer = 0; /* Buffer to merge doclists in */ + int nAlloc = 0; /* Allocated size of aBuffer buffer */ + int rc = SQLITE_OK; /* Return code */ - assert( (new_size & (new_size-1))==0 ); - new_ht = (struct _fts3ht *)fts3HashMalloc( new_size*sizeof(struct _fts3ht) ); - if( new_ht==0 ) return; - fts3HashFree(pH->ht); - pH->ht = new_ht; - pH->htsize = new_size; - xHash = ftsHashFunction(pH->keyClass); - for(elem=pH->first, pH->first=0; elem; elem = next_elem){ - int h = (*xHash)(elem->pKey, elem->nKey) & (new_size-1); - next_elem = elem->next; - fts3HashInsertElement(pH, &new_ht[h], elem); + int isIgnoreEmpty = (pFilter->flags & FTS3_SEGMENT_IGNORE_EMPTY); + int isRequirePos = (pFilter->flags & FTS3_SEGMENT_REQUIRE_POS); + int isColFilter = (pFilter->flags & FTS3_SEGMENT_COLUMN_FILTER); + int isPrefix = (pFilter->flags & FTS3_SEGMENT_PREFIX); + + /* If there are zero segments, this function is a no-op. This scenario + ** comes about only when reading from an empty database. + */ + if( nSegment==0 ) goto finished; + + /* If the Fts3SegFilter defines a specific term (or term prefix) to search + ** for, then advance each segment iterator until it points to a term of + ** equal or greater value than the specified term. This prevents many + ** unnecessary merge/sort operations for the case where single segment + ** b-tree leaf nodes contain more than one term. + */ + if( pFilter->zTerm ){ + int nTerm = pFilter->nTerm; + const char *zTerm = pFilter->zTerm; + for(i=0; iaNode ){ + int nTerm = apSegment[0]->nTerm; + char *zTerm = apSegment[0]->zTerm; + int nMerge = 1; - if( pH->ht ){ - struct _fts3ht *pEntry = &pH->ht[h]; - elem = pEntry->chain; - count = pEntry->count; - xCompare = ftsCompareFunction(pH->keyClass); - while( count-- && elem ){ - if( (*xCompare)(elem->pKey,elem->nKey,pKey,nKey)==0 ){ - return elem; + /* If this is a prefix-search, and if the term that apSegment[0] points + ** to does not share a suffix with pFilter->zTerm/nTerm, then all + ** required callbacks have been made. In this case exit early. + ** + ** Similarly, if this is a search for an exact match, and the first term + ** of segment apSegment[0] is not a match, exit early. + */ + if( pFilter->zTerm ){ + if( nTermnTerm + || (!isPrefix && nTerm>pFilter->nTerm) + || memcmp(zTerm, pFilter->zTerm, pFilter->nTerm) + ){ + goto finished; + } + } + + while( nMergeaNode + && apSegment[nMerge]->nTerm==nTerm + && 0==memcmp(zTerm, apSegment[nMerge]->zTerm, nTerm) + ){ + nMerge++; + } + + assert( isIgnoreEmpty || (isRequirePos && !isColFilter) ); + if( nMerge==1 && !isIgnoreEmpty ){ + Fts3SegReader *p0 = apSegment[0]; + rc = xFunc(p, pContext, zTerm, nTerm, p0->aDoclist, p0->nDoclist); + if( rc!=SQLITE_OK ) goto finished; + }else{ + int nDoclist = 0; /* Size of doclist */ + sqlite3_int64 iPrev = 0; /* Previous docid stored in doclist */ + + /* The current term of the first nMerge entries in the array + ** of Fts3SegReader objects is the same. The doclists must be merged + ** and a single term added to the new segment. + */ + for(i=0; ipOffsetList ){ + int j; /* Number of segments that share a docid */ + char *pList; + int nList; + int nByte; + sqlite3_int64 iDocid = apSegment[0]->iDocid; + fts3SegReaderNextDocid(apSegment[0], &pList, &nList); + j = 1; + while( jpOffsetList + && apSegment[j]->iDocid==iDocid + ){ + fts3SegReaderNextDocid(apSegment[j], 0, 0); + j++; + } + + if( isColFilter ){ + fts3ColumnFilter(pFilter->iCol, &pList, &nList); + } + + if( !isIgnoreEmpty || nList>0 ){ + nByte = sqlite3Fts3VarintLen(iDocid-iPrev) + (isRequirePos?nList+1:0); + if( nDoclist+nByte>nAlloc ){ + char *aNew; + nAlloc = nDoclist+nByte*2; + aNew = sqlite3_realloc(aBuffer, nAlloc); + if( !aNew ){ + rc = SQLITE_NOMEM; + goto finished; + } + aBuffer = aNew; + } + nDoclist += sqlite3Fts3PutVarint(&aBuffer[nDoclist], iDocid-iPrev); + iPrev = iDocid; + if( isRequirePos ){ + memcpy(&aBuffer[nDoclist], pList, nList); + nDoclist += nList; + aBuffer[nDoclist++] = '\0'; + } + } + + fts3SegReaderSort(apSegment, nMerge, j, fts3SegReaderDoclistCmp); + } + + if( nDoclist>0 ){ + rc = xFunc(p, pContext, zTerm, nTerm, aBuffer, nDoclist); + if( rc!=SQLITE_OK ) goto finished; } - elem = elem->next; } + + /* If there is a term specified to filter on, and this is not a prefix + ** search, return now. The callback that corresponds to the required + ** term (if such a term exists in the index) has already been made. + */ + if( pFilter->zTerm && !isPrefix ){ + goto finished; + } + + for(i=0; iprev ){ - elem->prev->next = elem->next; +static int fts3SegmentMerge(Fts3Table *p, int iLevel){ + int i; /* Iterator variable */ + int rc; /* Return code */ + int iIdx; /* Index of new segment */ + int iNewLevel; /* Level to create new segment at */ + sqlite3_stmt *pStmt = 0; + SegmentWriter *pWriter = 0; + int nSegment = 0; /* Number of segments being merged */ + Fts3SegReader **apSegment = 0; /* Array of Segment iterators */ + Fts3SegReader *pPending = 0; /* Iterator for pending-terms */ + Fts3SegFilter filter; /* Segment term filter condition */ + + if( iLevel<0 ){ + /* This call is to merge all segments in the database to a single + ** segment. The level of the new segment is equal to the the numerically + ** greatest segment level currently present in the database. The index + ** of the new segment is always 0. + */ + iIdx = 0; + rc = sqlite3Fts3SegReaderPending(p, 0, 0, 1, &pPending); + if( rc!=SQLITE_OK ) goto finished; + rc = fts3SegmentCountMax(p, &nSegment, &iNewLevel); + if( rc!=SQLITE_OK ) goto finished; + nSegment += (pPending!=0); + if( nSegment<=1 ){ + return SQLITE_DONE; + } }else{ - pH->first = elem->next; - } - if( elem->next ){ - elem->next->prev = elem->prev; + /* This call is to merge all segments at level iLevel. Find the next + ** available segment index at level iLevel+1. The call to + ** fts3AllocateSegdirIdx() will merge the segments at level iLevel+1 to + ** a single iLevel+2 segment if necessary. + */ + iNewLevel = iLevel+1; + rc = fts3AllocateSegdirIdx(p, iNewLevel, &iIdx); + if( rc!=SQLITE_OK ) goto finished; + rc = fts3SegmentCount(p, iLevel, &nSegment); + if( rc!=SQLITE_OK ) goto finished; + } + assert( nSegment>0 ); + assert( iNewLevel>=0 ); + + /* Allocate space for an array of pointers to segment iterators. */ + apSegment = (Fts3SegReader**)sqlite3_malloc(sizeof(Fts3SegReader *)*nSegment); + if( !apSegment ){ + rc = SQLITE_NOMEM; + goto finished; } - pEntry = &pH->ht[h]; - if( pEntry->chain==elem ){ - pEntry->chain = elem->next; + memset(apSegment, 0, sizeof(Fts3SegReader *)*nSegment); + + /* Allocate a Fts3SegReader structure for each segment being merged. A + ** Fts3SegReader stores the state data required to iterate through all + ** entries on all leaves of a single segment. + */ + assert( SQL_SELECT_LEVEL+1==SQL_SELECT_ALL_LEVEL); + rc = fts3SqlStmt(p, SQL_SELECT_LEVEL+(iLevel<0), &pStmt, 0); + if( rc!=SQLITE_OK ) goto finished; + sqlite3_bind_int(pStmt, 1, iLevel); + for(i=0; SQLITE_ROW==(sqlite3_step(pStmt)); i++){ + rc = fts3SegReaderNew(p, pStmt, i, &apSegment[i]); + if( rc!=SQLITE_OK ){ + goto finished; + } } - pEntry->count--; - if( pEntry->count<=0 ){ - pEntry->chain = 0; + rc = sqlite3_reset(pStmt); + if( pPending ){ + apSegment[i] = pPending; + pPending = 0; } - if( pH->copyKey && elem->pKey ){ - fts3HashFree(elem->pKey); + pStmt = 0; + if( rc!=SQLITE_OK ) goto finished; + + memset(&filter, 0, sizeof(Fts3SegFilter)); + filter.flags = FTS3_SEGMENT_REQUIRE_POS; + filter.flags |= (iLevel<0 ? FTS3_SEGMENT_IGNORE_EMPTY : 0); + rc = sqlite3Fts3SegReaderIterate(p, apSegment, nSegment, + &filter, fts3MergeCallback, (void *)&pWriter + ); + if( rc!=SQLITE_OK ) goto finished; + + rc = fts3DeleteSegdir(p, iLevel, apSegment, nSegment); + if( rc==SQLITE_OK ){ + rc = fts3SegWriterFlush(p, pWriter, iNewLevel, iIdx); } - fts3HashFree( elem ); - pH->count--; - if( pH->count<=0 ){ - assert( pH->first==0 ); - assert( pH->count==0 ); - fts3HashClear(pH); + + finished: + fts3SegWriterFree(pWriter); + if( apSegment ){ + for(i=0; iht==0 ) return 0; - xHash = ftsHashFunction(pH->keyClass); - assert( xHash!=0 ); - h = (*xHash)(pKey,nKey); - assert( (pH->htsize & (pH->htsize-1))==0 ); - elem = fts3FindElementByHash(pH,pKey,nKey, h & (pH->htsize-1)); - return elem ? elem->data : 0; -} -/* Insert an element into the hash table pH. The key is pKey,nKey -** and the data is "data". -** -** If no element exists with a matching key, then a new -** element is created. A copy of the key is made if the copyKey -** flag is set. NULL is returned. -** -** If another element already exists with the same key, then the -** new data replaces the old data and the old data is returned. -** The key is not copied in this instance. If a malloc fails, then -** the new data is returned and the hash table is unchanged. -** -** If the "data" parameter to this function is NULL, then the -** element corresponding to "key" is removed from the hash table. +/* +** Flush the contents of pendingTerms to a level 0 segment. */ -SQLITE_PRIVATE void *sqlite3Fts3HashInsert( - fts3Hash *pH, /* The hash table to insert into */ - const void *pKey, /* The key */ - int nKey, /* Number of bytes in the key */ - void *data /* The data */ -){ - int hraw; /* Raw hash value of the key */ - int h; /* the hash of the key modulo hash table size */ - fts3HashElem *elem; /* Used to loop thru the element list */ - fts3HashElem *new_elem; /* New element added to the pH */ - int (*xHash)(const void*,int); /* The hash function */ +SQLITE_PRIVATE int sqlite3Fts3PendingTermsFlush(Fts3Table *p){ + int rc; /* Return Code */ + int idx; /* Index of new segment created */ + SegmentWriter *pWriter = 0; /* Used to write the segment */ + Fts3SegReader *pReader = 0; /* Used to iterate through the hash table */ - assert( pH!=0 ); - xHash = ftsHashFunction(pH->keyClass); - assert( xHash!=0 ); - hraw = (*xHash)(pKey, nKey); - assert( (pH->htsize & (pH->htsize-1))==0 ); - h = hraw & (pH->htsize-1); - elem = fts3FindElementByHash(pH,pKey,nKey,h); - if( elem ){ - void *old_data = elem->data; - if( data==0 ){ - fts3RemoveElementByHash(pH,elem,h); - }else{ - elem->data = data; - } - return old_data; + /* Allocate a SegReader object to iterate through the contents of the + ** pending-terms table. If an error occurs, or if there are no terms + ** in the pending-terms table, return immediately. + */ + rc = sqlite3Fts3SegReaderPending(p, 0, 0, 1, &pReader); + if( rc!=SQLITE_OK || pReader==0 ){ + return rc; } - if( data==0 ) return 0; - if( pH->htsize==0 ){ - fts3Rehash(pH,8); - if( pH->htsize==0 ){ - pH->count = 0; - return data; - } + + /* Determine the next index at level 0. If level 0 is already full, this + ** call may merge all existing level 0 segments into a single level 1 + ** segment. + */ + rc = fts3AllocateSegdirIdx(p, 0, &idx); + + /* If no errors have occured, iterate through the contents of the + ** pending-terms hash table using the Fts3SegReader iterator. The callback + ** writes each term (along with its doclist) to the database via the + ** SegmentWriter handle pWriter. + */ + if( rc==SQLITE_OK ){ + void *c = (void *)&pWriter; /* SegReaderIterate() callback context */ + Fts3SegFilter f; /* SegReaderIterate() parameters */ + + memset(&f, 0, sizeof(Fts3SegFilter)); + f.flags = FTS3_SEGMENT_REQUIRE_POS; + rc = sqlite3Fts3SegReaderIterate(p, &pReader, 1, &f, fts3FlushCallback, c); } - new_elem = (fts3HashElem*)fts3HashMalloc( sizeof(fts3HashElem) ); - if( new_elem==0 ) return data; - if( pH->copyKey && pKey!=0 ){ - new_elem->pKey = fts3HashMalloc( nKey ); - if( new_elem->pKey==0 ){ - fts3HashFree(new_elem); - return data; - } - memcpy((void*)new_elem->pKey, pKey, nKey); - }else{ - new_elem->pKey = (void*)pKey; + assert( pWriter || rc!=SQLITE_OK ); + + /* If no errors have occured, flush the SegmentWriter object to the + ** database. Then delete the SegmentWriter and Fts3SegReader objects + ** allocated by this function. + */ + if( rc==SQLITE_OK ){ + rc = fts3SegWriterFlush(p, pWriter, 0, idx); } - new_elem->nKey = nKey; - pH->count++; - if( pH->count > pH->htsize ){ - fts3Rehash(pH,pH->htsize*2); + fts3SegWriterFree(pWriter); + sqlite3Fts3SegReaderFree(p, pReader); + + if( rc==SQLITE_OK ){ + sqlite3Fts3PendingTermsClear(p); } - assert( pH->htsize>0 ); - assert( (pH->htsize & (pH->htsize-1))==0 ); - h = hraw & (pH->htsize-1); - fts3HashInsertElement(pH, &pH->ht[h], new_elem); - new_elem->data = data; - return 0; + return rc; } -#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */ - -/************** End of fts3_hash.c *******************************************/ -/************** Begin file fts3_porter.c *************************************/ -/* -** 2006 September 30 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** Implementation of the full-text-search tokenizer that implements -** a Porter stemmer. -*/ - /* -** The code in this file is only compiled if: +** Handle a 'special' INSERT of the form: ** -** * The FTS3 module is being built as an extension -** (in which case SQLITE_CORE is not defined), or +** "INSERT INTO tbl(tbl) VALUES()" ** -** * The FTS3 module is being built into the core of -** SQLite (in which case SQLITE_ENABLE_FTS3 is defined). +** Argument pVal contains the result of . Currently the only +** meaningful value to insert is the text 'optimize'. */ -#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) - - +static int fts3SpecialInsert(Fts3Table *p, sqlite3_value *pVal){ + int rc; /* Return Code */ + const char *zVal = (const char *)sqlite3_value_text(pVal); + int nVal = sqlite3_value_bytes(pVal); + if( !zVal ){ + return SQLITE_NOMEM; + }else if( nVal==8 && 0==sqlite3_strnicmp(zVal, "optimize", 8) ){ + rc = fts3SegmentMerge(p, -1); + if( rc==SQLITE_DONE ){ + rc = SQLITE_OK; + }else{ + sqlite3Fts3PendingTermsClear(p); + } +#ifdef SQLITE_TEST + }else if( nVal>9 && 0==sqlite3_strnicmp(zVal, "nodesize=", 9) ){ + p->nNodeSize = atoi(&zVal[9]); + rc = SQLITE_OK; + }else if( nVal>11 && 0==sqlite3_strnicmp(zVal, "maxpending=", 9) ){ + p->nMaxPendingData = atoi(&zVal[11]); + rc = SQLITE_OK; +#endif + }else{ + rc = SQLITE_ERROR; + } -/* -** Class derived from sqlite3_tokenizer -*/ -typedef struct porter_tokenizer { - sqlite3_tokenizer base; /* Base class */ -} porter_tokenizer; + return rc; +} /* -** Class derived from sqlit3_tokenizer_cursor +** This function does the work for the xUpdate method of FTS3 virtual +** tables. */ -typedef struct porter_tokenizer_cursor { - sqlite3_tokenizer_cursor base; - const char *zInput; /* input we are tokenizing */ - int nInput; /* size of the input */ - int iOffset; /* current position in zInput */ - int iToken; /* index of next token to be returned */ - char *zToken; /* storage for current token */ - int nAllocated; /* space allocated to zToken buffer */ -} porter_tokenizer_cursor; - +SQLITE_PRIVATE int sqlite3Fts3UpdateMethod( + sqlite3_vtab *pVtab, /* FTS3 vtab object */ + int nArg, /* Size of argument array */ + sqlite3_value **apVal, /* Array of arguments */ + sqlite_int64 *pRowid /* OUT: The affected (or effected) rowid */ +){ + Fts3Table *p = (Fts3Table *)pVtab; + int rc = SQLITE_OK; /* Return Code */ + int isRemove = 0; /* True for an UPDATE or DELETE */ + sqlite3_int64 iRemove = 0; /* Rowid removed by UPDATE or DELETE */ -/* Forward declaration */ -static const sqlite3_tokenizer_module porterTokenizerModule; + /* If this is a DELETE or UPDATE operation, remove the old record. */ + if( sqlite3_value_type(apVal[0])!=SQLITE_NULL ){ + int isEmpty; + rc = fts3IsEmpty(p, apVal, &isEmpty); + if( rc==SQLITE_OK ){ + if( isEmpty ){ + /* Deleting this row means the whole table is empty. In this case + ** delete the contents of all three tables and throw away any + ** data in the pendingTerms hash table. + */ + rc = fts3DeleteAll(p); + }else{ + isRemove = 1; + iRemove = sqlite3_value_int64(apVal[0]); + rc = fts3PendingTermsDocid(p, iRemove); + if( rc==SQLITE_OK ){ + rc = fts3DeleteTerms(p, apVal); + if( rc==SQLITE_OK ){ + rc = fts3SqlExec(p, SQL_DELETE_CONTENT, apVal); + } + } + } + } + }else if( sqlite3_value_type(apVal[p->nColumn+2])!=SQLITE_NULL ){ + return fts3SpecialInsert(p, apVal[p->nColumn+2]); + } + + /* If this is an INSERT or UPDATE operation, insert the new record. */ + if( nArg>1 && rc==SQLITE_OK ){ + rc = fts3InsertData(p, apVal, pRowid); + if( rc==SQLITE_OK && (!isRemove || *pRowid!=iRemove) ){ + rc = fts3PendingTermsDocid(p, *pRowid); + } + if( rc==SQLITE_OK ){ + rc = fts3InsertTerms(p, apVal); + } + } -/* -** Create a new tokenizer instance. -*/ -static int porterCreate( - int argc, const char * const *argv, - sqlite3_tokenizer **ppTokenizer -){ - porter_tokenizer *t; - t = (porter_tokenizer *) sqlite3_malloc(sizeof(*t)); - if( t==NULL ) return SQLITE_NOMEM; - memset(t, 0, sizeof(*t)); - *ppTokenizer = &t->base; - return SQLITE_OK; + return rc; } -/* -** Destroy a tokenizer +/* +** Flush any data in the pending-terms hash table to disk. If successful, +** merge all segments in the database (including the new segment, if +** there was any data to flush) into a single segment. */ -static int porterDestroy(sqlite3_tokenizer *pTokenizer){ - sqlite3_free(pTokenizer); - return SQLITE_OK; +SQLITE_PRIVATE int sqlite3Fts3Optimize(Fts3Table *p){ + int rc; + rc = sqlite3_exec(p->db, "SAVEPOINT fts3", 0, 0, 0); + if( rc==SQLITE_OK ){ + rc = fts3SegmentMerge(p, -1); + if( rc==SQLITE_OK ){ + rc = sqlite3_exec(p->db, "RELEASE fts3", 0, 0, 0); + if( rc==SQLITE_OK ){ + sqlite3Fts3PendingTermsClear(p); + } + }else{ + sqlite3_exec(p->db, "ROLLBACK TO fts3", 0, 0, 0); + sqlite3_exec(p->db, "RELEASE fts3", 0, 0, 0); + } + } + return rc; } +#endif + +/************** End of fts3_write.c ******************************************/ +/************** Begin file fts3_snippet.c ************************************/ /* -** Prepare to begin tokenizing a particular string. The input -** string to be tokenized is zInput[0..nInput-1]. A cursor -** used to incrementally tokenize this string is returned in -** *ppCursor. +** 2009 Oct 23 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +****************************************************************************** */ -static int porterOpen( - sqlite3_tokenizer *pTokenizer, /* The tokenizer */ - const char *zInput, int nInput, /* String to be tokenized */ - sqlite3_tokenizer_cursor **ppCursor /* OUT: Tokenization cursor */ -){ - porter_tokenizer_cursor *c; - c = (porter_tokenizer_cursor *) sqlite3_malloc(sizeof(*c)); - if( c==NULL ) return SQLITE_NOMEM; +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) - c->zInput = zInput; - if( zInput==0 ){ - c->nInput = 0; - }else if( nInput<0 ){ - c->nInput = (int)strlen(zInput); - }else{ - c->nInput = nInput; - } - c->iOffset = 0; /* start tokenizing at the beginning */ - c->iToken = 0; - c->zToken = NULL; /* no space allocated, yet. */ - c->nAllocated = 0; - *ppCursor = &c->base; - return SQLITE_OK; -} +typedef struct Snippet Snippet; /* -** Close a tokenization cursor previously opened by a call to -** porterOpen() above. +** An instance of the following structure keeps track of generated +** matching-word offset information and snippets. */ -static int porterClose(sqlite3_tokenizer_cursor *pCursor){ - porter_tokenizer_cursor *c = (porter_tokenizer_cursor *) pCursor; - sqlite3_free(c->zToken); - sqlite3_free(c); - return SQLITE_OK; +struct Snippet { + int nMatch; /* Total number of matches */ + int nAlloc; /* Space allocated for aMatch[] */ + struct snippetMatch { /* One entry for each matching term */ + char snStatus; /* Status flag for use while constructing snippets */ + short int nByte; /* Number of bytes in the term */ + short int iCol; /* The column that contains the match */ + short int iTerm; /* The index in Query.pTerms[] of the matching term */ + int iToken; /* The index of the matching document token */ + int iStart; /* The offset to the first character of the term */ + } *aMatch; /* Points to space obtained from malloc */ + char *zOffset; /* Text rendering of aMatch[] */ + int nOffset; /* strlen(zOffset) */ + char *zSnippet; /* Snippet text */ + int nSnippet; /* strlen(zSnippet) */ +}; + + +/* It is not safe to call isspace(), tolower(), or isalnum() on +** hi-bit-set characters. This is the same solution used in the +** tokenizer. +*/ +static int fts3snippetIsspace(char c){ + return (c&0x80)==0 ? isspace(c) : 0; } + + /* -** Vowel or consonant +** A StringBuffer object holds a zero-terminated string that grows +** arbitrarily by appending. Space to hold the string is obtained +** from sqlite3_malloc(). After any memory allocation failure, +** StringBuffer.z is set to NULL and no further allocation is attempted. */ -static const char cType[] = { - 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, - 1, 1, 1, 2, 1 -}; +typedef struct StringBuffer { + char *z; /* Text of the string. Space from malloc. */ + int nUsed; /* Number bytes of z[] used, not counting \000 terminator */ + int nAlloc; /* Bytes allocated for z[] */ +} StringBuffer; + /* -** isConsonant() and isVowel() determine if their first character in -** the string they point to is a consonant or a vowel, according -** to Porter ruls. -** -** A consonate is any letter other than 'a', 'e', 'i', 'o', or 'u'. -** 'Y' is a consonant unless it follows another consonant, -** in which case it is a vowel. -** -** In these routine, the letters are in reverse order. So the 'y' rule -** is that 'y' is a consonant unless it is followed by another -** consonent. +** Initialize a new StringBuffer. */ -static int isVowel(const char*); -static int isConsonant(const char *z){ - int j; - char x = *z; - if( x==0 ) return 0; - assert( x>='a' && x<='z' ); - j = cType[x-'a']; - if( j<2 ) return j; - return z[1]==0 || isVowel(z + 1); -} -static int isVowel(const char *z){ - int j; - char x = *z; - if( x==0 ) return 0; - assert( x>='a' && x<='z' ); - j = cType[x-'a']; - if( j<2 ) return 1-j; - return isConsonant(z + 1); +static void fts3SnippetSbInit(StringBuffer *p){ + p->nAlloc = 100; + p->nUsed = 0; + p->z = sqlite3_malloc( p->nAlloc ); } /* -** Let any sequence of one or more vowels be represented by V and let -** C be sequence of one or more consonants. Then every word can be -** represented as: -** -** [C] (VC){m} [V] -** -** In prose: A word is an optional consonant followed by zero or -** vowel-consonant pairs followed by an optional vowel. "m" is the -** number of vowel consonant pairs. This routine computes the value -** of m for the first i bytes of a word. -** -** Return true if the m-value for z is 1 or more. In other words, -** return true if z contains at least one vowel that is followed -** by a consonant. -** -** In this routine z[] is in reverse order. So we are really looking -** for an instance of of a consonant followed by a vowel. +** Append text to the string buffer. */ -static int m_gt_0(const char *z){ - while( isVowel(z) ){ z++; } - if( *z==0 ) return 0; - while( isConsonant(z) ){ z++; } - return *z!=0; +static void fts3SnippetAppend(StringBuffer *p, const char *zNew, int nNew){ + if( p->z==0 ) return; + if( nNew<0 ) nNew = (int)strlen(zNew); + if( p->nUsed + nNew >= p->nAlloc ){ + int nAlloc; + char *zNew; + + nAlloc = p->nUsed + nNew + p->nAlloc; + zNew = sqlite3_realloc(p->z, nAlloc); + if( zNew==0 ){ + sqlite3_free(p->z); + p->z = 0; + return; + } + p->z = zNew; + p->nAlloc = nAlloc; + } + memcpy(&p->z[p->nUsed], zNew, nNew); + p->nUsed += nNew; + p->z[p->nUsed] = 0; } -/* Like mgt0 above except we are looking for a value of m which is -** exactly 1 +/* If the StringBuffer ends in something other than white space, add a +** single space character to the end. */ -static int m_eq_1(const char *z){ - while( isVowel(z) ){ z++; } - if( *z==0 ) return 0; - while( isConsonant(z) ){ z++; } - if( *z==0 ) return 0; - while( isVowel(z) ){ z++; } - if( *z==0 ) return 1; - while( isConsonant(z) ){ z++; } - return *z==0; +static void fts3SnippetAppendWhiteSpace(StringBuffer *p){ + if( p->z && p->nUsed && !fts3snippetIsspace(p->z[p->nUsed-1]) ){ + fts3SnippetAppend(p, " ", 1); + } } -/* Like mgt0 above except we are looking for a value of m>1 instead -** or m>0 -*/ -static int m_gt_1(const char *z){ - while( isVowel(z) ){ z++; } - if( *z==0 ) return 0; - while( isConsonant(z) ){ z++; } - if( *z==0 ) return 0; - while( isVowel(z) ){ z++; } - if( *z==0 ) return 0; - while( isConsonant(z) ){ z++; } - return *z!=0; +/* Remove white space from the end of the StringBuffer */ +static void fts3SnippetTrimWhiteSpace(StringBuffer *p){ + if( p->z ){ + while( p->nUsed && fts3snippetIsspace(p->z[p->nUsed-1]) ){ + p->nUsed--; + } + p->z[p->nUsed] = 0; + } } -/* -** Return TRUE if there is a vowel anywhere within z[0..n-1] +/* +** Release all memory associated with the Snippet structure passed as +** an argument. */ -static int hasVowel(const char *z){ - while( isConsonant(z) ){ z++; } - return *z!=0; +static void fts3SnippetFree(Snippet *p){ + if( p ){ + sqlite3_free(p->aMatch); + sqlite3_free(p->zOffset); + sqlite3_free(p->zSnippet); + sqlite3_free(p); + } } /* -** Return TRUE if the word ends in a double consonant. -** -** The text is reversed here. So we are really looking at -** the first two characters of z[]. +** Append a single entry to the p->aMatch[] log. */ -static int doubleConsonant(const char *z){ - return isConsonant(z) && z[0]==z[1] && isConsonant(z+1); +static int snippetAppendMatch( + Snippet *p, /* Append the entry to this snippet */ + int iCol, int iTerm, /* The column and query term */ + int iToken, /* Matching token in document */ + int iStart, int nByte /* Offset and size of the match */ +){ + int i; + struct snippetMatch *pMatch; + if( p->nMatch+1>=p->nAlloc ){ + struct snippetMatch *pNew; + p->nAlloc = p->nAlloc*2 + 10; + pNew = sqlite3_realloc(p->aMatch, p->nAlloc*sizeof(p->aMatch[0]) ); + if( pNew==0 ){ + p->aMatch = 0; + p->nMatch = 0; + p->nAlloc = 0; + return SQLITE_NOMEM; + } + p->aMatch = pNew; + } + i = p->nMatch++; + pMatch = &p->aMatch[i]; + pMatch->iCol = (short)iCol; + pMatch->iTerm = (short)iTerm; + pMatch->iToken = iToken; + pMatch->iStart = iStart; + pMatch->nByte = (short)nByte; + return SQLITE_OK; } /* -** Return TRUE if the word ends with three letters which -** are consonant-vowel-consonent and where the final consonant -** is not 'w', 'x', or 'y'. -** -** The word is reversed here. So we are really checking the -** first three letters and the first one cannot be in [wxy]. +** Sizing information for the circular buffer used in snippetOffsetsOfColumn() */ -static int star_oh(const char *z){ - return - z[0]!=0 && isConsonant(z) && - z[0]!='w' && z[0]!='x' && z[0]!='y' && - z[1]!=0 && isVowel(z+1) && - z[2]!=0 && isConsonant(z+2); -} +#define FTS3_ROTOR_SZ (32) +#define FTS3_ROTOR_MASK (FTS3_ROTOR_SZ-1) /* -** If the word ends with zFrom and xCond() is true for the stem -** of the word that preceeds the zFrom ending, then change the -** ending to zTo. -** -** The input word *pz and zFrom are both in reverse order. zTo -** is in normal order. +** Function to iterate through the tokens of a compiled expression. ** -** Return TRUE if zFrom matches. Return FALSE if zFrom does not -** match. Not that TRUE is returned even if xCond() fails and -** no substitution occurs. +** Except, skip all tokens on the right-hand side of a NOT operator. +** This function is used to find tokens as part of snippet and offset +** generation and we do nt want snippets and offsets to report matches +** for tokens on the RHS of a NOT. */ -static int stem( - char **pz, /* The word being stemmed (Reversed) */ - const char *zFrom, /* If the ending matches this... (Reversed) */ - const char *zTo, /* ... change the ending to this (not reversed) */ - int (*xCond)(const char*) /* Condition that must be true */ -){ - char *z = *pz; - while( *zFrom && *zFrom==*z ){ z++; zFrom++; } - if( *zFrom!=0 ) return 0; - if( xCond && !xCond(z) ) return 1; - while( *zTo ){ - *(--z) = *(zTo++); +static int fts3NextExprToken(Fts3Expr **ppExpr, int *piToken){ + Fts3Expr *p = *ppExpr; + int iToken = *piToken; + if( iToken<0 ){ + /* In this case the expression p is the root of an expression tree. + ** Move to the first token in the expression tree. + */ + while( p->pLeft ){ + p = p->pLeft; + } + iToken = 0; + }else{ + assert(p && p->eType==FTSQUERY_PHRASE ); + if( iToken<(p->pPhrase->nToken-1) ){ + iToken++; + }else{ + iToken = 0; + while( p->pParent && p->pParent->pLeft!=p ){ + assert( p->pParent->pRight==p ); + p = p->pParent; + } + p = p->pParent; + if( p ){ + assert( p->pRight!=0 ); + p = p->pRight; + while( p->pLeft ){ + p = p->pLeft; + } + } + } } - *pz = z; - return 1; + + *ppExpr = p; + *piToken = iToken; + return p?1:0; } /* -** This is the fallback stemmer used when the porter stemmer is -** inappropriate. The input word is copied into the output with -** US-ASCII case folding. If the input word is too long (more -** than 20 bytes if it contains no digits or more than 6 bytes if -** it contains digits) then word is truncated to 20 or 6 bytes -** by taking 10 or 3 bytes from the beginning and end. +** Return TRUE if the expression node pExpr is located beneath the +** RHS of a NOT operator. */ -static void copy_stemmer(const char *zIn, int nIn, char *zOut, int *pnOut){ - int i, mx, j; - int hasDigit = 0; - for(i=0; i='A' && c<='Z' ){ - zOut[i] = c - 'A' + 'a'; - }else{ - if( c>='0' && c<='9' ) hasDigit = 1; - zOut[i] = c; +static int fts3ExprBeneathNot(Fts3Expr *p){ + Fts3Expr *pParent; + while( p ){ + pParent = p->pParent; + if( pParent && pParent->eType==FTSQUERY_NOT && pParent->pRight==p ){ + return 1; } + p = pParent; } - mx = hasDigit ? 3 : 10; - if( nIn>mx*2 ){ - for(j=mx, i=nIn-mx; iaMatch[] for every match that occurs against +** document zDoc[0..nDoc-1] which is stored in column iColumn. +*/ +static int snippetOffsetsOfColumn( + Fts3Cursor *pCur, /* The fulltest search cursor */ + Snippet *pSnippet, /* The Snippet object to be filled in */ + int iColumn, /* Index of fulltext table column */ + const char *zDoc, /* Text of the fulltext table column */ + int nDoc /* Length of zDoc in bytes */ +){ + const sqlite3_tokenizer_module *pTModule; /* The tokenizer module */ + sqlite3_tokenizer *pTokenizer; /* The specific tokenizer */ + sqlite3_tokenizer_cursor *pTCursor; /* Tokenizer cursor */ + Fts3Table *pVtab; /* The full text index */ + int nColumn; /* Number of columns in the index */ + int i, j; /* Loop counters */ + int rc; /* Return code */ + unsigned int match, prevMatch; /* Phrase search bitmasks */ + const char *zToken; /* Next token from the tokenizer */ + int nToken; /* Size of zToken */ + int iBegin, iEnd, iPos; /* Offsets of beginning and end */ + + /* The following variables keep a circular buffer of the last + ** few tokens */ + unsigned int iRotor = 0; /* Index of current token */ + int iRotorBegin[FTS3_ROTOR_SZ]; /* Beginning offset of token */ + int iRotorLen[FTS3_ROTOR_SZ]; /* Length of token */ + + pVtab = (Fts3Table *)pCur->base.pVtab; + nColumn = pVtab->nColumn; + pTokenizer = pVtab->pTokenizer; + pTModule = pTokenizer->pModule; + rc = pTModule->xOpen(pTokenizer, zDoc, nDoc, &pTCursor); + if( rc ) return rc; + pTCursor->pTokenizer = pTokenizer; + + prevMatch = 0; + while( (rc = pTModule->xNext(pTCursor, &zToken, &nToken, + &iBegin, &iEnd, &iPos))==SQLITE_OK ){ + Fts3Expr *pIter = pCur->pExpr; + int iIter = -1; + iRotorBegin[iRotor&FTS3_ROTOR_MASK] = iBegin; + iRotorLen[iRotor&FTS3_ROTOR_MASK] = iEnd-iBegin; + match = 0; + for(i=0; i<(FTS3_ROTOR_SZ-1) && fts3NextExprToken(&pIter, &iIter); i++){ + int nPhrase; /* Number of tokens in current phrase */ + struct PhraseToken *pToken; /* Current token */ + int iCol; /* Column index */ + + if( fts3ExprBeneathNot(pIter) ) continue; + nPhrase = pIter->pPhrase->nToken; + pToken = &pIter->pPhrase->aToken[iIter]; + iCol = pIter->pPhrase->iColumn; + if( iCol>=0 && iColn>nToken ) continue; + if( !pToken->isPrefix && pToken->nn<=nToken ); + if( memcmp(pToken->z, zToken, pToken->n) ) continue; + if( iIter>0 && (prevMatch & (1<=0; j--){ + int k = (iRotor-j) & FTS3_ROTOR_MASK; + rc = snippetAppendMatch(pSnippet, iColumn, i-j, iPos-j, + iRotorBegin[k], iRotorLen[k]); + if( rc ) goto end_offsets_of_column; + } + } } - i = j; + prevMatch = match<<1; + iRotor++; } - zOut[i] = 0; - *pnOut = i; +end_offsets_of_column: + pTModule->xClose(pTCursor); + return rc==SQLITE_DONE ? SQLITE_OK : rc; } - /* -** Stem the input word zIn[0..nIn-1]. Store the output in zOut. -** zOut is at least big enough to hold nIn bytes. Write the actual -** size of the output word (exclusive of the '\0' terminator) into *pnOut. +** Remove entries from the pSnippet structure to account for the NEAR +** operator. When this is called, pSnippet contains the list of token +** offsets produced by treating all NEAR operators as AND operators. +** This function removes any entries that should not be present after +** accounting for the NEAR restriction. For example, if the queried +** document is: ** -** Any upper-case characters in the US-ASCII character set ([A-Z]) -** are converted to lower case. Upper-case UTF characters are -** unchanged. +** "A B C D E A" ** -** Words that are longer than about 20 bytes are stemmed by retaining -** a few bytes from the beginning and the end of the word. If the -** word contains digits, 3 bytes are taken from the beginning and -** 3 bytes from the end. For long words without digits, 10 bytes -** are taken from each end. US-ASCII case folding still applies. +** and the query is: ** -** If the input word contains not digits but does characters not -** in [a-zA-Z] then no stemming is attempted and this routine just -** copies the input into the input into the output with US-ASCII -** case folding. +** A NEAR/0 E ** -** Stemming never increases the length of the word. So there is -** no chance of overflowing the zOut buffer. +** then when this function is called the Snippet contains token offsets +** 0, 4 and 5. This function removes the "0" entry (because the first A +** is not near enough to an E). +** +** When this function is called, the value pointed to by parameter piLeft is +** the integer id of the left-most token in the expression tree headed by +** pExpr. This function increments *piLeft by the total number of tokens +** in the expression tree headed by pExpr. +** +** Return 1 if any trimming occurs. Return 0 if no trimming is required. */ -static void porter_stemmer(const char *zIn, int nIn, char *zOut, int *pnOut){ - int i, j, c; - char zReverse[28]; - char *z, *z2; - if( nIn<3 || nIn>=sizeof(zReverse)-7 ){ - /* The word is too big or too small for the porter stemmer. - ** Fallback to the copy stemmer */ - copy_stemmer(zIn, nIn, zOut, pnOut); - return; - } - for(i=0, j=sizeof(zReverse)-6; i='A' && c<='Z' ){ - zReverse[j] = c + 'a' - 'A'; - }else if( c>='a' && c<='z' ){ - zReverse[j] = c; - }else{ - /* The use of a character not in [a-zA-Z] means that we fallback - ** to the copy stemmer */ - copy_stemmer(zIn, nIn, zOut, pnOut); - return; +static int trimSnippetOffsets( + Fts3Expr *pExpr, /* The search expression */ + Snippet *pSnippet, /* The set of snippet offsets to be trimmed */ + int *piLeft /* Index of left-most token in pExpr */ +){ + if( pExpr ){ + if( trimSnippetOffsets(pExpr->pLeft, pSnippet, piLeft) ){ + return 1; + } + + switch( pExpr->eType ){ + case FTSQUERY_PHRASE: + *piLeft += pExpr->pPhrase->nToken; + break; + case FTSQUERY_NEAR: { + /* The right-hand-side of a NEAR operator is always a phrase. The + ** left-hand-side is either a phrase or an expression tree that is + ** itself headed by a NEAR operator. The following initializations + ** set local variable iLeft to the token number of the left-most + ** token in the right-hand phrase, and iRight to the right most + ** token in the same phrase. For example, if we had: + ** + ** MATCH '"abc def" NEAR/2 "ghi jkl"' + ** + ** then iLeft will be set to 2 (token number of ghi) and nToken will + ** be set to 4. + */ + Fts3Expr *pLeft = pExpr->pLeft; + Fts3Expr *pRight = pExpr->pRight; + int iLeft = *piLeft; + int nNear = pExpr->nNear; + int nToken = pRight->pPhrase->nToken; + int jj, ii; + if( pLeft->eType==FTSQUERY_NEAR ){ + pLeft = pLeft->pRight; + } + assert( pRight->eType==FTSQUERY_PHRASE ); + assert( pLeft->eType==FTSQUERY_PHRASE ); + nToken += pLeft->pPhrase->nToken; + + for(ii=0; iinMatch; ii++){ + struct snippetMatch *p = &pSnippet->aMatch[ii]; + if( p->iTerm==iLeft ){ + int isOk = 0; + /* Snippet ii is an occurence of query term iLeft in the document. + ** It occurs at position (p->iToken) of the document. We now + ** search for an instance of token (iLeft-1) somewhere in the + ** range (p->iToken - nNear)...(p->iToken + nNear + nToken) within + ** the set of snippetMatch structures. If one is found, proceed. + ** If one cannot be found, then remove snippets ii..(ii+N-1) + ** from the matching snippets, where N is the number of tokens + ** in phrase pRight->pPhrase. + */ + for(jj=0; isOk==0 && jjnMatch; jj++){ + struct snippetMatch *p2 = &pSnippet->aMatch[jj]; + if( p2->iTerm==(iLeft-1) ){ + if( p2->iToken>=(p->iToken-nNear-1) + && p2->iToken<(p->iToken+nNear+nToken) + ){ + isOk = 1; + } + } + } + if( !isOk ){ + int kk; + for(kk=0; kkpPhrase->nToken; kk++){ + pSnippet->aMatch[kk+ii].iTerm = -2; + } + return 1; + } + } + if( p->iTerm==(iLeft-1) ){ + int isOk = 0; + for(jj=0; isOk==0 && jjnMatch; jj++){ + struct snippetMatch *p2 = &pSnippet->aMatch[jj]; + if( p2->iTerm==iLeft ){ + if( p2->iToken<=(p->iToken+nNear+1) + && p2->iToken>(p->iToken-nNear-nToken) + ){ + isOk = 1; + } + } + } + if( !isOk ){ + int kk; + for(kk=0; kkpPhrase->nToken; kk++){ + pSnippet->aMatch[ii-kk].iTerm = -2; + } + return 1; + } + } + } + break; + } } - } - memset(&zReverse[sizeof(zReverse)-5], 0, 5); - z = &zReverse[j+1]; - - /* Step 1a */ - if( z[0]=='s' ){ - if( - !stem(&z, "sess", "ss", 0) && - !stem(&z, "sei", "i", 0) && - !stem(&z, "ss", "ss", 0) - ){ - z++; + if( trimSnippetOffsets(pExpr->pRight, pSnippet, piLeft) ){ + return 1; } } + return 0; +} - /* Step 1b */ - z2 = z; - if( stem(&z, "dee", "ee", m_gt_0) ){ - /* Do nothing. The work was all in the test */ - }else if( - (stem(&z, "gni", "", hasVowel) || stem(&z, "de", "", hasVowel)) - && z!=z2 - ){ - if( stem(&z, "ta", "ate", 0) || - stem(&z, "lb", "ble", 0) || - stem(&z, "zi", "ize", 0) ){ - /* Do nothing. The work was all in the test */ - }else if( doubleConsonant(z) && (*z!='l' && *z!='s' && *z!='z') ){ - z++; - }else if( m_eq_1(z) && star_oh(z) ){ - *(--z) = 'e'; - } - } - - /* Step 1c */ - if( z[0]=='y' && hasVowel(z+1) ){ - z[0] = 'i'; - } +/* +** Compute all offsets for the current row of the query. +** If the offsets have already been computed, this routine is a no-op. +*/ +static int snippetAllOffsets(Fts3Cursor *pCsr, Snippet **ppSnippet){ + Fts3Table *p = (Fts3Table *)pCsr->base.pVtab; /* The FTS3 virtual table */ + int nColumn; /* Number of columns. Docid does count */ + int iColumn; /* Index of of a column */ + int i; /* Loop index */ + int iFirst; /* First column to search */ + int iLast; /* Last coumn to search */ + int iTerm = 0; + Snippet *pSnippet; + int rc = SQLITE_OK; - /* Step 2 */ - switch( z[1] ){ - case 'a': - stem(&z, "lanoita", "ate", m_gt_0) || - stem(&z, "lanoit", "tion", m_gt_0); - break; - case 'c': - stem(&z, "icne", "ence", m_gt_0) || - stem(&z, "icna", "ance", m_gt_0); - break; - case 'e': - stem(&z, "rezi", "ize", m_gt_0); - break; - case 'g': - stem(&z, "igol", "log", m_gt_0); - break; - case 'l': - stem(&z, "ilb", "ble", m_gt_0) || - stem(&z, "illa", "al", m_gt_0) || - stem(&z, "iltne", "ent", m_gt_0) || - stem(&z, "ile", "e", m_gt_0) || - stem(&z, "ilsuo", "ous", m_gt_0); - break; - case 'o': - stem(&z, "noitazi", "ize", m_gt_0) || - stem(&z, "noita", "ate", m_gt_0) || - stem(&z, "rota", "ate", m_gt_0); - break; - case 's': - stem(&z, "msila", "al", m_gt_0) || - stem(&z, "ssenevi", "ive", m_gt_0) || - stem(&z, "ssenluf", "ful", m_gt_0) || - stem(&z, "ssensuo", "ous", m_gt_0); - break; - case 't': - stem(&z, "itila", "al", m_gt_0) || - stem(&z, "itivi", "ive", m_gt_0) || - stem(&z, "itilib", "ble", m_gt_0); - break; + if( pCsr->pExpr==0 ){ + return SQLITE_OK; } - /* Step 3 */ - switch( z[0] ){ - case 'e': - stem(&z, "etaci", "ic", m_gt_0) || - stem(&z, "evita", "", m_gt_0) || - stem(&z, "ezila", "al", m_gt_0); - break; - case 'i': - stem(&z, "itici", "ic", m_gt_0); - break; - case 'l': - stem(&z, "laci", "ic", m_gt_0) || - stem(&z, "luf", "", m_gt_0); - break; - case 's': - stem(&z, "ssen", "", m_gt_0); - break; + pSnippet = (Snippet *)sqlite3_malloc(sizeof(Snippet)); + *ppSnippet = pSnippet; + if( !pSnippet ){ + return SQLITE_NOMEM; } + memset(pSnippet, 0, sizeof(Snippet)); - /* Step 4 */ - switch( z[1] ){ - case 'a': - if( z[0]=='l' && m_gt_1(z+2) ){ - z += 2; - } - break; - case 'c': - if( z[0]=='e' && z[2]=='n' && (z[3]=='a' || z[3]=='e') && m_gt_1(z+4) ){ - z += 4; - } - break; - case 'e': - if( z[0]=='r' && m_gt_1(z+2) ){ - z += 2; - } - break; - case 'i': - if( z[0]=='c' && m_gt_1(z+2) ){ - z += 2; - } - break; - case 'l': - if( z[0]=='e' && z[2]=='b' && (z[3]=='a' || z[3]=='i') && m_gt_1(z+4) ){ - z += 4; - } - break; - case 'n': - if( z[0]=='t' ){ - if( z[2]=='a' ){ - if( m_gt_1(z+3) ){ - z += 3; - } - }else if( z[2]=='e' ){ - stem(&z, "tneme", "", m_gt_1) || - stem(&z, "tnem", "", m_gt_1) || - stem(&z, "tne", "", m_gt_1); - } - } - break; - case 'o': - if( z[0]=='u' ){ - if( m_gt_1(z+2) ){ - z += 2; - } - }else if( z[3]=='s' || z[3]=='t' ){ - stem(&z, "noi", "", m_gt_1); - } - break; - case 's': - if( z[0]=='m' && z[2]=='i' && m_gt_1(z+3) ){ - z += 3; - } - break; - case 't': - stem(&z, "eta", "", m_gt_1) || - stem(&z, "iti", "", m_gt_1); - break; - case 'u': - if( z[0]=='s' && z[2]=='o' && m_gt_1(z+3) ){ - z += 3; - } - break; - case 'v': - case 'z': - if( z[0]=='e' && z[2]=='i' && m_gt_1(z+3) ){ - z += 3; - } - break; + nColumn = p->nColumn; + iColumn = (pCsr->eSearch - 2); + if( iColumn<0 || iColumn>=nColumn ){ + /* Look for matches over all columns of the full-text index */ + iFirst = 0; + iLast = nColumn-1; + }else{ + /* Look for matches in the iColumn-th column of the index only */ + iFirst = iColumn; + iLast = iColumn; } - - /* Step 5a */ - if( z[0]=='e' ){ - if( m_gt_1(z+1) ){ - z++; - }else if( m_eq_1(z+1) && !star_oh(z+1) ){ - z++; + for(i=iFirst; rc==SQLITE_OK && i<=iLast; i++){ + const char *zDoc; + int nDoc; + zDoc = (const char*)sqlite3_column_text(pCsr->pStmt, i+1); + nDoc = sqlite3_column_bytes(pCsr->pStmt, i+1); + if( zDoc==0 && sqlite3_column_type(pCsr->pStmt, i+1)!=SQLITE_NULL ){ + rc = SQLITE_NOMEM; + }else{ + rc = snippetOffsetsOfColumn(pCsr, pSnippet, i, zDoc, nDoc); } } - /* Step 5b */ - if( m_gt_1(z) && z[0]=='l' && z[1]=='l' ){ - z++; + while( trimSnippetOffsets(pCsr->pExpr, pSnippet, &iTerm) ){ + iTerm = 0; } - /* z[] is now the stemmed word in reverse order. Flip it back - ** around into forward order and return. - */ - *pnOut = i = strlen(z); - zOut[i] = 0; - while( *z ){ - zOut[--i] = *(z++); - } + return rc; } /* -** Characters that can be part of a token. We assume any character -** whose value is greater than 0x80 (any UTF character) can be -** part of a token. In other words, delimiters all must have -** values of 0x7f or lower. +** Convert the information in the aMatch[] array of the snippet +** into the string zOffset[0..nOffset-1]. This string is used as +** the return of the SQL offsets() function. */ -static const char porterIdChar[] = { -/* x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF */ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, /* 3x */ - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 4x */ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, /* 5x */ - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 6x */ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, /* 7x */ -}; -#define isDelim(C) (((ch=C)&0x80)==0 && (ch<0x30 || !porterIdChar[ch-0x30])) +static void snippetOffsetText(Snippet *p){ + int i; + int cnt = 0; + StringBuffer sb; + char zBuf[200]; + if( p->zOffset ) return; + fts3SnippetSbInit(&sb); + for(i=0; inMatch; i++){ + struct snippetMatch *pMatch = &p->aMatch[i]; + if( pMatch->iTerm>=0 ){ + /* If snippetMatch.iTerm is less than 0, then the match was + ** discarded as part of processing the NEAR operator (see the + ** trimSnippetOffsetsForNear() function for details). Ignore + ** it in this case + */ + zBuf[0] = ' '; + sqlite3_snprintf(sizeof(zBuf)-1, &zBuf[cnt>0], "%d %d %d %d", + pMatch->iCol, pMatch->iTerm, pMatch->iStart, pMatch->nByte); + fts3SnippetAppend(&sb, zBuf, -1); + cnt++; + } + } + p->zOffset = sb.z; + p->nOffset = sb.z ? sb.nUsed : 0; +} /* -** Extract the next token from a tokenization cursor. The cursor must -** have been opened by a prior call to porterOpen(). +** zDoc[0..nDoc-1] is phrase of text. aMatch[0..nMatch-1] are a set +** of matching words some of which might be in zDoc. zDoc is column +** number iCol. +** +** iBreak is suggested spot in zDoc where we could begin or end an +** excerpt. Return a value similar to iBreak but possibly adjusted +** to be a little left or right so that the break point is better. */ -static int porterNext( - sqlite3_tokenizer_cursor *pCursor, /* Cursor returned by porterOpen */ - const char **pzToken, /* OUT: *pzToken is the token text */ - int *pnBytes, /* OUT: Number of bytes in token */ - int *piStartOffset, /* OUT: Starting offset of token */ - int *piEndOffset, /* OUT: Ending offset of token */ - int *piPosition /* OUT: Position integer of token */ +static int wordBoundary( + int iBreak, /* The suggested break point */ + const char *zDoc, /* Document text */ + int nDoc, /* Number of bytes in zDoc[] */ + struct snippetMatch *aMatch, /* Matching words */ + int nMatch, /* Number of entries in aMatch[] */ + int iCol /* The column number for zDoc[] */ ){ - porter_tokenizer_cursor *c = (porter_tokenizer_cursor *) pCursor; - const char *z = c->zInput; - - while( c->iOffsetnInput ){ - int iStartOffset, ch; - - /* Scan past delimiter characters */ - while( c->iOffsetnInput && isDelim(z[c->iOffset]) ){ - c->iOffset++; + int i; + if( iBreak<=10 ){ + return 0; + } + if( iBreak>=nDoc-10 ){ + return nDoc; + } + for(i=0; ALWAYS(iiOffset; - while( c->iOffsetnInput && !isDelim(z[c->iOffset]) ){ - c->iOffset++; + if( i>0 && aMatch[i-1].iStart+aMatch[i-1].nByte>=iBreak ){ + return aMatch[i-1].iStart; } - - if( c->iOffset>iStartOffset ){ - int n = c->iOffset-iStartOffset; - if( n>c->nAllocated ){ - c->nAllocated = n+20; - c->zToken = sqlite3_realloc(c->zToken, c->nAllocated); - if( c->zToken==NULL ) return SQLITE_NOMEM; - } - porter_stemmer(&z[iStartOffset], n, c->zToken, pnBytes); - *pzToken = c->zToken; - *piStartOffset = iStartOffset; - *piEndOffset = c->iOffset; - *piPosition = c->iToken++; - return SQLITE_OK; + } + for(i=1; i<=10; i++){ + if( fts3snippetIsspace(zDoc[iBreak-i]) ){ + return iBreak - i + 1; + } + if( fts3snippetIsspace(zDoc[iBreak+i]) ){ + return iBreak + i + 1; } } - return SQLITE_DONE; -} - -/* -** The set of routines that implement the porter-stemmer tokenizer -*/ -static const sqlite3_tokenizer_module porterTokenizerModule = { - 0, - porterCreate, - porterDestroy, - porterOpen, - porterClose, - porterNext, -}; - -/* -** Allocate a new porter tokenizer. Return a pointer to the new -** tokenizer in *ppModule -*/ -SQLITE_PRIVATE void sqlite3Fts3PorterTokenizerModule( - sqlite3_tokenizer_module const**ppModule -){ - *ppModule = &porterTokenizerModule; + return iBreak; } -#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */ -/************** End of fts3_porter.c *****************************************/ -/************** Begin file fts3_tokenizer.c **********************************/ -/* -** 2007 June 22 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -****************************************************************************** -** -** This is part of an SQLite module implementing full-text search. -** This particular file implements the generic tokenizer interface. -*/ /* -** The code in this file is only compiled if: -** -** * The FTS3 module is being built as an extension -** (in which case SQLITE_CORE is not defined), or -** -** * The FTS3 module is being built into the core of -** SQLite (in which case SQLITE_ENABLE_FTS3 is defined). +** Allowed values for Snippet.aMatch[].snStatus */ -#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) - -#ifndef SQLITE_CORE - SQLITE_EXTENSION_INIT1 -#endif - +#define SNIPPET_IGNORE 0 /* It is ok to omit this match from the snippet */ +#define SNIPPET_DESIRED 1 /* We want to include this match in the snippet */ /* -** Implementation of the SQL scalar function for accessing the underlying -** hash table. This function may be called as follows: -** -** SELECT (); -** SELECT (, ); -** -** where is the name passed as the second argument -** to the sqlite3Fts3InitHashTable() function (e.g. 'fts3_tokenizer'). -** -** If the argument is specified, it must be a blob value -** containing a pointer to be stored as the hash data corresponding -** to the string . If is not specified, then -** the string must already exist in the has table. Otherwise, -** an error is returned. -** -** Whether or not the argument is specified, the value returned -** is a blob containing the pointer stored as the hash data corresponding -** to string (after the hash-table is updated, if applicable). +** Generate the text of a snippet. */ -static void scalarFunc( - sqlite3_context *context, - int argc, - sqlite3_value **argv +static void snippetText( + Fts3Cursor *pCursor, /* The cursor we need the snippet for */ + Snippet *pSnippet, + const char *zStartMark, /* Markup to appear before each match */ + const char *zEndMark, /* Markup to appear after each match */ + const char *zEllipsis /* Ellipsis mark */ ){ - fts3Hash *pHash; - void *pPtr = 0; - const unsigned char *zName; - int nName; - - assert( argc==1 || argc==2 ); + int i, j; + struct snippetMatch *aMatch; + int nMatch; + int nDesired; + StringBuffer sb; + int tailCol; + int tailOffset; + int iCol; + int nDoc; + const char *zDoc; + int iStart, iEnd; + int tailEllipsis = 0; + int iMatch; + - pHash = (fts3Hash *)sqlite3_user_data(context); + sqlite3_free(pSnippet->zSnippet); + pSnippet->zSnippet = 0; + aMatch = pSnippet->aMatch; + nMatch = pSnippet->nMatch; + fts3SnippetSbInit(&sb); - zName = sqlite3_value_text(argv[0]); - nName = sqlite3_value_bytes(argv[0])+1; + for(i=0; i0; i++){ + if( aMatch[i].snStatus!=SNIPPET_DESIRED ) continue; + nDesired--; + iCol = aMatch[i].iCol; + zDoc = (const char*)sqlite3_column_text(pCursor->pStmt, iCol+1); + nDoc = sqlite3_column_bytes(pCursor->pStmt, iCol+1); + iStart = aMatch[i].iStart - 40; + iStart = wordBoundary(iStart, zDoc, nDoc, aMatch, nMatch, iCol); + if( iStart<=10 ){ + iStart = 0; } - pPtr = *(void **)sqlite3_value_blob(argv[1]); - pOld = sqlite3Fts3HashInsert(pHash, (void *)zName, nName, pPtr); - if( pOld==pPtr ){ - sqlite3_result_error(context, "out of memory", -1); - return; + if( iCol==tailCol && iStart<=tailOffset+20 ){ + iStart = tailOffset; + } + if( (iCol!=tailCol && tailCol>=0) || iStart!=tailOffset ){ + fts3SnippetTrimWhiteSpace(&sb); + fts3SnippetAppendWhiteSpace(&sb); + fts3SnippetAppend(&sb, zEllipsis, -1); + fts3SnippetAppendWhiteSpace(&sb); + } + iEnd = aMatch[i].iStart + aMatch[i].nByte + 40; + iEnd = wordBoundary(iEnd, zDoc, nDoc, aMatch, nMatch, iCol); + if( iEnd>=nDoc-10 ){ + iEnd = nDoc; + tailEllipsis = 0; + }else{ + tailEllipsis = 1; + } + while( iMatchzSnippet = sb.z; + pSnippet->nSnippet = sb.z ? sb.nUsed : 0; +} + +SQLITE_PRIVATE void sqlite3Fts3Offsets( + sqlite3_context *pCtx, /* SQLite function call context */ + Fts3Cursor *pCsr /* Cursor object */ +){ + Snippet *p; /* Snippet structure */ + int rc = snippetAllOffsets(pCsr, &p); + if( rc==SQLITE_OK ){ + snippetOffsetText(p); + if( p->zOffset ){ + sqlite3_result_text(pCtx, p->zOffset, p->nOffset, SQLITE_TRANSIENT); + }else{ + sqlite3_result_error_nomem(pCtx); } }else{ - pPtr = sqlite3Fts3HashFind(pHash, zName, nName); - if( !pPtr ){ - char *zErr = sqlite3_mprintf("unknown tokenizer: %s", zName); - sqlite3_result_error(context, zErr, -1); - sqlite3_free(zErr); - return; + sqlite3_result_error_nomem(pCtx); + } + fts3SnippetFree(p); +} + +SQLITE_PRIVATE void sqlite3Fts3Snippet( + sqlite3_context *pCtx, /* SQLite function call context */ + Fts3Cursor *pCsr, /* Cursor object */ + const char *zStart, /* Snippet start text - "" */ + const char *zEnd, /* Snippet end text - "" */ + const char *zEllipsis /* Snippet ellipsis text - "..." */ +){ + Snippet *p; /* Snippet structure */ + int rc = snippetAllOffsets(pCsr, &p); + if( rc==SQLITE_OK ){ + snippetText(pCsr, p, zStart, zEnd, zEllipsis); + if( p->zSnippet ){ + sqlite3_result_text(pCtx, p->zSnippet, p->nSnippet, SQLITE_TRANSIENT); + }else{ + sqlite3_result_error_nomem(pCtx); } + }else{ + sqlite3_result_error_nomem(pCtx); } - - sqlite3_result_blob(context, (void *)&pPtr, sizeof(pPtr), SQLITE_TRANSIENT); + fts3SnippetFree(p); } -#ifdef SQLITE_TEST +/************************************************************************* +** Below this point is the alternative, experimental snippet() implementation. +*/ +#define SNIPPET_BUFFER_CHUNK 64 +#define SNIPPET_BUFFER_SIZE SNIPPET_BUFFER_CHUNK*4 +#define SNIPPET_BUFFER_MASK (SNIPPET_BUFFER_SIZE-1) + +static void fts3GetDeltaPosition(char **pp, int *piPos){ + int iVal; + *pp += sqlite3Fts3GetVarint32(*pp, &iVal); + *piPos += (iVal-2); +} /* -** Implementation of a special SQL scalar function for testing tokenizers -** designed to be used in concert with the Tcl testing framework. This -** function must be called with two arguments: -** -** SELECT (, ); -** SELECT (, ); +** Iterate through all phrase nodes in an FTS3 query, except those that +** are part of a sub-tree that is the right-hand-side of a NOT operator. +** For each phrase node found, the supplied callback function is invoked. ** -** where is the name passed as the second argument -** to the sqlite3Fts3InitHashTable() function (e.g. 'fts3_tokenizer') -** concatenated with the string '_test' (e.g. 'fts3_tokenizer_test'). -** -** The return value is a string that may be interpreted as a Tcl -** list. For each token in the , three elements are -** added to the returned list. The first is the token position, the -** second is the token text (folded, stemmed, etc.) and the third is the -** substring of associated with the token. For example, -** using the built-in "simple" tokenizer: -** -** SELECT fts_tokenizer_test('simple', 'I don't see how'); -** -** will return the string: -** -** "{0 i I 1 dont don't 2 see see 3 how how}" -** +** If the callback function returns anything other than SQLITE_OK, +** the iteration is abandoned and the error code returned immediately. +** Otherwise, SQLITE_OK is returned after a callback has been made for +** all eligible phrase nodes. */ -static void testFunc( - sqlite3_context *context, - int argc, - sqlite3_value **argv +static int fts3ExprIterate( + Fts3Expr *pExpr, /* Expression to iterate phrases of */ + int (*x)(Fts3Expr *, void *), /* Callback function to invoke for phrases */ + void *pCtx /* Second argument to pass to callback */ ){ - fts3Hash *pHash; - sqlite3_tokenizer_module *p; - sqlite3_tokenizer *pTokenizer = 0; - sqlite3_tokenizer_cursor *pCsr = 0; + int rc; + int eType = pExpr->eType; + if( eType==FTSQUERY_NOT ){ + rc = SQLITE_OK; + }else if( eType!=FTSQUERY_PHRASE ){ + assert( pExpr->pLeft && pExpr->pRight ); + rc = fts3ExprIterate(pExpr->pLeft, x, pCtx); + if( rc==SQLITE_OK ){ + rc = fts3ExprIterate(pExpr->pRight, x, pCtx); + } + }else{ + rc = x(pExpr, pCtx); + } + return rc; +} - const char *zErr = 0; +typedef struct LoadDoclistCtx LoadDoclistCtx; +struct LoadDoclistCtx { + Fts3Table *pTab; /* FTS3 Table */ + int nPhrase; /* Number of phrases so far */ +}; - const char *zName; - int nName; - const char *zInput; - int nInput; +static int fts3ExprLoadDoclistsCb(Fts3Expr *pExpr, void *ctx){ + int rc = SQLITE_OK; + LoadDoclistCtx *p = (LoadDoclistCtx *)ctx; + p->nPhrase++; + if( pExpr->isLoaded==0 ){ + rc = sqlite3Fts3ExprLoadDoclist(p->pTab, pExpr); + pExpr->isLoaded = 1; + if( rc==SQLITE_OK && pExpr->aDoclist ){ + pExpr->pCurrent = pExpr->aDoclist; + pExpr->pCurrent += sqlite3Fts3GetVarint(pExpr->pCurrent,&pExpr->iCurrent); + } + } + return rc; +} - const char *zArg = 0; +static int fts3ExprLoadDoclists(Fts3Cursor *pCsr, int *pnPhrase){ + int rc; + LoadDoclistCtx sCtx = {0, 0}; + sCtx.pTab = (Fts3Table *)pCsr->base.pVtab; + rc = fts3ExprIterate(pCsr->pExpr, fts3ExprLoadDoclistsCb, (void *)&sCtx); + *pnPhrase = sCtx.nPhrase; + return rc; +} - const char *zToken; - int nToken; - int iStart; - int iEnd; - int iPos; +/* +** Each call to this function populates a chunk of a snippet-buffer +** SNIPPET_BUFFER_CHUNK bytes in size. +** +** Return true if the end of the data has been reached (and all subsequent +** calls to fts3LoadSnippetBuffer() with the same arguments will be no-ops), +** or false otherwise. +*/ +static int fts3LoadSnippetBuffer( + int iPos, /* Document token offset to load data for */ + u8 *aBuffer, /* Circular snippet buffer to populate */ + int nList, /* Number of position lists in appList */ + char **apList, /* IN/OUT: nList position list pointers */ + int *aiPrev /* IN/OUT: Previous positions read */ +){ + int i; + int nFin = 0; - Tcl_Obj *pRet; + assert( (iPos&(SNIPPET_BUFFER_CHUNK-1))==0 ); - assert( argc==2 || argc==3 ); + memset(&aBuffer[iPos&SNIPPET_BUFFER_MASK], 0, SNIPPET_BUFFER_CHUNK); - nName = sqlite3_value_bytes(argv[0]); - zName = (const char *)sqlite3_value_text(argv[0]); - nInput = sqlite3_value_bytes(argv[argc-1]); - zInput = (const char *)sqlite3_value_text(argv[argc-1]); + for(i=0; i=iPos ){ + aBuffer[iPrev&SNIPPET_BUFFER_MASK] = (u8)(i+1); + } + if( 0==((*pList)&0xFE) ){ + nFin++; + break; + } + fts3GetDeltaPosition(&pList, &iPrev); + } - if( !p ){ - char *zErr = sqlite3_mprintf("unknown tokenizer: %s", zName); - sqlite3_result_error(context, zErr, -1); - sqlite3_free(zErr); - return; + aiPrev[i] = iPrev; + apList[i] = pList; } - pRet = Tcl_NewObj(); - Tcl_IncrRefCount(pRet); + return (nFin==nList); +} - if( SQLITE_OK!=p->xCreate(zArg ? 1 : 0, &zArg, &pTokenizer) ){ - zErr = "error in xCreate()"; - goto finish; - } - pTokenizer->pModule = p; - if( SQLITE_OK!=p->xOpen(pTokenizer, zInput, nInput, &pCsr) ){ - zErr = "error in xOpen()"; - goto finish; - } - pCsr->pTokenizer = pTokenizer; +typedef struct SnippetCtx SnippetCtx; +struct SnippetCtx { + Fts3Cursor *pCsr; + int iCol; + int iPhrase; + int *aiPrev; + int *anToken; + char **apList; +}; - while( SQLITE_OK==p->xNext(pCsr, &zToken, &nToken, &iStart, &iEnd, &iPos) ){ - Tcl_ListObjAppendElement(0, pRet, Tcl_NewIntObj(iPos)); - Tcl_ListObjAppendElement(0, pRet, Tcl_NewStringObj(zToken, nToken)); - zToken = &zInput[iStart]; - nToken = iEnd-iStart; - Tcl_ListObjAppendElement(0, pRet, Tcl_NewStringObj(zToken, nToken)); - } +static int fts3SnippetFindPositions(Fts3Expr *pExpr, void *ctx){ + SnippetCtx *p = (SnippetCtx *)ctx; + int iPhrase = p->iPhrase++; + char *pCsr; - if( SQLITE_OK!=p->xClose(pCsr) ){ - zErr = "error in xClose()"; - goto finish; - } - if( SQLITE_OK!=p->xDestroy(pTokenizer) ){ - zErr = "error in xDestroy()"; - goto finish; - } + p->anToken[iPhrase] = pExpr->pPhrase->nToken; + pCsr = sqlite3Fts3FindPositions(pExpr, p->pCsr->iPrevId, p->iCol); -finish: - if( zErr ){ - sqlite3_result_error(context, zErr, -1); - }else{ - sqlite3_result_text(context, Tcl_GetString(pRet), -1, SQLITE_TRANSIENT); + if( pCsr ){ + int iVal; + pCsr += sqlite3Fts3GetVarint32(pCsr, &iVal); + p->apList[iPhrase] = pCsr; + p->aiPrev[iPhrase] = iVal-2; } - Tcl_DecrRefCount(pRet); + return SQLITE_OK; } -static -int registerTokenizer( - sqlite3 *db, - char *zName, - const sqlite3_tokenizer_module *p +static void fts3SnippetCnt( + int iIdx, + int nSnippet, + int *anCnt, + u8 *aBuffer, + int *anToken, + u64 *pHlmask ){ - int rc; - sqlite3_stmt *pStmt; - const char zSql[] = "SELECT fts3_tokenizer(?, ?)"; + int iSub = (iIdx-1)&SNIPPET_BUFFER_MASK; + int iAdd = (iIdx+nSnippet-1)&SNIPPET_BUFFER_MASK; + int iSub2 = (iIdx+(nSnippet/3)-1)&SNIPPET_BUFFER_MASK; + int iAdd2 = (iIdx+(nSnippet*2/3)-1)&SNIPPET_BUFFER_MASK; - rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); - if( rc!=SQLITE_OK ){ - return rc; - } + u64 h = *pHlmask; - sqlite3_bind_text(pStmt, 1, zName, -1, SQLITE_STATIC); - sqlite3_bind_blob(pStmt, 2, &p, sizeof(p), SQLITE_STATIC); - sqlite3_step(pStmt); + anCnt[ aBuffer[iSub] ]--; + anCnt[ aBuffer[iSub2] ]--; + anCnt[ aBuffer[iAdd] ]++; + anCnt[ aBuffer[iAdd2] ]++; - return sqlite3_finalize(pStmt); + h = h >> 1; + if( aBuffer[iAdd] ){ + int j; + for(j=anToken[aBuffer[iAdd]-1]; j>=1; j--){ + h |= (u64)1 << (nSnippet-j); + } + } + *pHlmask = h; } -static -int queryTokenizer( - sqlite3 *db, - char *zName, - const sqlite3_tokenizer_module **pp +static int fts3SnippetScore(int n, int *anCnt){ + int j; + int iScore = 0; + for(j=1; j<=n; j++){ + int nCnt = anCnt[j]; + iScore += nCnt + (nCnt ? 1000 : 0); + } + return iScore; +} + +static int fts3BestSnippet( + int nSnippet, /* Desired snippet length */ + Fts3Cursor *pCsr, /* Cursor to create snippet for */ + int iCol, /* Index of column to create snippet from */ + int *piPos, /* OUT: Starting token for best snippet */ + u64 *pHlmask /* OUT: Highlight mask for best snippet */ ){ - int rc; - sqlite3_stmt *pStmt; - const char zSql[] = "SELECT fts3_tokenizer(?)"; + int rc; /* Return Code */ + u8 aBuffer[SNIPPET_BUFFER_SIZE];/* Circular snippet buffer */ + int *aiPrev; /* Used by fts3LoadSnippetBuffer() */ + int *anToken; /* Number of tokens in each phrase */ + char **apList; /* Array of position lists */ + int *anCnt; /* Running totals of phrase occurences */ + int nList; - *pp = 0; - rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); + int i; + + u64 hlmask = 0; /* Current mask of highlighted terms */ + u64 besthlmask = 0; /* Mask of highlighted terms for iBestPos */ + int iBestPos = 0; /* Starting position of 'best' snippet */ + int iBestScore = 0; /* Score of best snippet higher->better */ + SnippetCtx sCtx; + + /* Iterate through the phrases in the expression to count them. The same + ** callback makes sure the doclists are loaded for each phrase. + */ + rc = fts3ExprLoadDoclists(pCsr, &nList); if( rc!=SQLITE_OK ){ return rc; } - sqlite3_bind_text(pStmt, 1, zName, -1, SQLITE_STATIC); - if( SQLITE_ROW==sqlite3_step(pStmt) ){ - if( sqlite3_column_type(pStmt, 0)==SQLITE_BLOB ){ - memcpy(pp, sqlite3_column_blob(pStmt, 0), sizeof(*pp)); + /* Now that it is known how many phrases there are, allocate and zero + ** the required arrays using malloc(). + */ + apList = sqlite3_malloc( + sizeof(u8*)*nList + /* apList */ + sizeof(int)*(nList) + /* anToken */ + sizeof(int)*nList + /* aiPrev */ + sizeof(int)*(nList+1) /* anCnt */ + ); + if( !apList ){ + return SQLITE_NOMEM; + } + memset(apList, 0, sizeof(u8*)*nList+sizeof(int)*nList+sizeof(int)*nList); + anToken = (int *)&apList[nList]; + aiPrev = &anToken[nList]; + anCnt = &aiPrev[nList]; + + /* Initialize the contents of the aiPrev and aiList arrays. */ + sCtx.pCsr = pCsr; + sCtx.iCol = iCol; + sCtx.apList = apList; + sCtx.aiPrev = aiPrev; + sCtx.anToken = anToken; + sCtx.iPhrase = 0; + (void)fts3ExprIterate(pCsr->pExpr, fts3SnippetFindPositions, (void *)&sCtx); + + /* Load the first two chunks of data into the buffer. */ + memset(aBuffer, 0, SNIPPET_BUFFER_SIZE); + fts3LoadSnippetBuffer(0, aBuffer, nList, apList, aiPrev); + fts3LoadSnippetBuffer(SNIPPET_BUFFER_CHUNK, aBuffer, nList, apList, aiPrev); + + /* Set the initial contents of the highlight-mask and anCnt[] array. */ + for(i=1-nSnippet; i<=0; i++){ + fts3SnippetCnt(i, nSnippet, anCnt, aBuffer, anToken, &hlmask); + } + iBestScore = fts3SnippetScore(nList, anCnt); + besthlmask = hlmask; + iBestPos = 0; + + for(i=1; 1; i++){ + int iScore; + + if( 0==(i&(SNIPPET_BUFFER_CHUNK-1)) ){ + int iLoad = i + SNIPPET_BUFFER_CHUNK; + if( fts3LoadSnippetBuffer(iLoad, aBuffer, nList, apList, aiPrev) ) break; + } + + /* Figure out how highly a snippet starting at token offset i scores + ** according to fts3SnippetScore(). If it is higher than any previously + ** considered position, save the current position, score and hlmask as + ** the best snippet candidate found so far. + */ + fts3SnippetCnt(i, nSnippet, anCnt, aBuffer, anToken, &hlmask); + iScore = fts3SnippetScore(nList, anCnt); + if( iScore>iBestScore ){ + iBestPos = i; + iBestScore = iScore; + besthlmask = hlmask; } } - return sqlite3_finalize(pStmt); + sqlite3_free(apList); + *piPos = iBestPos; + *pHlmask = besthlmask; + return SQLITE_OK; } -SQLITE_PRIVATE void sqlite3Fts3SimpleTokenizerModule(sqlite3_tokenizer_module const**ppModule); +typedef struct StrBuffer StrBuffer; +struct StrBuffer { + char *z; + int n; + int nAlloc; +}; -/* -** Implementation of the scalar function fts3_tokenizer_internal_test(). -** This function is used for testing only, it is not included in the -** build unless SQLITE_TEST is defined. -** -** The purpose of this is to test that the fts3_tokenizer() function -** can be used as designed by the C-code in the queryTokenizer and -** registerTokenizer() functions above. These two functions are repeated -** in the README.tokenizer file as an example, so it is important to -** test them. -** -** To run the tests, evaluate the fts3_tokenizer_internal_test() scalar -** function with no arguments. An assert() will fail if a problem is -** detected. i.e.: -** -** SELECT fts3_tokenizer_internal_test(); -** -*/ -static void intTestFunc( - sqlite3_context *context, - int argc, - sqlite3_value **argv +static int fts3StringAppend( + StrBuffer *pStr, + const char *zAppend, + int nAppend ){ - int rc; - const sqlite3_tokenizer_module *p1; - const sqlite3_tokenizer_module *p2; - sqlite3 *db = (sqlite3 *)sqlite3_user_data(context); + if( nAppend<0 ){ + nAppend = (int)strlen(zAppend); + } - /* Test the query function */ - sqlite3Fts3SimpleTokenizerModule(&p1); - rc = queryTokenizer(db, "simple", &p2); - assert( rc==SQLITE_OK ); - assert( p1==p2 ); - rc = queryTokenizer(db, "nosuchtokenizer", &p2); - assert( rc==SQLITE_ERROR ); - assert( p2==0 ); - assert( 0==strcmp(sqlite3_errmsg(db), "unknown tokenizer: nosuchtokenizer") ); + if( pStr->n+nAppend+1>=pStr->nAlloc ){ + int nAlloc = pStr->nAlloc+nAppend+100; + char *zNew = sqlite3_realloc(pStr->z, nAlloc); + if( !zNew ){ + return SQLITE_NOMEM; + } + pStr->z = zNew; + pStr->nAlloc = nAlloc; + } - /* Test the storage function */ - rc = registerTokenizer(db, "nosuchtokenizer", p1); - assert( rc==SQLITE_OK ); - rc = queryTokenizer(db, "nosuchtokenizer", &p2); - assert( rc==SQLITE_OK ); - assert( p2==p1 ); + memcpy(&pStr->z[pStr->n], zAppend, nAppend); + pStr->n += nAppend; + pStr->z[pStr->n] = '\0'; - sqlite3_result_text(context, "ok", -1, SQLITE_STATIC); + return SQLITE_OK; } -#endif - -/* -** Set up SQL objects in database db used to access the contents of -** the hash table pointed to by argument pHash. The hash table must -** been initialised to use string keys, and to take a private copy -** of the key when a value is inserted. i.e. by a call similar to: -** -** sqlite3Fts3HashInit(pHash, FTS3_HASH_STRING, 1); -** -** This function adds a scalar function (see header comment above -** scalarFunc() in this file for details) and, if ENABLE_TABLE is -** defined at compilation time, a temporary virtual table (see header -** comment above struct HashTableVtab) to the database schema. Both -** provide read/write access to the contents of *pHash. -** -** The third argument to this function, zName, is used as the name -** of both the scalar and, if created, the virtual table. -*/ -SQLITE_PRIVATE int sqlite3Fts3InitHashTable( - sqlite3 *db, - fts3Hash *pHash, - const char *zName +static int fts3SnippetText( + Fts3Cursor *pCsr, /* FTS3 Cursor */ + const char *zDoc, /* Document to extract snippet from */ + int nDoc, /* Size of zDoc in bytes */ + int nSnippet, /* Number of tokens in extracted snippet */ + int iPos, /* Index of first document token in snippet */ + u64 hlmask, /* Bitmask of terms to highlight in snippet */ + const char *zOpen, /* String inserted before highlighted term */ + const char *zClose, /* String inserted after highlighted term */ + const char *zEllipsis, + char **pzSnippet /* OUT: Snippet text */ ){ - int rc = SQLITE_OK; - void *p = (void *)pHash; - const int any = SQLITE_ANY; - char *zTest = 0; - char *zTest2 = 0; + Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab; + int rc; /* Return code */ + int iCurrent = 0; + int iStart = 0; + int iEnd; -#ifdef SQLITE_TEST - void *pdb = (void *)db; - zTest = sqlite3_mprintf("%s_test", zName); - zTest2 = sqlite3_mprintf("%s_internal_test", zName); - if( !zTest || !zTest2 ){ - rc = SQLITE_NOMEM; + sqlite3_tokenizer_module *pMod; /* Tokenizer module methods object */ + sqlite3_tokenizer_cursor *pC; /* Tokenizer cursor open on zDoc/nDoc */ + const char *ZDUMMY; /* Dummy arguments used with tokenizer */ + int DUMMY1, DUMMY2, DUMMY3; /* Dummy arguments used with tokenizer */ + + StrBuffer res = {0, 0, 0}; /* Result string */ + + /* Open a token cursor on the document. Read all tokens up to and + ** including token iPos (the first token of the snippet). Set variable + ** iStart to the byte offset in zDoc of the start of token iPos. + */ + pMod = (sqlite3_tokenizer_module *)pTab->pTokenizer->pModule; + rc = pMod->xOpen(pTab->pTokenizer, zDoc, nDoc, &pC); + while( rc==SQLITE_OK && iCurrentxNext(pC, &ZDUMMY, &DUMMY1, &iStart, &DUMMY2, &iCurrent); } -#endif + iEnd = iStart; - if( rc!=SQLITE_OK - || (rc = sqlite3_create_function(db, zName, 1, any, p, scalarFunc, 0, 0)) - || (rc = sqlite3_create_function(db, zName, 2, any, p, scalarFunc, 0, 0)) -#ifdef SQLITE_TEST - || (rc = sqlite3_create_function(db, zTest, 2, any, p, testFunc, 0, 0)) - || (rc = sqlite3_create_function(db, zTest, 3, any, p, testFunc, 0, 0)) - || (rc = sqlite3_create_function(db, zTest2, 0, any, pdb, intTestFunc, 0, 0)) -#endif - ); + if( rc==SQLITE_OK && iStart>0 ){ + rc = fts3StringAppend(&res, zEllipsis, -1); + } - sqlite3_free(zTest); - sqlite3_free(zTest2); + while( rc==SQLITE_OK ){ + int iBegin; + int iFin; + rc = pMod->xNext(pC, &ZDUMMY, &DUMMY1, &iBegin, &iFin, &iCurrent); + + if( rc==SQLITE_OK ){ + if( iCurrent>=(iPos+nSnippet) ){ + rc = SQLITE_DONE; + }else{ + iEnd = iFin; + if( hlmask & ((u64)1 << (iCurrent-iPos)) ){ + if( fts3StringAppend(&res, &zDoc[iStart], iBegin-iStart) + || fts3StringAppend(&res, zOpen, -1) + || fts3StringAppend(&res, &zDoc[iBegin], iEnd-iBegin) + || fts3StringAppend(&res, zClose, -1) + ){ + rc = SQLITE_NOMEM; + } + iStart = iEnd; + } + } + } + } + assert( rc!=SQLITE_OK ); + if( rc==SQLITE_DONE ){ + rc = fts3StringAppend(&res, &zDoc[iStart], iEnd-iStart); + if( rc==SQLITE_OK ){ + rc = pMod->xNext(pC, &ZDUMMY, &DUMMY1, &DUMMY2, &DUMMY3, &iCurrent); + if( rc==SQLITE_OK ){ + rc = fts3StringAppend(&res, zEllipsis, -1); + }else if( rc==SQLITE_DONE ){ + rc = fts3StringAppend(&res, &zDoc[iEnd], -1); + } + } + } + + pMod->xClose(pC); + if( rc!=SQLITE_OK ){ + sqlite3_free(res.z); + }else{ + *pzSnippet = res.z; + } return rc; } -#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */ -/************** End of fts3_tokenizer.c **************************************/ -/************** Begin file fts3_tokenizer1.c *********************************/ /* -** 2006 Oct 10 +** An instance of this structure is used to collect the 'global' part of +** the matchinfo statistics. The 'global' part consists of the following: ** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: +** 1. The number of phrases in the query (nPhrase). ** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. +** 2. The number of columns in the FTS3 table (nCol). ** -****************************************************************************** +** 3. A matrix of (nPhrase*nCol) integers containing the sum of the +** number of hits for each phrase in each column across all rows +** of the table. ** -** Implementation of the "simple" full-text-search tokenizer. -*/ - -/* -** The code in this file is only compiled if: +** The total size of the global matchinfo array, assuming the number of +** columns is N and the number of phrases is P is: ** -** * The FTS3 module is being built as an extension -** (in which case SQLITE_CORE is not defined), or +** 2 + P*(N+1) ** -** * The FTS3 module is being built into the core of -** SQLite (in which case SQLITE_ENABLE_FTS3 is defined). +** The number of hits for the 3rd phrase in the second column is found +** using the expression: +** +** aGlobal[2 + P*(1+2) + 1] */ -#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) - - - - -typedef struct simple_tokenizer { - sqlite3_tokenizer base; - char delim[128]; /* flag ASCII delimiters */ -} simple_tokenizer; +typedef struct MatchInfo MatchInfo; +struct MatchInfo { + Fts3Table *pTab; /* FTS3 Table */ + Fts3Cursor *pCursor; /* FTS3 Cursor */ + int iPhrase; /* Number of phrases so far */ + int nCol; /* Number of columns in table */ + u32 *aGlobal; /* Pre-allocated buffer */ +}; -typedef struct simple_tokenizer_cursor { - sqlite3_tokenizer_cursor base; - const char *pInput; /* input we are tokenizing */ - int nBytes; /* size of the input */ - int iOffset; /* current position in pInput */ - int iToken; /* index of next token to be returned */ - char *pToken; /* storage for current token */ - int nTokenAllocated; /* space allocated to zToken buffer */ -} simple_tokenizer_cursor; +/* +** This function is used to count the entries in a column-list (delta-encoded +** list of term offsets within a single column of a single row). +*/ +static int fts3ColumnlistCount(char **ppCollist){ + char *pEnd = *ppCollist; + char c = 0; + int nEntry = 0; + /* A column-list is terminated by either a 0x01 or 0x00. */ + while( 0xFE & (*pEnd | c) ){ + c = *pEnd++ & 0x80; + if( !c ) nEntry++; + } -/* Forward declaration */ -static const sqlite3_tokenizer_module simpleTokenizerModule; + *ppCollist = pEnd; + return nEntry; +} -static int simpleDelim(simple_tokenizer *t, unsigned char c){ - return c<0x80 && t->delim[c]; +static void fts3LoadColumnlistCounts(char **pp, u32 *aOut){ + char *pCsr = *pp; + while( *pCsr ){ + sqlite3_int64 iCol = 0; + if( *pCsr==0x01 ){ + pCsr++; + pCsr += sqlite3Fts3GetVarint(pCsr, &iCol); + } + aOut[iCol] += fts3ColumnlistCount(&pCsr); + } + pCsr++; + *pp = pCsr; } /* -** Create a new tokenizer instance. +** fts3ExprIterate() callback used to collect the "global" matchinfo stats +** for a single query. */ -static int simpleCreate( - int argc, const char * const *argv, - sqlite3_tokenizer **ppTokenizer +static int fts3ExprGlobalMatchinfoCb( + Fts3Expr *pExpr, /* Phrase expression node */ + void *pCtx /* Pointer to MatchInfo structure */ ){ - simple_tokenizer *t; + MatchInfo *p = (MatchInfo *)pCtx; + char *pCsr; + char *pEnd; + const int iStart = 2 + p->nCol*p->iPhrase; - t = (simple_tokenizer *) sqlite3_malloc(sizeof(*t)); - if( t==NULL ) return SQLITE_NOMEM; - memset(t, 0, sizeof(*t)); + assert( pExpr->isLoaded ); - /* TODO(shess) Delimiters need to remain the same from run to run, - ** else we need to reindex. One solution would be a meta-table to - ** track such information in the database, then we'd only want this - ** information on the initial create. - */ - if( argc>1 ){ - int i, n = strlen(argv[1]); - for(i=0; i=0x80 ){ - sqlite3_free(t); - return SQLITE_ERROR; - } - t->delim[ch] = 1; - } - } else { - /* Mark non-alphanumeric ASCII characters as delimiters */ - int i; - for(i=1; i<0x80; i++){ - t->delim[i] = !isalnum(i); - } + /* Fill in the global hit count matrix row for this phrase. */ + pCsr = pExpr->aDoclist; + pEnd = &pExpr->aDoclist[pExpr->nDoclist]; + while( pCsraGlobal[iStart]); } - *ppTokenizer = &t->base; - return SQLITE_OK; -} - -/* -** Destroy a tokenizer -*/ -static int simpleDestroy(sqlite3_tokenizer *pTokenizer){ - sqlite3_free(pTokenizer); + p->iPhrase++; return SQLITE_OK; } -/* -** Prepare to begin tokenizing a particular string. The input -** string to be tokenized is pInput[0..nBytes-1]. A cursor -** used to incrementally tokenize this string is returned in -** *ppCursor. -*/ -static int simpleOpen( - sqlite3_tokenizer *pTokenizer, /* The tokenizer */ - const char *pInput, int nBytes, /* String to be tokenized */ - sqlite3_tokenizer_cursor **ppCursor /* OUT: Tokenization cursor */ +static int fts3ExprLocalMatchinfoCb( + Fts3Expr *pExpr, /* Phrase expression node */ + void *pCtx /* Pointer to MatchInfo structure */ ){ - simple_tokenizer_cursor *c; + MatchInfo *p = (MatchInfo *)pCtx; + int iPhrase = p->iPhrase++; - c = (simple_tokenizer_cursor *) sqlite3_malloc(sizeof(*c)); - if( c==NULL ) return SQLITE_NOMEM; + if( pExpr->aDoclist ){ + char *pCsr; + int iOffset = 2 + p->nCol*(p->aGlobal[0]+iPhrase); - c->pInput = pInput; - if( pInput==0 ){ - c->nBytes = 0; - }else if( nBytes<0 ){ - c->nBytes = (int)strlen(pInput); - }else{ - c->nBytes = nBytes; + memset(&p->aGlobal[iOffset], 0, p->nCol*sizeof(u32)); + pCsr = sqlite3Fts3FindPositions(pExpr, p->pCursor->iPrevId, -1); + if( pCsr ) fts3LoadColumnlistCounts(&pCsr, &p->aGlobal[iOffset]); } - c->iOffset = 0; /* start tokenizing at the beginning */ - c->iToken = 0; - c->pToken = NULL; /* no space allocated, yet. */ - c->nTokenAllocated = 0; - *ppCursor = &c->base; return SQLITE_OK; } /* -** Close a tokenization cursor previously opened by a call to -** simpleOpen() above. +** Populate pCsr->aMatchinfo[] with data for the current row. The 'matchinfo' +** data is an array of 32-bit unsigned integers (C type u32). */ -static int simpleClose(sqlite3_tokenizer_cursor *pCursor){ - simple_tokenizer_cursor *c = (simple_tokenizer_cursor *) pCursor; - sqlite3_free(c->pToken); - sqlite3_free(c); - return SQLITE_OK; -} +static int fts3GetMatchinfo(Fts3Cursor *pCsr){ + MatchInfo g; + Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab; + if( pCsr->aMatchinfo==0 ){ + int rc; + int nPhrase; + int nMatchinfo; -/* -** Extract the next token from a tokenization cursor. The cursor must -** have been opened by a prior call to simpleOpen(). -*/ -static int simpleNext( - sqlite3_tokenizer_cursor *pCursor, /* Cursor returned by simpleOpen */ - const char **ppToken, /* OUT: *ppToken is the token text */ - int *pnBytes, /* OUT: Number of bytes in token */ - int *piStartOffset, /* OUT: Starting offset of token */ - int *piEndOffset, /* OUT: Ending offset of token */ - int *piPosition /* OUT: Position integer of token */ -){ - simple_tokenizer_cursor *c = (simple_tokenizer_cursor *) pCursor; - simple_tokenizer *t = (simple_tokenizer *) pCursor->pTokenizer; - unsigned char *p = (unsigned char *)c->pInput; + g.pTab = pTab; + g.nCol = pTab->nColumn; + g.iPhrase = 0; + rc = fts3ExprLoadDoclists(pCsr, &nPhrase); + if( rc!=SQLITE_OK ){ + return rc; + } - while( c->iOffsetnBytes ){ - int iStartOffset; + nMatchinfo = 2 + 2*g.nCol*nPhrase; - /* Scan past delimiter characters */ - while( c->iOffsetnBytes && simpleDelim(t, p[c->iOffset]) ){ - c->iOffset++; + g.iPhrase = 0; + g.aGlobal = (u32 *)sqlite3_malloc(sizeof(u32)*nMatchinfo); + if( !g.aGlobal ){ + return SQLITE_NOMEM; } + memset(g.aGlobal, 0, sizeof(u32)*nMatchinfo); - /* Count non-delimiter characters. */ - iStartOffset = c->iOffset; - while( c->iOffsetnBytes && !simpleDelim(t, p[c->iOffset]) ){ - c->iOffset++; - } + g.aGlobal[0] = nPhrase; + g.aGlobal[1] = g.nCol; + (void)fts3ExprIterate(pCsr->pExpr, fts3ExprGlobalMatchinfoCb, (void *)&g); - if( c->iOffset>iStartOffset ){ - int i, n = c->iOffset-iStartOffset; - if( n>c->nTokenAllocated ){ - c->nTokenAllocated = n+20; - c->pToken = sqlite3_realloc(c->pToken, c->nTokenAllocated); - if( c->pToken==NULL ) return SQLITE_NOMEM; - } - for(i=0; ipToken[i] = ch<0x80 ? tolower(ch) : ch; - } - *ppToken = c->pToken; - *pnBytes = n; - *piStartOffset = iStartOffset; - *piEndOffset = c->iOffset; - *piPosition = c->iToken++; + pCsr->aMatchinfo = g.aGlobal; + } - return SQLITE_OK; - } + g.pTab = pTab; + g.pCursor = pCsr; + g.nCol = pTab->nColumn; + g.iPhrase = 0; + g.aGlobal = pCsr->aMatchinfo; + + if( pCsr->isMatchinfoOk ){ + (void)fts3ExprIterate(pCsr->pExpr, fts3ExprLocalMatchinfoCb, (void *)&g); + pCsr->isMatchinfoOk = 0; } - return SQLITE_DONE; -} -/* -** The set of routines that implement the simple tokenizer -*/ -static const sqlite3_tokenizer_module simpleTokenizerModule = { - 0, - simpleCreate, - simpleDestroy, - simpleOpen, - simpleClose, - simpleNext, -}; + return SQLITE_OK; +} -/* -** Allocate a new simple tokenizer. Return a pointer to the new -** tokenizer in *ppModule -*/ -SQLITE_PRIVATE void sqlite3Fts3SimpleTokenizerModule( - sqlite3_tokenizer_module const**ppModule +SQLITE_PRIVATE void sqlite3Fts3Snippet2( + sqlite3_context *pCtx, /* SQLite function call context */ + Fts3Cursor *pCsr, /* Cursor object */ + const char *zStart, /* Snippet start text - "" */ + const char *zEnd, /* Snippet end text - "" */ + const char *zEllipsis, /* Snippet ellipsis text - "..." */ + int iCol, /* Extract snippet from this column */ + int nToken /* Approximate number of tokens in snippet */ ){ - *ppModule = &simpleTokenizerModule; + int rc; + int iPos = 0; + u64 hlmask = 0; + char *z = 0; + int nDoc; + const char *zDoc; + + rc = fts3BestSnippet(nToken, pCsr, iCol, &iPos, &hlmask); + + nDoc = sqlite3_column_bytes(pCsr->pStmt, iCol+1); + zDoc = (const char *)sqlite3_column_text(pCsr->pStmt, iCol+1); + + if( rc==SQLITE_OK ){ + rc = fts3SnippetText( + pCsr, zDoc, nDoc, nToken, iPos, hlmask, zStart, zEnd, zEllipsis, &z); + } + if( rc!=SQLITE_OK ){ + sqlite3_result_error_code(pCtx, rc); + }else{ + sqlite3_result_text(pCtx, z, -1, sqlite3_free); + } } -#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */ +SQLITE_PRIVATE void sqlite3Fts3Matchinfo(sqlite3_context *pContext, Fts3Cursor *pCsr){ + int rc = fts3GetMatchinfo(pCsr); + if( rc!=SQLITE_OK ){ + sqlite3_result_error_code(pContext, rc); + }else{ + int n = sizeof(u32)*(2+pCsr->aMatchinfo[0]*pCsr->aMatchinfo[1]*2); + sqlite3_result_blob(pContext, pCsr->aMatchinfo, n, SQLITE_TRANSIENT); + } +} -/************** End of fts3_tokenizer1.c *************************************/ +#endif + +/************** End of fts3_snippet.c ****************************************/ /************** Begin file rtree.c *******************************************/ /* ** 2001 September 15 @@ -107001,8 +107254,6 @@ SQLITE_PRIVATE void sqlite3Fts3SimpleTokenizerModule( ************************************************************************* ** This file contains code for implementations of the r-tree and r*-tree ** algorithms packaged as an SQLite virtual table module. -** -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ */ #if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_RTREE) @@ -109862,7 +110113,7 @@ SQLITE_API int sqlite3_extension_init( ** May you share freely, never taking more than you give. ** ************************************************************************* -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ +** $Id: sqlite3.c 294454 2010-02-03 20:23:53Z pajoye $ ** ** This file implements an integration between the ICU library ** ("International Components for Unicode", an open-source library @@ -110304,7 +110555,7 @@ SQLITE_PRIVATE int sqlite3IcuInit(sqlite3 *db){ void *pContext; /* sqlite3_user_data() context */ void (*xFunc)(sqlite3_context*,int,sqlite3_value**); } scalars[] = { - {"regexp",-1, SQLITE_ANY, 0, icuRegexpFunc}, + {"regexp", 2, SQLITE_ANY, 0, icuRegexpFunc}, {"lower", 1, SQLITE_UTF16, 0, icuCaseFunc16}, {"lower", 2, SQLITE_UTF16, 0, icuCaseFunc16}, @@ -110363,7 +110614,7 @@ SQLITE_API int sqlite3_extension_init( ************************************************************************* ** This file implements a tokenizer for fts3 based on the ICU library. ** -** $Id: sqlite3.c 289758 2009-10-19 17:11:05Z pajoye $ +** $Id: sqlite3.c 294454 2010-02-03 20:23:53Z pajoye $ */ #if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) diff --git a/ext/sqlite3/libsqlite/sqlite3.h b/ext/sqlite3/libsqlite/sqlite3.h index 5216154f6..6709662bb 100644 --- a/ext/sqlite3/libsqlite/sqlite3.h +++ b/ext/sqlite3/libsqlite/sqlite3.h @@ -81,55 +81,43 @@ extern "C" { #endif /* -** CAPI3REF: Compile-Time Library Version Numbers {H10010} -** -** The SQLITE_VERSION and SQLITE_VERSION_NUMBER #defines in -** the sqlite3.h file specify the version of SQLite with which -** that header file is associated. -** -** The "version" of SQLite is a string of the form "W.X.Y" or "W.X.Y.Z". -** The W value is major version number and is always 3 in SQLite3. -** The W value only changes when backwards compatibility is -** broken and we intend to never break backwards compatibility. -** The X value is the minor version number and only changes when -** there are major feature enhancements that are forwards compatible -** but not backwards compatible. -** The Y value is the release number and is incremented with -** each release but resets back to 0 whenever X is incremented. -** The Z value only appears on branch releases. -** -** The SQLITE_VERSION_NUMBER is an integer that is computed as -** follows: -** -**
    -** SQLITE_VERSION_NUMBER = W*1000000 + X*1000 + Y
    -** 
    +** CAPI3REF: Compile-Time Library Version Numbers +** +** ^(The [SQLITE_VERSION] C preprocessor macro in the sqlite3.h header +** evaluates to a string literal that is the SQLite version in the +** format "X.Y.Z" where X is the major version number (always 3 for +** SQLite3) and Y is the minor version number and Z is the release number.)^ +** ^(The [SQLITE_VERSION_NUMBER] C preprocessor macro resolves to an integer +** with the value (X*1000000 + Y*1000 + Z) where X, Y, and Z are the same +** numbers used in [SQLITE_VERSION].)^ +** The SQLITE_VERSION_NUMBER for any given release of SQLite will also +** be larger than the release from which it is derived. Either Y will +** be held constant and Z will be incremented or else Y will be incremented +** and Z will be reset to zero. ** ** Since version 3.6.18, SQLite source code has been stored in the -** fossil configuration management -** system. The SQLITE_SOURCE_ID -** macro is a string which identifies a particular check-in of SQLite -** within its configuration management system. The string contains the -** date and time of the check-in (UTC) and an SHA1 hash of the entire -** source tree. +** Fossil configuration management +** system. ^The SQLITE_SOURCE_ID macro evalutes to +** a string which identifies a particular check-in of SQLite +** within its configuration management system. ^The SQLITE_SOURCE_ID +** string contains the date and time of the check-in (UTC) and an SHA1 +** hash of the entire source tree. ** ** See also: [sqlite3_libversion()], ** [sqlite3_libversion_number()], [sqlite3_sourceid()], ** [sqlite_version()] and [sqlite_source_id()]. -** -** Requirements: [H10011] [H10014] */ -#define SQLITE_VERSION "3.6.19" -#define SQLITE_VERSION_NUMBER 3006019 -#define SQLITE_SOURCE_ID "2009-10-14 11:33:55 c1d499afc50d54b376945b4efb65c56c787a073d" +#define SQLITE_VERSION "3.6.22" +#define SQLITE_VERSION_NUMBER 3006022 +#define SQLITE_SOURCE_ID "2010-01-05 15:30:36 28d0d7710761114a44a1a3a425a6883c661f06e7" /* -** CAPI3REF: Run-Time Library Version Numbers {H10020} +** CAPI3REF: Run-Time Library Version Numbers ** KEYWORDS: sqlite3_version ** ** These interfaces provide the same information as the [SQLITE_VERSION], -** [SQLITE_VERSION_NUMBER], and [SQLITE_SOURCE_ID] #defines in the header, -** but are associated with the library instead of the header file. Cautious +** [SQLITE_VERSION_NUMBER], and [SQLITE_SOURCE_ID] C preprocessor macros +** but are associated with the library instead of the header file. ^(Cautious ** programmers might include assert() statements in their application to ** verify that values returned by these interfaces match the macros in ** the header, and thus insure that the application is @@ -138,19 +126,20 @@ extern "C" { **
     ** assert( sqlite3_libversion_number()==SQLITE_VERSION_NUMBER );
     ** assert( strcmp(sqlite3_sourceid(),SQLITE_SOURCE_ID)==0 );
    -** assert( strcmp(sqlite3_libversion,SQLITE_VERSION)==0 );
    -** 
    -** -** The sqlite3_libversion() function returns the same information as is -** in the sqlite3_version[] string constant. The function is provided -** for use in DLLs since DLL users usually do not have direct access to string -** constants within the DLL. Similarly, the sqlite3_sourceid() function -** returns the same information as is in the [SQLITE_SOURCE_ID] #define of -** the header file. +** assert( strcmp(sqlite3_libversion(),SQLITE_VERSION)==0 ); +** )^ +** +** ^The sqlite3_version[] string constant contains the text of [SQLITE_VERSION] +** macro. ^The sqlite3_libversion() function returns a pointer to the +** to the sqlite3_version[] string constant. The sqlite3_libversion() +** function is provided for use in DLLs since DLL users usually do not have +** direct access to string constants within the DLL. ^The +** sqlite3_libversion_number() function returns an integer equal to +** [SQLITE_VERSION_NUMBER]. ^The sqlite3_sourceid() function a pointer +** to a string constant whose value is the same as the [SQLITE_SOURCE_ID] +** C preprocessor macro. ** ** See also: [sqlite_version()] and [sqlite_source_id()]. -** -** Requirements: [H10021] [H10022] [H10023] */ SQLITE_API SQLITE_EXTERN const char sqlite3_version[]; SQLITE_API const char *sqlite3_libversion(void); @@ -158,7 +147,11 @@ SQLITE_API const char *sqlite3_sourceid(void); SQLITE_API int sqlite3_libversion_number(void); /* -** CAPI3REF: Test To See If The Library Is Threadsafe {H10100} +** CAPI3REF: Test To See If The Library Is Threadsafe +** +** ^The sqlite3_threadsafe() function returns zero if and only if +** SQLite was compiled mutexing code omitted due to the +** [SQLITE_THREADSAFE] compile-time option being set to 0. ** ** SQLite can be compiled with or without mutexes. When ** the [SQLITE_THREADSAFE] C preprocessor macro is 1 or 2, mutexes @@ -170,7 +163,7 @@ SQLITE_API int sqlite3_libversion_number(void); ** Enabling mutexes incurs a measurable performance penalty. ** So if speed is of utmost importance, it makes sense to disable ** the mutexes. But for maximum safety, mutexes should be enabled. -** The default behavior is for mutexes to be enabled. +** ^The default behavior is for mutexes to be enabled. ** ** This interface can be used by an application to make sure that the ** version of SQLite that it is linking against was compiled with @@ -178,21 +171,21 @@ SQLITE_API int sqlite3_libversion_number(void); ** ** This interface only reports on the compile-time mutex setting ** of the [SQLITE_THREADSAFE] flag. If SQLite is compiled with -** SQLITE_THREADSAFE=1 then mutexes are enabled by default but +** SQLITE_THREADSAFE=1 or =2 then mutexes are enabled by default but ** can be fully or partially disabled using a call to [sqlite3_config()] ** with the verbs [SQLITE_CONFIG_SINGLETHREAD], [SQLITE_CONFIG_MULTITHREAD], -** or [SQLITE_CONFIG_MUTEX]. The return value of this function shows -** only the default compile-time setting, not any run-time changes -** to that setting. +** or [SQLITE_CONFIG_MUTEX]. ^(The return value of the +** sqlite3_threadsafe() function shows only the compile-time setting of +** thread safety, not any run-time changes to that setting made by +** sqlite3_config(). In other words, the return value from sqlite3_threadsafe() +** is unchanged by calls to sqlite3_config().)^ ** ** See the [threading mode] documentation for additional information. -** -** Requirements: [H10101] [H10102] */ SQLITE_API int sqlite3_threadsafe(void); /* -** CAPI3REF: Database Connection Handle {H12000} +** CAPI3REF: Database Connection Handle ** KEYWORDS: {database connection} {database connections} ** ** Each open SQLite database is represented by a pointer to an instance of @@ -207,7 +200,7 @@ SQLITE_API int sqlite3_threadsafe(void); typedef struct sqlite3 sqlite3; /* -** CAPI3REF: 64-Bit Integer Types {H10200} +** CAPI3REF: 64-Bit Integer Types ** KEYWORDS: sqlite_int64 sqlite_uint64 ** ** Because there is no cross-platform way to specify 64-bit integer types @@ -217,7 +210,10 @@ typedef struct sqlite3 sqlite3; ** The sqlite_int64 and sqlite_uint64 types are supported for backwards ** compatibility only. ** -** Requirements: [H10201] [H10202] +** ^The sqlite3_int64 and sqlite_int64 types can store integer values +** between -9223372036854775808 and +9223372036854775807 inclusive. ^The +** sqlite3_uint64 and sqlite_uint64 types can store integer values +** between 0 and +18446744073709551615 inclusive. */ #ifdef SQLITE_INT64_TYPE typedef SQLITE_INT64_TYPE sqlite_int64; @@ -241,34 +237,28 @@ typedef sqlite_uint64 sqlite3_uint64; #endif /* -** CAPI3REF: Closing A Database Connection {H12010} +** CAPI3REF: Closing A Database Connection ** -** This routine is the destructor for the [sqlite3] object. +** ^The sqlite3_close() routine is the destructor for the [sqlite3] object. +** ^Calls to sqlite3_close() return SQLITE_OK if the [sqlite3] object is +** successfullly destroyed and all associated resources are deallocated. ** -** Applications should [sqlite3_finalize | finalize] all [prepared statements] +** Applications must [sqlite3_finalize | finalize] all [prepared statements] ** and [sqlite3_blob_close | close] all [BLOB handles] associated with -** the [sqlite3] object prior to attempting to close the object. -** The [sqlite3_next_stmt()] interface can be used to locate all -** [prepared statements] associated with a [database connection] if desired. -** Typical code might look like this: -** -**
    -** sqlite3_stmt *pStmt;
    -** while( (pStmt = sqlite3_next_stmt(db, 0))!=0 ){
    -**     sqlite3_finalize(pStmt);
    -** }
    -** 
    +** the [sqlite3] object prior to attempting to close the object. ^If +** sqlite3_close() is called on a [database connection] that still has +** outstanding [prepared statements] or [BLOB handles], then it returns +** SQLITE_BUSY. ** -** If [sqlite3_close()] is invoked while a transaction is open, +** ^If [sqlite3_close()] is invoked while a transaction is open, ** the transaction is automatically rolled back. ** ** The C parameter to [sqlite3_close(C)] must be either a NULL ** pointer or an [sqlite3] object pointer obtained ** from [sqlite3_open()], [sqlite3_open16()], or ** [sqlite3_open_v2()], and not previously closed. -** -** Requirements: -** [H12011] [H12012] [H12013] [H12014] [H12015] [H12019] +** ^Calling sqlite3_close() with a NULL pointer argument is a +** harmless no-op. */ SQLITE_API int sqlite3_close(sqlite3 *); @@ -280,48 +270,65 @@ SQLITE_API int sqlite3_close(sqlite3 *); typedef int (*sqlite3_callback)(void*,int,char**, char**); /* -** CAPI3REF: One-Step Query Execution Interface {H12100} -** -** The sqlite3_exec() interface is a convenient way of running one or more -** SQL statements without having to write a lot of C code. The UTF-8 encoded -** SQL statements are passed in as the second parameter to sqlite3_exec(). -** The statements are evaluated one by one until either an error or -** an interrupt is encountered, or until they are all done. The 3rd parameter -** is an optional callback that is invoked once for each row of any query -** results produced by the SQL statements. The 5th parameter tells where -** to write any error messages. -** -** The error message passed back through the 5th parameter is held -** in memory obtained from [sqlite3_malloc()]. To avoid a memory leak, -** the calling application should call [sqlite3_free()] on any error -** message returned through the 5th parameter when it has finished using -** the error message. -** -** If the SQL statement in the 2nd parameter is NULL or an empty string -** or a string containing only whitespace and comments, then no SQL -** statements are evaluated and the database is not changed. +** CAPI3REF: One-Step Query Execution Interface +** +** The sqlite3_exec() interface is a convenience wrapper around +** [sqlite3_prepare_v2()], [sqlite3_step()], and [sqlite3_finalize()], +** that allows an application to run multiple statements of SQL +** without having to use a lot of C code. +** +** ^The sqlite3_exec() interface runs zero or more UTF-8 encoded, +** semicolon-separate SQL statements passed into its 2nd argument, +** in the context of the [database connection] passed in as its 1st +** argument. ^If the callback function of the 3rd argument to +** sqlite3_exec() is not NULL, then it is invoked for each result row +** coming out of the evaluated SQL statements. ^The 4th argument to +** to sqlite3_exec() is relayed through to the 1st argument of each +** callback invocation. ^If the callback pointer to sqlite3_exec() +** is NULL, then no callback is ever invoked and result rows are +** ignored. +** +** ^If an error occurs while evaluating the SQL statements passed into +** sqlite3_exec(), then execution of the current statement stops and +** subsequent statements are skipped. ^If the 5th parameter to sqlite3_exec() +** is not NULL then any error message is written into memory obtained +** from [sqlite3_malloc()] and passed back through the 5th parameter. +** To avoid memory leaks, the application should invoke [sqlite3_free()] +** on error message strings returned through the 5th parameter of +** of sqlite3_exec() after the error message string is no longer needed. +** ^If the 5th parameter to sqlite3_exec() is not NULL and no errors +** occur, then sqlite3_exec() sets the pointer in its 5th parameter to +** NULL before returning. +** +** ^If an sqlite3_exec() callback returns non-zero, the sqlite3_exec() +** routine returns SQLITE_ABORT without invoking the callback again and +** without running any subsequent SQL statements. +** +** ^The 2nd argument to the sqlite3_exec() callback function is the +** number of columns in the result. ^The 3rd argument to the sqlite3_exec() +** callback is an array of pointers to strings obtained as if from +** [sqlite3_column_text()], one for each column. ^If an element of a +** result row is NULL then the corresponding string pointer for the +** sqlite3_exec() callback is a NULL pointer. ^The 4th argument to the +** sqlite3_exec() callback is an array of pointers to strings where each +** entry represents the name of corresponding result column as obtained +** from [sqlite3_column_name()]. +** +** ^If the 2nd parameter to sqlite3_exec() is a NULL pointer, a pointer +** to an empty string, or a pointer that contains only whitespace and/or +** SQL comments, then no SQL statements are evaluated and the database +** is not changed. +** +** Restrictions: ** -** The sqlite3_exec() interface is implemented in terms of -** [sqlite3_prepare_v2()], [sqlite3_step()], and [sqlite3_finalize()]. -** The sqlite3_exec() routine does nothing to the database that cannot be done -** by [sqlite3_prepare_v2()], [sqlite3_step()], and [sqlite3_finalize()]. -** -** The first parameter to [sqlite3_exec()] must be an valid and open -** [database connection]. -** -** The database connection must not be closed while -** [sqlite3_exec()] is running. -** -** The calling function should use [sqlite3_free()] to free -** the memory that *errmsg is left pointing at once the error -** message is no longer needed. -** -** The SQL statement text in the 2nd parameter to [sqlite3_exec()] -** must remain unchanged while [sqlite3_exec()] is running. -** -** Requirements: -** [H12101] [H12102] [H12104] [H12105] [H12107] [H12110] [H12113] [H12116] -** [H12119] [H12122] [H12125] [H12131] [H12134] [H12137] [H12138] +**
      +**
    • The application must insure that the 1st parameter to sqlite3_exec() +** is a valid and open [database connection]. +**
    • The application must not close [database connection] specified by +** the 1st parameter to sqlite3_exec() while sqlite3_exec() is running. +**
    • The application must not modify the SQL statement text passed into +** the 2nd parameter of sqlite3_exec() while sqlite3_exec() is running. +**
    */ SQLITE_API int sqlite3_exec( sqlite3*, /* An open database */ @@ -332,7 +339,7 @@ SQLITE_API int sqlite3_exec( ); /* -** CAPI3REF: Result Codes {H10210} +** CAPI3REF: Result Codes ** KEYWORDS: SQLITE_OK {error code} {error codes} ** KEYWORDS: {result code} {result codes} ** @@ -376,7 +383,7 @@ SQLITE_API int sqlite3_exec( /* end-of-error-codes */ /* -** CAPI3REF: Extended Result Codes {H10220} +** CAPI3REF: Extended Result Codes ** KEYWORDS: {extended error code} {extended error codes} ** KEYWORDS: {extended result code} {extended result codes} ** @@ -418,7 +425,7 @@ SQLITE_API int sqlite3_exec( #define SQLITE_LOCKED_SHAREDCACHE (SQLITE_LOCKED | (1<<8) ) /* -** CAPI3REF: Flags For File Open Operations {H10230} +** CAPI3REF: Flags For File Open Operations ** ** These bit values are intended for use in the ** 3rd parameter to the [sqlite3_open_v2()] interface and @@ -443,7 +450,7 @@ SQLITE_API int sqlite3_exec( #define SQLITE_OPEN_PRIVATECACHE 0x00040000 /* Ok for sqlite3_open_v2() */ /* -** CAPI3REF: Device Characteristics {H10240} +** CAPI3REF: Device Characteristics ** ** The xDeviceCapabilities method of the [sqlite3_io_methods] ** object returns an integer which is a vector of the these @@ -475,7 +482,7 @@ SQLITE_API int sqlite3_exec( #define SQLITE_IOCAP_SEQUENTIAL 0x00000400 /* -** CAPI3REF: File Locking Levels {H10250} +** CAPI3REF: File Locking Levels ** ** SQLite uses one of these integer values as the second ** argument to calls it makes to the xLock() and xUnlock() methods @@ -488,7 +495,7 @@ SQLITE_API int sqlite3_exec( #define SQLITE_LOCK_EXCLUSIVE 4 /* -** CAPI3REF: Synchronization Type Flags {H10260} +** CAPI3REF: Synchronization Type Flags ** ** When SQLite invokes the xSync() method of an ** [sqlite3_io_methods] object it uses a combination of @@ -506,7 +513,7 @@ SQLITE_API int sqlite3_exec( #define SQLITE_SYNC_DATAONLY 0x00010 /* -** CAPI3REF: OS Interface Open File Handle {H11110} +** CAPI3REF: OS Interface Open File Handle ** ** An [sqlite3_file] object represents an open file in the ** [sqlite3_vfs | OS interface layer]. Individual OS interface @@ -522,7 +529,7 @@ struct sqlite3_file { }; /* -** CAPI3REF: OS Interface File Virtual Methods Object {H11120} +** CAPI3REF: OS Interface File Virtual Methods Object ** ** Every file opened by the [sqlite3_vfs] xOpen method populates an ** [sqlite3_file] object (or, more commonly, a subclass of the @@ -627,7 +634,7 @@ struct sqlite3_io_methods { }; /* -** CAPI3REF: Standard File Control Opcodes {H11310} +** CAPI3REF: Standard File Control Opcodes ** ** These integer constants are opcodes for the xFileControl method ** of the [sqlite3_io_methods] object and for the [sqlite3_file_control()] @@ -647,7 +654,7 @@ struct sqlite3_io_methods { #define SQLITE_LAST_ERRNO 4 /* -** CAPI3REF: Mutex Handle {H17110} +** CAPI3REF: Mutex Handle ** ** The mutex module within SQLite defines [sqlite3_mutex] to be an ** abstract type for a mutex object. The SQLite core never looks @@ -659,7 +666,7 @@ struct sqlite3_io_methods { typedef struct sqlite3_mutex sqlite3_mutex; /* -** CAPI3REF: OS Interface Object {H11140} +** CAPI3REF: OS Interface Object ** ** An instance of the sqlite3_vfs object defines the interface between ** the SQLite core and the underlying operating system. The "vfs" @@ -813,10 +820,10 @@ struct sqlite3_vfs { }; /* -** CAPI3REF: Flags for the xAccess VFS method {H11190} +** CAPI3REF: Flags for the xAccess VFS method ** ** These integer constants can be used as the third parameter to -** the xAccess method of an [sqlite3_vfs] object. {END} They determine +** the xAccess method of an [sqlite3_vfs] object. They determine ** what kind of permissions the xAccess method is looking for. ** With SQLITE_ACCESS_EXISTS, the xAccess method ** simply checks whether the file exists. @@ -830,39 +837,48 @@ struct sqlite3_vfs { #define SQLITE_ACCESS_READ 2 /* -** CAPI3REF: Initialize The SQLite Library {H10130} +** CAPI3REF: Initialize The SQLite Library ** -** The sqlite3_initialize() routine initializes the -** SQLite library. The sqlite3_shutdown() routine +** ^The sqlite3_initialize() routine initializes the +** SQLite library. ^The sqlite3_shutdown() routine ** deallocates any resources that were allocated by sqlite3_initialize(). +** These routines are designed to aid in process initialization and +** shutdown on embedded systems. Workstation applications using +** SQLite normally do not need to invoke either of these routines. ** ** A call to sqlite3_initialize() is an "effective" call if it is ** the first time sqlite3_initialize() is invoked during the lifetime of ** the process, or if it is the first time sqlite3_initialize() is invoked -** following a call to sqlite3_shutdown(). Only an effective call +** following a call to sqlite3_shutdown(). ^(Only an effective call ** of sqlite3_initialize() does any initialization. All other calls -** are harmless no-ops. +** are harmless no-ops.)^ ** ** A call to sqlite3_shutdown() is an "effective" call if it is the first -** call to sqlite3_shutdown() since the last sqlite3_initialize(). Only +** call to sqlite3_shutdown() since the last sqlite3_initialize(). ^(Only ** an effective call to sqlite3_shutdown() does any deinitialization. -** All other calls to sqlite3_shutdown() are harmless no-ops. +** All other valid calls to sqlite3_shutdown() are harmless no-ops.)^ +** +** The sqlite3_initialize() interface is threadsafe, but sqlite3_shutdown() +** is not. The sqlite3_shutdown() interface must only be called from a +** single thread. All open [database connections] must be closed and all +** other SQLite resources must be deallocated prior to invoking +** sqlite3_shutdown(). ** -** Among other things, sqlite3_initialize() shall invoke -** sqlite3_os_init(). Similarly, sqlite3_shutdown() -** shall invoke sqlite3_os_end(). +** Among other things, ^sqlite3_initialize() will invoke +** sqlite3_os_init(). Similarly, ^sqlite3_shutdown() +** will invoke sqlite3_os_end(). ** -** The sqlite3_initialize() routine returns [SQLITE_OK] on success. -** If for some reason, sqlite3_initialize() is unable to initialize +** ^The sqlite3_initialize() routine returns [SQLITE_OK] on success. +** ^If for some reason, sqlite3_initialize() is unable to initialize ** the library (perhaps it is unable to allocate a needed resource such ** as a mutex) it returns an [error code] other than [SQLITE_OK]. ** -** The sqlite3_initialize() routine is called internally by many other +** ^The sqlite3_initialize() routine is called internally by many other ** SQLite interfaces so that an application usually does not need to ** invoke sqlite3_initialize() directly. For example, [sqlite3_open()] ** calls sqlite3_initialize() so the SQLite library will be automatically ** initialized when [sqlite3_open()] is called if it has not be initialized -** already. However, if SQLite is compiled with the [SQLITE_OMIT_AUTOINIT] +** already. ^However, if SQLite is compiled with the [SQLITE_OMIT_AUTOINIT] ** compile-time option, then the automatic calls to sqlite3_initialize() ** are omitted and the application must call sqlite3_initialize() directly ** prior to using any other SQLite interface. For maximum portability, @@ -901,7 +917,7 @@ SQLITE_API int sqlite3_os_init(void); SQLITE_API int sqlite3_os_end(void); /* -** CAPI3REF: Configuring The SQLite Library {H14100} +** CAPI3REF: Configuring The SQLite Library ** EXPERIMENTAL ** ** The sqlite3_config() interface is used to make global configuration @@ -915,7 +931,9 @@ SQLITE_API int sqlite3_os_end(void); ** threads while sqlite3_config() is running. Furthermore, sqlite3_config() ** may only be invoked prior to library initialization using ** [sqlite3_initialize()] or after shutdown by [sqlite3_shutdown()]. -** Note, however, that sqlite3_config() can be called as part of the +** ^If sqlite3_config() is called after [sqlite3_initialize()] and before +** [sqlite3_shutdown()] then it will return SQLITE_MISUSE. +** Note, however, that ^sqlite3_config() can be called as part of the ** implementation of an application-defined [sqlite3_os_init()]. ** ** The first argument to sqlite3_config() is an integer @@ -924,26 +942,21 @@ SQLITE_API int sqlite3_os_end(void); ** vary depending on the [SQLITE_CONFIG_SINGLETHREAD | configuration option] ** in the first argument. ** -** When a configuration option is set, sqlite3_config() returns [SQLITE_OK]. -** If the option is unknown or SQLite is unable to set the option +** ^When a configuration option is set, sqlite3_config() returns [SQLITE_OK]. +** ^If the option is unknown or SQLite is unable to set the option ** then this routine returns a non-zero [error code]. -** -** Requirements: -** [H14103] [H14106] [H14120] [H14123] [H14126] [H14129] [H14132] [H14135] -** [H14138] [H14141] [H14144] [H14147] [H14150] [H14153] [H14156] [H14159] -** [H14162] [H14165] [H14168] */ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_config(int, ...); /* -** CAPI3REF: Configure database connections {H14200} +** CAPI3REF: Configure database connections ** EXPERIMENTAL ** ** The sqlite3_db_config() interface is used to make configuration ** changes to a [database connection]. The interface is similar to ** [sqlite3_config()] except that the changes apply to a single ** [database connection] (specified in the first argument). The -** sqlite3_db_config() interface can only be used immediately after +** sqlite3_db_config() interface should only be used immediately after ** the database connection is created using [sqlite3_open()], ** [sqlite3_open16()], or [sqlite3_open_v2()]. ** @@ -954,13 +967,13 @@ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_config(int, ...); ** New verbs are likely to be added in future releases of SQLite. ** Additional arguments depend on the verb. ** -** Requirements: -** [H14203] [H14206] [H14209] [H14212] [H14215] +** ^Calls to sqlite3_db_config() return SQLITE_OK if and only if +** the call is considered successful. */ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_db_config(sqlite3*, int op, ...); /* -** CAPI3REF: Memory Allocation Routines {H10155} +** CAPI3REF: Memory Allocation Routines ** EXPERIMENTAL ** ** An instance of this object defines the interface between SQLite @@ -990,7 +1003,7 @@ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_db_config(sqlite3*, int op, ...); ** The xRealloc method must work like realloc() from the standard C library ** with the exception that if the second argument to xRealloc is zero, ** xRealloc must be a no-op - it must not perform any allocation or -** deallocation. SQLite guaranteeds that the second argument to +** deallocation. ^SQLite guarantees that the second argument to ** xRealloc is always a value returned by a prior call to xRoundup. ** And so in cases where xRoundup always returns a positive number, ** xRealloc can perform exactly as the standard library realloc() and @@ -1042,7 +1055,7 @@ struct sqlite3_mem_methods { }; /* -** CAPI3REF: Configuration Options {H10160} +** CAPI3REF: Configuration Options ** EXPERIMENTAL ** ** These constants are the available integer configuration options that @@ -1057,22 +1070,33 @@ struct sqlite3_mem_methods { ** **
    **
    SQLITE_CONFIG_SINGLETHREAD
    -**
    There are no arguments to this option. This option disables +**
    There are no arguments to this option. ^This option sets the +** [threading mode] to Single-thread. In other words, it disables ** all mutexing and puts SQLite into a mode where it can only be used -** by a single thread.
    +** by a single thread. ^If SQLite is compiled with +** the [SQLITE_THREADSAFE | SQLITE_THREADSAFE=0] compile-time option then +** it is not possible to change the [threading mode] from its default +** value of Single-thread and so [sqlite3_config()] will return +** [SQLITE_ERROR] if called with the SQLITE_CONFIG_SINGLETHREAD +** configuration option. ** **
    SQLITE_CONFIG_MULTITHREAD
    -**
    There are no arguments to this option. This option disables +**
    There are no arguments to this option. ^This option sets the +** [threading mode] to Multi-thread. In other words, it disables ** mutexing on [database connection] and [prepared statement] objects. ** The application is responsible for serializing access to ** [database connections] and [prepared statements]. But other mutexes ** are enabled so that SQLite will be safe to use in a multi-threaded ** environment as long as no two threads attempt to use the same -** [database connection] at the same time. See the [threading mode] -** documentation for additional information.
    +** [database connection] at the same time. ^If SQLite is compiled with +** the [SQLITE_THREADSAFE | SQLITE_THREADSAFE=0] compile-time option then +** it is not possible to set the Multi-thread [threading mode] and +** [sqlite3_config()] will return [SQLITE_ERROR] if called with the +** SQLITE_CONFIG_MULTITHREAD configuration option. ** **
    SQLITE_CONFIG_SERIALIZED
    -**
    There are no arguments to this option. This option enables +**
    There are no arguments to this option. ^This option sets the +** [threading mode] to Serialized. In other words, this option enables ** all mutexes including the recursive ** mutexes on [database connection] and [prepared statement] objects. ** In this mode (which is the default when SQLite is compiled with @@ -1080,55 +1104,63 @@ struct sqlite3_mem_methods { ** to [database connections] and [prepared statements] so that the ** application is free to use the same [database connection] or the ** same [prepared statement] in different threads at the same time. -** See the [threading mode] documentation for additional information.
    +** ^If SQLite is compiled with +** the [SQLITE_THREADSAFE | SQLITE_THREADSAFE=0] compile-time option then +** it is not possible to set the Serialized [threading mode] and +** [sqlite3_config()] will return [SQLITE_ERROR] if called with the +** SQLITE_CONFIG_SERIALIZED configuration option. ** **
    SQLITE_CONFIG_MALLOC
    -**
    This option takes a single argument which is a pointer to an +**
    ^(This option takes a single argument which is a pointer to an ** instance of the [sqlite3_mem_methods] structure. The argument specifies ** alternative low-level memory allocation routines to be used in place of -** the memory allocation routines built into SQLite.
    +** the memory allocation routines built into SQLite.)^ ^SQLite makes +** its own private copy of the content of the [sqlite3_mem_methods] structure +** before the [sqlite3_config()] call returns. ** **
    SQLITE_CONFIG_GETMALLOC
    -**
    This option takes a single argument which is a pointer to an +**
    ^(This option takes a single argument which is a pointer to an ** instance of the [sqlite3_mem_methods] structure. The [sqlite3_mem_methods] -** structure is filled with the currently defined memory allocation routines. +** structure is filled with the currently defined memory allocation routines.)^ ** This option can be used to overload the default memory allocation ** routines with a wrapper that simulations memory allocation failure or -** tracks memory usage, for example.
    +** tracks memory usage, for example. ** **
    SQLITE_CONFIG_MEMSTATUS
    -**
    This option takes single argument of type int, interpreted as a +**
    ^This option takes single argument of type int, interpreted as a ** boolean, which enables or disables the collection of memory allocation -** statistics. When disabled, the following SQLite interfaces become -** non-operational: +** statistics. ^(When memory allocation statistics are disabled, the +** following SQLite interfaces become non-operational: **
      **
    • [sqlite3_memory_used()] **
    • [sqlite3_memory_highwater()] **
    • [sqlite3_soft_heap_limit()] **
    • [sqlite3_status()] -**
    +** )^ +** ^Memory allocation statistics are enabled by default unless SQLite is +** compiled with [SQLITE_DEFAULT_MEMSTATUS]=0 in which case memory +** allocation statistics are disabled by default. **
    ** **
    SQLITE_CONFIG_SCRATCH
    -**
    This option specifies a static memory buffer that SQLite can use for +**
    ^This option specifies a static memory buffer that SQLite can use for ** scratch memory. There are three arguments: A pointer an 8-byte ** aligned memory buffer from which the scrach allocations will be ** drawn, the size of each scratch allocation (sz), ** and the maximum number of scratch allocations (N). The sz ** argument must be a multiple of 16. The sz parameter should be a few bytes ** larger than the actual scratch space required due to internal overhead. -** The first argument should pointer to an 8-byte aligned buffer +** The first argument must be a pointer to an 8-byte aligned buffer ** of at least sz*N bytes of memory. -** SQLite will use no more than one scratch buffer at once per thread, so -** N should be set to the expected maximum number of threads. The sz -** parameter should be 6 times the size of the largest database page size. -** Scratch buffers are used as part of the btree balance operation. If -** The btree balancer needs additional memory beyond what is provided by -** scratch buffers or if no scratch buffer space is specified, then SQLite -** goes to [sqlite3_malloc()] to obtain the memory it needs.
    +** ^SQLite will use no more than one scratch buffer per thread. So +** N should be set to the expected maximum number of threads. ^SQLite will +** never require a scratch buffer that is more than 6 times the database +** page size. ^If SQLite needs needs additional scratch memory beyond +** what is provided by this configuration option, then +** [sqlite3_malloc()] will be used to obtain the memory needed. ** **
    SQLITE_CONFIG_PAGECACHE
    -**
    This option specifies a static memory buffer that SQLite can use for +**
    ^This option specifies a static memory buffer that SQLite can use for ** the database page cache with the default page cache implemenation. ** This configuration should not be used if an application-define page ** cache implementation is loaded using the SQLITE_CONFIG_PCACHE option. @@ -1136,28 +1168,28 @@ struct sqlite3_mem_methods { ** memory, the size of each page buffer (sz), and the number of pages (N). ** The sz argument should be the size of the largest database page ** (a power of two between 512 and 32768) plus a little extra for each -** page header. The page header size is 20 to 40 bytes depending on -** the host architecture. It is harmless, apart from the wasted memory, +** page header. ^The page header size is 20 to 40 bytes depending on +** the host architecture. ^It is harmless, apart from the wasted memory, ** to make sz a little too large. The first ** argument should point to an allocation of at least sz*N bytes of memory. -** SQLite will use the memory provided by the first argument to satisfy its -** memory needs for the first N pages that it adds to cache. If additional +** ^SQLite will use the memory provided by the first argument to satisfy its +** memory needs for the first N pages that it adds to cache. ^If additional ** page cache memory is needed beyond what is provided by this option, then ** SQLite goes to [sqlite3_malloc()] for the additional storage space. -** The implementation might use one or more of the N buffers to hold +** ^The implementation might use one or more of the N buffers to hold ** memory accounting information. The pointer in the first argument must ** be aligned to an 8-byte boundary or subsequent behavior of SQLite ** will be undefined.
    ** **
    SQLITE_CONFIG_HEAP
    -**
    This option specifies a static memory buffer that SQLite will use +**
    ^This option specifies a static memory buffer that SQLite will use ** for all of its dynamic memory allocation needs beyond those provided ** for by [SQLITE_CONFIG_SCRATCH] and [SQLITE_CONFIG_PAGECACHE]. ** There are three arguments: An 8-byte aligned pointer to the memory, ** the number of bytes in the memory buffer, and the minimum allocation size. -** If the first pointer (the memory pointer) is NULL, then SQLite reverts +** ^If the first pointer (the memory pointer) is NULL, then SQLite reverts ** to using its default memory allocator (the system malloc() implementation), -** undoing any prior invocation of [SQLITE_CONFIG_MALLOC]. If the +** undoing any prior invocation of [SQLITE_CONFIG_MALLOC]. ^If the ** memory pointer is not NULL and either [SQLITE_ENABLE_MEMSYS3] or ** [SQLITE_ENABLE_MEMSYS5] are defined, then the alternative memory ** allocator is engaged to handle all of SQLites memory allocation needs. @@ -1165,39 +1197,50 @@ struct sqlite3_mem_methods { ** boundary or subsequent behavior of SQLite will be undefined.
    ** **
    SQLITE_CONFIG_MUTEX
    -**
    This option takes a single argument which is a pointer to an +**
    ^(This option takes a single argument which is a pointer to an ** instance of the [sqlite3_mutex_methods] structure. The argument specifies ** alternative low-level mutex routines to be used in place -** the mutex routines built into SQLite.
    +** the mutex routines built into SQLite.)^ ^SQLite makes a copy of the +** content of the [sqlite3_mutex_methods] structure before the call to +** [sqlite3_config()] returns. ^If SQLite is compiled with +** the [SQLITE_THREADSAFE | SQLITE_THREADSAFE=0] compile-time option then +** the entire mutexing subsystem is omitted from the build and hence calls to +** [sqlite3_config()] with the SQLITE_CONFIG_MUTEX configuration option will +** return [SQLITE_ERROR]. ** **
    SQLITE_CONFIG_GETMUTEX
    -**
    This option takes a single argument which is a pointer to an +**
    ^(This option takes a single argument which is a pointer to an ** instance of the [sqlite3_mutex_methods] structure. The ** [sqlite3_mutex_methods] -** structure is filled with the currently defined mutex routines. +** structure is filled with the currently defined mutex routines.)^ ** This option can be used to overload the default mutex allocation ** routines with a wrapper used to track mutex usage for performance -** profiling or testing, for example.
    +** profiling or testing, for example. ^If SQLite is compiled with +** the [SQLITE_THREADSAFE | SQLITE_THREADSAFE=0] compile-time option then +** the entire mutexing subsystem is omitted from the build and hence calls to +** [sqlite3_config()] with the SQLITE_CONFIG_GETMUTEX configuration option will +** return [SQLITE_ERROR]. ** **
    SQLITE_CONFIG_LOOKASIDE
    -**
    This option takes two arguments that determine the default -** memory allocation lookaside optimization. The first argument is the +**
    ^(This option takes two arguments that determine the default +** memory allocation for the lookaside memory allocator on each +** [database connection]. The first argument is the ** size of each lookaside buffer slot and the second is the number of -** slots allocated to each database connection. This option sets the -** default lookaside size. The [SQLITE_DBCONFIG_LOOKASIDE] +** slots allocated to each database connection.)^ ^(This option sets the +** default lookaside size. The [SQLITE_DBCONFIG_LOOKASIDE] ** verb to [sqlite3_db_config()] can be used to change the lookaside -** configuration on individual connections.
    +** configuration on individual connections.)^ ** **
    SQLITE_CONFIG_PCACHE
    -**
    This option takes a single argument which is a pointer to +**
    ^(This option takes a single argument which is a pointer to ** an [sqlite3_pcache_methods] object. This object specifies the interface -** to a custom page cache implementation. SQLite makes a copy of the +** to a custom page cache implementation.)^ ^SQLite makes a copy of the ** object and uses it for page cache memory allocations.
    ** **
    SQLITE_CONFIG_GETPCACHE
    -**
    This option takes a single argument which is a pointer to an +**
    ^(This option takes a single argument which is a pointer to an ** [sqlite3_pcache_methods] object. SQLite copies of the current -** page cache implementation into that object.
    +** page cache implementation into that object.)^ ** **
    */ @@ -1218,7 +1261,7 @@ struct sqlite3_mem_methods { #define SQLITE_CONFIG_GETPCACHE 15 /* sqlite3_pcache_methods* */ /* -** CAPI3REF: Configuration Options {H10170} +** CAPI3REF: Configuration Options ** EXPERIMENTAL ** ** These constants are the available integer configuration options that @@ -1227,23 +1270,25 @@ struct sqlite3_mem_methods { ** New configuration options may be added in future releases of SQLite. ** Existing configuration options might be discontinued. Applications ** should check the return code from [sqlite3_db_config()] to make sure that -** the call worked. The [sqlite3_db_config()] interface will return a +** the call worked. ^The [sqlite3_db_config()] interface will return a ** non-zero [error code] if a discontinued or unsupported configuration option ** is invoked. ** **
    **
    SQLITE_DBCONFIG_LOOKASIDE
    -**
    This option takes three additional arguments that determine the +**
    ^This option takes three additional arguments that determine the ** [lookaside memory allocator] configuration for the [database connection]. -** The first argument (the third parameter to [sqlite3_db_config()] is a +** ^The first argument (the third parameter to [sqlite3_db_config()] is a ** pointer to an memory buffer to use for lookaside memory. -** The first argument may be NULL in which case SQLite will allocate the -** lookaside buffer itself using [sqlite3_malloc()]. The second argument is the -** size of each lookaside buffer slot and the third argument is the number of +** ^The first argument after the SQLITE_DBCONFIG_LOOKASIDE verb +** may be NULL in which case SQLite will allocate the +** lookaside buffer itself using [sqlite3_malloc()]. ^The second argument is the +** size of each lookaside buffer slot. ^The third argument is the number of ** slots. The size of the buffer in the first argument must be greater than ** or equal to the product of the second and third arguments. The buffer -** must be aligned to an 8-byte boundary. If the second argument is not -** a multiple of 8, it is internally rounded down to the next smaller +** must be aligned to an 8-byte boundary. ^If the second argument to +** SQLITE_DBCONFIG_LOOKASIDE is not a multiple of 8, it is internally +** rounded down to the next smaller ** multiple of 8. See also: [SQLITE_CONFIG_LOOKASIDE]
    ** **
    @@ -1252,52 +1297,49 @@ struct sqlite3_mem_methods { /* -** CAPI3REF: Enable Or Disable Extended Result Codes {H12200} -** -** The sqlite3_extended_result_codes() routine enables or disables the -** [extended result codes] feature of SQLite. The extended result -** codes are disabled by default for historical compatibility considerations. +** CAPI3REF: Enable Or Disable Extended Result Codes ** -** Requirements: -** [H12201] [H12202] +** ^The sqlite3_extended_result_codes() routine enables or disables the +** [extended result codes] feature of SQLite. ^The extended result +** codes are disabled by default for historical compatibility. */ SQLITE_API int sqlite3_extended_result_codes(sqlite3*, int onoff); /* -** CAPI3REF: Last Insert Rowid {H12220} +** CAPI3REF: Last Insert Rowid ** -** Each entry in an SQLite table has a unique 64-bit signed -** integer key called the [ROWID | "rowid"]. The rowid is always available +** ^Each entry in an SQLite table has a unique 64-bit signed +** integer key called the [ROWID | "rowid"]. ^The rowid is always available ** as an undeclared column named ROWID, OID, or _ROWID_ as long as those -** names are not also used by explicitly declared columns. If +** names are not also used by explicitly declared columns. ^If ** the table has a column of type [INTEGER PRIMARY KEY] then that column ** is another alias for the rowid. ** -** This routine returns the [rowid] of the most recent +** ^This routine returns the [rowid] of the most recent ** successful [INSERT] into the database from the [database connection] -** in the first argument. If no successful [INSERT]s +** in the first argument. ^If no successful [INSERT]s ** have ever occurred on that database connection, zero is returned. ** -** If an [INSERT] occurs within a trigger, then the [rowid] of the inserted +** ^(If an [INSERT] occurs within a trigger, then the [rowid] of the inserted ** row is returned by this routine as long as the trigger is running. ** But once the trigger terminates, the value returned by this routine -** reverts to the last value inserted before the trigger fired. +** reverts to the last value inserted before the trigger fired.)^ ** -** An [INSERT] that fails due to a constraint violation is not a +** ^An [INSERT] that fails due to a constraint violation is not a ** successful [INSERT] and does not change the value returned by this -** routine. Thus INSERT OR FAIL, INSERT OR IGNORE, INSERT OR ROLLBACK, +** routine. ^Thus INSERT OR FAIL, INSERT OR IGNORE, INSERT OR ROLLBACK, ** and INSERT OR ABORT make no changes to the return value of this -** routine when their insertion fails. When INSERT OR REPLACE +** routine when their insertion fails. ^(When INSERT OR REPLACE ** encounters a constraint violation, it does not fail. The ** INSERT continues to completion after deleting rows that caused ** the constraint problem so INSERT OR REPLACE will always change -** the return value of this interface. +** the return value of this interface.)^ ** -** For the purposes of this routine, an [INSERT] is considered to +** ^For the purposes of this routine, an [INSERT] is considered to ** be successful even if it is subsequently rolled back. ** -** Requirements: -** [H12221] [H12223] +** This function is accessible to SQL statements via the +** [last_insert_rowid() SQL function]. ** ** If a separate thread performs a new [INSERT] on the same ** database connection while the [sqlite3_last_insert_rowid()] @@ -1309,25 +1351,25 @@ SQLITE_API int sqlite3_extended_result_codes(sqlite3*, int onoff); SQLITE_API sqlite3_int64 sqlite3_last_insert_rowid(sqlite3*); /* -** CAPI3REF: Count The Number Of Rows Modified {H12240} +** CAPI3REF: Count The Number Of Rows Modified ** -** This function returns the number of database rows that were changed +** ^This function returns the number of database rows that were changed ** or inserted or deleted by the most recently completed SQL statement ** on the [database connection] specified by the first parameter. -** Only changes that are directly specified by the [INSERT], [UPDATE], +** ^(Only changes that are directly specified by the [INSERT], [UPDATE], ** or [DELETE] statement are counted. Auxiliary changes caused by -** triggers or [foreign key actions] are not counted. Use the +** triggers or [foreign key actions] are not counted.)^ Use the ** [sqlite3_total_changes()] function to find the total number of changes ** including changes caused by triggers and foreign key actions. ** -** Changes to a view that are simulated by an [INSTEAD OF trigger] +** ^Changes to a view that are simulated by an [INSTEAD OF trigger] ** are not counted. Only real table changes are counted. ** -** A "row change" is a change to a single row of a single table +** ^(A "row change" is a change to a single row of a single table ** caused by an INSERT, DELETE, or UPDATE statement. Rows that ** are changed as side effects of [REPLACE] constraint resolution, ** rollback, ABORT processing, [DROP TABLE], or by any other -** mechanisms do not count as direct row changes. +** mechanisms do not count as direct row changes.)^ ** ** A "trigger context" is a scope of execution that begins and ** ends with the script of a [CREATE TRIGGER | trigger]. @@ -1337,27 +1379,24 @@ SQLITE_API sqlite3_int64 sqlite3_last_insert_rowid(sqlite3*); ** new trigger context is entered for the duration of that one ** trigger. Subtriggers create subcontexts for their duration. ** -** Calling [sqlite3_exec()] or [sqlite3_step()] recursively does +** ^Calling [sqlite3_exec()] or [sqlite3_step()] recursively does ** not create a new trigger context. ** -** This function returns the number of direct row changes in the +** ^This function returns the number of direct row changes in the ** most recent INSERT, UPDATE, or DELETE statement within the same ** trigger context. ** -** Thus, when called from the top level, this function returns the +** ^Thus, when called from the top level, this function returns the ** number of changes in the most recent INSERT, UPDATE, or DELETE -** that also occurred at the top level. Within the body of a trigger, +** that also occurred at the top level. ^(Within the body of a trigger, ** the sqlite3_changes() interface can be called to find the number of ** changes in the most recently completed INSERT, UPDATE, or DELETE ** statement within the body of the same trigger. ** However, the number returned does not include changes -** caused by subtriggers since those have their own context. +** caused by subtriggers since those have their own context.)^ ** -** See also the [sqlite3_total_changes()] interface and the -** [count_changes pragma]. -** -** Requirements: -** [H12241] [H12243] +** See also the [sqlite3_total_changes()] interface, the +** [count_changes pragma], and the [changes() SQL function]. ** ** If a separate thread makes changes on the same database connection ** while [sqlite3_changes()] is running then the value returned @@ -1366,26 +1405,24 @@ SQLITE_API sqlite3_int64 sqlite3_last_insert_rowid(sqlite3*); SQLITE_API int sqlite3_changes(sqlite3*); /* -** CAPI3REF: Total Number Of Rows Modified {H12260} +** CAPI3REF: Total Number Of Rows Modified ** -** This function returns the number of row changes caused by [INSERT], +** ^This function returns the number of row changes caused by [INSERT], ** [UPDATE] or [DELETE] statements since the [database connection] was opened. -** The count includes all changes from all [CREATE TRIGGER | trigger] -** contexts and changes made by [foreign key actions]. However, +** ^(The count returned by sqlite3_total_changes() includes all changes +** from all [CREATE TRIGGER | trigger] contexts and changes made by +** [foreign key actions]. However, ** the count does not include changes used to implement [REPLACE] constraints, ** do rollbacks or ABORT processing, or [DROP TABLE] processing. The ** count does not include rows of views that fire an [INSTEAD OF trigger], ** though if the INSTEAD OF trigger makes changes of its own, those changes -** are counted. -** The changes are counted as soon as the statement that makes them is -** completed (when the statement handle is passed to [sqlite3_reset()] or -** [sqlite3_finalize()]). -** -** See also the [sqlite3_changes()] interface and the -** [count_changes pragma]. +** are counted.)^ +** ^The sqlite3_total_changes() function counts the changes as soon as +** the statement that makes them is completed (when the statement handle +** is passed to [sqlite3_reset()] or [sqlite3_finalize()]). ** -** Requirements: -** [H12261] [H12263] +** See also the [sqlite3_changes()] interface, the +** [count_changes pragma], and the [total_changes() SQL function]. ** ** If a separate thread makes changes on the same database connection ** while [sqlite3_total_changes()] is running then the value @@ -1394,75 +1431,70 @@ SQLITE_API int sqlite3_changes(sqlite3*); SQLITE_API int sqlite3_total_changes(sqlite3*); /* -** CAPI3REF: Interrupt A Long-Running Query {H12270} +** CAPI3REF: Interrupt A Long-Running Query ** -** This function causes any pending database operation to abort and +** ^This function causes any pending database operation to abort and ** return at its earliest opportunity. This routine is typically ** called in response to a user action such as pressing "Cancel" ** or Ctrl-C where the user wants a long query operation to halt ** immediately. ** -** It is safe to call this routine from a thread different from the +** ^It is safe to call this routine from a thread different from the ** thread that is currently running the database operation. But it ** is not safe to call this routine with a [database connection] that ** is closed or might close before sqlite3_interrupt() returns. ** -** If an SQL operation is very nearly finished at the time when +** ^If an SQL operation is very nearly finished at the time when ** sqlite3_interrupt() is called, then it might not have an opportunity ** to be interrupted and might continue to completion. ** -** An SQL operation that is interrupted will return [SQLITE_INTERRUPT]. -** If the interrupted SQL operation is an INSERT, UPDATE, or DELETE +** ^An SQL operation that is interrupted will return [SQLITE_INTERRUPT]. +** ^If the interrupted SQL operation is an INSERT, UPDATE, or DELETE ** that is inside an explicit transaction, then the entire transaction ** will be rolled back automatically. ** -** The sqlite3_interrupt(D) call is in effect until all currently running -** SQL statements on [database connection] D complete. Any new SQL statements +** ^The sqlite3_interrupt(D) call is in effect until all currently running +** SQL statements on [database connection] D complete. ^Any new SQL statements ** that are started after the sqlite3_interrupt() call and before the ** running statements reaches zero are interrupted as if they had been -** running prior to the sqlite3_interrupt() call. New SQL statements +** running prior to the sqlite3_interrupt() call. ^New SQL statements ** that are started after the running statement count reaches zero are ** not effected by the sqlite3_interrupt(). -** A call to sqlite3_interrupt(D) that occurs when there are no running +** ^A call to sqlite3_interrupt(D) that occurs when there are no running ** SQL statements is a no-op and has no effect on SQL statements ** that are started after the sqlite3_interrupt() call returns. ** -** Requirements: -** [H12271] [H12272] -** ** If the database connection closes while [sqlite3_interrupt()] ** is running then bad things will likely happen. */ SQLITE_API void sqlite3_interrupt(sqlite3*); /* -** CAPI3REF: Determine If An SQL Statement Is Complete {H10510} +** CAPI3REF: Determine If An SQL Statement Is Complete ** ** These routines are useful during command-line input to determine if the ** currently entered text seems to form a complete SQL statement or ** if additional input is needed before sending the text into -** SQLite for parsing. These routines return 1 if the input string -** appears to be a complete SQL statement. A statement is judged to be +** SQLite for parsing. ^These routines return 1 if the input string +** appears to be a complete SQL statement. ^A statement is judged to be ** complete if it ends with a semicolon token and is not a prefix of a -** well-formed CREATE TRIGGER statement. Semicolons that are embedded within +** well-formed CREATE TRIGGER statement. ^Semicolons that are embedded within ** string literals or quoted identifier names or comments are not ** independent tokens (they are part of the token in which they are -** embedded) and thus do not count as a statement terminator. Whitespace +** embedded) and thus do not count as a statement terminator. ^Whitespace ** and comments that follow the final semicolon are ignored. ** -** These routines return 0 if the statement is incomplete. If a +** ^These routines return 0 if the statement is incomplete. ^If a ** memory allocation fails, then SQLITE_NOMEM is returned. ** -** These routines do not parse the SQL statements thus +** ^These routines do not parse the SQL statements thus ** will not detect syntactically incorrect SQL. ** -** If SQLite has not been initialized using [sqlite3_initialize()] prior +** ^(If SQLite has not been initialized using [sqlite3_initialize()] prior ** to invoking sqlite3_complete16() then sqlite3_initialize() is invoked ** automatically by sqlite3_complete16(). If that initialization fails, ** then the return value from sqlite3_complete16() will be non-zero -** regardless of whether or not the input SQL is complete. -** -** Requirements: [H10511] [H10512] +** regardless of whether or not the input SQL is complete.)^ ** ** The input to [sqlite3_complete()] must be a zero-terminated ** UTF-8 string. @@ -1474,27 +1506,27 @@ SQLITE_API int sqlite3_complete(const char *sql); SQLITE_API int sqlite3_complete16(const void *sql); /* -** CAPI3REF: Register A Callback To Handle SQLITE_BUSY Errors {H12310} +** CAPI3REF: Register A Callback To Handle SQLITE_BUSY Errors ** -** This routine sets a callback function that might be invoked whenever +** ^This routine sets a callback function that might be invoked whenever ** an attempt is made to open a database table that another thread ** or process has locked. ** -** If the busy callback is NULL, then [SQLITE_BUSY] or [SQLITE_IOERR_BLOCKED] -** is returned immediately upon encountering the lock. If the busy callback -** is not NULL, then the callback will be invoked with two arguments. +** ^If the busy callback is NULL, then [SQLITE_BUSY] or [SQLITE_IOERR_BLOCKED] +** is returned immediately upon encountering the lock. ^If the busy callback +** is not NULL, then the callback might be invoked with two arguments. ** -** The first argument to the handler is a copy of the void* pointer which -** is the third argument to sqlite3_busy_handler(). The second argument to -** the handler callback is the number of times that the busy handler has -** been invoked for this locking event. If the +** ^The first argument to the busy handler is a copy of the void* pointer which +** is the third argument to sqlite3_busy_handler(). ^The second argument to +** the busy handler callback is the number of times that the busy handler has +** been invoked for this locking event. ^If the ** busy callback returns 0, then no additional attempts are made to ** access the database and [SQLITE_BUSY] or [SQLITE_IOERR_BLOCKED] is returned. -** If the callback returns non-zero, then another attempt +** ^If the callback returns non-zero, then another attempt ** is made to open the database for reading and the cycle repeats. ** ** The presence of a busy handler does not guarantee that it will be invoked -** when there is lock contention. If SQLite determines that invoking the busy +** when there is lock contention. ^If SQLite determines that invoking the busy ** handler could result in a deadlock, it will go ahead and return [SQLITE_BUSY] ** or [SQLITE_IOERR_BLOCKED] instead of invoking the busy handler. ** Consider a scenario where one process is holding a read lock that @@ -1508,65 +1540,59 @@ SQLITE_API int sqlite3_complete16(const void *sql); ** will induce the first process to release its read lock and allow ** the second process to proceed. ** -** The default busy callback is NULL. +** ^The default busy callback is NULL. ** -** The [SQLITE_BUSY] error is converted to [SQLITE_IOERR_BLOCKED] +** ^The [SQLITE_BUSY] error is converted to [SQLITE_IOERR_BLOCKED] ** when SQLite is in the middle of a large transaction where all the ** changes will not fit into the in-memory cache. SQLite will ** already hold a RESERVED lock on the database file, but it needs ** to promote this lock to EXCLUSIVE so that it can spill cache ** pages into the database file without harm to concurrent -** readers. If it is unable to promote the lock, then the in-memory +** readers. ^If it is unable to promote the lock, then the in-memory ** cache will be left in an inconsistent state and so the error ** code is promoted from the relatively benign [SQLITE_BUSY] to -** the more severe [SQLITE_IOERR_BLOCKED]. This error code promotion +** the more severe [SQLITE_IOERR_BLOCKED]. ^This error code promotion ** forces an automatic rollback of the changes. See the ** ** CorruptionFollowingBusyError wiki page for a discussion of why ** this is important. ** -** There can only be a single busy handler defined for each +** ^(There can only be a single busy handler defined for each ** [database connection]. Setting a new busy handler clears any -** previously set handler. Note that calling [sqlite3_busy_timeout()] +** previously set handler.)^ ^Note that calling [sqlite3_busy_timeout()] ** will also set or clear the busy handler. ** ** The busy callback should not take any actions which modify the ** database connection that invoked the busy handler. Any such actions ** result in undefined behavior. ** -** Requirements: -** [H12311] [H12312] [H12314] [H12316] [H12318] -** ** A busy handler must not close the database connection ** or [prepared statement] that invoked the busy handler. */ SQLITE_API int sqlite3_busy_handler(sqlite3*, int(*)(void*,int), void*); /* -** CAPI3REF: Set A Busy Timeout {H12340} +** CAPI3REF: Set A Busy Timeout ** -** This routine sets a [sqlite3_busy_handler | busy handler] that sleeps -** for a specified amount of time when a table is locked. The handler +** ^This routine sets a [sqlite3_busy_handler | busy handler] that sleeps +** for a specified amount of time when a table is locked. ^The handler ** will sleep multiple times until at least "ms" milliseconds of sleeping -** have accumulated. {H12343} After "ms" milliseconds of sleeping, +** have accumulated. ^After at least "ms" milliseconds of sleeping, ** the handler returns 0 which causes [sqlite3_step()] to return ** [SQLITE_BUSY] or [SQLITE_IOERR_BLOCKED]. ** -** Calling this routine with an argument less than or equal to zero +** ^Calling this routine with an argument less than or equal to zero ** turns off all busy handlers. ** -** There can only be a single busy handler for a particular +** ^(There can only be a single busy handler for a particular ** [database connection] any any given moment. If another busy handler ** was defined (using [sqlite3_busy_handler()]) prior to calling -** this routine, that other busy handler is cleared. -** -** Requirements: -** [H12341] [H12343] [H12344] +** this routine, that other busy handler is cleared.)^ */ SQLITE_API int sqlite3_busy_timeout(sqlite3*, int ms); /* -** CAPI3REF: Convenience Routines For Running Queries {H12370} +** CAPI3REF: Convenience Routines For Running Queries ** ** Definition: A result table is memory data structure created by the ** [sqlite3_get_table()] interface. A result table records the @@ -1614,27 +1640,25 @@ SQLITE_API int sqlite3_busy_timeout(sqlite3*, int ms); ** azResult[7] = "21"; ** ** -** The sqlite3_get_table() function evaluates one or more +** ^The sqlite3_get_table() function evaluates one or more ** semicolon-separated SQL statements in the zero-terminated UTF-8 -** string of its 2nd parameter. It returns a result table to the +** string of its 2nd parameter and returns a result table to the ** pointer given in its 3rd parameter. ** -** After the calling function has finished using the result, it should -** pass the pointer to the result table to sqlite3_free_table() in order to +** After the application has finished with the result from sqlite3_get_table(), +** it should pass the result table pointer to sqlite3_free_table() in order to ** release the memory that was malloced. Because of the way the ** [sqlite3_malloc()] happens within sqlite3_get_table(), the calling ** function must not try to call [sqlite3_free()] directly. Only ** [sqlite3_free_table()] is able to release the memory properly and safely. ** -** The sqlite3_get_table() interface is implemented as a wrapper around +** ^(The sqlite3_get_table() interface is implemented as a wrapper around ** [sqlite3_exec()]. The sqlite3_get_table() routine does not have access ** to any internal data structures of SQLite. It uses only the public ** interface defined here. As a consequence, errors that occur in the ** wrapper layer outside of the internal [sqlite3_exec()] call are not -** reflected in subsequent calls to [sqlite3_errcode()] or [sqlite3_errmsg()]. -** -** Requirements: -** [H12371] [H12373] [H12374] [H12376] [H12379] [H12382] +** reflected in subsequent calls to [sqlite3_errcode()] or +** [sqlite3_errmsg()].)^ */ SQLITE_API int sqlite3_get_table( sqlite3 *db, /* An open database */ @@ -1647,33 +1671,33 @@ SQLITE_API int sqlite3_get_table( SQLITE_API void sqlite3_free_table(char **result); /* -** CAPI3REF: Formatted String Printing Functions {H17400} +** CAPI3REF: Formatted String Printing Functions ** ** These routines are work-alikes of the "printf()" family of functions ** from the standard C library. ** -** The sqlite3_mprintf() and sqlite3_vmprintf() routines write their +** ^The sqlite3_mprintf() and sqlite3_vmprintf() routines write their ** results into memory obtained from [sqlite3_malloc()]. ** The strings returned by these two routines should be -** released by [sqlite3_free()]. Both routines return a +** released by [sqlite3_free()]. ^Both routines return a ** NULL pointer if [sqlite3_malloc()] is unable to allocate enough ** memory to hold the resulting string. ** -** In sqlite3_snprintf() routine is similar to "snprintf()" from +** ^(In sqlite3_snprintf() routine is similar to "snprintf()" from ** the standard C library. The result is written into the ** buffer supplied as the second parameter whose size is given by ** the first parameter. Note that the order of the -** first two parameters is reversed from snprintf(). This is an +** first two parameters is reversed from snprintf().)^ This is an ** historical accident that cannot be fixed without breaking -** backwards compatibility. Note also that sqlite3_snprintf() +** backwards compatibility. ^(Note also that sqlite3_snprintf() ** returns a pointer to its buffer instead of the number of -** characters actually written into the buffer. We admit that +** characters actually written into the buffer.)^ We admit that ** the number of characters written would be a more useful return ** value but we cannot change the implementation of sqlite3_snprintf() ** now without breaking compatibility. ** -** As long as the buffer size is greater than zero, sqlite3_snprintf() -** guarantees that the buffer is always zero-terminated. The first +** ^As long as the buffer size is greater than zero, sqlite3_snprintf() +** guarantees that the buffer is always zero-terminated. ^The first ** parameter "n" is the total size of the buffer, including space for ** the zero terminator. So the longest string that can be completely ** written will be n-1 characters. @@ -1683,9 +1707,9 @@ SQLITE_API void sqlite3_free_table(char **result); ** All of the usual printf() formatting options apply. In addition, there ** is are "%q", "%Q", and "%z" options. ** -** The %q option works like %s in that it substitutes a null-terminated +** ^(The %q option works like %s in that it substitutes a null-terminated ** string from the argument list. But %q also doubles every '\'' character. -** %q is designed for use inside a string literal. By doubling each '\'' +** %q is designed for use inside a string literal.)^ By doubling each '\'' ** character it escapes that character and allows it to be inserted into ** the string. ** @@ -1720,10 +1744,10 @@ SQLITE_API void sqlite3_free_table(char **result); ** This second example is an SQL syntax error. As a general rule you should ** always use %q instead of %s when inserting text into a string literal. ** -** The %Q option works like %q except it also adds single quotes around +** ^(The %Q option works like %q except it also adds single quotes around ** the outside of the total string. Additionally, if the parameter in the ** argument list is a NULL pointer, %Q substitutes the text "NULL" (without -** single quotes) in place of the %Q option. So, for example, one could say: +** single quotes).)^ So, for example, one could say: ** **
     **  char *zSQL = sqlite3_mprintf("INSERT INTO table VALUES(%Q)", zText);
    @@ -1734,35 +1758,32 @@ SQLITE_API void sqlite3_free_table(char **result);
     ** The code above will render a correct SQL statement in the zSQL
     ** variable even if the zText variable is a NULL pointer.
     **
    -** The "%z" formatting option works exactly like "%s" with the
    +** ^(The "%z" formatting option works like "%s" but with the
     ** addition that after the string has been read and copied into
    -** the result, [sqlite3_free()] is called on the input string. {END}
    -**
    -** Requirements:
    -** [H17403] [H17406] [H17407]
    +** the result, [sqlite3_free()] is called on the input string.)^
     */
     SQLITE_API char *sqlite3_mprintf(const char*,...);
     SQLITE_API char *sqlite3_vmprintf(const char*, va_list);
     SQLITE_API char *sqlite3_snprintf(int,char*,const char*, ...);
     
     /*
    -** CAPI3REF: Memory Allocation Subsystem {H17300} 
    +** CAPI3REF: Memory Allocation Subsystem
     **
    -** The SQLite core  uses these three routines for all of its own
    +** The SQLite core uses these three routines for all of its own
     ** internal memory allocation needs. "Core" in the previous sentence
     ** does not include operating-system specific VFS implementation.  The
     ** Windows VFS uses native malloc() and free() for some operations.
     **
    -** The sqlite3_malloc() routine returns a pointer to a block
    +** ^The sqlite3_malloc() routine returns a pointer to a block
     ** of memory at least N bytes in length, where N is the parameter.
    -** If sqlite3_malloc() is unable to obtain sufficient free
    -** memory, it returns a NULL pointer.  If the parameter N to
    +** ^If sqlite3_malloc() is unable to obtain sufficient free
    +** memory, it returns a NULL pointer.  ^If the parameter N to
     ** sqlite3_malloc() is zero or negative then sqlite3_malloc() returns
     ** a NULL pointer.
     **
    -** Calling sqlite3_free() with a pointer previously returned
    +** ^Calling sqlite3_free() with a pointer previously returned
     ** by sqlite3_malloc() or sqlite3_realloc() releases that memory so
    -** that it might be reused.  The sqlite3_free() routine is
    +** that it might be reused.  ^The sqlite3_free() routine is
     ** a no-op if is called with a NULL pointer.  Passing a NULL pointer
     ** to sqlite3_free() is harmless.  After being freed, memory
     ** should neither be read nor written.  Even reading previously freed
    @@ -1771,34 +1792,25 @@ SQLITE_API char *sqlite3_snprintf(int,char*,const char*, ...);
     ** might result if sqlite3_free() is called with a non-NULL pointer that
     ** was not obtained from sqlite3_malloc() or sqlite3_realloc().
     **
    -** The sqlite3_realloc() interface attempts to resize a
    +** ^(The sqlite3_realloc() interface attempts to resize a
     ** prior memory allocation to be at least N bytes, where N is the
     ** second parameter.  The memory allocation to be resized is the first
    -** parameter.  If the first parameter to sqlite3_realloc()
    +** parameter.)^ ^ If the first parameter to sqlite3_realloc()
     ** is a NULL pointer then its behavior is identical to calling
     ** sqlite3_malloc(N) where N is the second parameter to sqlite3_realloc().
    -** If the second parameter to sqlite3_realloc() is zero or
    +** ^If the second parameter to sqlite3_realloc() is zero or
     ** negative then the behavior is exactly the same as calling
     ** sqlite3_free(P) where P is the first parameter to sqlite3_realloc().
    -** sqlite3_realloc() returns a pointer to a memory allocation
    +** ^sqlite3_realloc() returns a pointer to a memory allocation
     ** of at least N bytes in size or NULL if sufficient memory is unavailable.
    -** If M is the size of the prior allocation, then min(N,M) bytes
    +** ^If M is the size of the prior allocation, then min(N,M) bytes
     ** of the prior allocation are copied into the beginning of buffer returned
     ** by sqlite3_realloc() and the prior allocation is freed.
    -** If sqlite3_realloc() returns NULL, then the prior allocation
    +** ^If sqlite3_realloc() returns NULL, then the prior allocation
     ** is not freed.
     **
    -** The memory returned by sqlite3_malloc() and sqlite3_realloc()
    -** is always aligned to at least an 8 byte boundary. {END}
    -**
    -** The default implementation of the memory allocation subsystem uses
    -** the malloc(), realloc() and free() provided by the standard C library.
    -** {H17382} However, if SQLite is compiled with the
    -** SQLITE_MEMORY_SIZE=NNN C preprocessor macro (where NNN
    -** is an integer), then SQLite create a static array of at least
    -** NNN bytes in size and uses that array for all of its dynamic
    -** memory allocation needs. {END}  Additional memory allocator options
    -** may be added in future releases.
    +** ^The memory returned by sqlite3_malloc() and sqlite3_realloc()
    +** is always aligned to at least an 8 byte boundary.
     **
     ** In SQLite version 3.5.0 and 3.5.1, it was possible to define
     ** the SQLITE_OMIT_MEMORY_ALLOCATION which would cause the built-in
    @@ -1813,10 +1825,6 @@ SQLITE_API char *sqlite3_snprintf(int,char*,const char*, ...);
     ** they are reported back as [SQLITE_CANTOPEN] or
     ** [SQLITE_IOERR] rather than [SQLITE_NOMEM].
     **
    -** Requirements:
    -** [H17303] [H17304] [H17305] [H17306] [H17310] [H17312] [H17315] [H17318]
    -** [H17321] [H17322] [H17323]
    -**
     ** The pointer arguments to [sqlite3_free()] and [sqlite3_realloc()]
     ** must be either NULL or else pointers obtained from a prior
     ** invocation of [sqlite3_malloc()] or [sqlite3_realloc()] that have
    @@ -1831,20 +1839,33 @@ SQLITE_API void *sqlite3_realloc(void*, int);
     SQLITE_API void sqlite3_free(void*);
     
     /*
    -** CAPI3REF: Memory Allocator Statistics {H17370} 
    +** CAPI3REF: Memory Allocator Statistics
     **
     ** SQLite provides these two interfaces for reporting on the status
     ** of the [sqlite3_malloc()], [sqlite3_free()], and [sqlite3_realloc()]
     ** routines, which form the built-in memory allocation subsystem.
     **
    -** Requirements:
    -** [H17371] [H17373] [H17374] [H17375]
    +** ^The [sqlite3_memory_used()] routine returns the number of bytes
    +** of memory currently outstanding (malloced but not freed).
    +** ^The [sqlite3_memory_highwater()] routine returns the maximum
    +** value of [sqlite3_memory_used()] since the high-water mark
    +** was last reset.  ^The values returned by [sqlite3_memory_used()] and
    +** [sqlite3_memory_highwater()] include any overhead
    +** added by SQLite in its implementation of [sqlite3_malloc()],
    +** but not overhead added by the any underlying system library
    +** routines that [sqlite3_malloc()] may call.
    +**
    +** ^The memory high-water mark is reset to the current value of
    +** [sqlite3_memory_used()] if and only if the parameter to
    +** [sqlite3_memory_highwater()] is true.  ^The value returned
    +** by [sqlite3_memory_highwater(1)] is the high-water mark
    +** prior to the reset.
     */
     SQLITE_API sqlite3_int64 sqlite3_memory_used(void);
     SQLITE_API sqlite3_int64 sqlite3_memory_highwater(int resetFlag);
     
     /*
    -** CAPI3REF: Pseudo-Random Number Generator {H17390} 
    +** CAPI3REF: Pseudo-Random Number Generator
     **
     ** SQLite contains a high-quality pseudo-random number generator (PRNG) used to
     ** select random [ROWID | ROWIDs] when inserting new records into a table that
    @@ -1852,60 +1873,57 @@ SQLITE_API sqlite3_int64 sqlite3_memory_highwater(int resetFlag);
     ** the build-in random() and randomblob() SQL functions.  This interface allows
     ** applications to access the same PRNG for other purposes.
     **
    -** A call to this routine stores N bytes of randomness into buffer P.
    +** ^A call to this routine stores N bytes of randomness into buffer P.
     **
    -** The first time this routine is invoked (either internally or by
    +** ^The first time this routine is invoked (either internally or by
     ** the application) the PRNG is seeded using randomness obtained
     ** from the xRandomness method of the default [sqlite3_vfs] object.
    -** On all subsequent invocations, the pseudo-randomness is generated
    +** ^On all subsequent invocations, the pseudo-randomness is generated
     ** internally and without recourse to the [sqlite3_vfs] xRandomness
     ** method.
    -**
    -** Requirements:
    -** [H17392]
     */
     SQLITE_API void sqlite3_randomness(int N, void *P);
     
     /*
    -** CAPI3REF: Compile-Time Authorization Callbacks {H12500} 
    +** CAPI3REF: Compile-Time Authorization Callbacks
     **
    -** This routine registers a authorizer callback with a particular
    +** ^This routine registers a authorizer callback with a particular
     ** [database connection], supplied in the first argument.
    -** The authorizer callback is invoked as SQL statements are being compiled
    +** ^The authorizer callback is invoked as SQL statements are being compiled
     ** by [sqlite3_prepare()] or its variants [sqlite3_prepare_v2()],
    -** [sqlite3_prepare16()] and [sqlite3_prepare16_v2()].  At various
    +** [sqlite3_prepare16()] and [sqlite3_prepare16_v2()].  ^At various
     ** points during the compilation process, as logic is being created
     ** to perform various actions, the authorizer callback is invoked to
    -** see if those actions are allowed.  The authorizer callback should
    +** see if those actions are allowed.  ^The authorizer callback should
     ** return [SQLITE_OK] to allow the action, [SQLITE_IGNORE] to disallow the
     ** specific action but allow the SQL statement to continue to be
     ** compiled, or [SQLITE_DENY] to cause the entire SQL statement to be
    -** rejected with an error.  If the authorizer callback returns
    +** rejected with an error.  ^If the authorizer callback returns
     ** any value other than [SQLITE_IGNORE], [SQLITE_OK], or [SQLITE_DENY]
     ** then the [sqlite3_prepare_v2()] or equivalent call that triggered
     ** the authorizer will fail with an error message.
     **
     ** When the callback returns [SQLITE_OK], that means the operation
    -** requested is ok.  When the callback returns [SQLITE_DENY], the
    +** requested is ok.  ^When the callback returns [SQLITE_DENY], the
     ** [sqlite3_prepare_v2()] or equivalent call that triggered the
     ** authorizer will fail with an error message explaining that
     ** access is denied. 
     **
    -** The first parameter to the authorizer callback is a copy of the third
    -** parameter to the sqlite3_set_authorizer() interface. The second parameter
    +** ^The first parameter to the authorizer callback is a copy of the third
    +** parameter to the sqlite3_set_authorizer() interface. ^The second parameter
     ** to the callback is an integer [SQLITE_COPY | action code] that specifies
    -** the particular action to be authorized. The third through sixth parameters
    +** the particular action to be authorized. ^The third through sixth parameters
     ** to the callback are zero-terminated strings that contain additional
     ** details about the action to be authorized.
     **
    -** If the action code is [SQLITE_READ]
    +** ^If the action code is [SQLITE_READ]
     ** and the callback returns [SQLITE_IGNORE] then the
     ** [prepared statement] statement is constructed to substitute
     ** a NULL value in place of the table column that would have
     ** been read if [SQLITE_OK] had been returned.  The [SQLITE_IGNORE]
     ** return can be used to deny an untrusted user access to individual
     ** columns of a table.
    -** If the action code is [SQLITE_DELETE] and the callback returns
    +** ^If the action code is [SQLITE_DELETE] and the callback returns
     ** [SQLITE_IGNORE] then the [DELETE] operation proceeds but the
     ** [truncate optimization] is disabled and all rows are deleted individually.
     **
    @@ -1925,9 +1943,9 @@ SQLITE_API void sqlite3_randomness(int N, void *P);
     ** and limiting database size using the [max_page_count] [PRAGMA]
     ** in addition to using an authorizer.
     **
    -** Only a single authorizer can be in place on a database connection
    +** ^(Only a single authorizer can be in place on a database connection
     ** at a time.  Each call to sqlite3_set_authorizer overrides the
    -** previous call.  Disable the authorizer by installing a NULL callback.
    +** previous call.)^  ^Disable the authorizer by installing a NULL callback.
     ** The authorizer is disabled by default.
     **
     ** The authorizer callback must not do anything that will modify
    @@ -1935,20 +1953,16 @@ SQLITE_API void sqlite3_randomness(int N, void *P);
     ** Note that [sqlite3_prepare_v2()] and [sqlite3_step()] both modify their
     ** database connections for the meaning of "modify" in this paragraph.
     **
    -** When [sqlite3_prepare_v2()] is used to prepare a statement, the
    +** ^When [sqlite3_prepare_v2()] is used to prepare a statement, the
     ** statement might be re-prepared during [sqlite3_step()] due to a 
     ** schema change.  Hence, the application should ensure that the
     ** correct authorizer callback remains in place during the [sqlite3_step()].
     **
    -** Note that the authorizer callback is invoked only during
    +** ^Note that the authorizer callback is invoked only during
     ** [sqlite3_prepare()] or its variants.  Authorization is not
     ** performed during statement evaluation in [sqlite3_step()], unless
     ** as stated in the previous paragraph, sqlite3_step() invokes
     ** sqlite3_prepare_v2() to reprepare a statement after a schema change.
    -**
    -** Requirements:
    -** [H12501] [H12502] [H12503] [H12504] [H12505] [H12506] [H12507] [H12510]
    -** [H12511] [H12512] [H12520] [H12521] [H12522]
     */
     SQLITE_API int sqlite3_set_authorizer(
       sqlite3*,
    @@ -1957,7 +1971,7 @@ SQLITE_API int sqlite3_set_authorizer(
     );
     
     /*
    -** CAPI3REF: Authorizer Return Codes {H12590} 
    +** CAPI3REF: Authorizer Return Codes
     **
     ** The [sqlite3_set_authorizer | authorizer callback function] must
     ** return either [SQLITE_OK] or one of these two constants in order
    @@ -1969,7 +1983,7 @@ SQLITE_API int sqlite3_set_authorizer(
     #define SQLITE_IGNORE 2   /* Don't allow access, but don't generate an error */
     
     /*
    -** CAPI3REF: Authorizer Action Codes {H12550} 
    +** CAPI3REF: Authorizer Action Codes
     **
     ** The [sqlite3_set_authorizer()] interface registers a callback function
     ** that is invoked to authorize certain SQL statement actions.  The
    @@ -1980,15 +1994,12 @@ SQLITE_API int sqlite3_set_authorizer(
     ** These action code values signify what kind of operation is to be
     ** authorized.  The 3rd and 4th parameters to the authorization
     ** callback function will be parameters or NULL depending on which of these
    -** codes is used as the second parameter.  The 5th parameter to the
    +** codes is used as the second parameter.  ^(The 5th parameter to the
     ** authorizer callback is the name of the database ("main", "temp",
    -** etc.) if applicable.  The 6th parameter to the authorizer callback
    +** etc.) if applicable.)^  ^The 6th parameter to the authorizer callback
     ** is the name of the inner-most trigger or view that is responsible for
     ** the access attempt or NULL if this access attempt is directly from
     ** top-level SQL code.
    -**
    -** Requirements:
    -** [H12551] [H12552] [H12553] [H12554]
     */
     /******************************************* 3rd ************ 4th ***********/
     #define SQLITE_CREATE_INDEX          1   /* Index Name      Table Name      */
    @@ -2026,42 +2037,39 @@ SQLITE_API int sqlite3_set_authorizer(
     #define SQLITE_COPY                  0   /* No longer used */
     
     /*
    -** CAPI3REF: Tracing And Profiling Functions {H12280} 
    +** CAPI3REF: Tracing And Profiling Functions
     ** EXPERIMENTAL
     **
     ** These routines register callback functions that can be used for
     ** tracing and profiling the execution of SQL statements.
     **
    -** The callback function registered by sqlite3_trace() is invoked at
    +** ^The callback function registered by sqlite3_trace() is invoked at
     ** various times when an SQL statement is being run by [sqlite3_step()].
    -** The callback returns a UTF-8 rendering of the SQL statement text
    -** as the statement first begins executing.  Additional callbacks occur
    +** ^The sqlite3_trace() callback is invoked with a UTF-8 rendering of the
    +** SQL statement text as the statement first begins executing.
    +** ^(Additional sqlite3_trace() callbacks might occur
     ** as each triggered subprogram is entered.  The callbacks for triggers
    -** contain a UTF-8 SQL comment that identifies the trigger.
    +** contain a UTF-8 SQL comment that identifies the trigger.)^
     **
    -** The callback function registered by sqlite3_profile() is invoked
    -** as each SQL statement finishes.  The profile callback contains
    +** ^The callback function registered by sqlite3_profile() is invoked
    +** as each SQL statement finishes.  ^The profile callback contains
     ** the original statement text and an estimate of wall-clock time
     ** of how long that statement took to run.
    -**
    -** Requirements:
    -** [H12281] [H12282] [H12283] [H12284] [H12285] [H12287] [H12288] [H12289]
    -** [H12290]
     */
     SQLITE_API SQLITE_EXPERIMENTAL void *sqlite3_trace(sqlite3*, void(*xTrace)(void*,const char*), void*);
     SQLITE_API SQLITE_EXPERIMENTAL void *sqlite3_profile(sqlite3*,
        void(*xProfile)(void*,const char*,sqlite3_uint64), void*);
     
     /*
    -** CAPI3REF: Query Progress Callbacks {H12910} 
    +** CAPI3REF: Query Progress Callbacks
     **
    -** This routine configures a callback function - the
    +** ^This routine configures a callback function - the
     ** progress callback - that is invoked periodically during long
     ** running calls to [sqlite3_exec()], [sqlite3_step()] and
     ** [sqlite3_get_table()].  An example use for this
     ** interface is to keep a GUI updated during a large query.
     **
    -** If the progress callback returns non-zero, the operation is
    +** ^If the progress callback returns non-zero, the operation is
     ** interrupted.  This feature can be used to implement a
     ** "Cancel" button on a GUI progress dialog box.
     **
    @@ -2070,28 +2078,26 @@ SQLITE_API SQLITE_EXPERIMENTAL void *sqlite3_profile(sqlite3*,
     ** Note that [sqlite3_prepare_v2()] and [sqlite3_step()] both modify their
     ** database connections for the meaning of "modify" in this paragraph.
     **
    -** Requirements:
    -** [H12911] [H12912] [H12913] [H12914] [H12915] [H12916] [H12917] [H12918]
    -**
     */
     SQLITE_API void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*);
     
     /*
    -** CAPI3REF: Opening A New Database Connection {H12700} 
    +** CAPI3REF: Opening A New Database Connection
     **
    -** These routines open an SQLite database file whose name is given by the
    -** filename argument. The filename argument is interpreted as UTF-8 for
    +** ^These routines open an SQLite database file whose name is given by the
    +** filename argument. ^The filename argument is interpreted as UTF-8 for
     ** sqlite3_open() and sqlite3_open_v2() and as UTF-16 in the native byte
    -** order for sqlite3_open16(). A [database connection] handle is usually
    +** order for sqlite3_open16(). ^(A [database connection] handle is usually
     ** returned in *ppDb, even if an error occurs.  The only exception is that
     ** if SQLite is unable to allocate memory to hold the [sqlite3] object,
     ** a NULL will be written into *ppDb instead of a pointer to the [sqlite3]
    -** object. If the database is opened (and/or created) successfully, then
    -** [SQLITE_OK] is returned.  Otherwise an [error code] is returned.  The
    +** object.)^ ^(If the database is opened (and/or created) successfully, then
    +** [SQLITE_OK] is returned.  Otherwise an [error code] is returned.)^ ^The
     ** [sqlite3_errmsg()] or [sqlite3_errmsg16()] routines can be used to obtain
    -** an English language description of the error.
    +** an English language description of the error following a failure of any
    +** of the sqlite3_open() routines.
     **
    -** The default encoding for the database will be UTF-8 if
    +** ^The default encoding for the database will be UTF-8 if
     ** sqlite3_open() or sqlite3_open_v2() is called and
     ** UTF-16 in the native byte order if sqlite3_open16() is used.
     **
    @@ -2101,25 +2107,26 @@ SQLITE_API void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*);
     **
     ** The sqlite3_open_v2() interface works like sqlite3_open()
     ** except that it accepts two additional parameters for additional control
    -** over the new database connection.  The flags parameter can take one of
    +** over the new database connection.  ^(The flags parameter to
    +** sqlite3_open_v2() can take one of
     ** the following three values, optionally combined with the 
     ** [SQLITE_OPEN_NOMUTEX], [SQLITE_OPEN_FULLMUTEX], [SQLITE_OPEN_SHAREDCACHE],
    -** and/or [SQLITE_OPEN_PRIVATECACHE] flags:
    +** and/or [SQLITE_OPEN_PRIVATECACHE] flags:)^
     **
     ** 
    -**
    [SQLITE_OPEN_READONLY]
    +** ^(
    [SQLITE_OPEN_READONLY]
    **
    The database is opened in read-only mode. If the database does not -** already exist, an error is returned.
    +** already exist, an error is returned.)^ ** -**
    [SQLITE_OPEN_READWRITE]
    +** ^(
    [SQLITE_OPEN_READWRITE]
    **
    The database is opened for reading and writing if possible, or reading ** only if the file is write protected by the operating system. In either -** case the database must already exist, otherwise an error is returned.
    +** case the database must already exist, otherwise an error is returned.)^ ** -**
    [SQLITE_OPEN_READWRITE] | [SQLITE_OPEN_CREATE]
    +** ^(
    [SQLITE_OPEN_READWRITE] | [SQLITE_OPEN_CREATE]
    **
    The database is opened for reading and writing, and is creates it if ** it does not already exist. This is the behavior that is always used for -** sqlite3_open() and sqlite3_open16().
    +** sqlite3_open() and sqlite3_open16().)^ **
    ** ** If the 3rd parameter to sqlite3_open_v2() is not one of the @@ -2128,33 +2135,33 @@ SQLITE_API void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*); ** [SQLITE_OPEN_SHAREDCACHE] and/or [SQLITE_OPEN_SHAREDCACHE] flags, ** then the behavior is undefined. ** -** If the [SQLITE_OPEN_NOMUTEX] flag is set, then the database connection +** ^If the [SQLITE_OPEN_NOMUTEX] flag is set, then the database connection ** opens in the multi-thread [threading mode] as long as the single-thread -** mode has not been set at compile-time or start-time. If the +** mode has not been set at compile-time or start-time. ^If the ** [SQLITE_OPEN_FULLMUTEX] flag is set then the database connection opens ** in the serialized [threading mode] unless single-thread was ** previously selected at compile-time or start-time. -** The [SQLITE_OPEN_SHAREDCACHE] flag causes the database connection to be +** ^The [SQLITE_OPEN_SHAREDCACHE] flag causes the database connection to be ** eligible to use [shared cache mode], regardless of whether or not shared -** cache is enabled using [sqlite3_enable_shared_cache()]. The +** cache is enabled using [sqlite3_enable_shared_cache()]. ^The ** [SQLITE_OPEN_PRIVATECACHE] flag causes the database connection to not ** participate in [shared cache mode] even if it is enabled. ** -** If the filename is ":memory:", then a private, temporary in-memory database -** is created for the connection. This in-memory database will vanish when +** ^If the filename is ":memory:", then a private, temporary in-memory database +** is created for the connection. ^This in-memory database will vanish when ** the database connection is closed. Future versions of SQLite might ** make use of additional special filenames that begin with the ":" character. ** It is recommended that when a database filename actually does begin with ** a ":" character you should prefix the filename with a pathname such as ** "./" to avoid ambiguity. ** -** If the filename is an empty string, then a private, temporary -** on-disk database will be created. This private database will be +** ^If the filename is an empty string, then a private, temporary +** on-disk database will be created. ^This private database will be ** automatically deleted as soon as the database connection is closed. ** -** The fourth parameter to sqlite3_open_v2() is the name of the +** ^The fourth parameter to sqlite3_open_v2() is the name of the ** [sqlite3_vfs] object that defines the operating system interface that -** the new database connection should use. If the fourth parameter is +** the new database connection should use. ^If the fourth parameter is ** a NULL pointer then the default [sqlite3_vfs] object is used. ** ** Note to Windows users: The encoding used for the filename argument @@ -2162,10 +2169,6 @@ SQLITE_API void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*); ** codepage is currently defined. Filenames containing international ** characters must be converted to UTF-8 prior to passing them into ** sqlite3_open() or sqlite3_open_v2(). -** -** Requirements: -** [H12701] [H12702] [H12703] [H12704] [H12706] [H12707] [H12709] [H12711] -** [H12712] [H12713] [H12714] [H12717] [H12719] [H12721] [H12723] */ SQLITE_API int sqlite3_open( const char *filename, /* Database filename (UTF-8) */ @@ -2183,23 +2186,23 @@ SQLITE_API int sqlite3_open_v2( ); /* -** CAPI3REF: Error Codes And Messages {H12800} +** CAPI3REF: Error Codes And Messages ** -** The sqlite3_errcode() interface returns the numeric [result code] or +** ^The sqlite3_errcode() interface returns the numeric [result code] or ** [extended result code] for the most recent failed sqlite3_* API call ** associated with a [database connection]. If a prior API call failed ** but the most recent API call succeeded, the return value from -** sqlite3_errcode() is undefined. The sqlite3_extended_errcode() +** sqlite3_errcode() is undefined. ^The sqlite3_extended_errcode() ** interface is the same except that it always returns the ** [extended result code] even when extended result codes are ** disabled. ** -** The sqlite3_errmsg() and sqlite3_errmsg16() return English-language +** ^The sqlite3_errmsg() and sqlite3_errmsg16() return English-language ** text that describes the error, as either UTF-8 or UTF-16 respectively. -** Memory to hold the error message string is managed internally. +** ^(Memory to hold the error message string is managed internally. ** The application does not need to worry about freeing the result. ** However, the error string might be overwritten or deallocated by -** subsequent calls to other SQLite interface functions. +** subsequent calls to other SQLite interface functions.)^ ** ** When the serialized [threading mode] is in use, it might be the ** case that a second error occurs on a separate thread in between @@ -2214,9 +2217,6 @@ SQLITE_API int sqlite3_open_v2( ** If an interface fails with SQLITE_MISUSE, that means the interface ** was invoked incorrectly by the application. In that case, the ** error code and message may or may not be set. -** -** Requirements: -** [H12801] [H12802] [H12803] [H12807] [H12808] [H12809] */ SQLITE_API int sqlite3_errcode(sqlite3 *db); SQLITE_API int sqlite3_extended_errcode(sqlite3 *db); @@ -2224,7 +2224,7 @@ SQLITE_API const char *sqlite3_errmsg(sqlite3*); SQLITE_API const void *sqlite3_errmsg16(sqlite3*); /* -** CAPI3REF: SQL Statement Object {H13000} +** CAPI3REF: SQL Statement Object ** KEYWORDS: {prepared statement} {prepared statements} ** ** An instance of this object represents a single SQL statement. @@ -2250,25 +2250,25 @@ SQLITE_API const void *sqlite3_errmsg16(sqlite3*); typedef struct sqlite3_stmt sqlite3_stmt; /* -** CAPI3REF: Run-time Limits {H12760} +** CAPI3REF: Run-time Limits ** -** This interface allows the size of various constructs to be limited +** ^(This interface allows the size of various constructs to be limited ** on a connection by connection basis. The first parameter is the ** [database connection] whose limit is to be set or queried. The ** second parameter is one of the [limit categories] that define a ** class of constructs to be size limited. The third parameter is the -** new limit for that construct. The function returns the old limit. +** new limit for that construct. The function returns the old limit.)^ ** -** If the new limit is a negative number, the limit is unchanged. -** For the limit category of SQLITE_LIMIT_XYZ there is a +** ^If the new limit is a negative number, the limit is unchanged. +** ^(For the limit category of SQLITE_LIMIT_XYZ there is a ** [limits | hard upper bound] ** set by a compile-time C preprocessor macro named ** [limits | SQLITE_MAX_XYZ]. -** (The "_LIMIT_" in the name is changed to "_MAX_".) -** Attempts to increase a limit above its hard upper bound are -** silently truncated to the hard upper limit. +** (The "_LIMIT_" in the name is changed to "_MAX_".))^ +** ^Attempts to increase a limit above its hard upper bound are +** silently truncated to the hard upper bound. ** -** Run time limits are intended for use in applications that manage +** Run-time limits are intended for use in applications that manage ** both their own internal database and also databases that are controlled ** by untrusted external sources. An example application might be a ** web browser that has its own databases for storing history and @@ -2282,15 +2282,12 @@ typedef struct sqlite3_stmt sqlite3_stmt; ** [max_page_count] [PRAGMA]. ** ** New run-time limit categories may be added in future releases. -** -** Requirements: -** [H12762] [H12766] [H12769] */ SQLITE_API int sqlite3_limit(sqlite3*, int id, int newVal); /* -** CAPI3REF: Run-Time Limit Categories {H12790} -** KEYWORDS: {limit category} {limit categories} +** CAPI3REF: Run-Time Limit Categories +** KEYWORDS: {limit category} {*limit categories} ** ** These constants define various performance limits ** that can be lowered at run-time using [sqlite3_limit()]. @@ -2298,43 +2295,43 @@ SQLITE_API int sqlite3_limit(sqlite3*, int id, int newVal); ** Additional information is available at [limits | Limits in SQLite]. ** **
    -**
    SQLITE_LIMIT_LENGTH
    -**
    The maximum size of any string or BLOB or table row.
    +** ^(
    SQLITE_LIMIT_LENGTH
    +**
    The maximum size of any string or BLOB or table row.
    )^ ** -**
    SQLITE_LIMIT_SQL_LENGTH
    -**
    The maximum length of an SQL statement.
    +** ^(
    SQLITE_LIMIT_SQL_LENGTH
    +**
    The maximum length of an SQL statement, in bytes.
    )^ ** -**
    SQLITE_LIMIT_COLUMN
    +** ^(
    SQLITE_LIMIT_COLUMN
    **
    The maximum number of columns in a table definition or in the ** result set of a [SELECT] or the maximum number of columns in an index -** or in an ORDER BY or GROUP BY clause.
    +** or in an ORDER BY or GROUP BY clause.)^ ** -**
    SQLITE_LIMIT_EXPR_DEPTH
    -**
    The maximum depth of the parse tree on any expression.
    +** ^(
    SQLITE_LIMIT_EXPR_DEPTH
    +**
    The maximum depth of the parse tree on any expression.
    )^ ** -**
    SQLITE_LIMIT_COMPOUND_SELECT
    -**
    The maximum number of terms in a compound SELECT statement.
    +** ^(
    SQLITE_LIMIT_COMPOUND_SELECT
    +**
    The maximum number of terms in a compound SELECT statement.
    )^ ** -**
    SQLITE_LIMIT_VDBE_OP
    +** ^(
    SQLITE_LIMIT_VDBE_OP
    **
    The maximum number of instructions in a virtual machine program -** used to implement an SQL statement.
    +** used to implement an SQL statement.)^ ** -**
    SQLITE_LIMIT_FUNCTION_ARG
    -**
    The maximum number of arguments on a function.
    +** ^(
    SQLITE_LIMIT_FUNCTION_ARG
    +**
    The maximum number of arguments on a function.
    )^ ** -**
    SQLITE_LIMIT_ATTACHED
    -**
    The maximum number of [ATTACH | attached databases].
    +** ^(
    SQLITE_LIMIT_ATTACHED
    +**
    The maximum number of [ATTACH | attached databases].)^
    ** -**
    SQLITE_LIMIT_LIKE_PATTERN_LENGTH
    +** ^(
    SQLITE_LIMIT_LIKE_PATTERN_LENGTH
    **
    The maximum length of the pattern argument to the [LIKE] or -** [GLOB] operators.
    +** [GLOB] operators.)^ ** -**
    SQLITE_LIMIT_VARIABLE_NUMBER
    +** ^(
    SQLITE_LIMIT_VARIABLE_NUMBER
    **
    The maximum number of variables in an SQL statement that can -** be bound.
    +** be bound.)^ ** -**
    SQLITE_LIMIT_TRIGGER_DEPTH
    -**
    The maximum depth of recursion for triggers.
    +** ^(
    SQLITE_LIMIT_TRIGGER_DEPTH
    +**
    The maximum depth of recursion for triggers.
    )^ **
    */ #define SQLITE_LIMIT_LENGTH 0 @@ -2350,7 +2347,7 @@ SQLITE_API int sqlite3_limit(sqlite3*, int id, int newVal); #define SQLITE_LIMIT_TRIGGER_DEPTH 10 /* -** CAPI3REF: Compiling An SQL Statement {H13010} +** CAPI3REF: Compiling An SQL Statement ** KEYWORDS: {SQL statement compiler} ** ** To execute an SQL query, it must first be compiled into a byte-code @@ -2365,9 +2362,9 @@ SQLITE_API int sqlite3_limit(sqlite3*, int id, int newVal); ** interfaces use UTF-8, and sqlite3_prepare16() and sqlite3_prepare16_v2() ** use UTF-16. ** -** If the nByte argument is less than zero, then zSql is read up to the -** first zero terminator. If nByte is non-negative, then it is the maximum -** number of bytes read from zSql. When nByte is non-negative, the +** ^If the nByte argument is less than zero, then zSql is read up to the +** first zero terminator. ^If nByte is non-negative, then it is the maximum +** number of bytes read from zSql. ^When nByte is non-negative, the ** zSql string ends at either the first '\000' or '\u0000' character or ** the nByte-th byte, whichever comes first. If the caller knows ** that the supplied string is nul-terminated, then there is a small @@ -2375,34 +2372,35 @@ SQLITE_API int sqlite3_limit(sqlite3*, int id, int newVal); ** is equal to the number of bytes in the input string including ** the nul-terminator bytes. ** -** If pzTail is not NULL then *pzTail is made to point to the first byte +** ^If pzTail is not NULL then *pzTail is made to point to the first byte ** past the end of the first SQL statement in zSql. These routines only ** compile the first statement in zSql, so *pzTail is left pointing to ** what remains uncompiled. ** -** *ppStmt is left pointing to a compiled [prepared statement] that can be -** executed using [sqlite3_step()]. If there is an error, *ppStmt is set -** to NULL. If the input text contains no SQL (if the input is an empty +** ^*ppStmt is left pointing to a compiled [prepared statement] that can be +** executed using [sqlite3_step()]. ^If there is an error, *ppStmt is set +** to NULL. ^If the input text contains no SQL (if the input is an empty ** string or a comment) then *ppStmt is set to NULL. ** The calling procedure is responsible for deleting the compiled ** SQL statement using [sqlite3_finalize()] after it has finished with it. ** ppStmt may not be NULL. ** -** On success, [SQLITE_OK] is returned, otherwise an [error code] is returned. +** ^On success, the sqlite3_prepare() family of routines return [SQLITE_OK]; +** otherwise an [error code] is returned. ** ** The sqlite3_prepare_v2() and sqlite3_prepare16_v2() interfaces are ** recommended for all new programs. The two older interfaces are retained ** for backwards compatibility, but their use is discouraged. -** In the "v2" interfaces, the prepared statement +** ^In the "v2" interfaces, the prepared statement ** that is returned (the [sqlite3_stmt] object) contains a copy of the ** original SQL text. This causes the [sqlite3_step()] interface to -** behave a differently in two ways: +** behave differently in three ways: ** **
      **
    1. -** If the database schema changes, instead of returning [SQLITE_SCHEMA] as it +** ^If the database schema changes, instead of returning [SQLITE_SCHEMA] as it ** always used to do, [sqlite3_step()] will automatically recompile the SQL -** statement and try to run it again. If the schema has changed in +** statement and try to run it again. ^If the schema has changed in ** a way that makes the statement no longer valid, [sqlite3_step()] will still ** return [SQLITE_SCHEMA]. But unlike the legacy behavior, [SQLITE_SCHEMA] is ** now a fatal error. Calling [sqlite3_prepare_v2()] again will not make the @@ -2411,18 +2409,22 @@ SQLITE_API int sqlite3_limit(sqlite3*, int id, int newVal); **
    2. ** **
    3. -** When an error occurs, [sqlite3_step()] will return one of the detailed -** [error codes] or [extended error codes]. The legacy behavior was that +** ^When an error occurs, [sqlite3_step()] will return one of the detailed +** [error codes] or [extended error codes]. ^The legacy behavior was that ** [sqlite3_step()] would only return a generic [SQLITE_ERROR] result code -** and you would have to make a second call to [sqlite3_reset()] in order -** to find the underlying cause of the problem. With the "v2" prepare +** and the application would have to make a second call to [sqlite3_reset()] +** in order to find the underlying cause of the problem. With the "v2" prepare ** interfaces, the underlying reason for the error is returned immediately. **
    4. -**
    -** -** Requirements: -** [H13011] [H13012] [H13013] [H13014] [H13015] [H13016] [H13019] [H13021] ** +**
  • +** ^If the value of a [parameter | host parameter] in the WHERE clause might +** change the query plan for a statement, then the statement may be +** automatically recompiled (as if there had been a schema change) on the first +** [sqlite3_step()] call following any change to the +** [sqlite3_bind_text | bindings] of the [parameter]. +**
  • +** */ SQLITE_API int sqlite3_prepare( sqlite3 *db, /* Database handle */ @@ -2454,24 +2456,21 @@ SQLITE_API int sqlite3_prepare16_v2( ); /* -** CAPI3REF: Retrieving Statement SQL {H13100} +** CAPI3REF: Retrieving Statement SQL ** -** This interface can be used to retrieve a saved copy of the original +** ^This interface can be used to retrieve a saved copy of the original ** SQL text used to create a [prepared statement] if that statement was ** compiled using either [sqlite3_prepare_v2()] or [sqlite3_prepare16_v2()]. -** -** Requirements: -** [H13101] [H13102] [H13103] */ SQLITE_API const char *sqlite3_sql(sqlite3_stmt *pStmt); /* -** CAPI3REF: Dynamically Typed Value Object {H15000} +** CAPI3REF: Dynamically Typed Value Object ** KEYWORDS: {protected sqlite3_value} {unprotected sqlite3_value} ** ** SQLite uses the sqlite3_value object to represent all values ** that can be stored in a database table. SQLite uses dynamic typing -** for the values it stores. Values stored in sqlite3_value objects +** for the values it stores. ^Values stored in sqlite3_value objects ** can be integers, floating point values, strings, BLOBs, or NULL. ** ** An sqlite3_value object may be either "protected" or "unprotected". @@ -2493,9 +2492,9 @@ SQLITE_API const char *sqlite3_sql(sqlite3_stmt *pStmt); ** still make the distinction between between protected and unprotected ** sqlite3_value objects even when not strictly required. ** -** The sqlite3_value objects that are passed as parameters into the +** ^The sqlite3_value objects that are passed as parameters into the ** implementation of [application-defined SQL functions] are protected. -** The sqlite3_value object returned by +** ^The sqlite3_value object returned by ** [sqlite3_column_value()] is unprotected. ** Unprotected sqlite3_value objects may only be used with ** [sqlite3_result_value()] and [sqlite3_bind_value()]. @@ -2505,10 +2504,10 @@ SQLITE_API const char *sqlite3_sql(sqlite3_stmt *pStmt); typedef struct Mem sqlite3_value; /* -** CAPI3REF: SQL Function Context Object {H16001} +** CAPI3REF: SQL Function Context Object ** ** The context in which an SQL function executes is stored in an -** sqlite3_context object. A pointer to an sqlite3_context object +** sqlite3_context object. ^A pointer to an sqlite3_context object ** is always first parameter to [application-defined SQL functions]. ** The application-defined SQL function implementation will pass this ** pointer through into calls to [sqlite3_result_int | sqlite3_result()], @@ -2519,11 +2518,11 @@ typedef struct Mem sqlite3_value; typedef struct sqlite3_context sqlite3_context; /* -** CAPI3REF: Binding Values To Prepared Statements {H13500} +** CAPI3REF: Binding Values To Prepared Statements ** KEYWORDS: {host parameter} {host parameters} {host parameter name} ** KEYWORDS: {SQL parameter} {SQL parameters} {parameter binding} ** -** In the SQL strings input to [sqlite3_prepare_v2()] and its variants, +** ^(In the SQL statement text input to [sqlite3_prepare_v2()] and its variants, ** literals may be replaced by a [parameter] that matches one of following ** templates: ** @@ -2536,72 +2535,66 @@ typedef struct sqlite3_context sqlite3_context; ** ** ** In the templates above, NNN represents an integer literal, -** and VVV represents an alphanumeric identifer. The values of these +** and VVV represents an alphanumeric identifer.)^ ^The values of these ** parameters (also called "host parameter names" or "SQL parameters") ** can be set using the sqlite3_bind_*() routines defined here. ** -** The first argument to the sqlite3_bind_*() routines is always +** ^The first argument to the sqlite3_bind_*() routines is always ** a pointer to the [sqlite3_stmt] object returned from ** [sqlite3_prepare_v2()] or its variants. ** -** The second argument is the index of the SQL parameter to be set. -** The leftmost SQL parameter has an index of 1. When the same named +** ^The second argument is the index of the SQL parameter to be set. +** ^The leftmost SQL parameter has an index of 1. ^When the same named ** SQL parameter is used more than once, second and subsequent ** occurrences have the same index as the first occurrence. -** The index for named parameters can be looked up using the -** [sqlite3_bind_parameter_index()] API if desired. The index +** ^The index for named parameters can be looked up using the +** [sqlite3_bind_parameter_index()] API if desired. ^The index ** for "?NNN" parameters is the value of NNN. -** The NNN value must be between 1 and the [sqlite3_limit()] +** ^The NNN value must be between 1 and the [sqlite3_limit()] ** parameter [SQLITE_LIMIT_VARIABLE_NUMBER] (default value: 999). ** -** The third argument is the value to bind to the parameter. +** ^The third argument is the value to bind to the parameter. ** -** In those routines that have a fourth argument, its value is the +** ^(In those routines that have a fourth argument, its value is the ** number of bytes in the parameter. To be clear: the value is the -** number of bytes in the value, not the number of characters. -** If the fourth parameter is negative, the length of the string is +** number of bytes in the value, not the number of characters.)^ +** ^If the fourth parameter is negative, the length of the string is ** the number of bytes up to the first zero terminator. ** -** The fifth argument to sqlite3_bind_blob(), sqlite3_bind_text(), and +** ^The fifth argument to sqlite3_bind_blob(), sqlite3_bind_text(), and ** sqlite3_bind_text16() is a destructor used to dispose of the BLOB or -** string after SQLite has finished with it. If the fifth argument is +** string after SQLite has finished with it. ^If the fifth argument is ** the special value [SQLITE_STATIC], then SQLite assumes that the ** information is in static, unmanaged space and does not need to be freed. -** If the fifth argument has the value [SQLITE_TRANSIENT], then +** ^If the fifth argument has the value [SQLITE_TRANSIENT], then ** SQLite makes its own private copy of the data immediately, before ** the sqlite3_bind_*() routine returns. ** -** The sqlite3_bind_zeroblob() routine binds a BLOB of length N that -** is filled with zeroes. A zeroblob uses a fixed amount of memory +** ^The sqlite3_bind_zeroblob() routine binds a BLOB of length N that +** is filled with zeroes. ^A zeroblob uses a fixed amount of memory ** (just an integer to hold its size) while it is being processed. ** Zeroblobs are intended to serve as placeholders for BLOBs whose ** content is later written using ** [sqlite3_blob_open | incremental BLOB I/O] routines. -** A negative value for the zeroblob results in a zero-length BLOB. -** -** The sqlite3_bind_*() routines must be called after -** [sqlite3_prepare_v2()] (and its variants) or [sqlite3_reset()] and -** before [sqlite3_step()]. -** Bindings are not cleared by the [sqlite3_reset()] routine. -** Unbound parameters are interpreted as NULL. -** -** These routines return [SQLITE_OK] on success or an error code if -** anything goes wrong. [SQLITE_RANGE] is returned if the parameter -** index is out of range. [SQLITE_NOMEM] is returned if malloc() fails. -** [SQLITE_MISUSE] might be returned if these routines are called on a -** virtual machine that is the wrong state or which has already been finalized. -** Detection of misuse is unreliable. Applications should not depend -** on SQLITE_MISUSE returns. SQLITE_MISUSE is intended to indicate a -** a logic error in the application. Future versions of SQLite might -** panic rather than return SQLITE_MISUSE. +** ^A negative value for the zeroblob results in a zero-length BLOB. ** -** See also: [sqlite3_bind_parameter_count()], -** [sqlite3_bind_parameter_name()], and [sqlite3_bind_parameter_index()]. +** ^If any of the sqlite3_bind_*() routines are called with a NULL pointer +** for the [prepared statement] or with a prepared statement for which +** [sqlite3_step()] has been called more recently than [sqlite3_reset()], +** then the call will return [SQLITE_MISUSE]. If any sqlite3_bind_() +** routine is passed a [prepared statement] that has been finalized, the +** result is undefined and probably harmful. +** +** ^Bindings are not cleared by the [sqlite3_reset()] routine. +** ^Unbound parameters are interpreted as NULL. ** -** Requirements: -** [H13506] [H13509] [H13512] [H13515] [H13518] [H13521] [H13524] [H13527] -** [H13530] [H13533] [H13536] [H13539] [H13542] [H13545] [H13548] [H13551] +** ^The sqlite3_bind_* routines return [SQLITE_OK] on success or an +** [error code] if anything goes wrong. +** ^[SQLITE_RANGE] is returned if the parameter +** index is out of range. ^[SQLITE_NOMEM] is returned if malloc() fails. ** +** See also: [sqlite3_bind_parameter_count()], +** [sqlite3_bind_parameter_name()], and [sqlite3_bind_parameter_index()]. */ SQLITE_API int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*)); SQLITE_API int sqlite3_bind_double(sqlite3_stmt*, int, double); @@ -2614,45 +2607,42 @@ SQLITE_API int sqlite3_bind_value(sqlite3_stmt*, int, const sqlite3_value*); SQLITE_API int sqlite3_bind_zeroblob(sqlite3_stmt*, int, int n); /* -** CAPI3REF: Number Of SQL Parameters {H13600} +** CAPI3REF: Number Of SQL Parameters ** -** This routine can be used to find the number of [SQL parameters] +** ^This routine can be used to find the number of [SQL parameters] ** in a [prepared statement]. SQL parameters are tokens of the ** form "?", "?NNN", ":AAA", "$AAA", or "@AAA" that serve as ** placeholders for values that are [sqlite3_bind_blob | bound] ** to the parameters at a later time. ** -** This routine actually returns the index of the largest (rightmost) +** ^(This routine actually returns the index of the largest (rightmost) ** parameter. For all forms except ?NNN, this will correspond to the -** number of unique parameters. If parameters of the ?NNN are used, -** there may be gaps in the list. +** number of unique parameters. If parameters of the ?NNN form are used, +** there may be gaps in the list.)^ ** ** See also: [sqlite3_bind_blob|sqlite3_bind()], ** [sqlite3_bind_parameter_name()], and ** [sqlite3_bind_parameter_index()]. -** -** Requirements: -** [H13601] */ SQLITE_API int sqlite3_bind_parameter_count(sqlite3_stmt*); /* -** CAPI3REF: Name Of A Host Parameter {H13620} +** CAPI3REF: Name Of A Host Parameter ** -** This routine returns a pointer to the name of the n-th -** [SQL parameter] in a [prepared statement]. -** SQL parameters of the form "?NNN" or ":AAA" or "@AAA" or "$AAA" +** ^The sqlite3_bind_parameter_name(P,N) interface returns +** the name of the N-th [SQL parameter] in the [prepared statement] P. +** ^(SQL parameters of the form "?NNN" or ":AAA" or "@AAA" or "$AAA" ** have a name which is the string "?NNN" or ":AAA" or "@AAA" or "$AAA" ** respectively. ** In other words, the initial ":" or "$" or "@" or "?" -** is included as part of the name. -** Parameters of the form "?" without a following integer have no name -** and are also referred to as "anonymous parameters". +** is included as part of the name.)^ +** ^Parameters of the form "?" without a following integer have no name +** and are referred to as "nameless" or "anonymous parameters". ** -** The first host parameter has an index of 1, not 0. +** ^The first host parameter has an index of 1, not 0. ** -** If the value n is out of range or if the n-th parameter is -** nameless, then NULL is returned. The returned string is +** ^If the value N is out of range or if the N-th parameter is +** nameless, then NULL is returned. ^The returned string is ** always in UTF-8 encoding even if the named parameter was ** originally specified as UTF-16 in [sqlite3_prepare16()] or ** [sqlite3_prepare16_v2()]. @@ -2660,125 +2650,108 @@ SQLITE_API int sqlite3_bind_parameter_count(sqlite3_stmt*); ** See also: [sqlite3_bind_blob|sqlite3_bind()], ** [sqlite3_bind_parameter_count()], and ** [sqlite3_bind_parameter_index()]. -** -** Requirements: -** [H13621] */ SQLITE_API const char *sqlite3_bind_parameter_name(sqlite3_stmt*, int); /* -** CAPI3REF: Index Of A Parameter With A Given Name {H13640} +** CAPI3REF: Index Of A Parameter With A Given Name ** -** Return the index of an SQL parameter given its name. The +** ^Return the index of an SQL parameter given its name. ^The ** index value returned is suitable for use as the second -** parameter to [sqlite3_bind_blob|sqlite3_bind()]. A zero -** is returned if no matching parameter is found. The parameter +** parameter to [sqlite3_bind_blob|sqlite3_bind()]. ^A zero +** is returned if no matching parameter is found. ^The parameter ** name must be given in UTF-8 even if the original statement ** was prepared from UTF-16 text using [sqlite3_prepare16_v2()]. ** ** See also: [sqlite3_bind_blob|sqlite3_bind()], ** [sqlite3_bind_parameter_count()], and ** [sqlite3_bind_parameter_index()]. -** -** Requirements: -** [H13641] */ SQLITE_API int sqlite3_bind_parameter_index(sqlite3_stmt*, const char *zName); /* -** CAPI3REF: Reset All Bindings On A Prepared Statement {H13660} +** CAPI3REF: Reset All Bindings On A Prepared Statement ** -** Contrary to the intuition of many, [sqlite3_reset()] does not reset +** ^Contrary to the intuition of many, [sqlite3_reset()] does not reset ** the [sqlite3_bind_blob | bindings] on a [prepared statement]. -** Use this routine to reset all host parameters to NULL. -** -** Requirements: -** [H13661] +** ^Use this routine to reset all host parameters to NULL. */ SQLITE_API int sqlite3_clear_bindings(sqlite3_stmt*); /* -** CAPI3REF: Number Of Columns In A Result Set {H13710} +** CAPI3REF: Number Of Columns In A Result Set ** -** Return the number of columns in the result set returned by the -** [prepared statement]. This routine returns 0 if pStmt is an SQL +** ^Return the number of columns in the result set returned by the +** [prepared statement]. ^This routine returns 0 if pStmt is an SQL ** statement that does not return data (for example an [UPDATE]). -** -** Requirements: -** [H13711] */ SQLITE_API int sqlite3_column_count(sqlite3_stmt *pStmt); /* -** CAPI3REF: Column Names In A Result Set {H13720} +** CAPI3REF: Column Names In A Result Set ** -** These routines return the name assigned to a particular column -** in the result set of a [SELECT] statement. The sqlite3_column_name() +** ^These routines return the name assigned to a particular column +** in the result set of a [SELECT] statement. ^The sqlite3_column_name() ** interface returns a pointer to a zero-terminated UTF-8 string ** and sqlite3_column_name16() returns a pointer to a zero-terminated -** UTF-16 string. The first parameter is the [prepared statement] -** that implements the [SELECT] statement. The second parameter is the -** column number. The leftmost column is number 0. +** UTF-16 string. ^The first parameter is the [prepared statement] +** that implements the [SELECT] statement. ^The second parameter is the +** column number. ^The leftmost column is number 0. ** -** The returned string pointer is valid until either the [prepared statement] +** ^The returned string pointer is valid until either the [prepared statement] ** is destroyed by [sqlite3_finalize()] or until the next call to ** sqlite3_column_name() or sqlite3_column_name16() on the same column. ** -** If sqlite3_malloc() fails during the processing of either routine +** ^If sqlite3_malloc() fails during the processing of either routine ** (for example during a conversion from UTF-8 to UTF-16) then a ** NULL pointer is returned. ** -** The name of a result column is the value of the "AS" clause for +** ^The name of a result column is the value of the "AS" clause for ** that column, if there is an AS clause. If there is no AS clause ** then the name of the column is unspecified and may change from ** one release of SQLite to the next. -** -** Requirements: -** [H13721] [H13723] [H13724] [H13725] [H13726] [H13727] */ SQLITE_API const char *sqlite3_column_name(sqlite3_stmt*, int N); SQLITE_API const void *sqlite3_column_name16(sqlite3_stmt*, int N); /* -** CAPI3REF: Source Of Data In A Query Result {H13740} +** CAPI3REF: Source Of Data In A Query Result ** -** These routines provide a means to determine what column of what -** table in which database a result of a [SELECT] statement comes from. -** The name of the database or table or column can be returned as -** either a UTF-8 or UTF-16 string. The _database_ routines return +** ^These routines provide a means to determine the database, table, and +** table column that is the origin of a particular result column in +** [SELECT] statement. +** ^The name of the database or table or column can be returned as +** either a UTF-8 or UTF-16 string. ^The _database_ routines return ** the database name, the _table_ routines return the table name, and ** the origin_ routines return the column name. -** The returned string is valid until the [prepared statement] is destroyed +** ^The returned string is valid until the [prepared statement] is destroyed ** using [sqlite3_finalize()] or until the same information is requested ** again in a different encoding. ** -** The names returned are the original un-aliased names of the +** ^The names returned are the original un-aliased names of the ** database, table, and column. ** -** The first argument to the following calls is a [prepared statement]. -** These functions return information about the Nth column returned by +** ^The first argument to these interfaces is a [prepared statement]. +** ^These functions return information about the Nth result column returned by ** the statement, where N is the second function argument. +** ^The left-most column is column 0 for these routines. ** -** If the Nth column returned by the statement is an expression or +** ^If the Nth column returned by the statement is an expression or ** subquery and is not a column value, then all of these functions return -** NULL. These routine might also return NULL if a memory allocation error -** occurs. Otherwise, they return the name of the attached database, table -** and column that query result column was extracted from. +** NULL. ^These routine might also return NULL if a memory allocation error +** occurs. ^Otherwise, they return the name of the attached database, table, +** or column that query result column was extracted from. ** -** As with all other SQLite APIs, those postfixed with "16" return -** UTF-16 encoded strings, the other functions return UTF-8. {END} +** ^As with all other SQLite APIs, those whose names end with "16" return +** UTF-16 encoded strings and the other functions return UTF-8. ** -** These APIs are only available if the library was compiled with the -** [SQLITE_ENABLE_COLUMN_METADATA] C-preprocessor symbol defined. +** ^These APIs are only available if the library was compiled with the +** [SQLITE_ENABLE_COLUMN_METADATA] C-preprocessor symbol. ** -** {A13751} ** If two or more threads call one or more of these routines against the same ** prepared statement and column at the same time then the results are ** undefined. ** -** Requirements: -** [H13741] [H13742] [H13743] [H13744] [H13745] [H13746] [H13748] -** ** If two or more threads call one or more ** [sqlite3_column_database_name | column metadata interfaces] ** for the same [prepared statement] and result column @@ -2792,17 +2765,17 @@ SQLITE_API const char *sqlite3_column_origin_name(sqlite3_stmt*,int); SQLITE_API const void *sqlite3_column_origin_name16(sqlite3_stmt*,int); /* -** CAPI3REF: Declared Datatype Of A Query Result {H13760} +** CAPI3REF: Declared Datatype Of A Query Result ** -** The first parameter is a [prepared statement]. +** ^(The first parameter is a [prepared statement]. ** If this statement is a [SELECT] statement and the Nth column of the ** returned result set of that [SELECT] is a table column (not an ** expression or subquery) then the declared type of the table -** column is returned. If the Nth column of the result set is an +** column is returned.)^ ^If the Nth column of the result set is an ** expression or subquery, then a NULL pointer is returned. -** The returned string is always UTF-8 encoded. {END} +** ^The returned string is always UTF-8 encoded. ** -** For example, given the database schema: +** ^(For example, given the database schema: ** ** CREATE TABLE t1(c1 VARIANT); ** @@ -2811,23 +2784,20 @@ SQLITE_API const void *sqlite3_column_origin_name16(sqlite3_stmt*,int); ** SELECT c1 + 1, c1 FROM t1; ** ** this routine would return the string "VARIANT" for the second result -** column (i==1), and a NULL pointer for the first result column (i==0). +** column (i==1), and a NULL pointer for the first result column (i==0).)^ ** -** SQLite uses dynamic run-time typing. So just because a column +** ^SQLite uses dynamic run-time typing. ^So just because a column ** is declared to contain a particular type does not mean that the ** data stored in that column is of the declared type. SQLite is -** strongly typed, but the typing is dynamic not static. Type +** strongly typed, but the typing is dynamic not static. ^Type ** is associated with individual values, not with the containers ** used to hold those values. -** -** Requirements: -** [H13761] [H13762] [H13763] */ SQLITE_API const char *sqlite3_column_decltype(sqlite3_stmt*,int); SQLITE_API const void *sqlite3_column_decltype16(sqlite3_stmt*,int); /* -** CAPI3REF: Evaluate An SQL Statement {H13200} +** CAPI3REF: Evaluate An SQL Statement ** ** After a [prepared statement] has been prepared using either ** [sqlite3_prepare_v2()] or [sqlite3_prepare16_v2()] or one of the legacy @@ -2841,35 +2811,35 @@ SQLITE_API const void *sqlite3_column_decltype16(sqlite3_stmt*,int); ** new "v2" interface is recommended for new applications but the legacy ** interface will continue to be supported. ** -** In the legacy interface, the return value will be either [SQLITE_BUSY], +** ^In the legacy interface, the return value will be either [SQLITE_BUSY], ** [SQLITE_DONE], [SQLITE_ROW], [SQLITE_ERROR], or [SQLITE_MISUSE]. -** With the "v2" interface, any of the other [result codes] or +** ^With the "v2" interface, any of the other [result codes] or ** [extended result codes] might be returned as well. ** -** [SQLITE_BUSY] means that the database engine was unable to acquire the -** database locks it needs to do its job. If the statement is a [COMMIT] +** ^[SQLITE_BUSY] means that the database engine was unable to acquire the +** database locks it needs to do its job. ^If the statement is a [COMMIT] ** or occurs outside of an explicit transaction, then you can retry the ** statement. If the statement is not a [COMMIT] and occurs within a ** explicit transaction then you should rollback the transaction before ** continuing. ** -** [SQLITE_DONE] means that the statement has finished executing +** ^[SQLITE_DONE] means that the statement has finished executing ** successfully. sqlite3_step() should not be called again on this virtual ** machine without first calling [sqlite3_reset()] to reset the virtual ** machine back to its initial state. ** -** If the SQL statement being executed returns any data, then [SQLITE_ROW] +** ^If the SQL statement being executed returns any data, then [SQLITE_ROW] ** is returned each time a new row of data is ready for processing by the ** caller. The values may be accessed using the [column access functions]. ** sqlite3_step() is called again to retrieve the next row of data. ** -** [SQLITE_ERROR] means that a run-time error (such as a constraint +** ^[SQLITE_ERROR] means that a run-time error (such as a constraint ** violation) has occurred. sqlite3_step() should not be called again on ** the VM. More information may be found by calling [sqlite3_errmsg()]. -** With the legacy interface, a more specific error code (for example, +** ^With the legacy interface, a more specific error code (for example, ** [SQLITE_INTERRUPT], [SQLITE_SCHEMA], [SQLITE_CORRUPT], and so forth) ** can be obtained by calling [sqlite3_reset()] on the -** [prepared statement]. In the "v2" interface, +** [prepared statement]. ^In the "v2" interface, ** the more specific error code is returned directly by sqlite3_step(). ** ** [SQLITE_MISUSE] means that the this routine was called inappropriately. @@ -2890,27 +2860,22 @@ SQLITE_API const void *sqlite3_column_decltype16(sqlite3_stmt*,int); ** of the legacy [sqlite3_prepare()] and [sqlite3_prepare16()] interfaces, ** then the more specific [error codes] are returned directly ** by sqlite3_step(). The use of the "v2" interface is recommended. -** -** Requirements: -** [H13202] [H15304] [H15306] [H15308] [H15310] */ SQLITE_API int sqlite3_step(sqlite3_stmt*); /* -** CAPI3REF: Number of columns in a result set {H13770} -** -** Returns the number of values in the current row of the result set. +** CAPI3REF: Number of columns in a result set ** -** Requirements: -** [H13771] [H13772] +** ^The sqlite3_data_count(P) the number of columns in the +** of the result set of [prepared statement] P. */ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt); /* -** CAPI3REF: Fundamental Datatypes {H10265} +** CAPI3REF: Fundamental Datatypes ** KEYWORDS: SQLITE_TEXT ** -** {H10266} Every value in SQLite has one of five fundamental datatypes: +** ^(Every value in SQLite has one of five fundamental datatypes: ** **
      **
    • 64-bit signed integer @@ -2918,7 +2883,7 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt); **
    • string **
    • BLOB **
    • NULL -**
    {END} +** )^ ** ** These constants are codes for each of those types. ** @@ -2939,17 +2904,19 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt); #define SQLITE3_TEXT 3 /* -** CAPI3REF: Result Values From A Query {H13800} +** CAPI3REF: Result Values From A Query ** KEYWORDS: {column access functions} ** -** These routines form the "result set query" interface. +** These routines form the "result set" interface. ** -** These routines return information about a single column of the current -** result row of a query. In every case the first argument is a pointer +** ^These routines return information about a single column of the current +** result row of a query. ^In every case the first argument is a pointer ** to the [prepared statement] that is being evaluated (the [sqlite3_stmt*] ** that was returned from [sqlite3_prepare_v2()] or one of its variants) ** and the second argument is the index of the column for which information -** should be returned. The leftmost column of the result set has the index 0. +** should be returned. ^The leftmost column of the result set has the index 0. +** ^The number of columns in the result can be determined using +** [sqlite3_column_count()]. ** ** If the SQL statement does not currently point to a valid row, or if the ** column index is out of range, the result is undefined. @@ -2963,9 +2930,9 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt); ** are called from a different thread while any of these routines ** are pending, then the results are undefined. ** -** The sqlite3_column_type() routine returns the +** ^The sqlite3_column_type() routine returns the ** [SQLITE_INTEGER | datatype code] for the initial data type -** of the result column. The returned value is one of [SQLITE_INTEGER], +** of the result column. ^The returned value is one of [SQLITE_INTEGER], ** [SQLITE_FLOAT], [SQLITE_TEXT], [SQLITE_BLOB], or [SQLITE_NULL]. The value ** returned by sqlite3_column_type() is only meaningful if no type ** conversions have occurred as described below. After a type conversion, @@ -2973,27 +2940,27 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt); ** versions of SQLite may change the behavior of sqlite3_column_type() ** following a type conversion. ** -** If the result is a BLOB or UTF-8 string then the sqlite3_column_bytes() +** ^If the result is a BLOB or UTF-8 string then the sqlite3_column_bytes() ** routine returns the number of bytes in that BLOB or string. -** If the result is a UTF-16 string, then sqlite3_column_bytes() converts +** ^If the result is a UTF-16 string, then sqlite3_column_bytes() converts ** the string to UTF-8 and then returns the number of bytes. -** If the result is a numeric value then sqlite3_column_bytes() uses +** ^If the result is a numeric value then sqlite3_column_bytes() uses ** [sqlite3_snprintf()] to convert that value to a UTF-8 string and returns ** the number of bytes in that string. -** The value returned does not include the zero terminator at the end -** of the string. For clarity: the value returned is the number of +** ^The value returned does not include the zero terminator at the end +** of the string. ^For clarity: the value returned is the number of ** bytes in the string, not the number of characters. ** -** Strings returned by sqlite3_column_text() and sqlite3_column_text16(), -** even empty strings, are always zero terminated. The return +** ^Strings returned by sqlite3_column_text() and sqlite3_column_text16(), +** even empty strings, are always zero terminated. ^The return ** value from sqlite3_column_blob() for a zero-length BLOB is an arbitrary ** pointer, possibly even a NULL pointer. ** -** The sqlite3_column_bytes16() routine is similar to sqlite3_column_bytes() +** ^The sqlite3_column_bytes16() routine is similar to sqlite3_column_bytes() ** but leaves the result in UTF-16 in native byte order instead of UTF-8. -** The zero terminator is not included in this count. +** ^The zero terminator is not included in this count. ** -** The object returned by [sqlite3_column_value()] is an +** ^The object returned by [sqlite3_column_value()] is an ** [unprotected sqlite3_value] object. An unprotected sqlite3_value object ** may only be used with [sqlite3_bind_value()] and [sqlite3_result_value()]. ** If the [unprotected sqlite3_value] object returned by @@ -3001,10 +2968,10 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt); ** to routines like [sqlite3_value_int()], [sqlite3_value_text()], ** or [sqlite3_value_bytes()], then the behavior is undefined. ** -** These routines attempt to convert the value where appropriate. For +** These routines attempt to convert the value where appropriate. ^For ** example, if the internal representation is FLOAT and a text result ** is requested, [sqlite3_snprintf()] is used internally to perform the -** conversion automatically. The following table details the conversions +** conversion automatically. ^(The following table details the conversions ** that are applied: ** **
    @@ -3028,7 +2995,7 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt); ** BLOB FLOAT Convert to TEXT then use atof() ** BLOB TEXT Add a zero terminator if needed ** -**
    +**
    )^ ** ** The table above makes reference to standard C library functions atoi() ** and atof(). SQLite does not really use these functions. It has its @@ -3036,10 +3003,10 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt); ** used in the table for brevity and because they are familiar to most ** C programmers. ** -** Note that when type conversions occur, pointers returned by prior +** ^Note that when type conversions occur, pointers returned by prior ** calls to sqlite3_column_blob(), sqlite3_column_text(), and/or ** sqlite3_column_text16() may be invalidated. -** Type conversions and pointer invalidations might occur +** ^(Type conversions and pointer invalidations might occur ** in the following cases: ** **
      @@ -3052,22 +3019,22 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt); **
    • The initial content is UTF-16 text and sqlite3_column_bytes() or ** sqlite3_column_text() is called. The content must be converted ** to UTF-8.
    • -**
    +** )^ ** -** Conversions between UTF-16be and UTF-16le are always done in place and do +** ^Conversions between UTF-16be and UTF-16le are always done in place and do ** not invalidate a prior pointer, though of course the content of the buffer ** that the prior pointer points to will have been modified. Other kinds ** of conversion are done in place when it is possible, but sometimes they ** are not possible and in those cases prior pointers are invalidated. ** -** The safest and easiest to remember policy is to invoke these routines +** ^(The safest and easiest to remember policy is to invoke these routines ** in one of the following ways: ** **
      **
    • sqlite3_column_text() followed by sqlite3_column_bytes()
    • **
    • sqlite3_column_blob() followed by sqlite3_column_bytes()
    • **
    • sqlite3_column_text16() followed by sqlite3_column_bytes16()
    • -**
    +** )^ ** ** In other words, you should call sqlite3_column_text(), ** sqlite3_column_blob(), or sqlite3_column_text16() first to force the result @@ -3077,22 +3044,18 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt); ** sqlite3_column_bytes16(), and do not mix calls to sqlite3_column_text16() ** with calls to sqlite3_column_bytes(). ** -** The pointers returned are valid until a type conversion occurs as +** ^The pointers returned are valid until a type conversion occurs as ** described above, or until [sqlite3_step()] or [sqlite3_reset()] or -** [sqlite3_finalize()] is called. The memory space used to hold strings +** [sqlite3_finalize()] is called. ^The memory space used to hold strings ** and BLOBs is freed automatically. Do not pass the pointers returned ** [sqlite3_column_blob()], [sqlite3_column_text()], etc. into ** [sqlite3_free()]. ** -** If a memory allocation error occurs during the evaluation of any +** ^(If a memory allocation error occurs during the evaluation of any ** of these routines, a default value is returned. The default value ** is either the integer 0, the floating point number 0.0, or a NULL ** pointer. Subsequent calls to [sqlite3_errcode()] will return -** [SQLITE_NOMEM]. -** -** Requirements: -** [H13803] [H13806] [H13809] [H13812] [H13815] [H13818] [H13821] [H13824] -** [H13827] [H13830] +** [SQLITE_NOMEM].)^ */ SQLITE_API const void *sqlite3_column_blob(sqlite3_stmt*, int iCol); SQLITE_API int sqlite3_column_bytes(sqlite3_stmt*, int iCol); @@ -3106,79 +3069,76 @@ SQLITE_API int sqlite3_column_type(sqlite3_stmt*, int iCol); SQLITE_API sqlite3_value *sqlite3_column_value(sqlite3_stmt*, int iCol); /* -** CAPI3REF: Destroy A Prepared Statement Object {H13300} +** CAPI3REF: Destroy A Prepared Statement Object ** -** The sqlite3_finalize() function is called to delete a [prepared statement]. -** If the statement was executed successfully or not executed at all, then -** SQLITE_OK is returned. If execution of the statement failed then an +** ^The sqlite3_finalize() function is called to delete a [prepared statement]. +** ^If the statement was executed successfully or not executed at all, then +** SQLITE_OK is returned. ^If execution of the statement failed then an ** [error code] or [extended error code] is returned. ** -** This routine can be called at any point during the execution of the -** [prepared statement]. If the virtual machine has not +** ^This routine can be called at any point during the execution of the +** [prepared statement]. ^If the virtual machine has not ** completed execution when this routine is called, that is like ** encountering an error or an [sqlite3_interrupt | interrupt]. -** Incomplete updates may be rolled back and transactions canceled, +** ^Incomplete updates may be rolled back and transactions canceled, ** depending on the circumstances, and the ** [error code] returned will be [SQLITE_ABORT]. -** -** Requirements: -** [H11302] [H11304] */ SQLITE_API int sqlite3_finalize(sqlite3_stmt *pStmt); /* -** CAPI3REF: Reset A Prepared Statement Object {H13330} +** CAPI3REF: Reset A Prepared Statement Object ** ** The sqlite3_reset() function is called to reset a [prepared statement] ** object back to its initial state, ready to be re-executed. -** Any SQL statement variables that had values bound to them using +** ^Any SQL statement variables that had values bound to them using ** the [sqlite3_bind_blob | sqlite3_bind_*() API] retain their values. ** Use [sqlite3_clear_bindings()] to reset the bindings. ** -** {H11332} The [sqlite3_reset(S)] interface resets the [prepared statement] S -** back to the beginning of its program. +** ^The [sqlite3_reset(S)] interface resets the [prepared statement] S +** back to the beginning of its program. ** -** {H11334} If the most recent call to [sqlite3_step(S)] for the -** [prepared statement] S returned [SQLITE_ROW] or [SQLITE_DONE], -** or if [sqlite3_step(S)] has never before been called on S, -** then [sqlite3_reset(S)] returns [SQLITE_OK]. +** ^If the most recent call to [sqlite3_step(S)] for the +** [prepared statement] S returned [SQLITE_ROW] or [SQLITE_DONE], +** or if [sqlite3_step(S)] has never before been called on S, +** then [sqlite3_reset(S)] returns [SQLITE_OK]. ** -** {H11336} If the most recent call to [sqlite3_step(S)] for the -** [prepared statement] S indicated an error, then -** [sqlite3_reset(S)] returns an appropriate [error code]. +** ^If the most recent call to [sqlite3_step(S)] for the +** [prepared statement] S indicated an error, then +** [sqlite3_reset(S)] returns an appropriate [error code]. ** -** {H11338} The [sqlite3_reset(S)] interface does not change the values -** of any [sqlite3_bind_blob|bindings] on the [prepared statement] S. +** ^The [sqlite3_reset(S)] interface does not change the values +** of any [sqlite3_bind_blob|bindings] on the [prepared statement] S. */ SQLITE_API int sqlite3_reset(sqlite3_stmt *pStmt); /* -** CAPI3REF: Create Or Redefine SQL Functions {H16100} +** CAPI3REF: Create Or Redefine SQL Functions ** KEYWORDS: {function creation routines} ** KEYWORDS: {application-defined SQL function} ** KEYWORDS: {application-defined SQL functions} ** -** These two functions (collectively known as "function creation routines") +** ^These two functions (collectively known as "function creation routines") ** are used to add SQL functions or aggregates or to redefine the behavior ** of existing SQL functions or aggregates. The only difference between the ** two is that the second parameter, the name of the (scalar) function or ** aggregate, is encoded in UTF-8 for sqlite3_create_function() and UTF-16 ** for sqlite3_create_function16(). ** -** The first parameter is the [database connection] to which the SQL -** function is to be added. If a single program uses more than one database -** connection internally, then SQL functions must be added individually to -** each database connection. +** ^The first parameter is the [database connection] to which the SQL +** function is to be added. ^If an application uses more than one database +** connection then application-defined SQL functions must be added +** to each database connection separately. ** ** The second parameter is the name of the SQL function to be created or -** redefined. The length of the name is limited to 255 bytes, exclusive of +** redefined. ^The length of the name is limited to 255 bytes, exclusive of ** the zero-terminator. Note that the name length limit is in bytes, not -** characters. Any attempt to create a function with a longer name +** characters. ^Any attempt to create a function with a longer name ** will result in [SQLITE_ERROR] being returned. ** -** The third parameter (nArg) +** ^The third parameter (nArg) ** is the number of arguments that the SQL function or -** aggregate takes. If this parameter is -1, then the SQL function or +** aggregate takes. ^If this parameter is -1, then the SQL function or ** aggregate may take any number of arguments between 0 and the limit ** set by [sqlite3_limit]([SQLITE_LIMIT_FUNCTION_ARG]). If the third ** parameter is less than -1 or greater than 127 then the behavior is @@ -3188,53 +3148,49 @@ SQLITE_API int sqlite3_reset(sqlite3_stmt *pStmt); ** [SQLITE_UTF8 | text encoding] this SQL function prefers for ** its parameters. Any SQL function implementation should be able to work ** work with UTF-8, UTF-16le, or UTF-16be. But some implementations may be -** more efficient with one encoding than another. An application may +** more efficient with one encoding than another. ^An application may ** invoke sqlite3_create_function() or sqlite3_create_function16() multiple ** times with the same function but with different values of eTextRep. -** When multiple implementations of the same function are available, SQLite +** ^When multiple implementations of the same function are available, SQLite ** will pick the one that involves the least amount of data conversion. ** If there is only a single implementation which does not care what text ** encoding is used, then the fourth argument should be [SQLITE_ANY]. ** -** The fifth parameter is an arbitrary pointer. The implementation of the -** function can gain access to this pointer using [sqlite3_user_data()]. +** ^(The fifth parameter is an arbitrary pointer. The implementation of the +** function can gain access to this pointer using [sqlite3_user_data()].)^ ** ** The seventh, eighth and ninth parameters, xFunc, xStep and xFinal, are ** pointers to C-language functions that implement the SQL function or -** aggregate. A scalar SQL function requires an implementation of the xFunc -** callback only, NULL pointers should be passed as the xStep and xFinal -** parameters. An aggregate SQL function requires an implementation of xStep -** and xFinal and NULL should be passed for xFunc. To delete an existing +** aggregate. ^A scalar SQL function requires an implementation of the xFunc +** callback only; NULL pointers should be passed as the xStep and xFinal +** parameters. ^An aggregate SQL function requires an implementation of xStep +** and xFinal and NULL should be passed for xFunc. ^To delete an existing ** SQL function or aggregate, pass NULL for all three function callbacks. ** -** It is permitted to register multiple implementations of the same +** ^It is permitted to register multiple implementations of the same ** functions with the same name but with either differing numbers of -** arguments or differing preferred text encodings. SQLite will use +** arguments or differing preferred text encodings. ^SQLite will use ** the implementation that most closely matches the way in which the -** SQL function is used. A function implementation with a non-negative +** SQL function is used. ^A function implementation with a non-negative ** nArg parameter is a better match than a function implementation with -** a negative nArg. A function where the preferred text encoding +** a negative nArg. ^A function where the preferred text encoding ** matches the database encoding is a better ** match than a function where the encoding is different. -** A function where the encoding difference is between UTF16le and UTF16be +** ^A function where the encoding difference is between UTF16le and UTF16be ** is a closer match than a function where the encoding difference is ** between UTF8 and UTF16. ** -** Built-in functions may be overloaded by new application-defined functions. -** The first application-defined function with a given name overrides all +** ^Built-in functions may be overloaded by new application-defined functions. +** ^The first application-defined function with a given name overrides all ** built-in functions in the same [database connection] with the same name. -** Subsequent application-defined functions of the same name only override +** ^Subsequent application-defined functions of the same name only override ** prior application-defined functions that are an exact match for the ** number of parameters and preferred encoding. ** -** An application-defined function is permitted to call other +** ^An application-defined function is permitted to call other ** SQLite interfaces. However, such calls must not ** close the database connection nor finalize or reset the prepared ** statement in which the function is running. -** -** Requirements: -** [H16103] [H16106] [H16109] [H16112] [H16118] [H16121] [H16127] -** [H16130] [H16133] [H16136] [H16139] [H16142] */ SQLITE_API int sqlite3_create_function( sqlite3 *db, @@ -3258,7 +3214,7 @@ SQLITE_API int sqlite3_create_function16( ); /* -** CAPI3REF: Text Encodings {H10267} +** CAPI3REF: Text Encodings ** ** These constant define integer codes that represent the various ** text encodings supported by SQLite. @@ -3290,7 +3246,7 @@ SQLITE_API SQLITE_DEPRECATED int sqlite3_memory_alarm(void(*)(void*,sqlite3_int6 #endif /* -** CAPI3REF: Obtaining SQL Function Parameter Values {H15100} +** CAPI3REF: Obtaining SQL Function Parameter Values ** ** The C-language implementation of SQL functions and aggregates uses ** this set of interface routines to access the parameter values on @@ -3308,22 +3264,22 @@ SQLITE_API SQLITE_DEPRECATED int sqlite3_memory_alarm(void(*)(void*,sqlite3_int6 ** Any attempt to use these routines on an [unprotected sqlite3_value] ** object results in undefined behavior. ** -** These routines work just like the corresponding [column access functions] +** ^These routines work just like the corresponding [column access functions] ** except that these routines take a single [protected sqlite3_value] object ** pointer instead of a [sqlite3_stmt*] pointer and an integer column number. ** -** The sqlite3_value_text16() interface extracts a UTF-16 string -** in the native byte-order of the host machine. The +** ^The sqlite3_value_text16() interface extracts a UTF-16 string +** in the native byte-order of the host machine. ^The ** sqlite3_value_text16be() and sqlite3_value_text16le() interfaces ** extract UTF-16 strings as big-endian and little-endian respectively. ** -** The sqlite3_value_numeric_type() interface attempts to apply +** ^(The sqlite3_value_numeric_type() interface attempts to apply ** numeric affinity to the value. This means that an attempt is ** made to convert the value to an integer or floating point. If ** such a conversion is possible without loss of information (in other ** words, if the value is a string that looks like a number) ** then the conversion is performed. Otherwise no conversion occurs. -** The [SQLITE_INTEGER | datatype] after conversion is returned. +** The [SQLITE_INTEGER | datatype] after conversion is returned.)^ ** ** Please pay particular attention to the fact that the pointer returned ** from [sqlite3_value_blob()], [sqlite3_value_text()], or @@ -3333,10 +3289,6 @@ SQLITE_API SQLITE_DEPRECATED int sqlite3_memory_alarm(void(*)(void*,sqlite3_int6 ** ** These routines must be called from the same thread as ** the SQL function that supplied the [sqlite3_value*] parameters. -** -** Requirements: -** [H15103] [H15106] [H15109] [H15112] [H15115] [H15118] [H15121] [H15124] -** [H15127] [H15130] [H15133] [H15136] */ SQLITE_API const void *sqlite3_value_blob(sqlite3_value*); SQLITE_API int sqlite3_value_bytes(sqlite3_value*); @@ -3352,66 +3304,73 @@ SQLITE_API int sqlite3_value_type(sqlite3_value*); SQLITE_API int sqlite3_value_numeric_type(sqlite3_value*); /* -** CAPI3REF: Obtain Aggregate Function Context {H16210} +** CAPI3REF: Obtain Aggregate Function Context +** +** Implementions of aggregate SQL functions use this +** routine to allocate memory for storing their state. +** +** ^The first time the sqlite3_aggregate_context(C,N) routine is called +** for a particular aggregate function, SQLite +** allocates N of memory, zeroes out that memory, and returns a pointer +** to the new memory. ^On second and subsequent calls to +** sqlite3_aggregate_context() for the same aggregate function instance, +** the same buffer is returned. Sqlite3_aggregate_context() is normally +** called once for each invocation of the xStep callback and then one +** last time when the xFinal callback is invoked. ^(When no rows match +** an aggregate query, the xStep() callback of the aggregate function +** implementation is never called and xFinal() is called exactly once. +** In those cases, sqlite3_aggregate_context() might be called for the +** first time from within xFinal().)^ ** -** The implementation of aggregate SQL functions use this routine to allocate -** a structure for storing their state. +** ^The sqlite3_aggregate_context(C,N) routine returns a NULL pointer if N is +** less than or equal to zero or if a memory allocate error occurs. ** -** The first time the sqlite3_aggregate_context() routine is called for a -** particular aggregate, SQLite allocates nBytes of memory, zeroes out that -** memory, and returns a pointer to it. On second and subsequent calls to -** sqlite3_aggregate_context() for the same aggregate function index, -** the same buffer is returned. The implementation of the aggregate can use -** the returned buffer to accumulate data. +** ^(The amount of space allocated by sqlite3_aggregate_context(C,N) is +** determined by the N parameter on first successful call. Changing the +** value of N in subsequent call to sqlite3_aggregate_context() within +** the same aggregate function instance will not resize the memory +** allocation.)^ ** -** SQLite automatically frees the allocated buffer when the aggregate -** query concludes. +** ^SQLite automatically frees the memory allocated by +** sqlite3_aggregate_context() when the aggregate query concludes. ** -** The first parameter should be a copy of the +** The first parameter must be a copy of the ** [sqlite3_context | SQL function context] that is the first parameter -** to the callback routine that implements the aggregate function. +** to the xStep or xFinal callback routine that implements the aggregate +** function. ** ** This routine must be called from the same thread in which ** the aggregate SQL function is running. -** -** Requirements: -** [H16211] [H16213] [H16215] [H16217] */ SQLITE_API void *sqlite3_aggregate_context(sqlite3_context*, int nBytes); /* -** CAPI3REF: User Data For Functions {H16240} +** CAPI3REF: User Data For Functions ** -** The sqlite3_user_data() interface returns a copy of +** ^The sqlite3_user_data() interface returns a copy of ** the pointer that was the pUserData parameter (the 5th parameter) ** of the [sqlite3_create_function()] ** and [sqlite3_create_function16()] routines that originally -** registered the application defined function. {END} +** registered the application defined function. ** ** This routine must be called from the same thread in which ** the application-defined function is running. -** -** Requirements: -** [H16243] */ SQLITE_API void *sqlite3_user_data(sqlite3_context*); /* -** CAPI3REF: Database Connection For Functions {H16250} +** CAPI3REF: Database Connection For Functions ** -** The sqlite3_context_db_handle() interface returns a copy of +** ^The sqlite3_context_db_handle() interface returns a copy of ** the pointer to the [database connection] (the 1st parameter) ** of the [sqlite3_create_function()] ** and [sqlite3_create_function16()] routines that originally ** registered the application defined function. -** -** Requirements: -** [H16253] */ SQLITE_API sqlite3 *sqlite3_context_db_handle(sqlite3_context*); /* -** CAPI3REF: Function Auxiliary Data {H16270} +** CAPI3REF: Function Auxiliary Data ** ** The following two functions may be used by scalar SQL functions to ** associate metadata with argument values. If the same value is passed to @@ -3424,48 +3383,45 @@ SQLITE_API sqlite3 *sqlite3_context_db_handle(sqlite3_context*); ** invocations of the same function so that the original pattern string ** does not need to be recompiled on each invocation. ** -** The sqlite3_get_auxdata() interface returns a pointer to the metadata +** ^The sqlite3_get_auxdata() interface returns a pointer to the metadata ** associated by the sqlite3_set_auxdata() function with the Nth argument -** value to the application-defined function. If no metadata has been ever +** value to the application-defined function. ^If no metadata has been ever ** been set for the Nth argument of the function, or if the corresponding ** function parameter has changed since the meta-data was set, ** then sqlite3_get_auxdata() returns a NULL pointer. ** -** The sqlite3_set_auxdata() interface saves the metadata +** ^The sqlite3_set_auxdata() interface saves the metadata ** pointed to by its 3rd parameter as the metadata for the N-th ** argument of the application-defined function. Subsequent ** calls to sqlite3_get_auxdata() might return this data, if it has ** not been destroyed. -** If it is not NULL, SQLite will invoke the destructor +** ^If it is not NULL, SQLite will invoke the destructor ** function given by the 4th parameter to sqlite3_set_auxdata() on ** the metadata when the corresponding function parameter changes ** or when the SQL statement completes, whichever comes first. ** ** SQLite is free to call the destructor and drop metadata on any -** parameter of any function at any time. The only guarantee is that +** parameter of any function at any time. ^The only guarantee is that ** the destructor will be called before the metadata is dropped. ** -** In practice, metadata is preserved between function calls for +** ^(In practice, metadata is preserved between function calls for ** expressions that are constant at compile time. This includes literal -** values and SQL variables. +** values and [parameters].)^ ** ** These routines must be called from the same thread in which ** the SQL function is running. -** -** Requirements: -** [H16272] [H16274] [H16276] [H16277] [H16278] [H16279] */ SQLITE_API void *sqlite3_get_auxdata(sqlite3_context*, int N); SQLITE_API void sqlite3_set_auxdata(sqlite3_context*, int N, void*, void (*)(void*)); /* -** CAPI3REF: Constants Defining Special Destructor Behavior {H10280} +** CAPI3REF: Constants Defining Special Destructor Behavior ** ** These are special values for the destructor that is passed in as the -** final argument to routines like [sqlite3_result_blob()]. If the destructor +** final argument to routines like [sqlite3_result_blob()]. ^If the destructor ** argument is SQLITE_STATIC, it means that the content pointer is constant -** and will never change. It does not need to be destroyed. The +** and will never change. It does not need to be destroyed. ^The ** SQLITE_TRANSIENT value means that the content will likely change in ** the near future and that SQLite should make its own private copy of ** the content before returning. @@ -3478,7 +3434,7 @@ typedef void (*sqlite3_destructor_type)(void*); #define SQLITE_TRANSIENT ((sqlite3_destructor_type)-1) /* -** CAPI3REF: Setting The Result Of An SQL Function {H16400} +** CAPI3REF: Setting The Result Of An SQL Function ** ** These routines are used by the xFunc or xFinal callbacks that ** implement SQL functions and aggregates. See @@ -3489,103 +3445,98 @@ typedef void (*sqlite3_destructor_type)(void*); ** functions used to bind values to host parameters in prepared statements. ** Refer to the [SQL parameter] documentation for additional information. ** -** The sqlite3_result_blob() interface sets the result from +** ^The sqlite3_result_blob() interface sets the result from ** an application-defined function to be the BLOB whose content is pointed ** to by the second parameter and which is N bytes long where N is the ** third parameter. ** -** The sqlite3_result_zeroblob() interfaces set the result of +** ^The sqlite3_result_zeroblob() interfaces set the result of ** the application-defined function to be a BLOB containing all zero ** bytes and N bytes in size, where N is the value of the 2nd parameter. ** -** The sqlite3_result_double() interface sets the result from +** ^The sqlite3_result_double() interface sets the result from ** an application-defined function to be a floating point value specified ** by its 2nd argument. ** -** The sqlite3_result_error() and sqlite3_result_error16() functions +** ^The sqlite3_result_error() and sqlite3_result_error16() functions ** cause the implemented SQL function to throw an exception. -** SQLite uses the string pointed to by the +** ^SQLite uses the string pointed to by the ** 2nd parameter of sqlite3_result_error() or sqlite3_result_error16() -** as the text of an error message. SQLite interprets the error -** message string from sqlite3_result_error() as UTF-8. SQLite +** as the text of an error message. ^SQLite interprets the error +** message string from sqlite3_result_error() as UTF-8. ^SQLite ** interprets the string from sqlite3_result_error16() as UTF-16 in native -** byte order. If the third parameter to sqlite3_result_error() +** byte order. ^If the third parameter to sqlite3_result_error() ** or sqlite3_result_error16() is negative then SQLite takes as the error ** message all text up through the first zero character. -** If the third parameter to sqlite3_result_error() or +** ^If the third parameter to sqlite3_result_error() or ** sqlite3_result_error16() is non-negative then SQLite takes that many ** bytes (not characters) from the 2nd parameter as the error message. -** The sqlite3_result_error() and sqlite3_result_error16() +** ^The sqlite3_result_error() and sqlite3_result_error16() ** routines make a private copy of the error message text before ** they return. Hence, the calling function can deallocate or ** modify the text after they return without harm. -** The sqlite3_result_error_code() function changes the error code -** returned by SQLite as a result of an error in a function. By default, -** the error code is SQLITE_ERROR. A subsequent call to sqlite3_result_error() +** ^The sqlite3_result_error_code() function changes the error code +** returned by SQLite as a result of an error in a function. ^By default, +** the error code is SQLITE_ERROR. ^A subsequent call to sqlite3_result_error() ** or sqlite3_result_error16() resets the error code to SQLITE_ERROR. ** -** The sqlite3_result_toobig() interface causes SQLite to throw an error -** indicating that a string or BLOB is to long to represent. +** ^The sqlite3_result_toobig() interface causes SQLite to throw an error +** indicating that a string or BLOB is too long to represent. ** -** The sqlite3_result_nomem() interface causes SQLite to throw an error +** ^The sqlite3_result_nomem() interface causes SQLite to throw an error ** indicating that a memory allocation failed. ** -** The sqlite3_result_int() interface sets the return value +** ^The sqlite3_result_int() interface sets the return value ** of the application-defined function to be the 32-bit signed integer ** value given in the 2nd argument. -** The sqlite3_result_int64() interface sets the return value +** ^The sqlite3_result_int64() interface sets the return value ** of the application-defined function to be the 64-bit signed integer ** value given in the 2nd argument. ** -** The sqlite3_result_null() interface sets the return value +** ^The sqlite3_result_null() interface sets the return value ** of the application-defined function to be NULL. ** -** The sqlite3_result_text(), sqlite3_result_text16(), +** ^The sqlite3_result_text(), sqlite3_result_text16(), ** sqlite3_result_text16le(), and sqlite3_result_text16be() interfaces ** set the return value of the application-defined function to be ** a text string which is represented as UTF-8, UTF-16 native byte order, ** UTF-16 little endian, or UTF-16 big endian, respectively. -** SQLite takes the text result from the application from +** ^SQLite takes the text result from the application from ** the 2nd parameter of the sqlite3_result_text* interfaces. -** If the 3rd parameter to the sqlite3_result_text* interfaces +** ^If the 3rd parameter to the sqlite3_result_text* interfaces ** is negative, then SQLite takes result text from the 2nd parameter ** through the first zero character. -** If the 3rd parameter to the sqlite3_result_text* interfaces +** ^If the 3rd parameter to the sqlite3_result_text* interfaces ** is non-negative, then as many bytes (not characters) of the text ** pointed to by the 2nd parameter are taken as the application-defined ** function result. -** If the 4th parameter to the sqlite3_result_text* interfaces +** ^If the 4th parameter to the sqlite3_result_text* interfaces ** or sqlite3_result_blob is a non-NULL pointer, then SQLite calls that ** function as the destructor on the text or BLOB result when it has ** finished using that result. -** If the 4th parameter to the sqlite3_result_text* interfaces or to +** ^If the 4th parameter to the sqlite3_result_text* interfaces or to ** sqlite3_result_blob is the special constant SQLITE_STATIC, then SQLite ** assumes that the text or BLOB result is in constant space and does not ** copy the content of the parameter nor call a destructor on the content ** when it has finished using that result. -** If the 4th parameter to the sqlite3_result_text* interfaces +** ^If the 4th parameter to the sqlite3_result_text* interfaces ** or sqlite3_result_blob is the special constant SQLITE_TRANSIENT ** then SQLite makes a copy of the result into space obtained from ** from [sqlite3_malloc()] before it returns. ** -** The sqlite3_result_value() interface sets the result of +** ^The sqlite3_result_value() interface sets the result of ** the application-defined function to be a copy the -** [unprotected sqlite3_value] object specified by the 2nd parameter. The +** [unprotected sqlite3_value] object specified by the 2nd parameter. ^The ** sqlite3_result_value() interface makes a copy of the [sqlite3_value] ** so that the [sqlite3_value] specified in the parameter may change or ** be deallocated after sqlite3_result_value() returns without harm. -** A [protected sqlite3_value] object may always be used where an +** ^A [protected sqlite3_value] object may always be used where an ** [unprotected sqlite3_value] object is required, so either ** kind of [sqlite3_value] object can be used with this interface. ** ** If these routines are called from within the different thread ** than the one containing the application-defined function that received ** the [sqlite3_context] pointer, the results are undefined. -** -** Requirements: -** [H16403] [H16406] [H16409] [H16412] [H16415] [H16418] [H16421] [H16424] -** [H16427] [H16430] [H16433] [H16436] [H16439] [H16442] [H16445] [H16448] -** [H16451] [H16454] [H16457] [H16460] [H16463] */ SQLITE_API void sqlite3_result_blob(sqlite3_context*, const void*, int, void(*)(void*)); SQLITE_API void sqlite3_result_double(sqlite3_context*, double); @@ -3605,20 +3556,20 @@ SQLITE_API void sqlite3_result_value(sqlite3_context*, sqlite3_value*); SQLITE_API void sqlite3_result_zeroblob(sqlite3_context*, int n); /* -** CAPI3REF: Define New Collating Sequences {H16600} +** CAPI3REF: Define New Collating Sequences ** ** These functions are used to add new collation sequences to the ** [database connection] specified as the first argument. ** -** The name of the new collation sequence is specified as a UTF-8 string +** ^The name of the new collation sequence is specified as a UTF-8 string ** for sqlite3_create_collation() and sqlite3_create_collation_v2() -** and a UTF-16 string for sqlite3_create_collation16(). In all cases +** and a UTF-16 string for sqlite3_create_collation16(). ^In all cases ** the name is passed as the second function argument. ** -** The third argument may be one of the constants [SQLITE_UTF8], +** ^The third argument may be one of the constants [SQLITE_UTF8], ** [SQLITE_UTF16LE], or [SQLITE_UTF16BE], indicating that the user-supplied ** routine expects to be passed pointers to strings encoded using UTF-8, -** UTF-16 little-endian, or UTF-16 big-endian, respectively. The +** UTF-16 little-endian, or UTF-16 big-endian, respectively. ^The ** third argument might also be [SQLITE_UTF16] to indicate that the routine ** expects pointers to be UTF-16 strings in the native byte order, or the ** argument can be [SQLITE_UTF16_ALIGNED] if the @@ -3626,33 +3577,29 @@ SQLITE_API void sqlite3_result_zeroblob(sqlite3_context*, int n); ** of UTF-16 in the native byte order. ** ** A pointer to the user supplied routine must be passed as the fifth -** argument. If it is NULL, this is the same as deleting the collation +** argument. ^If it is NULL, this is the same as deleting the collation ** sequence (so that SQLite cannot call it anymore). -** Each time the application supplied function is invoked, it is passed +** ^Each time the application supplied function is invoked, it is passed ** as its first parameter a copy of the void* passed as the fourth argument ** to sqlite3_create_collation() or sqlite3_create_collation16(). ** -** The remaining arguments to the application-supplied routine are two strings, +** ^The remaining arguments to the application-supplied routine are two strings, ** each represented by a (length, data) pair and encoded in the encoding ** that was passed as the third argument when the collation sequence was -** registered. {END} The application defined collation routine should +** registered. The application defined collation routine should ** return negative, zero or positive if the first string is less than, ** equal to, or greater than the second string. i.e. (STRING1 - STRING2). ** -** The sqlite3_create_collation_v2() works like sqlite3_create_collation() +** ^The sqlite3_create_collation_v2() works like sqlite3_create_collation() ** except that it takes an extra argument which is a destructor for -** the collation. The destructor is called when the collation is +** the collation. ^The destructor is called when the collation is ** destroyed and is passed a copy of the fourth parameter void* pointer ** of the sqlite3_create_collation_v2(). -** Collations are destroyed when they are overridden by later calls to the +** ^Collations are destroyed when they are overridden by later calls to the ** collation creation functions or when the [database connection] is closed ** using [sqlite3_close()]. ** ** See also: [sqlite3_collation_needed()] and [sqlite3_collation_needed16()]. -** -** Requirements: -** [H16603] [H16604] [H16606] [H16609] [H16612] [H16615] [H16618] [H16621] -** [H16624] [H16627] [H16630] */ SQLITE_API int sqlite3_create_collation( sqlite3*, @@ -3678,33 +3625,30 @@ SQLITE_API int sqlite3_create_collation16( ); /* -** CAPI3REF: Collation Needed Callbacks {H16700} +** CAPI3REF: Collation Needed Callbacks ** -** To avoid having to register all collation sequences before a database +** ^To avoid having to register all collation sequences before a database ** can be used, a single callback function may be registered with the -** [database connection] to be called whenever an undefined collation +** [database connection] to be invoked whenever an undefined collation ** sequence is required. ** -** If the function is registered using the sqlite3_collation_needed() API, +** ^If the function is registered using the sqlite3_collation_needed() API, ** then it is passed the names of undefined collation sequences as strings -** encoded in UTF-8. {H16703} If sqlite3_collation_needed16() is used, +** encoded in UTF-8. ^If sqlite3_collation_needed16() is used, ** the names are passed as UTF-16 in machine native byte order. -** A call to either function replaces any existing callback. +** ^A call to either function replaces the existing collation-needed callback. ** -** When the callback is invoked, the first argument passed is a copy +** ^(When the callback is invoked, the first argument passed is a copy ** of the second argument to sqlite3_collation_needed() or ** sqlite3_collation_needed16(). The second argument is the database ** connection. The third argument is one of [SQLITE_UTF8], [SQLITE_UTF16BE], ** or [SQLITE_UTF16LE], indicating the most desirable form of the collation ** sequence function required. The fourth parameter is the name of the -** required collation sequence. +** required collation sequence.)^ ** ** The callback function should register the desired collation using ** [sqlite3_create_collation()], [sqlite3_create_collation16()], or ** [sqlite3_create_collation_v2()]. -** -** Requirements: -** [H16702] [H16704] [H16706] */ SQLITE_API int sqlite3_collation_needed( sqlite3*, @@ -3743,29 +3687,28 @@ SQLITE_API int sqlite3_rekey( ); /* -** CAPI3REF: Suspend Execution For A Short Time {H10530} +** CAPI3REF: Suspend Execution For A Short Time ** -** The sqlite3_sleep() function causes the current thread to suspend execution +** ^The sqlite3_sleep() function causes the current thread to suspend execution ** for at least a number of milliseconds specified in its parameter. ** -** If the operating system does not support sleep requests with +** ^If the operating system does not support sleep requests with ** millisecond time resolution, then the time will be rounded up to -** the nearest second. The number of milliseconds of sleep actually +** the nearest second. ^The number of milliseconds of sleep actually ** requested from the operating system is returned. ** -** SQLite implements this interface by calling the xSleep() +** ^SQLite implements this interface by calling the xSleep() ** method of the default [sqlite3_vfs] object. -** -** Requirements: [H10533] [H10536] */ SQLITE_API int sqlite3_sleep(int); /* -** CAPI3REF: Name Of The Folder Holding Temporary Files {H10310} +** CAPI3REF: Name Of The Folder Holding Temporary Files ** -** If this global variable is made to point to a string which is +** ^(If this global variable is made to point to a string which is ** the name of a folder (a.k.a. directory), then all temporary files -** created by SQLite will be placed in that directory. If this variable +** created by SQLite when using a built-in [sqlite3_vfs | VFS] +** will be placed in that directory.)^ ^If this variable ** is a NULL pointer, then SQLite performs a search for an appropriate ** temporary file directory. ** @@ -3778,8 +3721,8 @@ SQLITE_API int sqlite3_sleep(int); ** routines have been called and that this variable remain unchanged ** thereafter. ** -** The [temp_store_directory pragma] may modify this variable and cause -** it to point to memory obtained from [sqlite3_malloc]. Furthermore, +** ^The [temp_store_directory pragma] may modify this variable and cause +** it to point to memory obtained from [sqlite3_malloc]. ^Furthermore, ** the [temp_store_directory pragma] always assumes that any string ** that this variable points to is held in memory obtained from ** [sqlite3_malloc] and the pragma may attempt to free that memory @@ -3791,14 +3734,14 @@ SQLITE_API int sqlite3_sleep(int); SQLITE_API SQLITE_EXTERN char *sqlite3_temp_directory; /* -** CAPI3REF: Test For Auto-Commit Mode {H12930} +** CAPI3REF: Test For Auto-Commit Mode ** KEYWORDS: {autocommit mode} ** -** The sqlite3_get_autocommit() interface returns non-zero or +** ^The sqlite3_get_autocommit() interface returns non-zero or ** zero if the given database connection is or is not in autocommit mode, -** respectively. Autocommit mode is on by default. -** Autocommit mode is disabled by a [BEGIN] statement. -** Autocommit mode is re-enabled by a [COMMIT] or [ROLLBACK]. +** respectively. ^Autocommit mode is on by default. +** ^Autocommit mode is disabled by a [BEGIN] statement. +** ^Autocommit mode is re-enabled by a [COMMIT] or [ROLLBACK]. ** ** If certain kinds of errors occur on a statement within a multi-statement ** transaction (errors including [SQLITE_FULL], [SQLITE_IOERR], @@ -3810,58 +3753,55 @@ SQLITE_API SQLITE_EXTERN char *sqlite3_temp_directory; ** If another thread changes the autocommit status of the database ** connection while this routine is running, then the return value ** is undefined. -** -** Requirements: [H12931] [H12932] [H12933] [H12934] */ SQLITE_API int sqlite3_get_autocommit(sqlite3*); /* -** CAPI3REF: Find The Database Handle Of A Prepared Statement {H13120} +** CAPI3REF: Find The Database Handle Of A Prepared Statement ** -** The sqlite3_db_handle interface returns the [database connection] handle -** to which a [prepared statement] belongs. The [database connection] -** returned by sqlite3_db_handle is the same [database connection] that was the first argument +** ^The sqlite3_db_handle interface returns the [database connection] handle +** to which a [prepared statement] belongs. ^The [database connection] +** returned by sqlite3_db_handle is the same [database connection] +** that was the first argument ** to the [sqlite3_prepare_v2()] call (or its variants) that was used to ** create the statement in the first place. -** -** Requirements: [H13123] */ SQLITE_API sqlite3 *sqlite3_db_handle(sqlite3_stmt*); /* -** CAPI3REF: Find the next prepared statement {H13140} +** CAPI3REF: Find the next prepared statement ** -** This interface returns a pointer to the next [prepared statement] after -** pStmt associated with the [database connection] pDb. If pStmt is NULL +** ^This interface returns a pointer to the next [prepared statement] after +** pStmt associated with the [database connection] pDb. ^If pStmt is NULL ** then this interface returns a pointer to the first prepared statement -** associated with the database connection pDb. If no prepared statement +** associated with the database connection pDb. ^If no prepared statement ** satisfies the conditions of this routine, it returns NULL. ** ** The [database connection] pointer D in a call to ** [sqlite3_next_stmt(D,S)] must refer to an open database ** connection and in particular must not be a NULL pointer. -** -** Requirements: [H13143] [H13146] [H13149] [H13152] */ SQLITE_API sqlite3_stmt *sqlite3_next_stmt(sqlite3 *pDb, sqlite3_stmt *pStmt); /* -** CAPI3REF: Commit And Rollback Notification Callbacks {H12950} +** CAPI3REF: Commit And Rollback Notification Callbacks ** -** The sqlite3_commit_hook() interface registers a callback +** ^The sqlite3_commit_hook() interface registers a callback ** function to be invoked whenever a transaction is [COMMIT | committed]. -** Any callback set by a previous call to sqlite3_commit_hook() +** ^Any callback set by a previous call to sqlite3_commit_hook() ** for the same database connection is overridden. -** The sqlite3_rollback_hook() interface registers a callback +** ^The sqlite3_rollback_hook() interface registers a callback ** function to be invoked whenever a transaction is [ROLLBACK | rolled back]. -** Any callback set by a previous call to sqlite3_commit_hook() +** ^Any callback set by a previous call to sqlite3_rollback_hook() ** for the same database connection is overridden. -** The pArg argument is passed through to the callback. -** If the callback on a commit hook function returns non-zero, +** ^The pArg argument is passed through to the callback. +** ^If the callback on a commit hook function returns non-zero, ** then the commit is converted into a rollback. ** -** If another function was previously registered, its -** pArg value is returned. Otherwise NULL is returned. +** ^The sqlite3_commit_hook(D,C,P) and sqlite3_rollback_hook(D,C,P) functions +** return the P argument from the previous call of the same function +** on the same [database connection] D, or NULL for +** the first call for each function on D. ** ** The callback implementation must not do anything that will modify ** the database connection that invoked the callback. Any actions @@ -3871,59 +3811,54 @@ SQLITE_API sqlite3_stmt *sqlite3_next_stmt(sqlite3 *pDb, sqlite3_stmt *pStmt); ** Note that [sqlite3_prepare_v2()] and [sqlite3_step()] both modify their ** database connections for the meaning of "modify" in this paragraph. ** -** Registering a NULL function disables the callback. +** ^Registering a NULL function disables the callback. ** -** When the commit hook callback routine returns zero, the [COMMIT] -** operation is allowed to continue normally. If the commit hook +** ^When the commit hook callback routine returns zero, the [COMMIT] +** operation is allowed to continue normally. ^If the commit hook ** returns non-zero, then the [COMMIT] is converted into a [ROLLBACK]. -** The rollback hook is invoked on a rollback that results from a commit +** ^The rollback hook is invoked on a rollback that results from a commit ** hook returning non-zero, just as it would be with any other rollback. ** -** For the purposes of this API, a transaction is said to have been +** ^For the purposes of this API, a transaction is said to have been ** rolled back if an explicit "ROLLBACK" statement is executed, or ** an error or constraint causes an implicit rollback to occur. -** The rollback callback is not invoked if a transaction is +** ^The rollback callback is not invoked if a transaction is ** automatically rolled back because the database connection is closed. -** The rollback callback is not invoked if a transaction is +** ^The rollback callback is not invoked if a transaction is ** rolled back because a commit callback returned non-zero. -** Check on this ** ** See also the [sqlite3_update_hook()] interface. -** -** Requirements: -** [H12951] [H12952] [H12953] [H12954] [H12955] -** [H12961] [H12962] [H12963] [H12964] */ SQLITE_API void *sqlite3_commit_hook(sqlite3*, int(*)(void*), void*); SQLITE_API void *sqlite3_rollback_hook(sqlite3*, void(*)(void *), void*); /* -** CAPI3REF: Data Change Notification Callbacks {H12970} +** CAPI3REF: Data Change Notification Callbacks ** -** The sqlite3_update_hook() interface registers a callback function +** ^The sqlite3_update_hook() interface registers a callback function ** with the [database connection] identified by the first argument ** to be invoked whenever a row is updated, inserted or deleted. -** Any callback set by a previous call to this function +** ^Any callback set by a previous call to this function ** for the same database connection is overridden. ** -** The second argument is a pointer to the function to invoke when a +** ^The second argument is a pointer to the function to invoke when a ** row is updated, inserted or deleted. -** The first argument to the callback is a copy of the third argument +** ^The first argument to the callback is a copy of the third argument ** to sqlite3_update_hook(). -** The second callback argument is one of [SQLITE_INSERT], [SQLITE_DELETE], +** ^The second callback argument is one of [SQLITE_INSERT], [SQLITE_DELETE], ** or [SQLITE_UPDATE], depending on the operation that caused the callback ** to be invoked. -** The third and fourth arguments to the callback contain pointers to the +** ^The third and fourth arguments to the callback contain pointers to the ** database and table name containing the affected row. -** The final callback parameter is the [rowid] of the row. -** In the case of an update, this is the [rowid] after the update takes place. +** ^The final callback parameter is the [rowid] of the row. +** ^In the case of an update, this is the [rowid] after the update takes place. ** -** The update hook is not invoked when internal system tables are -** modified (i.e. sqlite_master and sqlite_sequence). +** ^(The update hook is not invoked when internal system tables are +** modified (i.e. sqlite_master and sqlite_sequence).)^ ** -** In the current implementation, the update hook +** ^In the current implementation, the update hook ** is not invoked when duplication rows are deleted because of an -** [ON CONFLICT | ON CONFLICT REPLACE] clause. Nor is the update hook +** [ON CONFLICT | ON CONFLICT REPLACE] clause. ^Nor is the update hook ** invoked when rows are deleted using the [truncate optimization]. ** The exceptions defined in this paragraph might change in a future ** release of SQLite. @@ -3935,14 +3870,13 @@ SQLITE_API void *sqlite3_rollback_hook(sqlite3*, void(*)(void *), void*); ** Note that [sqlite3_prepare_v2()] and [sqlite3_step()] both modify their ** database connections for the meaning of "modify" in this paragraph. ** -** If another function was previously registered, its pArg value -** is returned. Otherwise NULL is returned. +** ^The sqlite3_update_hook(D,C,P) function +** returns the P argument from the previous call +** on the same [database connection] D, or NULL for +** the first call on D. ** ** See also the [sqlite3_commit_hook()] and [sqlite3_rollback_hook()] ** interfaces. -** -** Requirements: -** [H12971] [H12973] [H12975] [H12977] [H12979] [H12981] [H12983] [H12986] */ SQLITE_API void *sqlite3_update_hook( sqlite3*, @@ -3951,74 +3885,66 @@ SQLITE_API void *sqlite3_update_hook( ); /* -** CAPI3REF: Enable Or Disable Shared Pager Cache {H10330} +** CAPI3REF: Enable Or Disable Shared Pager Cache ** KEYWORDS: {shared cache} ** -** This routine enables or disables the sharing of the database cache +** ^(This routine enables or disables the sharing of the database cache ** and schema data structures between [database connection | connections] ** to the same database. Sharing is enabled if the argument is true -** and disabled if the argument is false. +** and disabled if the argument is false.)^ ** -** Cache sharing is enabled and disabled for an entire process. +** ^Cache sharing is enabled and disabled for an entire process. ** This is a change as of SQLite version 3.5.0. In prior versions of SQLite, ** sharing was enabled or disabled for each thread separately. ** -** The cache sharing mode set by this interface effects all subsequent +** ^(The cache sharing mode set by this interface effects all subsequent ** calls to [sqlite3_open()], [sqlite3_open_v2()], and [sqlite3_open16()]. ** Existing database connections continue use the sharing mode -** that was in effect at the time they were opened. +** that was in effect at the time they were opened.)^ ** -** Virtual tables cannot be used with a shared cache. When shared -** cache is enabled, the [sqlite3_create_module()] API used to register -** virtual tables will always return an error. +** ^(This routine returns [SQLITE_OK] if shared cache was enabled or disabled +** successfully. An [error code] is returned otherwise.)^ ** -** This routine returns [SQLITE_OK] if shared cache was enabled or disabled -** successfully. An [error code] is returned otherwise. -** -** Shared cache is disabled by default. But this might change in +** ^Shared cache is disabled by default. But this might change in ** future releases of SQLite. Applications that care about shared ** cache setting should set it explicitly. ** ** See Also: [SQLite Shared-Cache Mode] -** -** Requirements: [H10331] [H10336] [H10337] [H10339] */ SQLITE_API int sqlite3_enable_shared_cache(int); /* -** CAPI3REF: Attempt To Free Heap Memory {H17340} +** CAPI3REF: Attempt To Free Heap Memory ** -** The sqlite3_release_memory() interface attempts to free N bytes +** ^The sqlite3_release_memory() interface attempts to free N bytes ** of heap memory by deallocating non-essential memory allocations -** held by the database library. {END} Memory used to cache database +** held by the database library. Memory used to cache database ** pages to improve performance is an example of non-essential memory. -** sqlite3_release_memory() returns the number of bytes actually freed, +** ^sqlite3_release_memory() returns the number of bytes actually freed, ** which might be more or less than the amount requested. -** -** Requirements: [H17341] [H17342] */ SQLITE_API int sqlite3_release_memory(int); /* -** CAPI3REF: Impose A Limit On Heap Size {H17350} +** CAPI3REF: Impose A Limit On Heap Size ** -** The sqlite3_soft_heap_limit() interface places a "soft" limit +** ^The sqlite3_soft_heap_limit() interface places a "soft" limit ** on the amount of heap memory that may be allocated by SQLite. -** If an internal allocation is requested that would exceed the +** ^If an internal allocation is requested that would exceed the ** soft heap limit, [sqlite3_release_memory()] is invoked one or ** more times to free up some space before the allocation is performed. ** -** The limit is called "soft", because if [sqlite3_release_memory()] +** ^The limit is called "soft" because if [sqlite3_release_memory()] ** cannot free sufficient memory to prevent the limit from being exceeded, ** the memory is allocated anyway and the current operation proceeds. ** -** A negative or zero value for N means that there is no soft heap limit and +** ^A negative or zero value for N means that there is no soft heap limit and ** [sqlite3_release_memory()] will only be called when memory is exhausted. -** The default value for the soft heap limit is zero. +** ^The default value for the soft heap limit is zero. ** -** SQLite makes a best effort to honor the soft heap limit. +** ^(SQLite makes a best effort to honor the soft heap limit. ** But if the soft heap limit cannot be honored, execution will -** continue without error or notification. This is why the limit is +** continue without error or notification.)^ This is why the limit is ** called a "soft" limit. It is advisory only. ** ** Prior to SQLite version 3.5.0, this routine only constrained the memory @@ -4028,35 +3954,32 @@ SQLITE_API int sqlite3_release_memory(int); ** is an upper bound on the total memory allocation for all threads. In ** version 3.5.0 there is no mechanism for limiting the heap usage for ** individual threads. -** -** Requirements: -** [H16351] [H16352] [H16353] [H16354] [H16355] [H16358] */ SQLITE_API void sqlite3_soft_heap_limit(int); /* -** CAPI3REF: Extract Metadata About A Column Of A Table {H12850} +** CAPI3REF: Extract Metadata About A Column Of A Table ** -** This routine returns metadata about a specific column of a specific +** ^This routine returns metadata about a specific column of a specific ** database table accessible using the [database connection] handle ** passed as the first function argument. ** -** The column is identified by the second, third and fourth parameters to -** this function. The second parameter is either the name of the database -** (i.e. "main", "temp" or an attached database) containing the specified -** table or NULL. If it is NULL, then all attached databases are searched +** ^The column is identified by the second, third and fourth parameters to +** this function. ^The second parameter is either the name of the database +** (i.e. "main", "temp", or an attached database) containing the specified +** table or NULL. ^If it is NULL, then all attached databases are searched ** for the table using the same algorithm used by the database engine to ** resolve unqualified table references. ** -** The third and fourth parameters to this function are the table and column +** ^The third and fourth parameters to this function are the table and column ** name of the desired column, respectively. Neither of these parameters ** may be NULL. ** -** Metadata is returned by writing to the memory locations passed as the 5th -** and subsequent parameters to this function. Any of these arguments may be +** ^Metadata is returned by writing to the memory locations passed as the 5th +** and subsequent parameters to this function. ^Any of these arguments may be ** NULL, in which case the corresponding element of metadata is omitted. ** -**
    +** ^(
    ** **
    Parameter Output
    Type
    Description ** @@ -4066,17 +3989,17 @@ SQLITE_API void sqlite3_soft_heap_limit(int); **
    8th int True if column is part of the PRIMARY KEY **
    9th int True if column is [AUTOINCREMENT] **
    -**
    +**
    )^ ** -** The memory pointed to by the character pointers returned for the +** ^The memory pointed to by the character pointers returned for the ** declaration type and collation sequence is valid only until the next ** call to any SQLite API function. ** -** If the specified table is actually a view, an [error code] is returned. +** ^If the specified table is actually a view, an [error code] is returned. ** -** If the specified column is "rowid", "oid" or "_rowid_" and an +** ^If the specified column is "rowid", "oid" or "_rowid_" and an ** [INTEGER PRIMARY KEY] column has been explicitly declared, then the output -** parameters are set for the explicitly declared column. If there is no +** parameters are set for the explicitly declared column. ^(If there is no ** explicitly declared [INTEGER PRIMARY KEY] column, then the output ** parameters are set as follows: ** @@ -4086,14 +4009,14 @@ SQLITE_API void sqlite3_soft_heap_limit(int); ** not null: 0 ** primary key: 1 ** auto increment: 0 -** +** )^ ** -** This function may load one or more schemas from database files. If an +** ^(This function may load one or more schemas from database files. If an ** error occurs during this process, or if the requested table or column ** cannot be found, an [error code] is returned and an error message left -** in the [database connection] (to be retrieved using sqlite3_errmsg()). +** in the [database connection] (to be retrieved using sqlite3_errmsg()).)^ ** -** This API is only available if the library was compiled with the +** ^This API is only available if the library was compiled with the ** [SQLITE_ENABLE_COLUMN_METADATA] C-preprocessor symbol defined. */ SQLITE_API int sqlite3_table_column_metadata( @@ -4109,30 +4032,29 @@ SQLITE_API int sqlite3_table_column_metadata( ); /* -** CAPI3REF: Load An Extension {H12600} +** CAPI3REF: Load An Extension ** -** This interface loads an SQLite extension library from the named file. +** ^This interface loads an SQLite extension library from the named file. ** -** {H12601} The sqlite3_load_extension() interface attempts to load an -** SQLite extension library contained in the file zFile. +** ^The sqlite3_load_extension() interface attempts to load an +** SQLite extension library contained in the file zFile. ** -** {H12602} The entry point is zProc. +** ^The entry point is zProc. +** ^zProc may be 0, in which case the name of the entry point +** defaults to "sqlite3_extension_init". +** ^The sqlite3_load_extension() interface returns +** [SQLITE_OK] on success and [SQLITE_ERROR] if something goes wrong. +** ^If an error occurs and pzErrMsg is not 0, then the +** [sqlite3_load_extension()] interface shall attempt to +** fill *pzErrMsg with error message text stored in memory +** obtained from [sqlite3_malloc()]. The calling function +** should free this memory by calling [sqlite3_free()]. ** -** {H12603} zProc may be 0, in which case the name of the entry point -** defaults to "sqlite3_extension_init". +** ^Extension loading must be enabled using +** [sqlite3_enable_load_extension()] prior to calling this API, +** otherwise an error will be returned. ** -** {H12604} The sqlite3_load_extension() interface shall return -** [SQLITE_OK] on success and [SQLITE_ERROR] if something goes wrong. -** -** {H12605} If an error occurs and pzErrMsg is not 0, then the -** [sqlite3_load_extension()] interface shall attempt to -** fill *pzErrMsg with error message text stored in memory -** obtained from [sqlite3_malloc()]. {END} The calling function -** should free this memory by calling [sqlite3_free()]. -** -** {H12606} Extension loading must be enabled using -** [sqlite3_enable_load_extension()] prior to calling this API, -** otherwise an error will be returned. +** See also the [load_extension() SQL function]. */ SQLITE_API int sqlite3_load_extension( sqlite3 *db, /* Load the extension into this database connection */ @@ -4142,61 +4064,49 @@ SQLITE_API int sqlite3_load_extension( ); /* -** CAPI3REF: Enable Or Disable Extension Loading {H12620} +** CAPI3REF: Enable Or Disable Extension Loading ** -** So as not to open security holes in older applications that are +** ^So as not to open security holes in older applications that are ** unprepared to deal with extension loading, and as a means of disabling ** extension loading while evaluating user-entered SQL, the following API ** is provided to turn the [sqlite3_load_extension()] mechanism on and off. ** -** Extension loading is off by default. See ticket #1863. -** -** {H12621} Call the sqlite3_enable_load_extension() routine with onoff==1 -** to turn extension loading on and call it with onoff==0 to turn -** it back off again. -** -** {H12622} Extension loading is off by default. +** ^Extension loading is off by default. See ticket #1863. +** ^Call the sqlite3_enable_load_extension() routine with onoff==1 +** to turn extension loading on and call it with onoff==0 to turn +** it back off again. */ SQLITE_API int sqlite3_enable_load_extension(sqlite3 *db, int onoff); /* -** CAPI3REF: Automatically Load An Extensions {H12640} +** CAPI3REF: Automatically Load An Extensions ** -** This API can be invoked at program startup in order to register +** ^This API can be invoked at program startup in order to register ** one or more statically linked extensions that will be available -** to all new [database connections]. {END} +** to all new [database connections]. ** -** This routine stores a pointer to the extension in an array that is -** obtained from [sqlite3_malloc()]. If you run a memory leak checker -** on your program and it reports a leak because of this array, invoke -** [sqlite3_reset_auto_extension()] prior to shutdown to free the memory. +** ^(This routine stores a pointer to the extension entry point +** in an array that is obtained from [sqlite3_malloc()]. That memory +** is deallocated by [sqlite3_reset_auto_extension()].)^ ** -** {H12641} This function registers an extension entry point that is -** automatically invoked whenever a new [database connection] -** is opened using [sqlite3_open()], [sqlite3_open16()], -** or [sqlite3_open_v2()]. -** -** {H12642} Duplicate extensions are detected so calling this routine -** multiple times with the same extension is harmless. -** -** {H12643} This routine stores a pointer to the extension in an array -** that is obtained from [sqlite3_malloc()]. -** -** {H12644} Automatic extensions apply across all threads. +** ^This function registers an extension entry point that is +** automatically invoked whenever a new [database connection] +** is opened using [sqlite3_open()], [sqlite3_open16()], +** or [sqlite3_open_v2()]. +** ^Duplicate extensions are detected so calling this routine +** multiple times with the same extension is harmless. +** ^Automatic extensions apply across all threads. */ SQLITE_API int sqlite3_auto_extension(void (*xEntryPoint)(void)); /* -** CAPI3REF: Reset Automatic Extension Loading {H12660} -** -** This function disables all previously registered automatic -** extensions. {END} It undoes the effect of all prior -** [sqlite3_auto_extension()] calls. +** CAPI3REF: Reset Automatic Extension Loading ** -** {H12661} This function disables all previously registered -** automatic extensions. +** ^(This function disables all previously registered automatic +** extensions. It undoes the effect of all prior +** [sqlite3_auto_extension()] calls.)^ ** -** {H12662} This function disables automatic extensions in all threads. +** ^This function disables automatic extensions in all threads. */ SQLITE_API void sqlite3_reset_auto_extension(void); @@ -4220,7 +4130,7 @@ typedef struct sqlite3_vtab_cursor sqlite3_vtab_cursor; typedef struct sqlite3_module sqlite3_module; /* -** CAPI3REF: Virtual Table Object {H18000} +** CAPI3REF: Virtual Table Object ** KEYWORDS: sqlite3_module {virtual table module} ** EXPERIMENTAL ** @@ -4228,10 +4138,10 @@ typedef struct sqlite3_module sqlite3_module; ** defines the implementation of a [virtual tables]. ** This structure consists mostly of methods for the module. ** -** A virtual table module is created by filling in a persistent +** ^A virtual table module is created by filling in a persistent ** instance of this structure and passing a pointer to that instance ** to [sqlite3_create_module()] or [sqlite3_create_module_v2()]. -** The registration remains valid until it is replaced by a different +** ^The registration remains valid until it is replaced by a different ** module or until the [database connection] closes. The content ** of this structure must not change while it is registered with ** any database connection. @@ -4267,7 +4177,7 @@ struct sqlite3_module { }; /* -** CAPI3REF: Virtual Table Indexing Information {H18100} +** CAPI3REF: Virtual Table Indexing Information ** KEYWORDS: sqlite3_index_info ** EXPERIMENTAL ** @@ -4277,42 +4187,42 @@ struct sqlite3_module { ** inputs to xBestIndex and are read-only. xBestIndex inserts its ** results into the **Outputs** fields. ** -** The aConstraint[] array records WHERE clause constraints of the form: +** ^(The aConstraint[] array records WHERE clause constraints of the form: ** **
    column OP expr
    ** -** where OP is =, <, <=, >, or >=. The particular operator is -** stored in aConstraint[].op. The index of the column is stored in -** aConstraint[].iColumn. aConstraint[].usable is TRUE if the +** where OP is =, <, <=, >, or >=.)^ ^(The particular operator is +** stored in aConstraint[].op.)^ ^(The index of the column is stored in +** aConstraint[].iColumn.)^ ^(aConstraint[].usable is TRUE if the ** expr on the right-hand side can be evaluated (and thus the constraint -** is usable) and false if it cannot. +** is usable) and false if it cannot.)^ ** -** The optimizer automatically inverts terms of the form "expr OP column" +** ^The optimizer automatically inverts terms of the form "expr OP column" ** and makes other simplifications to the WHERE clause in an attempt to ** get as many WHERE clause terms into the form shown above as possible. -** The aConstraint[] array only reports WHERE clause terms in the correct -** form that refer to the particular virtual table being queried. +** ^The aConstraint[] array only reports WHERE clause terms that are +** relevant to the particular virtual table being queried. ** -** Information about the ORDER BY clause is stored in aOrderBy[]. -** Each term of aOrderBy records a column of the ORDER BY clause. +** ^Information about the ORDER BY clause is stored in aOrderBy[]. +** ^Each term of aOrderBy records a column of the ORDER BY clause. ** ** The [xBestIndex] method must fill aConstraintUsage[] with information -** about what parameters to pass to xFilter. If argvIndex>0 then +** about what parameters to pass to xFilter. ^If argvIndex>0 then ** the right-hand side of the corresponding aConstraint[] is evaluated -** and becomes the argvIndex-th entry in argv. If aConstraintUsage[].omit +** and becomes the argvIndex-th entry in argv. ^(If aConstraintUsage[].omit ** is true, then the constraint is assumed to be fully handled by the -** virtual table and is not checked again by SQLite. +** virtual table and is not checked again by SQLite.)^ ** -** The idxNum and idxPtr values are recorded and passed into the +** ^The idxNum and idxPtr values are recorded and passed into the ** [xFilter] method. -** [sqlite3_free()] is used to free idxPtr if and only iff +** ^[sqlite3_free()] is used to free idxPtr if and only if ** needToFreeIdxPtr is true. ** -** The orderByConsumed means that output from [xFilter]/[xNext] will occur in +** ^The orderByConsumed means that output from [xFilter]/[xNext] will occur in ** the correct order to satisfy the ORDER BY clause so that no separate ** sorting step is required. ** -** The estimatedCost value is an estimate of the cost of doing the +** ^The estimatedCost value is an estimate of the cost of doing the ** particular lookup. A full scan of a table with N entries should have ** a cost of N. A binary search of a table of N entries should have a ** cost of approximately log(N). @@ -4350,24 +4260,28 @@ struct sqlite3_index_info { #define SQLITE_INDEX_CONSTRAINT_MATCH 64 /* -** CAPI3REF: Register A Virtual Table Implementation {H18200} +** CAPI3REF: Register A Virtual Table Implementation ** EXPERIMENTAL ** -** This routine is used to register a new [virtual table module] name. -** Module names must be registered before -** creating a new [virtual table] using the module, or before using a +** ^These routines are used to register a new [virtual table module] name. +** ^Module names must be registered before +** creating a new [virtual table] using the module and before using a ** preexisting [virtual table] for the module. ** -** The module name is registered on the [database connection] specified -** by the first parameter. The name of the module is given by the -** second parameter. The third parameter is a pointer to -** the implementation of the [virtual table module]. The fourth +** ^The module name is registered on the [database connection] specified +** by the first parameter. ^The name of the module is given by the +** second parameter. ^The third parameter is a pointer to +** the implementation of the [virtual table module]. ^The fourth ** parameter is an arbitrary client data pointer that is passed through ** into the [xCreate] and [xConnect] methods of the virtual table module ** when a new virtual table is be being created or reinitialized. ** -** This interface has exactly the same effect as calling -** [sqlite3_create_module_v2()] with a NULL client data destructor. +** ^The sqlite3_create_module_v2() interface has a fifth parameter which +** is a pointer to a destructor for the pClientData. ^SQLite will +** invoke the destructor function (if it is not NULL) when SQLite +** no longer needs the pClientData pointer. ^The sqlite3_create_module() +** interface is equivalent to sqlite3_create_module_v2() with a NULL +** destructor. */ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_create_module( sqlite3 *db, /* SQLite connection to register module with */ @@ -4375,17 +4289,6 @@ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_create_module( const sqlite3_module *p, /* Methods for the module */ void *pClientData /* Client data for xCreate/xConnect */ ); - -/* -** CAPI3REF: Register A Virtual Table Implementation {H18210} -** EXPERIMENTAL -** -** This routine is identical to the [sqlite3_create_module()] method, -** except that it has an extra parameter to specify -** a destructor function for the client data pointer. SQLite will -** invoke the destructor function (if it is not NULL) when SQLite -** no longer needs the pClientData pointer. -*/ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_create_module_v2( sqlite3 *db, /* SQLite connection to register module with */ const char *zName, /* Name of the module */ @@ -4395,21 +4298,21 @@ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_create_module_v2( ); /* -** CAPI3REF: Virtual Table Instance Object {H18010} +** CAPI3REF: Virtual Table Instance Object ** KEYWORDS: sqlite3_vtab ** EXPERIMENTAL ** ** Every [virtual table module] implementation uses a subclass -** of the following structure to describe a particular instance +** of this object to describe a particular instance ** of the [virtual table]. Each subclass will ** be tailored to the specific needs of the module implementation. ** The purpose of this superclass is to define certain fields that are ** common to all module implementations. ** -** Virtual tables methods can set an error message by assigning a +** ^Virtual tables methods can set an error message by assigning a ** string obtained from [sqlite3_mprintf()] to zErrMsg. The method should ** take care that any prior string is freed by a call to [sqlite3_free()] -** prior to assigning a new string to zErrMsg. After the error message +** prior to assigning a new string to zErrMsg. ^After the error message ** is delivered up to the client application, the string will be automatically ** freed by sqlite3_free() and the zErrMsg field will be zeroed. */ @@ -4421,7 +4324,7 @@ struct sqlite3_vtab { }; /* -** CAPI3REF: Virtual Table Cursor Object {H18020} +** CAPI3REF: Virtual Table Cursor Object ** KEYWORDS: sqlite3_vtab_cursor {virtual table cursor} ** EXPERIMENTAL ** @@ -4430,7 +4333,7 @@ struct sqlite3_vtab { ** [virtual table] and are used ** to loop through the virtual table. Cursors are created using the ** [sqlite3_module.xOpen | xOpen] method of the module and are destroyed -** by the [sqlite3_module.xClose | xClose] method. Cussors are used +** by the [sqlite3_module.xClose | xClose] method. Cursors are used ** by the [xFilter], [xNext], [xEof], [xColumn], and [xRowid] methods ** of the module. Each module implementation will define ** the content of a cursor structure to suit its own needs. @@ -4444,10 +4347,10 @@ struct sqlite3_vtab_cursor { }; /* -** CAPI3REF: Declare The Schema Of A Virtual Table {H18280} +** CAPI3REF: Declare The Schema Of A Virtual Table ** EXPERIMENTAL ** -** The [xCreate] and [xConnect] methods of a +** ^The [xCreate] and [xConnect] methods of a ** [virtual table module] call this interface ** to declare the format (the names and datatypes of the columns) of ** the virtual tables they implement. @@ -4455,17 +4358,17 @@ struct sqlite3_vtab_cursor { SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_declare_vtab(sqlite3*, const char *zSQL); /* -** CAPI3REF: Overload A Function For A Virtual Table {H18300} +** CAPI3REF: Overload A Function For A Virtual Table ** EXPERIMENTAL ** -** Virtual tables can provide alternative implementations of functions +** ^(Virtual tables can provide alternative implementations of functions ** using the [xFindFunction] method of the [virtual table module]. ** But global versions of those functions -** must exist in order to be overloaded. +** must exist in order to be overloaded.)^ ** -** This API makes sure a global version of a function with a particular +** ^(This API makes sure a global version of a function with a particular ** name and number of parameters exists. If no such function exists -** before this API is called, a new function is created. The implementation +** before this API is called, a new function is created.)^ ^The implementation ** of the new function always causes an exception to be thrown. So ** the new function is not good for anything by itself. Its only ** purpose is to be a placeholder function that can be overloaded @@ -4486,77 +4389,74 @@ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_overload_function(sqlite3*, const cha */ /* -** CAPI3REF: A Handle To An Open BLOB {H17800} +** CAPI3REF: A Handle To An Open BLOB ** KEYWORDS: {BLOB handle} {BLOB handles} ** ** An instance of this object represents an open BLOB on which ** [sqlite3_blob_open | incremental BLOB I/O] can be performed. -** Objects of this type are created by [sqlite3_blob_open()] +** ^Objects of this type are created by [sqlite3_blob_open()] ** and destroyed by [sqlite3_blob_close()]. -** The [sqlite3_blob_read()] and [sqlite3_blob_write()] interfaces +** ^The [sqlite3_blob_read()] and [sqlite3_blob_write()] interfaces ** can be used to read or write small subsections of the BLOB. -** The [sqlite3_blob_bytes()] interface returns the size of the BLOB in bytes. +** ^The [sqlite3_blob_bytes()] interface returns the size of the BLOB in bytes. */ typedef struct sqlite3_blob sqlite3_blob; /* -** CAPI3REF: Open A BLOB For Incremental I/O {H17810} +** CAPI3REF: Open A BLOB For Incremental I/O ** -** This interfaces opens a [BLOB handle | handle] to the BLOB located +** ^(This interfaces opens a [BLOB handle | handle] to the BLOB located ** in row iRow, column zColumn, table zTable in database zDb; ** in other words, the same BLOB that would be selected by: ** **
     **     SELECT zColumn FROM zDb.zTable WHERE [rowid] = iRow;
    -** 
    {END} +** )^ ** -** If the flags parameter is non-zero, then the BLOB is opened for read -** and write access. If it is zero, the BLOB is opened for read access. -** It is not possible to open a column that is part of an index or primary +** ^If the flags parameter is non-zero, then the BLOB is opened for read +** and write access. ^If it is zero, the BLOB is opened for read access. +** ^It is not possible to open a column that is part of an index or primary ** key for writing. ^If [foreign key constraints] are enabled, it is ** not possible to open a column that is part of a [child key] for writing. ** -** Note that the database name is not the filename that contains +** ^Note that the database name is not the filename that contains ** the database but rather the symbolic name of the database that -** is assigned when the database is connected using [ATTACH]. -** For the main database file, the database name is "main". -** For TEMP tables, the database name is "temp". +** appears after the AS keyword when the database is connected using [ATTACH]. +** ^For the main database file, the database name is "main". +** ^For TEMP tables, the database name is "temp". ** -** On success, [SQLITE_OK] is returned and the new [BLOB handle] is written +** ^(On success, [SQLITE_OK] is returned and the new [BLOB handle] is written ** to *ppBlob. Otherwise an [error code] is returned and *ppBlob is set -** to be a null pointer. -** This function sets the [database connection] error code and message +** to be a null pointer.)^ +** ^This function sets the [database connection] error code and message ** accessible via [sqlite3_errcode()] and [sqlite3_errmsg()] and related -** functions. Note that the *ppBlob variable is always initialized in a +** functions. ^Note that the *ppBlob variable is always initialized in a ** way that makes it safe to invoke [sqlite3_blob_close()] on *ppBlob ** regardless of the success or failure of this routine. ** -** If the row that a BLOB handle points to is modified by an +** ^(If the row that a BLOB handle points to is modified by an ** [UPDATE], [DELETE], or by [ON CONFLICT] side-effects ** then the BLOB handle is marked as "expired". ** This is true if any column of the row is changed, even a column -** other than the one the BLOB handle is open on. -** Calls to [sqlite3_blob_read()] and [sqlite3_blob_write()] for +** other than the one the BLOB handle is open on.)^ +** ^Calls to [sqlite3_blob_read()] and [sqlite3_blob_write()] for ** a expired BLOB handle fail with an return code of [SQLITE_ABORT]. -** Changes written into a BLOB prior to the BLOB expiring are not -** rollback by the expiration of the BLOB. Such changes will eventually -** commit if the transaction continues to completion. +** ^(Changes written into a BLOB prior to the BLOB expiring are not +** rolled back by the expiration of the BLOB. Such changes will eventually +** commit if the transaction continues to completion.)^ ** -** Use the [sqlite3_blob_bytes()] interface to determine the size of -** the opened blob. The size of a blob may not be changed by this +** ^Use the [sqlite3_blob_bytes()] interface to determine the size of +** the opened blob. ^The size of a blob may not be changed by this ** interface. Use the [UPDATE] SQL command to change the size of a ** blob. ** -** The [sqlite3_bind_zeroblob()] and [sqlite3_result_zeroblob()] interfaces +** ^The [sqlite3_bind_zeroblob()] and [sqlite3_result_zeroblob()] interfaces ** and the built-in [zeroblob] SQL function can be used, if desired, ** to create an empty, zero-filled blob in which to read or write using ** this interface. ** ** To avoid a resource leak, every open [BLOB handle] should eventually ** be released by a call to [sqlite3_blob_close()]. -** -** Requirements: -** [H17813] [H17814] [H17816] [H17819] [H17821] [H17824] */ SQLITE_API int sqlite3_blob_open( sqlite3*, @@ -4569,37 +4469,34 @@ SQLITE_API int sqlite3_blob_open( ); /* -** CAPI3REF: Close A BLOB Handle {H17830} +** CAPI3REF: Close A BLOB Handle ** -** Closes an open [BLOB handle]. +** ^Closes an open [BLOB handle]. ** -** Closing a BLOB shall cause the current transaction to commit +** ^Closing a BLOB shall cause the current transaction to commit ** if there are no other BLOBs, no pending prepared statements, and the ** database connection is in [autocommit mode]. -** If any writes were made to the BLOB, they might be held in cache +** ^If any writes were made to the BLOB, they might be held in cache ** until the close operation if they will fit. ** -** Closing the BLOB often forces the changes +** ^(Closing the BLOB often forces the changes ** out to disk and so if any I/O errors occur, they will likely occur ** at the time when the BLOB is closed. Any errors that occur during -** closing are reported as a non-zero return value. +** closing are reported as a non-zero return value.)^ ** -** The BLOB is closed unconditionally. Even if this routine returns -** an error code, the BLOB is still closed. +** ^(The BLOB is closed unconditionally. Even if this routine returns +** an error code, the BLOB is still closed.)^ ** -** Calling this routine with a null pointer (which as would be returned -** by failed call to [sqlite3_blob_open()]) is a harmless no-op. -** -** Requirements: -** [H17833] [H17836] [H17839] +** ^Calling this routine with a null pointer (such as would be returned +** by a failed call to [sqlite3_blob_open()]) is a harmless no-op. */ SQLITE_API int sqlite3_blob_close(sqlite3_blob *); /* -** CAPI3REF: Return The Size Of An Open BLOB {H17840} +** CAPI3REF: Return The Size Of An Open BLOB ** -** Returns the size in bytes of the BLOB accessible via the -** successfully opened [BLOB handle] in its only argument. The +** ^Returns the size in bytes of the BLOB accessible via the +** successfully opened [BLOB handle] in its only argument. ^The ** incremental blob I/O routines can only read or overwriting existing ** blob content; they cannot change the size of a blob. ** @@ -4607,30 +4504,27 @@ SQLITE_API int sqlite3_blob_close(sqlite3_blob *); ** by a prior successful call to [sqlite3_blob_open()] and which has not ** been closed by [sqlite3_blob_close()]. Passing any other pointer in ** to this routine results in undefined and probably undesirable behavior. -** -** Requirements: -** [H17843] */ SQLITE_API int sqlite3_blob_bytes(sqlite3_blob *); /* -** CAPI3REF: Read Data From A BLOB Incrementally {H17850} +** CAPI3REF: Read Data From A BLOB Incrementally ** -** This function is used to read data from an open [BLOB handle] into a +** ^(This function is used to read data from an open [BLOB handle] into a ** caller-supplied buffer. N bytes of data are copied into buffer Z -** from the open BLOB, starting at offset iOffset. +** from the open BLOB, starting at offset iOffset.)^ ** -** If offset iOffset is less than N bytes from the end of the BLOB, -** [SQLITE_ERROR] is returned and no data is read. If N or iOffset is +** ^If offset iOffset is less than N bytes from the end of the BLOB, +** [SQLITE_ERROR] is returned and no data is read. ^If N or iOffset is ** less than zero, [SQLITE_ERROR] is returned and no data is read. -** The size of the blob (and hence the maximum value of N+iOffset) +** ^The size of the blob (and hence the maximum value of N+iOffset) ** can be determined using the [sqlite3_blob_bytes()] interface. ** -** An attempt to read from an expired [BLOB handle] fails with an +** ^An attempt to read from an expired [BLOB handle] fails with an ** error code of [SQLITE_ABORT]. ** -** On success, SQLITE_OK is returned. -** Otherwise, an [error code] or an [extended error code] is returned. +** ^(On success, sqlite3_blob_read() returns SQLITE_OK. +** Otherwise, an [error code] or an [extended error code] is returned.)^ ** ** This routine only works on a [BLOB handle] which has been created ** by a prior successful call to [sqlite3_blob_open()] and which has not @@ -4638,40 +4532,37 @@ SQLITE_API int sqlite3_blob_bytes(sqlite3_blob *); ** to this routine results in undefined and probably undesirable behavior. ** ** See also: [sqlite3_blob_write()]. -** -** Requirements: -** [H17853] [H17856] [H17859] [H17862] [H17863] [H17865] [H17868] */ SQLITE_API int sqlite3_blob_read(sqlite3_blob *, void *Z, int N, int iOffset); /* -** CAPI3REF: Write Data Into A BLOB Incrementally {H17870} +** CAPI3REF: Write Data Into A BLOB Incrementally ** -** This function is used to write data into an open [BLOB handle] from a -** caller-supplied buffer. N bytes of data are copied from the buffer Z +** ^This function is used to write data into an open [BLOB handle] from a +** caller-supplied buffer. ^N bytes of data are copied from the buffer Z ** into the open BLOB, starting at offset iOffset. ** -** If the [BLOB handle] passed as the first argument was not opened for +** ^If the [BLOB handle] passed as the first argument was not opened for ** writing (the flags parameter to [sqlite3_blob_open()] was zero), ** this function returns [SQLITE_READONLY]. ** -** This function may only modify the contents of the BLOB; it is +** ^This function may only modify the contents of the BLOB; it is ** not possible to increase the size of a BLOB using this API. -** If offset iOffset is less than N bytes from the end of the BLOB, -** [SQLITE_ERROR] is returned and no data is written. If N is +** ^If offset iOffset is less than N bytes from the end of the BLOB, +** [SQLITE_ERROR] is returned and no data is written. ^If N is ** less than zero [SQLITE_ERROR] is returned and no data is written. ** The size of the BLOB (and hence the maximum value of N+iOffset) ** can be determined using the [sqlite3_blob_bytes()] interface. ** -** An attempt to write to an expired [BLOB handle] fails with an -** error code of [SQLITE_ABORT]. Writes to the BLOB that occurred +** ^An attempt to write to an expired [BLOB handle] fails with an +** error code of [SQLITE_ABORT]. ^Writes to the BLOB that occurred ** before the [BLOB handle] expired are not rolled back by the ** expiration of the handle, though of course those changes might ** have been overwritten by the statement that expired the BLOB handle ** or by other independent statements. ** -** On success, SQLITE_OK is returned. -** Otherwise, an [error code] or an [extended error code] is returned. +** ^(On success, sqlite3_blob_write() returns SQLITE_OK. +** Otherwise, an [error code] or an [extended error code] is returned.)^ ** ** This routine only works on a [BLOB handle] which has been created ** by a prior successful call to [sqlite3_blob_open()] and which has not @@ -4679,15 +4570,11 @@ SQLITE_API int sqlite3_blob_read(sqlite3_blob *, void *Z, int N, int iOffset); ** to this routine results in undefined and probably undesirable behavior. ** ** See also: [sqlite3_blob_read()]. -** -** Requirements: -** [H17873] [H17874] [H17875] [H17876] [H17877] [H17879] [H17882] [H17885] -** [H17888] */ SQLITE_API int sqlite3_blob_write(sqlite3_blob *, const void *z, int n, int iOffset); /* -** CAPI3REF: Virtual File System Objects {H11200} +** CAPI3REF: Virtual File System Objects ** ** A virtual filesystem (VFS) is an [sqlite3_vfs] object ** that SQLite uses to interact @@ -4696,34 +4583,31 @@ SQLITE_API int sqlite3_blob_write(sqlite3_blob *, const void *z, int n, int iOff ** New VFSes can be registered and existing VFSes can be unregistered. ** The following interfaces are provided. ** -** The sqlite3_vfs_find() interface returns a pointer to a VFS given its name. -** Names are case sensitive. -** Names are zero-terminated UTF-8 strings. -** If there is no match, a NULL pointer is returned. -** If zVfsName is NULL then the default VFS is returned. +** ^The sqlite3_vfs_find() interface returns a pointer to a VFS given its name. +** ^Names are case sensitive. +** ^Names are zero-terminated UTF-8 strings. +** ^If there is no match, a NULL pointer is returned. +** ^If zVfsName is NULL then the default VFS is returned. ** -** New VFSes are registered with sqlite3_vfs_register(). -** Each new VFS becomes the default VFS if the makeDflt flag is set. -** The same VFS can be registered multiple times without injury. -** To make an existing VFS into the default VFS, register it again +** ^New VFSes are registered with sqlite3_vfs_register(). +** ^Each new VFS becomes the default VFS if the makeDflt flag is set. +** ^The same VFS can be registered multiple times without injury. +** ^To make an existing VFS into the default VFS, register it again ** with the makeDflt flag set. If two different VFSes with the ** same name are registered, the behavior is undefined. If a ** VFS is registered with a name that is NULL or an empty string, ** then the behavior is undefined. ** -** Unregister a VFS with the sqlite3_vfs_unregister() interface. -** If the default VFS is unregistered, another VFS is chosen as -** the default. The choice for the new VFS is arbitrary. -** -** Requirements: -** [H11203] [H11206] [H11209] [H11212] [H11215] [H11218] +** ^Unregister a VFS with the sqlite3_vfs_unregister() interface. +** ^(If the default VFS is unregistered, another VFS is chosen as +** the default. The choice for the new VFS is arbitrary.)^ */ SQLITE_API sqlite3_vfs *sqlite3_vfs_find(const char *zVfsName); SQLITE_API int sqlite3_vfs_register(sqlite3_vfs*, int makeDflt); SQLITE_API int sqlite3_vfs_unregister(sqlite3_vfs*); /* -** CAPI3REF: Mutexes {H17000} +** CAPI3REF: Mutexes ** ** The SQLite core uses these routines for thread ** synchronization. Though they are intended for internal @@ -4732,7 +4616,7 @@ SQLITE_API int sqlite3_vfs_unregister(sqlite3_vfs*); ** ** The SQLite source code contains multiple implementations ** of these mutex routines. An appropriate implementation -** is selected automatically at compile-time. The following +** is selected automatically at compile-time. ^(The following ** implementations are available in the SQLite core: ** **
      @@ -4740,26 +4624,26 @@ SQLITE_API int sqlite3_vfs_unregister(sqlite3_vfs*); **
    • SQLITE_MUTEX_PTHREAD **
    • SQLITE_MUTEX_W32 **
    • SQLITE_MUTEX_NOOP -**
    +** )^ ** -** The SQLITE_MUTEX_NOOP implementation is a set of routines +** ^The SQLITE_MUTEX_NOOP implementation is a set of routines ** that does no real locking and is appropriate for use in -** a single-threaded application. The SQLITE_MUTEX_OS2, +** a single-threaded application. ^The SQLITE_MUTEX_OS2, ** SQLITE_MUTEX_PTHREAD, and SQLITE_MUTEX_W32 implementations ** are appropriate for use on OS/2, Unix, and Windows. ** -** If SQLite is compiled with the SQLITE_MUTEX_APPDEF preprocessor +** ^(If SQLite is compiled with the SQLITE_MUTEX_APPDEF preprocessor ** macro defined (with "-DSQLITE_MUTEX_APPDEF=1"), then no mutex ** implementation is included with the library. In this case the ** application must supply a custom mutex implementation using the ** [SQLITE_CONFIG_MUTEX] option of the sqlite3_config() function ** before calling sqlite3_initialize() or any other public sqlite3_ -** function that calls sqlite3_initialize(). +** function that calls sqlite3_initialize().)^ ** -** {H17011} The sqlite3_mutex_alloc() routine allocates a new -** mutex and returns a pointer to it. {H17012} If it returns NULL -** that means that a mutex could not be allocated. {H17013} SQLite -** will unwind its stack and return an error. {H17014} The argument +** ^The sqlite3_mutex_alloc() routine allocates a new +** mutex and returns a pointer to it. ^If it returns NULL +** that means that a mutex could not be allocated. ^SQLite +** will unwind its stack and return an error. ^(The argument ** to sqlite3_mutex_alloc() is one of these integer constants: ** **
      @@ -4771,64 +4655,66 @@ SQLITE_API int sqlite3_vfs_unregister(sqlite3_vfs*); **
    • SQLITE_MUTEX_STATIC_PRNG **
    • SQLITE_MUTEX_STATIC_LRU **
    • SQLITE_MUTEX_STATIC_LRU2 -**
    +** )^ ** -** {H17015} The first two constants cause sqlite3_mutex_alloc() to create -** a new mutex. The new mutex is recursive when SQLITE_MUTEX_RECURSIVE -** is used but not necessarily so when SQLITE_MUTEX_FAST is used. {END} +** ^The first two constants (SQLITE_MUTEX_FAST and SQLITE_MUTEX_RECURSIVE) +** cause sqlite3_mutex_alloc() to create +** a new mutex. ^The new mutex is recursive when SQLITE_MUTEX_RECURSIVE +** is used but not necessarily so when SQLITE_MUTEX_FAST is used. ** The mutex implementation does not need to make a distinction ** between SQLITE_MUTEX_RECURSIVE and SQLITE_MUTEX_FAST if it does -** not want to. {H17016} But SQLite will only request a recursive mutex in -** cases where it really needs one. {END} If a faster non-recursive mutex +** not want to. ^SQLite will only request a recursive mutex in +** cases where it really needs one. ^If a faster non-recursive mutex ** implementation is available on the host platform, the mutex subsystem ** might return such a mutex in response to SQLITE_MUTEX_FAST. ** -** {H17017} The other allowed parameters to sqlite3_mutex_alloc() each return -** a pointer to a static preexisting mutex. {END} Six static mutexes are +** ^The other allowed parameters to sqlite3_mutex_alloc() (anything other +** than SQLITE_MUTEX_FAST and SQLITE_MUTEX_RECURSIVE) each return +** a pointer to a static preexisting mutex. ^Six static mutexes are ** used by the current version of SQLite. Future versions of SQLite ** may add additional static mutexes. Static mutexes are for internal ** use by SQLite only. Applications that use SQLite mutexes should ** use only the dynamic mutexes returned by SQLITE_MUTEX_FAST or ** SQLITE_MUTEX_RECURSIVE. ** -** {H17018} Note that if one of the dynamic mutex parameters (SQLITE_MUTEX_FAST +** ^Note that if one of the dynamic mutex parameters (SQLITE_MUTEX_FAST ** or SQLITE_MUTEX_RECURSIVE) is used then sqlite3_mutex_alloc() -** returns a different mutex on every call. {H17034} But for the static +** returns a different mutex on every call. ^But for the static ** mutex types, the same mutex is returned on every call that has ** the same type number. ** -** {H17019} The sqlite3_mutex_free() routine deallocates a previously -** allocated dynamic mutex. {H17020} SQLite is careful to deallocate every -** dynamic mutex that it allocates. {A17021} The dynamic mutexes must not be in -** use when they are deallocated. {A17022} Attempting to deallocate a static -** mutex results in undefined behavior. {H17023} SQLite never deallocates -** a static mutex. {END} +** ^The sqlite3_mutex_free() routine deallocates a previously +** allocated dynamic mutex. ^SQLite is careful to deallocate every +** dynamic mutex that it allocates. The dynamic mutexes must not be in +** use when they are deallocated. Attempting to deallocate a static +** mutex results in undefined behavior. ^SQLite never deallocates +** a static mutex. ** -** The sqlite3_mutex_enter() and sqlite3_mutex_try() routines attempt -** to enter a mutex. {H17024} If another thread is already within the mutex, +** ^The sqlite3_mutex_enter() and sqlite3_mutex_try() routines attempt +** to enter a mutex. ^If another thread is already within the mutex, ** sqlite3_mutex_enter() will block and sqlite3_mutex_try() will return -** SQLITE_BUSY. {H17025} The sqlite3_mutex_try() interface returns [SQLITE_OK] -** upon successful entry. {H17026} Mutexes created using +** SQLITE_BUSY. ^The sqlite3_mutex_try() interface returns [SQLITE_OK] +** upon successful entry. ^(Mutexes created using ** SQLITE_MUTEX_RECURSIVE can be entered multiple times by the same thread. -** {H17027} In such cases the, +** In such cases the, ** mutex must be exited an equal number of times before another thread -** can enter. {A17028} If the same thread tries to enter any other +** can enter.)^ ^(If the same thread tries to enter any other ** kind of mutex more than once, the behavior is undefined. -** {H17029} SQLite will never exhibit -** such behavior in its own use of mutexes. +** SQLite will never exhibit +** such behavior in its own use of mutexes.)^ ** -** Some systems (for example, Windows 95) do not support the operation +** ^(Some systems (for example, Windows 95) do not support the operation ** implemented by sqlite3_mutex_try(). On those systems, sqlite3_mutex_try() -** will always return SQLITE_BUSY. {H17030} The SQLite core only ever uses -** sqlite3_mutex_try() as an optimization so this is acceptable behavior. +** will always return SQLITE_BUSY. The SQLite core only ever uses +** sqlite3_mutex_try() as an optimization so this is acceptable behavior.)^ ** -** {H17031} The sqlite3_mutex_leave() routine exits a mutex that was -** previously entered by the same thread. {A17032} The behavior +** ^The sqlite3_mutex_leave() routine exits a mutex that was +** previously entered by the same thread. ^(The behavior ** is undefined if the mutex is not currently entered by the -** calling thread or is not currently allocated. {H17033} SQLite will -** never do either. {END} +** calling thread or is not currently allocated. SQLite will +** never do either.)^ ** -** If the argument to sqlite3_mutex_enter(), sqlite3_mutex_try(), or +** ^If the argument to sqlite3_mutex_enter(), sqlite3_mutex_try(), or ** sqlite3_mutex_leave() is a NULL pointer, then all three routines ** behave as no-ops. ** @@ -4841,7 +4727,7 @@ SQLITE_API int sqlite3_mutex_try(sqlite3_mutex*); SQLITE_API void sqlite3_mutex_leave(sqlite3_mutex*); /* -** CAPI3REF: Mutex Methods Object {H17120} +** CAPI3REF: Mutex Methods Object ** EXPERIMENTAL ** ** An instance of this structure defines the low-level routines @@ -4857,19 +4743,19 @@ SQLITE_API void sqlite3_mutex_leave(sqlite3_mutex*); ** output variable when querying the system for the current mutex ** implementation, using the [SQLITE_CONFIG_GETMUTEX] option. ** -** The xMutexInit method defined by this structure is invoked as +** ^The xMutexInit method defined by this structure is invoked as ** part of system initialization by the sqlite3_initialize() function. -** {H17001} The xMutexInit routine shall be called by SQLite once for each +** ^The xMutexInit routine is calle by SQLite exactly once for each ** effective call to [sqlite3_initialize()]. ** -** The xMutexEnd method defined by this structure is invoked as +** ^The xMutexEnd method defined by this structure is invoked as ** part of system shutdown by the sqlite3_shutdown() function. The ** implementation of this method is expected to release all outstanding ** resources obtained by the mutex methods implementation, especially -** those obtained by the xMutexInit method. {H17003} The xMutexEnd() -** interface shall be invoked once for each call to [sqlite3_shutdown()]. +** those obtained by the xMutexInit method. ^The xMutexEnd() +** interface is invoked exactly once for each call to [sqlite3_shutdown()]. ** -** The remaining seven methods defined by this structure (xMutexAlloc, +** ^(The remaining seven methods defined by this structure (xMutexAlloc, ** xMutexFree, xMutexEnter, xMutexTry, xMutexLeave, xMutexHeld and ** xMutexNotheld) implement the following interfaces (respectively): ** @@ -4881,7 +4767,7 @@ SQLITE_API void sqlite3_mutex_leave(sqlite3_mutex*); **
  • [sqlite3_mutex_leave()]
  • **
  • [sqlite3_mutex_held()]
  • **
  • [sqlite3_mutex_notheld()]
  • -** +** )^ ** ** The only difference is that the public sqlite3_XXX functions enumerated ** above silently ignore any invocations that pass a NULL pointer instead @@ -4891,17 +4777,17 @@ SQLITE_API void sqlite3_mutex_leave(sqlite3_mutex*); ** (i.e. it is acceptable to provide an implementation that segfaults if ** it is passed a NULL pointer). ** -** The xMutexInit() method must be threadsafe. It must be harmless to +** The xMutexInit() method must be threadsafe. ^It must be harmless to ** invoke xMutexInit() mutiple times within the same process and without ** intervening calls to xMutexEnd(). Second and subsequent calls to ** xMutexInit() must be no-ops. ** -** xMutexInit() must not use SQLite memory allocation ([sqlite3_malloc()] -** and its associates). Similarly, xMutexAlloc() must not use SQLite memory -** allocation for a static mutex. However xMutexAlloc() may use SQLite +** ^xMutexInit() must not use SQLite memory allocation ([sqlite3_malloc()] +** and its associates). ^Similarly, xMutexAlloc() must not use SQLite memory +** allocation for a static mutex. ^However xMutexAlloc() may use SQLite ** memory allocation for a fast or recursive mutex. ** -** SQLite will invoke the xMutexEnd() method when [sqlite3_shutdown()] is +** ^SQLite will invoke the xMutexEnd() method when [sqlite3_shutdown()] is ** called, but only if the prior call to xMutexInit returned SQLITE_OK. ** If xMutexInit fails in any way, it is expected to clean up after itself ** prior to returning. @@ -4920,39 +4806,41 @@ struct sqlite3_mutex_methods { }; /* -** CAPI3REF: Mutex Verification Routines {H17080} +** CAPI3REF: Mutex Verification Routines ** ** The sqlite3_mutex_held() and sqlite3_mutex_notheld() routines -** are intended for use inside assert() statements. {H17081} The SQLite core +** are intended for use inside assert() statements. ^The SQLite core ** never uses these routines except inside an assert() and applications -** are advised to follow the lead of the core. {H17082} The core only +** are advised to follow the lead of the core. ^The SQLite core only ** provides implementations for these routines when it is compiled -** with the SQLITE_DEBUG flag. {A17087} External mutex implementations +** with the SQLITE_DEBUG flag. ^External mutex implementations ** are only required to provide these routines if SQLITE_DEBUG is ** defined and if NDEBUG is not defined. ** -** {H17083} These routines should return true if the mutex in their argument +** ^These routines should return true if the mutex in their argument ** is held or not held, respectively, by the calling thread. ** -** {X17084} The implementation is not required to provided versions of these +** ^The implementation is not required to provided versions of these ** routines that actually work. If the implementation does not provide working ** versions of these routines, it should at least provide stubs that always ** return true so that one does not get spurious assertion failures. ** -** {H17085} If the argument to sqlite3_mutex_held() is a NULL pointer then -** the routine should return 1. {END} This seems counter-intuitive since +** ^If the argument to sqlite3_mutex_held() is a NULL pointer then +** the routine should return 1. This seems counter-intuitive since ** clearly the mutex cannot be held if it does not exist. But the ** the reason the mutex does not exist is because the build is not ** using mutexes. And we do not want the assert() containing the ** call to sqlite3_mutex_held() to fail, so a non-zero return is -** the appropriate thing to do. {H17086} The sqlite3_mutex_notheld() +** the appropriate thing to do. ^The sqlite3_mutex_notheld() ** interface should also return 1 when given a NULL pointer. */ +#ifndef NDEBUG SQLITE_API int sqlite3_mutex_held(sqlite3_mutex*); SQLITE_API int sqlite3_mutex_notheld(sqlite3_mutex*); +#endif /* -** CAPI3REF: Mutex Types {H17001} +** CAPI3REF: Mutex Types ** ** The [sqlite3_mutex_alloc()] interface takes a single argument ** which is one of these integer constants. @@ -4972,48 +4860,50 @@ SQLITE_API int sqlite3_mutex_notheld(sqlite3_mutex*); #define SQLITE_MUTEX_STATIC_LRU2 7 /* lru page list */ /* -** CAPI3REF: Retrieve the mutex for a database connection {H17002} +** CAPI3REF: Retrieve the mutex for a database connection ** -** This interface returns a pointer the [sqlite3_mutex] object that +** ^This interface returns a pointer the [sqlite3_mutex] object that ** serializes access to the [database connection] given in the argument ** when the [threading mode] is Serialized. -** If the [threading mode] is Single-thread or Multi-thread then this +** ^If the [threading mode] is Single-thread or Multi-thread then this ** routine returns a NULL pointer. */ SQLITE_API sqlite3_mutex *sqlite3_db_mutex(sqlite3*); /* -** CAPI3REF: Low-Level Control Of Database Files {H11300} +** CAPI3REF: Low-Level Control Of Database Files ** -** {H11301} The [sqlite3_file_control()] interface makes a direct call to the +** ^The [sqlite3_file_control()] interface makes a direct call to the ** xFileControl method for the [sqlite3_io_methods] object associated -** with a particular database identified by the second argument. {H11302} The -** name of the database is the name assigned to the database by the -** ATTACH SQL command that opened the -** database. {H11303} To control the main database file, use the name "main" -** or a NULL pointer. {H11304} The third and fourth parameters to this routine +** with a particular database identified by the second argument. ^The +** name of the database "main" for the main database or "temp" for the +** TEMP database, or the name that appears after the AS keyword for +** databases that are added using the [ATTACH] SQL command. +** ^A NULL pointer can be used in place of "main" to refer to the +** main database file. +** ^The third and fourth parameters to this routine ** are passed directly through to the second and third parameters of -** the xFileControl method. {H11305} The return value of the xFileControl +** the xFileControl method. ^The return value of the xFileControl ** method becomes the return value of this routine. ** -** {H11306} If the second parameter (zDbName) does not match the name of any -** open database file, then SQLITE_ERROR is returned. {H11307} This error +** ^If the second parameter (zDbName) does not match the name of any +** open database file, then SQLITE_ERROR is returned. ^This error ** code is not remembered and will not be recalled by [sqlite3_errcode()] -** or [sqlite3_errmsg()]. {A11308} The underlying xFileControl method might -** also return SQLITE_ERROR. {A11309} There is no way to distinguish between +** or [sqlite3_errmsg()]. The underlying xFileControl method might +** also return SQLITE_ERROR. There is no way to distinguish between ** an incorrect zDbName and an SQLITE_ERROR return from the underlying -** xFileControl method. {END} +** xFileControl method. ** ** See also: [SQLITE_FCNTL_LOCKSTATE] */ SQLITE_API int sqlite3_file_control(sqlite3*, const char *zDbName, int op, void*); /* -** CAPI3REF: Testing Interface {H11400} +** CAPI3REF: Testing Interface ** -** The sqlite3_test_control() interface is used to read out internal +** ^The sqlite3_test_control() interface is used to read out internal ** state of SQLite and to inject faults into SQLite for testing -** purposes. The first parameter is an operation code that determines +** purposes. ^The first parameter is an operation code that determines ** the number, meaning, and operation of all subsequent parameters. ** ** This interface is not for use by applications. It exists solely @@ -5028,7 +4918,7 @@ SQLITE_API int sqlite3_file_control(sqlite3*, const char *zDbName, int op, void* SQLITE_API int sqlite3_test_control(int op, ...); /* -** CAPI3REF: Testing Interface Operation Codes {H11410} +** CAPI3REF: Testing Interface Operation Codes ** ** These constants are the valid operation code parameters used ** as the first argument to [sqlite3_test_control()]. @@ -5038,6 +4928,7 @@ SQLITE_API int sqlite3_test_control(int op, ...); ** Applications should not use any of these parameters or the ** [sqlite3_test_control()] interface. */ +#define SQLITE_TESTCTRL_FIRST 5 #define SQLITE_TESTCTRL_PRNG_SAVE 5 #define SQLITE_TESTCTRL_PRNG_RESTORE 6 #define SQLITE_TESTCTRL_PRNG_RESET 7 @@ -5048,27 +4939,30 @@ SQLITE_API int sqlite3_test_control(int op, ...); #define SQLITE_TESTCTRL_ASSERT 12 #define SQLITE_TESTCTRL_ALWAYS 13 #define SQLITE_TESTCTRL_RESERVE 14 +#define SQLITE_TESTCTRL_OPTIMIZATIONS 15 +#define SQLITE_TESTCTRL_ISKEYWORD 16 +#define SQLITE_TESTCTRL_LAST 16 /* -** CAPI3REF: SQLite Runtime Status {H17200} +** CAPI3REF: SQLite Runtime Status ** EXPERIMENTAL ** -** This interface is used to retrieve runtime status information +** ^This interface is used to retrieve runtime status information ** about the preformance of SQLite, and optionally to reset various -** highwater marks. The first argument is an integer code for -** the specific parameter to measure. Recognized integer codes -** are of the form [SQLITE_STATUS_MEMORY_USED | SQLITE_STATUS_...]. -** The current value of the parameter is returned into *pCurrent. -** The highest recorded value is returned in *pHighwater. If the +** highwater marks. ^The first argument is an integer code for +** the specific parameter to measure. ^(Recognized integer codes +** are of the form [SQLITE_STATUS_MEMORY_USED | SQLITE_STATUS_...].)^ +** ^The current value of the parameter is returned into *pCurrent. +** ^The highest recorded value is returned in *pHighwater. ^If the ** resetFlag is true, then the highest record value is reset after -** *pHighwater is written. Some parameters do not record the highest +** *pHighwater is written. ^(Some parameters do not record the highest ** value. For those parameters -** nothing is written into *pHighwater and the resetFlag is ignored. -** Other parameters record only the highwater mark and not the current -** value. For these latter parameters nothing is written into *pCurrent. +** nothing is written into *pHighwater and the resetFlag is ignored.)^ +** ^(Other parameters record only the highwater mark and not the current +** value. For these latter parameters nothing is written into *pCurrent.)^ ** -** This routine returns SQLITE_OK on success and a non-zero -** [error code] on failure. +** ^The sqlite3_db_status() routine returns SQLITE_OK on success and a +** non-zero [error code] on failure. ** ** This routine is threadsafe but is not atomic. This routine can be ** called while other threads are running the same or different SQLite @@ -5083,14 +4977,14 @@ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_status(int op, int *pCurrent, int *pH /* -** CAPI3REF: Status Parameters {H17250} +** CAPI3REF: Status Parameters ** EXPERIMENTAL ** ** These integer constants designate various run-time status parameters ** that can be returned by [sqlite3_status()]. ** **
    -**
    SQLITE_STATUS_MEMORY_USED
    +** ^(
    SQLITE_STATUS_MEMORY_USED
    **
    This parameter is the current amount of memory checked out ** using [sqlite3_malloc()], either directly or indirectly. The ** figure includes calls made to [sqlite3_malloc()] by the application @@ -5098,45 +4992,45 @@ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_status(int op, int *pCurrent, int *pH ** controlled by [SQLITE_CONFIG_SCRATCH] and auxiliary page-cache ** memory controlled by [SQLITE_CONFIG_PAGECACHE] is not included in ** this parameter. The amount returned is the sum of the allocation -** sizes as reported by the xSize method in [sqlite3_mem_methods].
    +** sizes as reported by the xSize method in [sqlite3_mem_methods].)^ ** -**
    SQLITE_STATUS_MALLOC_SIZE
    +** ^(
    SQLITE_STATUS_MALLOC_SIZE
    **
    This parameter records the largest memory allocation request ** handed to [sqlite3_malloc()] or [sqlite3_realloc()] (or their ** internal equivalents). Only the value returned in the ** *pHighwater parameter to [sqlite3_status()] is of interest. -** The value written into the *pCurrent parameter is undefined.
    +** The value written into the *pCurrent parameter is undefined.)^ ** -**
    SQLITE_STATUS_PAGECACHE_USED
    +** ^(
    SQLITE_STATUS_PAGECACHE_USED
    **
    This parameter returns the number of pages used out of the ** [pagecache memory allocator] that was configured using ** [SQLITE_CONFIG_PAGECACHE]. The -** value returned is in pages, not in bytes.
    +** value returned is in pages, not in bytes.)^ ** -**
    SQLITE_STATUS_PAGECACHE_OVERFLOW
    +** ^(
    SQLITE_STATUS_PAGECACHE_OVERFLOW
    **
    This parameter returns the number of bytes of page cache ** allocation which could not be statisfied by the [SQLITE_CONFIG_PAGECACHE] ** buffer and where forced to overflow to [sqlite3_malloc()]. The ** returned value includes allocations that overflowed because they ** where too large (they were larger than the "sz" parameter to ** [SQLITE_CONFIG_PAGECACHE]) and allocations that overflowed because -** no space was left in the page cache.
    +** no space was left in the page cache.)^ ** -**
    SQLITE_STATUS_PAGECACHE_SIZE
    +** ^(
    SQLITE_STATUS_PAGECACHE_SIZE
    **
    This parameter records the largest memory allocation request ** handed to [pagecache memory allocator]. Only the value returned in the ** *pHighwater parameter to [sqlite3_status()] is of interest. -** The value written into the *pCurrent parameter is undefined.
    +** The value written into the *pCurrent parameter is undefined.)^ ** -**
    SQLITE_STATUS_SCRATCH_USED
    +** ^(
    SQLITE_STATUS_SCRATCH_USED
    **
    This parameter returns the number of allocations used out of the ** [scratch memory allocator] configured using ** [SQLITE_CONFIG_SCRATCH]. The value returned is in allocations, not ** in bytes. Since a single thread may only have one scratch allocation ** outstanding at time, this parameter also reports the number of threads -** using scratch memory at the same time.
    +** using scratch memory at the same time.)^ ** -**
    SQLITE_STATUS_SCRATCH_OVERFLOW
    +** ^(
    SQLITE_STATUS_SCRATCH_OVERFLOW
    **
    This parameter returns the number of bytes of scratch memory ** allocation which could not be statisfied by the [SQLITE_CONFIG_SCRATCH] ** buffer and where forced to overflow to [sqlite3_malloc()]. The values @@ -5144,17 +5038,17 @@ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_status(int op, int *pCurrent, int *pH ** larger (that is, because the requested allocation was larger than the ** "sz" parameter to [SQLITE_CONFIG_SCRATCH]) and because no scratch buffer ** slots were available. -**
    +** )^ ** -**
    SQLITE_STATUS_SCRATCH_SIZE
    +** ^(
    SQLITE_STATUS_SCRATCH_SIZE
    **
    This parameter records the largest memory allocation request ** handed to [scratch memory allocator]. Only the value returned in the ** *pHighwater parameter to [sqlite3_status()] is of interest. -** The value written into the *pCurrent parameter is undefined.
    +** The value written into the *pCurrent parameter is undefined.)^ ** -**
    SQLITE_STATUS_PARSER_STACK
    +** ^(
    SQLITE_STATUS_PARSER_STACK
    **
    This parameter records the deepest parser stack. It is only -** meaningful if SQLite is compiled with [YYTRACKMAXSTACKDEPTH].
    +** meaningful if SQLite is compiled with [YYTRACKMAXSTACKDEPTH].)^ **
    ** ** New status parameters may be added from time to time. @@ -5170,18 +5064,18 @@ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_status(int op, int *pCurrent, int *pH #define SQLITE_STATUS_SCRATCH_SIZE 8 /* -** CAPI3REF: Database Connection Status {H17500} +** CAPI3REF: Database Connection Status ** EXPERIMENTAL ** -** This interface is used to retrieve runtime status information -** about a single [database connection]. The first argument is the -** database connection object to be interrogated. The second argument -** is the parameter to interrogate. Currently, the only allowed value +** ^This interface is used to retrieve runtime status information +** about a single [database connection]. ^The first argument is the +** database connection object to be interrogated. ^The second argument +** is the parameter to interrogate. ^Currently, the only allowed value ** for the second parameter is [SQLITE_DBSTATUS_LOOKASIDE_USED]. ** Additional options will likely appear in future releases of SQLite. ** -** The current value of the requested parameter is written into *pCur -** and the highest instantaneous value is written into *pHiwtr. If +** ^The current value of the requested parameter is written into *pCur +** and the highest instantaneous value is written into *pHiwtr. ^If ** the resetFlg is true, then the highest instantaneous value is ** reset back down to the current value. ** @@ -5190,7 +5084,7 @@ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_status(int op, int *pCurrent, int *pH SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int resetFlg); /* -** CAPI3REF: Status Parameters for database connections {H17520} +** CAPI3REF: Status Parameters for database connections ** EXPERIMENTAL ** ** These constants are the available integer "verbs" that can be passed as @@ -5203,34 +5097,34 @@ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_db_status(sqlite3*, int op, int *pCur ** if a discontinued or unsupported verb is invoked. ** **
    -**
    SQLITE_DBSTATUS_LOOKASIDE_USED
    +** ^(
    SQLITE_DBSTATUS_LOOKASIDE_USED
    **
    This parameter returns the number of lookaside memory slots currently -** checked out.
    +** checked out.)^ **
    */ #define SQLITE_DBSTATUS_LOOKASIDE_USED 0 /* -** CAPI3REF: Prepared Statement Status {H17550} +** CAPI3REF: Prepared Statement Status ** EXPERIMENTAL ** -** Each prepared statement maintains various +** ^(Each prepared statement maintains various ** [SQLITE_STMTSTATUS_SORT | counters] that measure the number -** of times it has performed specific operations. These counters can +** of times it has performed specific operations.)^ These counters can ** be used to monitor the performance characteristics of the prepared ** statements. For example, if the number of table steps greatly exceeds ** the number of table searches or result rows, that would tend to indicate ** that the prepared statement is using a full table scan rather than ** an index. ** -** This interface is used to retrieve and reset counter values from +** ^(This interface is used to retrieve and reset counter values from ** a [prepared statement]. The first argument is the prepared statement ** object to be interrogated. The second argument ** is an integer code for a specific [SQLITE_STMTSTATUS_SORT | counter] -** to be interrogated. -** The current value of the requested counter is returned. -** If the resetFlg is true, then the counter is reset to zero after this +** to be interrogated.)^ +** ^The current value of the requested counter is returned. +** ^If the resetFlg is true, then the counter is reset to zero after this ** interface call returns. ** ** See also: [sqlite3_status()] and [sqlite3_db_status()]. @@ -5238,7 +5132,7 @@ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_db_status(sqlite3*, int op, int *pCur SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_stmt_status(sqlite3_stmt*, int op,int resetFlg); /* -** CAPI3REF: Status Parameters for prepared statements {H17570} +** CAPI3REF: Status Parameters for prepared statements ** EXPERIMENTAL ** ** These preprocessor macros define integer codes that name counter @@ -5247,13 +5141,13 @@ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_stmt_status(sqlite3_stmt*, int op,int ** **
    **
    SQLITE_STMTSTATUS_FULLSCAN_STEP
    -**
    This is the number of times that SQLite has stepped forward in +**
    ^This is the number of times that SQLite has stepped forward in ** a table as part of a full table scan. Large numbers for this counter ** may indicate opportunities for performance improvement through ** careful use of indices.
    ** **
    SQLITE_STMTSTATUS_SORT
    -**
    This is the number of sort operations that have occurred. +**
    ^This is the number of sort operations that have occurred. ** A non-zero value in this counter may indicate an opportunity to ** improvement performance through careful use of indices.
    ** @@ -5281,9 +5175,9 @@ typedef struct sqlite3_pcache sqlite3_pcache; ** KEYWORDS: {page cache} ** EXPERIMENTAL ** -** The [sqlite3_config]([SQLITE_CONFIG_PCACHE], ...) interface can +** ^(The [sqlite3_config]([SQLITE_CONFIG_PCACHE], ...) interface can ** register an alternative page cache implementation by passing in an -** instance of the sqlite3_pcache_methods structure. The majority of the +** instance of the sqlite3_pcache_methods structure.)^ The majority of the ** heap memory used by SQLite is used by the page cache to cache data read ** from, or ready to be written to, the database file. By implementing a ** custom page cache using this API, an application can control more @@ -5292,69 +5186,69 @@ typedef struct sqlite3_pcache sqlite3_pcache; ** determine exactly which parts of a database file are cached and for ** how long. ** -** The contents of the sqlite3_pcache_methods structure are copied to an +** ^(The contents of the sqlite3_pcache_methods structure are copied to an ** internal buffer by SQLite within the call to [sqlite3_config]. Hence ** the application may discard the parameter after the call to -** [sqlite3_config()] returns. +** [sqlite3_config()] returns.)^ ** -** The xInit() method is called once for each call to [sqlite3_initialize()] -** (usually only once during the lifetime of the process). It is passed -** a copy of the sqlite3_pcache_methods.pArg value. It can be used to set -** up global structures and mutexes required by the custom page cache -** implementation. +** ^The xInit() method is called once for each call to [sqlite3_initialize()] +** (usually only once during the lifetime of the process). ^(The xInit() +** method is passed a copy of the sqlite3_pcache_methods.pArg value.)^ +** ^The xInit() method can set up up global structures and/or any mutexes +** required by the custom page cache implementation. ** -** The xShutdown() method is called from within [sqlite3_shutdown()], +** ^The xShutdown() method is called from within [sqlite3_shutdown()], ** if the application invokes this API. It can be used to clean up ** any outstanding resources before process shutdown, if required. ** -** SQLite holds a [SQLITE_MUTEX_RECURSIVE] mutex when it invokes -** the xInit method, so the xInit method need not be threadsafe. The +** ^SQLite holds a [SQLITE_MUTEX_RECURSIVE] mutex when it invokes +** the xInit method, so the xInit method need not be threadsafe. ^The ** xShutdown method is only called from [sqlite3_shutdown()] so it does ** not need to be threadsafe either. All other methods must be threadsafe ** in multithreaded applications. ** -** SQLite will never invoke xInit() more than once without an intervening +** ^SQLite will never invoke xInit() more than once without an intervening ** call to xShutdown(). ** -** The xCreate() method is used to construct a new cache instance. SQLite +** ^The xCreate() method is used to construct a new cache instance. SQLite ** will typically create one cache instance for each open database file, -** though this is not guaranteed. The +** though this is not guaranteed. ^The ** first parameter, szPage, is the size in bytes of the pages that must -** be allocated by the cache. szPage will not be a power of two. szPage +** be allocated by the cache. ^szPage will not be a power of two. ^szPage ** will the page size of the database file that is to be cached plus an -** increment (here called "R") of about 100 or 200. SQLite will use the +** increment (here called "R") of about 100 or 200. ^SQLite will use the ** extra R bytes on each page to store metadata about the underlying ** database page on disk. The value of R depends ** on the SQLite version, the target platform, and how SQLite was compiled. -** R is constant for a particular build of SQLite. The second argument to +** ^R is constant for a particular build of SQLite. ^The second argument to ** xCreate(), bPurgeable, is true if the cache being created will ** be used to cache database pages of a file stored on disk, or -** false if it is used for an in-memory database. The cache implementation +** false if it is used for an in-memory database. ^The cache implementation ** does not have to do anything special based with the value of bPurgeable; -** it is purely advisory. On a cache where bPurgeable is false, SQLite will +** it is purely advisory. ^On a cache where bPurgeable is false, SQLite will ** never invoke xUnpin() except to deliberately delete a page. -** In other words, a cache created with bPurgeable set to false will +** ^In other words, a cache created with bPurgeable set to false will ** never contain any unpinned pages. ** -** The xCachesize() method may be called at any time by SQLite to set the +** ^(The xCachesize() method may be called at any time by SQLite to set the ** suggested maximum cache-size (number of pages stored by) the cache ** instance passed as the first argument. This is the value configured using -** the SQLite "[PRAGMA cache_size]" command. As with the bPurgeable parameter, -** the implementation is not required to do anything with this +** the SQLite "[PRAGMA cache_size]" command.)^ ^As with the bPurgeable +** parameter, the implementation is not required to do anything with this ** value; it is advisory only. ** -** The xPagecount() method should return the number of pages currently +** ^The xPagecount() method should return the number of pages currently ** stored in the cache. ** -** The xFetch() method is used to fetch a page and return a pointer to it. -** A 'page', in this context, is a buffer of szPage bytes aligned at an -** 8-byte boundary. The page to be fetched is determined by the key. The +** ^The xFetch() method is used to fetch a page and return a pointer to it. +** ^A 'page', in this context, is a buffer of szPage bytes aligned at an +** 8-byte boundary. ^The page to be fetched is determined by the key. ^The ** mimimum key value is 1. After it has been retrieved using xFetch, the page ** is considered to be "pinned". ** -** If the requested page is already in the page cache, then the page cache +** ^If the requested page is already in the page cache, then the page cache ** implementation must return a pointer to the page buffer with its content -** intact. If the requested page is not already in the cache, then the +** intact. ^(If the requested page is not already in the cache, then the ** behavior of the cache implementation is determined by the value of the ** createFlag parameter passed to xFetch, according to the following table: ** @@ -5365,7 +5259,7 @@ typedef struct sqlite3_pcache sqlite3_pcache; ** Otherwise return NULL. ** 2 Make every effort to allocate a new page. Only return ** NULL if allocating a new page is effectively impossible. -** +** )^ ** ** SQLite will normally invoke xFetch() with a createFlag of 0 or 1. If ** a call to xFetch() with createFlag==1 returns NULL, then SQLite will @@ -5374,32 +5268,32 @@ typedef struct sqlite3_pcache sqlite3_pcache; ** attempting to unpin pages, the xFetch() method will be invoked again with ** a createFlag of 2. ** -** xUnpin() is called by SQLite with a pointer to a currently pinned page -** as its second argument. If the third parameter, discard, is non-zero, +** ^xUnpin() is called by SQLite with a pointer to a currently pinned page +** as its second argument. ^(If the third parameter, discard, is non-zero, ** then the page should be evicted from the cache. In this case SQLite ** assumes that the next time the page is retrieved from the cache using -** the xFetch() method, it will be zeroed. If the discard parameter is -** zero, then the page is considered to be unpinned. The cache implementation +** the xFetch() method, it will be zeroed.)^ ^If the discard parameter is +** zero, then the page is considered to be unpinned. ^The cache implementation ** may choose to evict unpinned pages at any time. ** -** The cache is not required to perform any reference counting. A single +** ^(The cache is not required to perform any reference counting. A single ** call to xUnpin() unpins the page regardless of the number of prior calls -** to xFetch(). +** to xFetch().)^ ** -** The xRekey() method is used to change the key value associated with the -** page passed as the second argument from oldKey to newKey. If the cache +** ^The xRekey() method is used to change the key value associated with the +** page passed as the second argument from oldKey to newKey. ^If the cache ** previously contains an entry associated with newKey, it should be -** discarded. Any prior cache entry associated with newKey is guaranteed not +** discarded. ^Any prior cache entry associated with newKey is guaranteed not ** to be pinned. ** -** When SQLite calls the xTruncate() method, the cache must discard all +** ^When SQLite calls the xTruncate() method, the cache must discard all ** existing cache entries with page numbers (keys) greater than or equal -** to the value of the iLimit parameter passed to xTruncate(). If any +** to the value of the iLimit parameter passed to xTruncate(). ^If any ** of these pages are pinned, they are implicitly unpinned, meaning that ** they can be safely discarded. ** -** The xDestroy() method is used to delete a cache allocated by xCreate(). -** All resources associated with the specified cache should be freed. After +** ^The xDestroy() method is used to delete a cache allocated by xCreate(). +** All resources associated with the specified cache should be freed. ^After ** calling the xDestroy() method, SQLite considers the [sqlite3_pcache*] ** handle invalid, and will not use it with any other sqlite3_pcache_methods ** functions. @@ -5424,7 +5318,7 @@ struct sqlite3_pcache_methods { ** EXPERIMENTAL ** ** The sqlite3_backup object records state information about an ongoing -** online backup operation. The sqlite3_backup object is created by +** online backup operation. ^The sqlite3_backup object is created by ** a call to [sqlite3_backup_init()] and is destroyed by a call to ** [sqlite3_backup_finish()]. ** @@ -5436,20 +5330,20 @@ typedef struct sqlite3_backup sqlite3_backup; ** CAPI3REF: Online Backup API. ** EXPERIMENTAL ** -** This API is used to overwrite the contents of one database with that -** of another. It is useful either for creating backups of databases or +** The backup API copies the content of one database into another. +** It is useful either for creating backups of databases or ** for copying in-memory databases to or from persistent files. ** ** See Also: [Using the SQLite Online Backup API] ** -** Exclusive access is required to the destination database for the -** duration of the operation. However the source database is only -** read-locked while it is actually being read, it is not locked -** continuously for the entire operation. Thus, the backup may be -** performed on a live database without preventing other users from -** writing to the database for an extended period of time. +** ^Exclusive access is required to the destination database for the +** duration of the operation. ^However the source database is only +** read-locked while it is actually being read; it is not locked +** continuously for the entire backup operation. ^Thus, the backup may be +** performed on a live source database without preventing other users from +** reading or writing to the source database while the backup is underway. ** -** To perform a backup operation: +** ^(To perform a backup operation: **
      **
    1. sqlite3_backup_init() is called once to initialize the ** backup, @@ -5457,143 +5351,148 @@ typedef struct sqlite3_backup sqlite3_backup; ** the data between the two databases, and finally **
    2. sqlite3_backup_finish() is called to release all resources ** associated with the backup operation. -**
    +** )^ ** There should be exactly one call to sqlite3_backup_finish() for each ** successful call to sqlite3_backup_init(). ** ** sqlite3_backup_init() ** -** The first two arguments passed to [sqlite3_backup_init()] are the database -** handle associated with the destination database and the database name -** used to attach the destination database to the handle. The database name -** is "main" for the main database, "temp" for the temporary database, or -** the name specified as part of the [ATTACH] statement if the destination is -** an attached database. The third and fourth arguments passed to -** sqlite3_backup_init() identify the [database connection] -** and database name used -** to access the source database. The values passed for the source and -** destination [database connection] parameters must not be the same. -** -** If an error occurs within sqlite3_backup_init(), then NULL is returned -** and an error code and error message written into the [database connection] -** passed as the first argument. They may be retrieved using the -** [sqlite3_errcode()], [sqlite3_errmsg()], and [sqlite3_errmsg16()] functions. -** Otherwise, if successful, a pointer to an [sqlite3_backup] object is -** returned. This pointer may be used with the sqlite3_backup_step() and +** ^The D and N arguments to sqlite3_backup_init(D,N,S,M) are the +** [database connection] associated with the destination database +** and the database name, respectively. +** ^The database name is "main" for the main database, "temp" for the +** temporary database, or the name specified after the AS keyword in +** an [ATTACH] statement for an attached database. +** ^The S and M arguments passed to +** sqlite3_backup_init(D,N,S,M) identify the [database connection] +** and database name of the source database, respectively. +** ^The source and destination [database connections] (parameters S and D) +** must be different or else sqlite3_backup_init(D,N,S,M) will file with +** an error. +** +** ^If an error occurs within sqlite3_backup_init(D,N,S,M), then NULL is +** returned and an error code and error message are store3d in the +** destination [database connection] D. +** ^The error code and message for the failed call to sqlite3_backup_init() +** can be retrieved using the [sqlite3_errcode()], [sqlite3_errmsg()], and/or +** [sqlite3_errmsg16()] functions. +** ^A successful call to sqlite3_backup_init() returns a pointer to an +** [sqlite3_backup] object. +** ^The [sqlite3_backup] object may be used with the sqlite3_backup_step() and ** sqlite3_backup_finish() functions to perform the specified backup ** operation. ** ** sqlite3_backup_step() ** -** Function [sqlite3_backup_step()] is used to copy up to nPage pages between -** the source and destination databases, where nPage is the value of the -** second parameter passed to sqlite3_backup_step(). If nPage is a negative -** value, all remaining source pages are copied. If the required pages are -** succesfully copied, but there are still more pages to copy before the -** backup is complete, it returns [SQLITE_OK]. If no error occured and there -** are no more pages to copy, then [SQLITE_DONE] is returned. If an error -** occurs, then an SQLite error code is returned. As well as [SQLITE_OK] and +** ^Function sqlite3_backup_step(B,N) will copy up to N pages between +** the source and destination databases specified by [sqlite3_backup] object B. +** ^If N is negative, all remaining source pages are copied. +** ^If sqlite3_backup_step(B,N) successfully copies N pages and there +** are still more pages to be copied, then the function resturns [SQLITE_OK]. +** ^If sqlite3_backup_step(B,N) successfully finishes copying all pages +** from source to destination, then it returns [SQLITE_DONE]. +** ^If an error occurs while running sqlite3_backup_step(B,N), +** then an [error code] is returned. ^As well as [SQLITE_OK] and ** [SQLITE_DONE], a call to sqlite3_backup_step() may return [SQLITE_READONLY], ** [SQLITE_NOMEM], [SQLITE_BUSY], [SQLITE_LOCKED], or an ** [SQLITE_IOERR_ACCESS | SQLITE_IOERR_XXX] extended error code. ** -** As well as the case where the destination database file was opened for -** read-only access, sqlite3_backup_step() may return [SQLITE_READONLY] if +** ^The sqlite3_backup_step() might return [SQLITE_READONLY] if the destination +** database was opened read-only or if ** the destination is an in-memory database with a different page size ** from the source database. ** -** If sqlite3_backup_step() cannot obtain a required file-system lock, then +** ^If sqlite3_backup_step() cannot obtain a required file-system lock, then ** the [sqlite3_busy_handler | busy-handler function] -** is invoked (if one is specified). If the +** is invoked (if one is specified). ^If the ** busy-handler returns non-zero before the lock is available, then -** [SQLITE_BUSY] is returned to the caller. In this case the call to -** sqlite3_backup_step() can be retried later. If the source +** [SQLITE_BUSY] is returned to the caller. ^In this case the call to +** sqlite3_backup_step() can be retried later. ^If the source ** [database connection] ** is being used to write to the source database when sqlite3_backup_step() -** is called, then [SQLITE_LOCKED] is returned immediately. Again, in this -** case the call to sqlite3_backup_step() can be retried later on. If +** is called, then [SQLITE_LOCKED] is returned immediately. ^Again, in this +** case the call to sqlite3_backup_step() can be retried later on. ^(If ** [SQLITE_IOERR_ACCESS | SQLITE_IOERR_XXX], [SQLITE_NOMEM], or ** [SQLITE_READONLY] is returned, then ** there is no point in retrying the call to sqlite3_backup_step(). These -** errors are considered fatal. At this point the application must accept +** errors are considered fatal.)^ The application must accept ** that the backup operation has failed and pass the backup operation handle ** to the sqlite3_backup_finish() to release associated resources. ** -** Following the first call to sqlite3_backup_step(), an exclusive lock is -** obtained on the destination file. It is not released until either +** ^The first call to sqlite3_backup_step() obtains an exclusive lock +** on the destination file. ^The exclusive lock is not released until either ** sqlite3_backup_finish() is called or the backup operation is complete -** and sqlite3_backup_step() returns [SQLITE_DONE]. Additionally, each time -** a call to sqlite3_backup_step() is made a [shared lock] is obtained on -** the source database file. This lock is released before the -** sqlite3_backup_step() call returns. Because the source database is not -** locked between calls to sqlite3_backup_step(), it may be modified mid-way -** through the backup procedure. If the source database is modified by an +** and sqlite3_backup_step() returns [SQLITE_DONE]. ^Every call to +** sqlite3_backup_step() obtains a [shared lock] on the source database that +** lasts for the duration of the sqlite3_backup_step() call. +** ^Because the source database is not locked between calls to +** sqlite3_backup_step(), the source database may be modified mid-way +** through the backup process. ^If the source database is modified by an ** external process or via a database connection other than the one being -** used by the backup operation, then the backup will be transparently -** restarted by the next call to sqlite3_backup_step(). If the source +** used by the backup operation, then the backup will be automatically +** restarted by the next call to sqlite3_backup_step(). ^If the source ** database is modified by the using the same database connection as is used -** by the backup operation, then the backup database is transparently +** by the backup operation, then the backup database is automatically ** updated at the same time. ** ** sqlite3_backup_finish() ** -** Once sqlite3_backup_step() has returned [SQLITE_DONE], or when the -** application wishes to abandon the backup operation, the [sqlite3_backup] -** object should be passed to sqlite3_backup_finish(). This releases all -** resources associated with the backup operation. If sqlite3_backup_step() -** has not yet returned [SQLITE_DONE], then any active write-transaction on the -** destination database is rolled back. The [sqlite3_backup] object is invalid +** When sqlite3_backup_step() has returned [SQLITE_DONE], or when the +** application wishes to abandon the backup operation, the application +** should destroy the [sqlite3_backup] by passing it to sqlite3_backup_finish(). +** ^The sqlite3_backup_finish() interfaces releases all +** resources associated with the [sqlite3_backup] object. +** ^If sqlite3_backup_step() has not yet returned [SQLITE_DONE], then any +** active write-transaction on the destination database is rolled back. +** The [sqlite3_backup] object is invalid ** and may not be used following a call to sqlite3_backup_finish(). ** -** The value returned by sqlite3_backup_finish is [SQLITE_OK] if no error -** occurred, regardless or whether or not sqlite3_backup_step() was called -** a sufficient number of times to complete the backup operation. Or, if -** an out-of-memory condition or IO error occured during a call to -** sqlite3_backup_step() then [SQLITE_NOMEM] or an -** [SQLITE_IOERR_ACCESS | SQLITE_IOERR_XXX] error code -** is returned. In this case the error code and an error message are -** written to the destination [database connection]. -** -** A return of [SQLITE_BUSY] or [SQLITE_LOCKED] from sqlite3_backup_step() is -** not a permanent error and does not affect the return value of +** ^The value returned by sqlite3_backup_finish is [SQLITE_OK] if no +** sqlite3_backup_step() errors occurred, regardless or whether or not +** sqlite3_backup_step() completed. +** ^If an out-of-memory condition or IO error occurred during any prior +** sqlite3_backup_step() call on the same [sqlite3_backup] object, then +** sqlite3_backup_finish() returns the corresponding [error code]. +** +** ^A return of [SQLITE_BUSY] or [SQLITE_LOCKED] from sqlite3_backup_step() +** is not a permanent error and does not affect the return value of ** sqlite3_backup_finish(). ** ** sqlite3_backup_remaining(), sqlite3_backup_pagecount() ** -** Each call to sqlite3_backup_step() sets two values stored internally -** by an [sqlite3_backup] object. The number of pages still to be backed -** up, which may be queried by sqlite3_backup_remaining(), and the total -** number of pages in the source database file, which may be queried by -** sqlite3_backup_pagecount(). +** ^Each call to sqlite3_backup_step() sets two values inside +** the [sqlite3_backup] object: the number of pages still to be backed +** up and the total number of pages in the source databae file. +** The sqlite3_backup_remaining() and sqlite3_backup_pagecount() interfaces +** retrieve these two values, respectively. ** -** The values returned by these functions are only updated by -** sqlite3_backup_step(). If the source database is modified during a backup +** ^The values returned by these functions are only updated by +** sqlite3_backup_step(). ^If the source database is modified during a backup ** operation, then the values are not updated to account for any extra ** pages that need to be updated or the size of the source database file ** changing. ** ** Concurrent Usage of Database Handles ** -** The source [database connection] may be used by the application for other +** ^The source [database connection] may be used by the application for other ** purposes while a backup operation is underway or being initialized. -** If SQLite is compiled and configured to support threadsafe database +** ^If SQLite is compiled and configured to support threadsafe database ** connections, then the source database connection may be used concurrently ** from within other threads. ** -** However, the application must guarantee that the destination database -** connection handle is not passed to any other API (by any thread) after +** However, the application must guarantee that the destination +** [database connection] is not passed to any other API (by any thread) after ** sqlite3_backup_init() is called and before the corresponding call to -** sqlite3_backup_finish(). Unfortunately SQLite does not currently check -** for this, if the application does use the destination [database connection] -** for some other purpose during a backup operation, things may appear to -** work correctly but in fact be subtly malfunctioning. Use of the -** destination database connection while a backup is in progress might -** also cause a mutex deadlock. -** -** Furthermore, if running in [shared cache mode], the application must +** sqlite3_backup_finish(). SQLite does not currently check to see +** if the application incorrectly accesses the destination [database connection] +** and so no error code is reported, but the operations may malfunction +** nevertheless. Use of the destination database connection while a +** backup is in progress might also also cause a mutex deadlock. +** +** If running in [shared cache mode], the application must ** guarantee that the shared cache used by the destination database ** is not accessed while the backup is running. In practice this means -** that the application must guarantee that the file-system file being +** that the application must guarantee that the disk file being ** backed up to is not accessed by any connection within the process, ** not just the specific connection that was passed to sqlite3_backup_init(). ** @@ -5619,48 +5518,48 @@ SQLITE_API int sqlite3_backup_pagecount(sqlite3_backup *p); ** CAPI3REF: Unlock Notification ** EXPERIMENTAL ** -** When running in shared-cache mode, a database operation may fail with +** ^When running in shared-cache mode, a database operation may fail with ** an [SQLITE_LOCKED] error if the required locks on the shared-cache or ** individual tables within the shared-cache cannot be obtained. See ** [SQLite Shared-Cache Mode] for a description of shared-cache locking. -** This API may be used to register a callback that SQLite will invoke +** ^This API may be used to register a callback that SQLite will invoke ** when the connection currently holding the required lock relinquishes it. -** This API is only available if the library was compiled with the +** ^This API is only available if the library was compiled with the ** [SQLITE_ENABLE_UNLOCK_NOTIFY] C-preprocessor symbol defined. ** ** See Also: [Using the SQLite Unlock Notification Feature]. ** -** Shared-cache locks are released when a database connection concludes +** ^Shared-cache locks are released when a database connection concludes ** its current transaction, either by committing it or rolling it back. ** -** When a connection (known as the blocked connection) fails to obtain a +** ^When a connection (known as the blocked connection) fails to obtain a ** shared-cache lock and SQLITE_LOCKED is returned to the caller, the ** identity of the database connection (the blocking connection) that -** has locked the required resource is stored internally. After an +** has locked the required resource is stored internally. ^After an ** application receives an SQLITE_LOCKED error, it may call the ** sqlite3_unlock_notify() method with the blocked connection handle as ** the first argument to register for a callback that will be invoked -** when the blocking connections current transaction is concluded. The +** when the blocking connections current transaction is concluded. ^The ** callback is invoked from within the [sqlite3_step] or [sqlite3_close] ** call that concludes the blocking connections transaction. ** -** If sqlite3_unlock_notify() is called in a multi-threaded application, +** ^(If sqlite3_unlock_notify() is called in a multi-threaded application, ** there is a chance that the blocking connection will have already ** concluded its transaction by the time sqlite3_unlock_notify() is invoked. ** If this happens, then the specified callback is invoked immediately, -** from within the call to sqlite3_unlock_notify(). +** from within the call to sqlite3_unlock_notify().)^ ** -** If the blocked connection is attempting to obtain a write-lock on a +** ^If the blocked connection is attempting to obtain a write-lock on a ** shared-cache table, and more than one other connection currently holds ** a read-lock on the same table, then SQLite arbitrarily selects one of ** the other connections to use as the blocking connection. ** -** There may be at most one unlock-notify callback registered by a +** ^(There may be at most one unlock-notify callback registered by a ** blocked connection. If sqlite3_unlock_notify() is called when the ** blocked connection already has a registered unlock-notify callback, -** then the new callback replaces the old. If sqlite3_unlock_notify() is +** then the new callback replaces the old.)^ ^If sqlite3_unlock_notify() is ** called with a NULL pointer as its second argument, then any existing -** unlock-notify callback is cancelled. The blocked connections +** unlock-notify callback is cancelled. ^The blocked connections ** unlock-notify callback may also be canceled by closing the blocked ** connection using [sqlite3_close()]. ** @@ -5668,7 +5567,7 @@ SQLITE_API int sqlite3_backup_pagecount(sqlite3_backup *p); ** any sqlite3_xxx API functions from within an unlock-notify callback, a ** crash or deadlock may be the result. ** -** Unless deadlock is detected (see below), sqlite3_unlock_notify() always +** ^Unless deadlock is detected (see below), sqlite3_unlock_notify() always ** returns SQLITE_OK. ** ** Callback Invocation Details @@ -5682,7 +5581,7 @@ SQLITE_API int sqlite3_backup_pagecount(sqlite3_backup *p); ** ** When a blocking connections transaction is concluded, there may be ** more than one blocked connection that has registered for an unlock-notify -** callback. If two or more such blocked connections have specified the +** callback. ^If two or more such blocked connections have specified the ** same callback function, then instead of invoking the callback function ** multiple times, it is invoked once with the set of void* context pointers ** specified by the blocked connections bundled together into an array. @@ -5700,16 +5599,16 @@ SQLITE_API int sqlite3_backup_pagecount(sqlite3_backup *p); ** will proceed and the system may remain deadlocked indefinitely. ** ** To avoid this scenario, the sqlite3_unlock_notify() performs deadlock -** detection. If a given call to sqlite3_unlock_notify() would put the +** detection. ^If a given call to sqlite3_unlock_notify() would put the ** system in a deadlocked state, then SQLITE_LOCKED is returned and no ** unlock-notify callback is registered. The system is said to be in ** a deadlocked state if connection A has registered for an unlock-notify ** callback on the conclusion of connection B's transaction, and connection ** B has itself registered for an unlock-notify callback when connection -** A's transaction is concluded. Indirect deadlock is also detected, so +** A's transaction is concluded. ^Indirect deadlock is also detected, so ** the system is also considered to be deadlocked if connection B has ** registered for an unlock-notify callback on the conclusion of connection -** C's transaction, where connection C is waiting on connection A. Any +** C's transaction, where connection C is waiting on connection A. ^Any ** number of levels of indirection are allowed. ** ** The "DROP TABLE" Exception @@ -5725,10 +5624,10 @@ SQLITE_API int sqlite3_backup_pagecount(sqlite3_backup *p); ** or "DROP INDEX" query, an infinite loop might be the result. ** ** One way around this problem is to check the extended error code returned -** by an sqlite3_step() call. If there is a blocking connection, then the +** by an sqlite3_step() call. ^(If there is a blocking connection, then the ** extended error code is set to SQLITE_LOCKED_SHAREDCACHE. Otherwise, in ** the special "DROP TABLE/INDEX" case, the extended error code is just -** SQLITE_LOCKED. +** SQLITE_LOCKED.)^ */ SQLITE_API int sqlite3_unlock_notify( sqlite3 *pBlocked, /* Waiting connection */ @@ -5741,7 +5640,7 @@ SQLITE_API int sqlite3_unlock_notify( ** CAPI3REF: String Comparison ** EXPERIMENTAL ** -** The [sqlite3_strnicmp()] API allows applications and extensions to +** ^The [sqlite3_strnicmp()] API allows applications and extensions to ** compare the contents of two buffers containing UTF-8 strings in a ** case-indendent fashion, using the same definition of case independence ** that SQLite uses internally when comparing identifiers. diff --git a/ext/sqlite3/libsqlite/sqlite3ext.h b/ext/sqlite3/libsqlite/sqlite3ext.h index 102aaeac8..0d37bbe01 100644 --- a/ext/sqlite3/libsqlite/sqlite3ext.h +++ b/ext/sqlite3/libsqlite/sqlite3ext.h @@ -14,8 +14,6 @@ ** an SQLite instance. Shared libraries that intend to be loaded ** as extensions by SQLite should #include this file instead of ** sqlite3.h. -** -** @(#) $Id: sqlite3ext.h 283115 2009-06-30 11:17:14Z scottmac $ */ #ifndef _SQLITE3EXT_H_ #define _SQLITE3EXT_H_ diff --git a/ext/sqlite3/php_sqlite3.h b/ext/sqlite3/php_sqlite3.h index 48f2afdb6..ea8180976 100644 --- a/ext/sqlite3/php_sqlite3.h +++ b/ext/sqlite3/php_sqlite3.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_sqlite3.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_sqlite3.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_SQLITE3_H #define PHP_SQLITE3_H diff --git a/ext/sqlite3/php_sqlite3_structs.h b/ext/sqlite3/php_sqlite3_structs.h index 866871e75..348836136 100644 --- a/ext/sqlite3/php_sqlite3_structs.h +++ b/ext/sqlite3/php_sqlite3_structs.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_sqlite3_structs.h 279456 2009-04-27 18:16:46Z scottmac $ */ +/* $Id: php_sqlite3_structs.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_SQLITE_STRUCTS_H #define PHP_SQLITE_STRUCTS_H diff --git a/ext/sqlite3/sqlite3.c b/ext/sqlite3/sqlite3.c index 70fab57ce..372ecda44 100644 --- a/ext/sqlite3/sqlite3.c +++ b/ext/sqlite3/sqlite3.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: sqlite3.c 281793 2009-06-08 02:15:54Z scottmac $ */ +/* $Id: sqlite3.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -851,9 +851,7 @@ PHP_METHOD(sqlite3, createFunction) func->func_name = estrdup(sql_func); MAKE_STD_ZVAL(func->func); - *(func->func) = *callback_func; - zval_copy_ctor(func->func); - INIT_PZVAL(func->func); + MAKE_COPY_ZVAL(&callback_func, func->func); func->argc = sql_func_num_args; func->next = db_obj->funcs; @@ -910,14 +908,10 @@ PHP_METHOD(sqlite3, createAggregate) func->func_name = estrdup(sql_func); MAKE_STD_ZVAL(func->step); - *(func->step) = *step_callback; - zval_copy_ctor(func->step); - INIT_PZVAL(func->step); + MAKE_COPY_ZVAL(&step_callback, func->step); MAKE_STD_ZVAL(func->fini); - *(func->fini) = *fini_callback; - zval_copy_ctor(func->fini); - INIT_PZVAL(func->fini); + MAKE_COPY_ZVAL(&fini_callback, func->fini); func->argc = sql_func_num_args; func->next = db_obj->funcs; diff --git a/ext/standard/array.c b/ext/standard/array.c index 457f8b1ce..e4156e89d 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -21,7 +21,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: array.c 287275 2009-08-14 06:20:21Z dmitry $ */ +/* $Id: array.c 293982 2010-01-25 14:11:32Z johannes $ */ #include "php.h" #include "php_ini.h" @@ -768,6 +768,7 @@ static int php_array_user_key_compare(const void *a, const void *b TSRMLS_DC) /* PHP_FUNCTION(uksort) { zval *array; + int refcount; PHP_ARRAY_CMP_FUNC_VARS; PHP_ARRAY_CMP_FUNC_BACKUP(); @@ -777,13 +778,31 @@ PHP_FUNCTION(uksort) return; } + /* Clear the is_ref flag, so the attemts to modify the array in user + * comaprison function will create a copy of array and won't affect the + * original array. The fact of modification is detected using refcount + * comparison. The result of sorting in such case is undefined and the + * function returns FALSE. + */ + Z_UNSET_ISREF_P(array); + refcount = Z_REFCOUNT_P(array); + if (zend_hash_sort(Z_ARRVAL_P(array), zend_qsort, php_array_user_key_compare, 0 TSRMLS_CC) == FAILURE) { - PHP_ARRAY_CMP_FUNC_RESTORE(); - RETURN_FALSE; + RETVAL_FALSE; + } else { + if (refcount > Z_REFCOUNT_P(array)) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Array was modified by the user comparison function"); + RETVAL_FALSE; + } else { + RETVAL_TRUE; + } + } + + if (Z_REFCOUNT_P(array) > 1) { + Z_SET_ISREF_P(array); } PHP_ARRAY_CMP_FUNC_RESTORE(); - RETURN_TRUE; } /* }}} */ @@ -1364,6 +1383,9 @@ PHP_FUNCTION(extract) if (var_exists && var_name_len == sizeof("GLOBALS") && !strcmp(var_name, "GLOBALS")) { break; } + if (var_exists && var_name_len == sizeof("this") && !strcmp(var_name, "this") && EG(scope) && EG(scope)->name_length != 0) { + break; + } ZVAL_STRINGL(&final_name, var_name, var_name_len, 1); break; @@ -1445,9 +1467,7 @@ static void php_compact_var(HashTable *eg_active_symbol_table, zval *return_valu if (zend_hash_find(eg_active_symbol_table, Z_STRVAL_P(entry), Z_STRLEN_P(entry) + 1, (void **)&value_ptr) != FAILURE) { value = *value_ptr; ALLOC_ZVAL(data); - *data = *value; - zval_copy_ctor(data); - INIT_PZVAL(data); + MAKE_COPY_ZVAL(&value, data); zend_hash_update(Z_ARRVAL_P(return_value), Z_STRVAL_P(entry), Z_STRLEN_P(entry) + 1, &data, sizeof(zval *), NULL); } @@ -4070,9 +4090,7 @@ PHP_FUNCTION(array_reduce) if (ZEND_NUM_ARGS() > 2) { ALLOC_ZVAL(result); - *result = *initial; - zval_copy_ctor(result); - INIT_PZVAL(result); + MAKE_COPY_ZVAL(&initial, result); } else { MAKE_STD_ZVAL(result); ZVAL_NULL(result); diff --git a/ext/standard/assert.c b/ext/standard/assert.c index af5ffff85..1730e417b 100644 --- a/ext/standard/assert.c +++ b/ext/standard/assert.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: assert.c 284153 2009-07-15 23:55:50Z stas $ */ +/* $Id: assert.c 293036 2010-01-03 09:23:27Z sebastian $ */ /* {{{ includes */ #include "php.h" diff --git a/ext/standard/base64.c b/ext/standard/base64.c index 42f5c5302..dff905547 100644 --- a/ext/standard/base64.c +++ b/ext/standard/base64.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -15,7 +15,7 @@ | Author: Jim Winstead | +----------------------------------------------------------------------+ */ -/* $Id: base64.c 274569 2009-01-25 18:27:12Z iliaa $ */ +/* $Id: base64.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include diff --git a/ext/standard/base64.h b/ext/standard/base64.h index 4f43dbb69..89760959a 100644 --- a/ext/standard/base64.h +++ b/ext/standard/base64.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: base64.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: base64.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef BASE64_H #define BASE64_H diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index f7b394a04..cd722db29 100644 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: basic_functions.c 289669 2009-10-15 14:10:03Z pajoye $ */ +/* $Id: basic_functions.c 294503 2010-02-04 09:08:57Z pajoye $ */ #include "php.h" #include "php_streams.h" @@ -1301,6 +1301,12 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_clearstatcache, 0, 0, 0) ZEND_ARG_INFO(0, filename) ZEND_END_ARG_INFO() +ZEND_BEGIN_ARG_INFO(arginfo_realpath_cache_size, 0) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO(arginfo_realpath_cache_get, 0) +ZEND_END_ARG_INFO() + ZEND_BEGIN_ARG_INFO(arginfo_fileperms, 0) ZEND_ARG_INFO(0, filename) ZEND_END_ARG_INFO() @@ -2004,6 +2010,10 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO(arginfo_stream_get_wrappers, 0) ZEND_END_ARG_INFO() +ZEND_BEGIN_ARG_INFO(arginfo_stream_resolve_include_path, 0) + ZEND_ARG_INFO(0, filename) +ZEND_END_ARG_INFO() + ZEND_BEGIN_ARG_INFO(arginfo_stream_is_local, 0) ZEND_ARG_INFO(0, stream) ZEND_END_ARG_INFO() @@ -3109,6 +3119,7 @@ const zend_function_entry basic_functions[] = { /* {{{ */ PHP_FE(stream_wrapper_restore, arginfo_stream_wrapper_restore) PHP_FE(stream_get_wrappers, arginfo_stream_get_wrappers) PHP_FE(stream_get_transports, arginfo_stream_get_transports) + PHP_FE(stream_resolve_include_path, arginfo_stream_resolve_include_path) PHP_FE(stream_is_local, arginfo_stream_is_local) PHP_FE(get_headers, arginfo_get_headers) @@ -3198,6 +3209,8 @@ const zend_function_entry basic_functions[] = { /* {{{ */ PHP_FE(disk_total_space, arginfo_disk_total_space) PHP_FE(disk_free_space, arginfo_disk_free_space) PHP_FALIAS(diskfreespace, disk_free_space, arginfo_disk_free_space) + PHP_FE(realpath_cache_size, arginfo_realpath_cache_size) + PHP_FE(realpath_cache_get, arginfo_realpath_cache_get) /* functions from mail.c */ PHP_FE(mail, arginfo_mail) @@ -4043,7 +4056,7 @@ PHP_FUNCTION(putenv) pe.key_len = strlen(pe.key); #ifdef PHP_WIN32 if (equals) { - if (pe.key_len < setting_len - 2) { + if (pe.key_len < setting_len - 1) { value = p + 1; } else { /* empty string*/ @@ -4652,7 +4665,7 @@ PHP_FUNCTION(error_log) opt_err = erropt; } - if (_php_error_log(opt_err, message, opt, headers TSRMLS_CC) == FAILURE) { + if (_php_error_log_ex(opt_err, message, message_len, opt, headers TSRMLS_CC) == FAILURE) { RETURN_FALSE; } @@ -4660,17 +4673,22 @@ PHP_FUNCTION(error_log) } /* }}} */ +/* For BC (not binary-safe!) */ PHPAPI int _php_error_log(int opt_err, char *message, char *opt, char *headers TSRMLS_DC) /* {{{ */ { - php_stream *stream = NULL; + return _php_error_log_ex(opt_err, message, (opt_err == 3) ? strlen(message) : 0, opt, headers TSRMLS_CC); +} +/* }}} */ - switch (opt_err) { +PHPAPI int _php_error_log_ex(int opt_err, char *message, int message_len, char *opt, char *headers TSRMLS_DC) /* {{{ */ +{ + php_stream *stream = NULL; + switch (opt_err) + { case 1: /*send an email */ - { - if (!php_mail(opt, "PHP error_log message", message, headers, NULL TSRMLS_CC)) { - return FAILURE; - } + if (!php_mail(opt, "PHP error_log message", message, headers, NULL TSRMLS_CC)) { + return FAILURE; } break; @@ -4681,11 +4699,13 @@ PHPAPI int _php_error_log(int opt_err, char *message, char *opt, char *headers T case 3: /*save to a file */ stream = php_stream_open_wrapper(opt, "a", IGNORE_URL_WIN | ENFORCE_SAFE_MODE | REPORT_ERRORS, NULL); - if (!stream) + if (!stream) { return FAILURE; - php_stream_write(stream, message, strlen(message)); + } + php_stream_write(stream, message, message_len); php_stream_close(stream); break; + case 4: /* send to SAPI */ if (sapi_module.log_message) { sapi_module.log_message(message); @@ -4693,6 +4713,7 @@ PHPAPI int _php_error_log(int opt_err, char *message, char *opt, char *headers T return FAILURE; } break; + default: php_log_err(message TSRMLS_CC); break; @@ -5561,6 +5582,15 @@ PHP_FUNCTION(getservbyname) return; } + +/* empty string behaves like NULL on windows implementation of + getservbyname. Let be portable instead. */ +#ifdef PHP_WIN32 + if (proto_len == 0) { + RETURN_FALSE; + } +#endif + serv = getservbyname(name, proto); if (serv == NULL) { @@ -5821,9 +5851,7 @@ static void php_simple_ini_parser_cb(zval *arg1, zval *arg2, zval *arg3, int cal break; } ALLOC_ZVAL(element); - *element = *arg2; - zval_copy_ctor(element); - INIT_PZVAL(element); + MAKE_COPY_ZVAL(&arg2, element); zend_symtable_update(Z_ARRVAL_P(arr), Z_STRVAL_P(arg1), Z_STRLEN_P(arg1) + 1, &element, sizeof(zval *), NULL); break; @@ -5866,9 +5894,7 @@ static void php_simple_ini_parser_cb(zval *arg1, zval *arg2, zval *arg3, int cal } ALLOC_ZVAL(element); - *element = *arg2; - zval_copy_ctor(element); - INIT_PZVAL(element); + MAKE_COPY_ZVAL(&arg2, element); if (arg3 && Z_STRLEN_P(arg3) > 0) { add_assoc_zval_ex(hash, Z_STRVAL_P(arg3), Z_STRLEN_P(arg3) + 1, element); diff --git a/ext/standard/basic_functions.h b/ext/standard/basic_functions.h index bc18f073b..acd17e5b3 100644 --- a/ext/standard/basic_functions.h +++ b/ext/standard/basic_functions.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: basic_functions.h 286378 2009-07-26 22:59:46Z jani $ */ +/* $Id: basic_functions.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef BASIC_FUNCTIONS_H #define BASIC_FUNCTIONS_H @@ -141,7 +141,9 @@ PHP_FUNCTION(stream_bucket_new); PHP_MINIT_FUNCTION(user_filters); PHP_RSHUTDOWN_FUNCTION(user_filters); +/* Left for BC (not binary safe!) */ PHPAPI int _php_error_log(int opt_err, char *message, char *opt, char *headers TSRMLS_DC); +PHPAPI int _php_error_log_ex(int opt_err, char *message, int message_len, char *opt, char *headers TSRMLS_DC); PHPAPI int php_prefix_varname(zval *result, zval *prefix, char *var_name, int var_name_len, zend_bool add_underscore TSRMLS_DC); #if SIZEOF_INT == 4 diff --git a/ext/standard/browscap.c b/ext/standard/browscap.c index c0b202979..9106727a0 100644 --- a/ext/standard/browscap.c +++ b/ext/standard/browscap.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: browscap.c 281742 2009-06-06 02:40:49Z mattwil $ */ +/* $Id: browscap.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php.h" #include "php_browscap.h" @@ -328,7 +328,7 @@ PHP_FUNCTION(get_browser) char *agent_name = NULL; int agent_name_len = 0; zend_bool return_array = 0; - zval **agent, **z_agent_name; + zval **agent, **z_agent_name, **http_user_agent; zval *found_browser_entry, *tmp_copy; char *lookup_browser_name; char *browscap = INI_STR("browscap"); @@ -344,11 +344,14 @@ PHP_FUNCTION(get_browser) if (agent_name == NULL) { zend_is_auto_global("_SERVER", sizeof("_SERVER") - 1 TSRMLS_CC); - if (!PG(http_globals)[TRACK_VARS_SERVER] - || zend_hash_find(PG(http_globals)[TRACK_VARS_SERVER]->value.ht, "HTTP_USER_AGENT", sizeof("HTTP_USER_AGENT"), (void **) &agent_name) == FAILURE) { + if (!PG(http_globals)[TRACK_VARS_SERVER] || + zend_hash_find(HASH_OF(PG(http_globals)[TRACK_VARS_SERVER]), "HTTP_USER_AGENT", sizeof("HTTP_USER_AGENT"), (void **) &http_user_agent) == FAILURE + ) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "HTTP_USER_AGENT variable is not set, cannot determine user agent name"); RETURN_FALSE; } + agent_name = Z_STRVAL_PP(http_user_agent); + agent_name_len = Z_STRLEN_PP(http_user_agent); } lookup_browser_name = estrndup(agent_name, agent_name_len); diff --git a/ext/standard/config.m4 b/ext/standard/config.m4 index 7ccec319b..98912a165 100644 --- a/ext/standard/config.m4 +++ b/ext/standard/config.m4 @@ -1,4 +1,4 @@ -dnl $Id: config.m4 287120 2009-08-11 22:07:35Z scottmac $ -*- autoconf -*- +dnl $Id: config.m4 295350 2010-02-22 00:34:22Z pajoye $ -*- autoconf -*- divert(3)dnl @@ -172,17 +172,112 @@ main() { ac_cv_crypt_blowfish=no ])]) +AC_CACHE_CHECK(for SHA512 crypt, ac_cv_crypt_SHA512,[ +AC_TRY_RUN([ +#if HAVE_UNISTD_H +#include +#endif + +#if HAVE_CRYPT_H +#include +#endif + +main() { +#if HAVE_CRYPT + char salt[30], answer[80]; + + salt[0]='$'; salt[1]='6'; salt[2]='$'; salt[3]='$'; salt[4]='b'; salt[5]='a'; salt[6]='r'; salt[7]='\0'; + strcpy(answer, salt); + strcpy(&answer[29],"$6$$QMXjqd7rHQZPQ1yHsXkQqC1FBzDiVfTHXL.LaeDAeVV.IzMaV9VU4MQ8kPuZa2SOP1A0RPm772EaFYjpEJtdu."); + exit (strcmp((char *)crypt("foo",salt),answer)); +#else + exit(0); +#endif +}],[ + ac_cv_crypt_SHA512=yes +],[ + ac_cv_crypt_SHA512=no +],[ + ac_cv_crypt_SHA512=no +])]) + +AC_CACHE_CHECK(for SHA256 crypt, ac_cv_crypt_SHA256,[ +AC_TRY_RUN([ +#if HAVE_UNISTD_H +#include +#endif + +#if HAVE_CRYPT_H +#include +#endif + +main() { +#if HAVE_CRYPT + char salt[30], answer[80]; + salt[0]='$'; salt[1]='5'; salt[2]='$'; salt[3]='$'; salt[4]='s'; salt[5]='a'; salt[6]='l'; salt[7]='t'; salt[8]='s'; salt[9]='t'; salt[10]='r'; salt[11]='i'; salt[12]='n'; salt[13]='g'; salt[14]='\0'; + strcat(salt,""); + strcpy(answer, salt); + strcpy(&answer[29], "$5$saltstring$5B8vYYiY.CVt1RlTTf8KbXBH3hsxY/GNooZaBBGWEc5"); + exit (strcmp((char *)crypt("foo",salt),answer)); +#else + exit(0); +#endif +}],[ + ac_cv_crypt_SHA256=yes +],[ + ac_cv_crypt_SHA256=no +],[ + ac_cv_crypt_SHA256=no +])]) + + dnl dnl If one of them is missing, use our own implementation, portable code is then possible dnl if test "$ac_cv_crypt_blowfish" = "no" || test "$ac_cv_crypt_des" = "no" || test "$ac_cv_crypt_ext_des" = "no" || test "x$php_crypt_r" = "x0"; then + + dnl + dnl Check for __alignof__ support in the compiler + dnl + AC_CACHE_CHECK(whether the compiler supports __alignof__, ac_cv_alignof_exists,[ + AC_TRY_COMPILE([ + ],[ + int align = __alignof__(int); + ],[ + ac_cv_alignof_exists=yes + ],[ + ac_cv_alignof_exists=no + ])]) + if test "$ac_cv_alignof_exists" = "yes"; then + AC_DEFINE([HAVE_ALIGNOF], 1, [whether the compiler supports __alignof__]) + fi + + dnl + dnl Check for __attribute__ ((__aligned__)) support in the compiler + dnl + AC_CACHE_CHECK(whether the compiler supports aligned attribute, ac_cv_attribute_aligned,[ + AC_TRY_COMPILE([ + ],[ + unsigned char test[32] __attribute__ ((__aligned__ (__alignof__ (int)))); + ],[ + ac_cv_attribute_aligned=yes + ],[ + ac_cv_attribute_aligned=no + ])]) + if test "$ac_cv_attribute_aligned" = "yes"; then + AC_DEFINE([HAVE_ATTRIBUTE_ALIGNED], 1, [whether the compiler supports __attribute__ ((__aligned__))]) + fi + + AC_DEFINE_UNQUOTED(PHP_USE_PHP_CRYPT_R, 1, [Whether PHP has to use its own crypt_r for blowfish, des, ext des and md5]) AC_DEFINE_UNQUOTED(PHP_STD_DES_CRYPT, 1, [Whether the system supports standard DES salt]) AC_DEFINE_UNQUOTED(PHP_BLOWFISH_CRYPT, 1, [Whether the system supports BlowFish salt]) AC_DEFINE_UNQUOTED(PHP_EXT_DES_CRYPT, 1, [Whether the system supports extended DES salt]) - AC_DEFINE_UNQUOTED(PHP_MD5_CRYPT, 1, [Whether the system supports extended DES salt]) + AC_DEFINE_UNQUOTED(PHP_MD5_CRYPT, 1, [Whether the system supports MD5 salt]) + AC_DEFINE_UNQUOTED(PHP_SHA512_CRYPT, 1, [Whether the system supports SHA512 salt]) + AC_DEFINE_UNQUOTED(PHP_SHA256_CRYPT, 1, [Whether the system supports SHA256 salt]) - PHP_ADD_SOURCES(PHP_EXT_DIR(standard), crypt_freesec.c crypt_blowfish.c php_crypt_r.c) + PHP_ADD_SOURCES(PHP_EXT_DIR(standard), crypt_freesec.c crypt_blowfish.c crypt_sha512.c crypt_sha256.c php_crypt_r.c) else if test "$ac_cv_crypt_des" = "yes"; then ac_result=1 @@ -211,13 +306,31 @@ else fi AC_DEFINE_UNQUOTED(PHP_EXT_DES_CRYPT, $ac_result, [Whether the system supports extended DES salt]) + if test "$ac_cv_crypt_sha512" = "yes"; then + ac_result=1 + ac_crypt_sha512=1 + else + ac_result=0 + ac_crypt_sha512=0 + fi + AC_DEFINE_UNQUOTED(PHP_EXT_SHA512_CRYPT, $ac_result, [Whether the system supports SHA512 salt]) + + if test "$ac_cv_crypt_sha256" = "yes"; then + ac_result=1 + ac_crypt_sha256=1 + else + ac_result=0 + ac_crypt_sha256=0 + fi + AC_DEFINE_UNQUOTED(PHP_EXT_SHA256_CRYPT, $ac_result, [Whether the system supports SHA256 salt]) + AC_DEFINE_UNQUOTED(PHP_USE_PHP_CRYPT_R, 0, [Whether PHP has to use its own crypt_r for blowfish, des and ext des]) fi dnl dnl Check for available functions dnl -AC_CHECK_FUNCS(getcwd getwd asinh acosh atanh log1p hypot glob strfmon nice fpclass isinf isnan) +AC_CHECK_FUNCS(getcwd getwd asinh acosh atanh log1p hypot glob strfmon nice fpclass isinf isnan mempcpy strpncpy) AC_FUNC_FNMATCH divert(5)dnl @@ -226,13 +339,12 @@ dnl dnl Check if there is a support means of creating a new process dnl and defining which handles it receives dnl -AC_CACHE_VAL(php_can_support_proc_open,[ AC_CHECK_FUNCS(fork CreateProcess, [ php_can_support_proc_open=yes break ],[ php_can_support_proc_open=no -])]) +]) AC_MSG_CHECKING([if your OS can spawn processes with inherited handles]) if test "$php_can_support_proc_open" = "yes"; then AC_MSG_RESULT(yes) diff --git a/ext/standard/config.w32 b/ext/standard/config.w32 index c72a8aa85..44dea72d3 100644 --- a/ext/standard/config.w32 +++ b/ext/standard/config.w32 @@ -1,5 +1,5 @@ // vim:ft=javascript -// $Id: config.w32 286378 2009-07-26 22:59:46Z jani $ +// $Id: config.w32 291899 2009-12-09 00:20:14Z pajoye $ ARG_WITH("config-file-scan-dir", "Dir to check for additional php ini files", ""); @@ -9,8 +9,8 @@ AC_DEFINE("PHP_USE_PHP_CRYPT_R", 1); CHECK_HEADER_ADD_INCLUDE("timelib_config.h", "CFLAGS_STANDARD", "ext/date/lib"); EXTENSION("standard", "array.c base64.c basic_functions.c browscap.c \ - crc32.c crypt.c \ - crypt_freesec.c crypt_blowfish.c php_crypt_r.c \ + crc32.c crypt.c crypt_freesec.c crypt_blowfish.c crypt_sha256.c \ + crypt_sha512.c php_crypt_r.c \ cyr_convert.c datetime.c dir.c dl.c dns.c dns_win32.c exec.c \ file.c filestat.c formatted_print.c fsock.c head.c html.c image.c \ info.c iptc.c lcg.c link_win32.c mail.c math.c md5.c metaphone.c microtime.c \ diff --git a/ext/standard/crc32.c b/ext/standard/crc32.c index 9afb56bf0..1504dabcd 100644 --- a/ext/standard/crc32.c +++ b/ext/standard/crc32.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: crc32.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: crc32.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php.h" #include "basic_functions.h" diff --git a/ext/standard/crc32.h b/ext/standard/crc32.h index 140d04e9b..50ac1162d 100644 --- a/ext/standard/crc32.h +++ b/ext/standard/crc32.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: crc32.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: crc32.h 293036 2010-01-03 09:23:27Z sebastian $ */ /* * This code implements the AUTODIN II polynomial diff --git a/ext/standard/credits.c b/ext/standard/credits.c index 71998b8da..eaf9d5428 100644 --- a/ext/standard/credits.c +++ b/ext/standard/credits.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: credits.c 289420 2009-10-09 14:34:18Z pajoye $ */ +/* $Id: credits.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php.h" #include "info.h" diff --git a/ext/standard/credits.h b/ext/standard/credits.h index 3fff960f1..2451c7724 100644 --- a/ext/standard/credits.h +++ b/ext/standard/credits.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: credits.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: credits.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef CREDITS_H #define CREDITS_H diff --git a/ext/standard/crypt.c b/ext/standard/crypt.c index 3743e1eb9..b4a5167b9 100644 --- a/ext/standard/crypt.c +++ b/ext/standard/crypt.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -15,10 +15,11 @@ | Authors: Stig Bakken | | Zeev Suraski | | Rasmus Lerdorf | + | Pierre Joye | +----------------------------------------------------------------------+ */ -/* $Id: crypt.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: crypt.c 295421 2010-02-23 17:49:00Z pajoye $ */ #include @@ -82,6 +83,12 @@ #define PHP_MAX_SALT_LEN 60 #endif +#if PHP_SHA512_CRYPT +#undef PHP_MAX_SALT_LEN +#define PHP_MAX_SALT_LEN 123 +#endif + + /* If the configure-time checks fail, we provide DES. * XXX: This is a hack. Fix the real problem! */ @@ -100,6 +107,9 @@ PHP_MINIT_FUNCTION(crypt) /* {{{ */ REGISTER_LONG_CONSTANT("CRYPT_EXT_DES", PHP_EXT_DES_CRYPT, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("CRYPT_MD5", PHP_MD5_CRYPT, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("CRYPT_BLOWFISH", PHP_BLOWFISH_CRYPT, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("CRYPT_SHA256", PHP_SHA256_CRYPT, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("CRYPT_SHA512", PHP_SHA512_CRYPT, CONST_CS | CONST_PERSISTENT); + #ifdef PHP_USE_PHP_CRYPT_R php_init_crypt_r(); @@ -137,7 +147,7 @@ PHP_FUNCTION(crypt) char salt[PHP_MAX_SALT_LEN + 1]; char *str, *salt_in = NULL; int str_len, salt_in_len = 0; - + char *crypt_res; salt[0] = salt[PHP_MAX_SALT_LEN] = '\0'; /* This will produce suitable results if people depend on DES-encryption @@ -163,6 +173,7 @@ PHP_FUNCTION(crypt) php_to64(&salt[0], PHP_CRYPT_RAND, 2); salt[2] = '\0'; #endif + salt_in_len = strlen(salt); } /* Windows (win32/crypt) has a stripped down version of libxcrypt and @@ -175,7 +186,53 @@ PHP_FUNCTION(crypt) char output[MD5_HASH_MAX_LEN]; RETURN_STRING(php_md5_crypt_r(str, salt, output), 1); - } else if ( + } else if (salt[0]=='$' && salt[1]=='6' && salt[2]=='$') { + const char sha512_salt_prefix[] = "$6$"; + const char sha512_rounds_prefix[] = "rounds="; + char *output; + int needed = (sizeof(sha512_salt_prefix) - 1 + + sizeof(sha512_rounds_prefix) + 9 + 1 + + strlen(salt) + 1 + 43 + 1); + output = emalloc(needed * sizeof(char *)); + salt[salt_in_len] = '\0'; + + crypt_res = php_sha512_crypt_r(str, salt, output, needed); + if (!crypt_res) { + if (salt[0]=='*' && salt[1]=='0') { + RETVAL_STRING("*1", 1); + } else { + RETVAL_STRING("*0", 1); + } + } else { + RETVAL_STRING(output, 1); + } + + memset(output, 0, PHP_MAX_SALT_LEN + 1); + efree(output); + } else if (salt[0]=='$' && salt[1]=='5' && salt[2]=='$') { + const char sha256_salt_prefix[] = "$5$"; + const char sha256_rounds_prefix[] = "rounds="; + char *output; + int needed = (sizeof(sha256_salt_prefix) - 1 + + sizeof(sha256_rounds_prefix) + 9 + 1 + + strlen(salt) + 1 + 43 + 1); + output = emalloc(needed * sizeof(char *)); + salt[salt_in_len] = '\0'; + + crypt_res = php_sha256_crypt_r(str, salt, output, needed); + if (!crypt_res) { + if (salt[0]=='*' && salt[1]=='0') { + RETVAL_STRING("*1", 1); + } else { + RETVAL_STRING("*0", 1); + } + } else { + RETVAL_STRING(output, 1); + } + + memset(output, 0, PHP_MAX_SALT_LEN + 1); + efree(output); + } else if ( salt[0] == '$' && salt[1] == '2' && salt[2] == 'a' && @@ -186,14 +243,33 @@ PHP_FUNCTION(crypt) char output[PHP_MAX_SALT_LEN + 1]; memset(output, 0, PHP_MAX_SALT_LEN + 1); - php_crypt_blowfish_rn(str, salt, output, sizeof(output)); - RETVAL_STRING(output, 1); + crypt_res = php_crypt_blowfish_rn(str, salt, output, sizeof(output)); + if (!crypt_res) { + if (salt[0]=='*' && salt[1]=='0') { + RETVAL_STRING("*1", 1); + } else { + RETVAL_STRING("*0", 1); + } + } else { + RETVAL_STRING(output, 1); + } + memset(output, 0, PHP_MAX_SALT_LEN + 1); } else { memset(&buffer, 0, sizeof(buffer)); _crypt_extended_init_r(); - RETURN_STRING(_crypt_extended_r(str, salt, &buffer), 1); + + crypt_res = _crypt_extended_r(str, salt, &buffer); + if (!crypt_res) { + if (salt[0]=='*' && salt[1]=='0') { + RETURN_STRING("*1", 1); + } else { + RETURN_STRING("*0", 1); + } + } else { + RETURN_STRING(crypt_res, 1); + } } } #else @@ -208,8 +284,16 @@ PHP_FUNCTION(crypt) # else # error Data struct used by crypt_r() is unknown. Please report. # endif - - RETURN_STRING(crypt_r(str, salt, &buffer), 1); + crypt_res = crypt_r(str, salt, &buffer); + if (!crypt_res) { + if (salt[0]=='*' && salt[1]=='0') { + RETURN_STRING("*1", 1); + } else { + RETURN_STRING("*0", 1); + } + } else { + RETURN_STRING(crypt_res, 1); + } } # endif #endif diff --git a/ext/standard/crypt_blowfish.c b/ext/standard/crypt_blowfish.c index a345fc0d8..c88c699c5 100644 --- a/ext/standard/crypt_blowfish.c +++ b/ext/standard/crypt_blowfish.c @@ -1,5 +1,5 @@ /* - $Id: crypt_blowfish.c 281805 2009-06-08 08:44:15Z pajoye $ + $Id: crypt_blowfish.c 295350 2010-02-22 00:34:22Z pajoye $ */ /* * This code comes from John the Ripper password cracker, with reentrant @@ -606,6 +606,7 @@ char *php_crypt_blowfish_rn(__CONST char *key, __CONST char *setting, setting[3] != '$' || setting[4] < '0' || setting[4] > '3' || setting[5] < '0' || setting[5] > '9' || + (setting[4] == '3' && setting[5] > '1') || setting[6] != '$') { __set_errno(EINVAL); return NULL; diff --git a/ext/standard/crypt_freesec.c b/ext/standard/crypt_freesec.c index 0d70772ad..bb9c032c0 100644 --- a/ext/standard/crypt_freesec.c +++ b/ext/standard/crypt_freesec.c @@ -1,12 +1,13 @@ /* - $Id: crypt_freesec.c 265468 2008-08-25 13:42:55Z jani $ + $Id: crypt_freesec.c 295350 2010-02-22 00:34:22Z pajoye $ */ /* * This version is derived from the original implementation of FreeSec * (release 1.1) by David Burren. I've reviewed the changes made in * OpenBSD (as of 2.7) and modified the original code in a similar way - * where applicable. I've also made it reentrant and did a number of - * other changes -- SD. + * where applicable. I've also made it reentrant and made a number of + * other changes. + * - Solar Designer */ /* @@ -40,7 +41,7 @@ * SUCH DAMAGE. * * $Owl: Owl/packages/glibc/crypt_freesec.c,v 1.4 2005/11/16 13:08:32 solar Exp $ - * $Id: crypt_freesec.c 265468 2008-08-25 13:42:55Z jani $ + * $Id: crypt_freesec.c 295350 2010-02-22 00:34:22Z pajoye $ * * This is an original implementation of the DES and the crypt(3) interfaces * by David Burren . @@ -57,14 +58,17 @@ * posted to the sci.crypt newsgroup by the author and is available for FTP. * * ARCHITECTURE ASSUMPTIONS: - * This code used to have some nasty ones, but I believe these have - * been removed by now. The code isn't very portable and requires a - * 32-bit integer type, though -- SD. + * This code used to have some nasty ones, but these have been removed + * by now. The code requires a 32-bit integer type, though. */ #include #include +#ifdef TEST +#include +#endif + #include "crypt_freesec.h" #define _PASSWORD_EFMT1 '_' @@ -183,19 +187,28 @@ static uint32_t comp_maskl[8][128], comp_maskr[8][128]; static inline int ascii_to_bin(char ch) { - if (ch > 'z') - return(0); - if (ch >= 'a') - return(ch - 'a' + 38); - if (ch > 'Z') - return(0); - if (ch >= 'A') - return(ch - 'A' + 12); - if (ch > '9') - return(0); - if (ch >= '.') - return(ch - '.'); - return(0); + signed char sch = ch; + int retval; + + retval = sch - '.'; + if (sch >= 'A') { + retval = sch - ('A' - 12); + if (sch >= 'a') + retval = sch - ('a' - 38); + } + retval &= 0x3f; + + return(retval); +} + +/* + * When we choose to "support" invalid salts, nevertheless disallow those + * containing characters that would violate the passwd file format. + */ +static inline int +ascii_is_unsafe(char ch) +{ + return !ch || ch == '\n' || ch == ':'; } void @@ -625,14 +638,24 @@ _crypt_extended_r(const char *key, const char *setting, if (*setting == _PASSWORD_EFMT1) { /* * "new"-style: - * setting - underscore, 4 bytes of count, 4 bytes of salt + * setting - underscore, 4 chars of count, 4 chars of salt * key - unlimited characters */ - for (i = 1, count = 0; i < 5; i++) - count |= ascii_to_bin(setting[i]) << (i - 1) * 6; + for (i = 1, count = 0; i < 5; i++) { + int value = ascii_to_bin(setting[i]); + if (ascii64[value] != setting[i]) + return(NULL); + count |= value << (i - 1) * 6; + } + if (!count) + return(NULL); - for (i = 5, salt = 0; i < 9; i++) - salt |= ascii_to_bin(setting[i]) << (i - 5) * 6; + for (i = 5, salt = 0; i < 9; i++) { + int value = ascii_to_bin(setting[i]); + if (ascii64[value] != setting[i]) + return(NULL); + salt |= value << (i - 5) * 6; + } while (*key) { /* @@ -651,35 +674,25 @@ _crypt_extended_r(const char *key, const char *setting, if (des_setkey((u_char *) keybuf, data)) return(NULL); } - strncpy(data->output, setting, 9); - /* - * Double check that we weren't given a short setting. - * If we were, the above code will probably have created - * wierd values for count and salt, but we don't really care. - * Just make sure the output string doesn't have an extra - * NUL in it. - */ + memcpy(data->output, setting, 9); data->output[9] = '\0'; - p = (u_char *) data->output + strlen(data->output); + p = (u_char *) data->output + 9; } else { /* * "old"-style: - * setting - 2 bytes of salt + * setting - 2 chars of salt * key - up to 8 characters */ count = 25; + if (ascii_is_unsafe(setting[0]) || ascii_is_unsafe(setting[1])) + return(NULL); + salt = (ascii_to_bin(setting[1]) << 6) | ascii_to_bin(setting[0]); data->output[0] = setting[0]; - /* - * If the encrypted password that the salt was extracted from - * is only 1 character long, the salt will be corrupted. We - * need to ensure that the output string doesn't have an extra - * NUL in it! - */ - data->output[1] = setting[1] ? setting[1] : data->output[0]; + data->output[1] = setting[1]; p = (u_char *) data->output + 2; } setup_salt(salt, data); @@ -733,6 +746,7 @@ static struct { char *hash; char *pw; } tests[] = { +/* "new"-style */ {"_J9..CCCCXBrJUJV154M", "U*U*U*U*"}, {"_J9..CCCCXUhOBTXzaiE", "U*U***U"}, {"_J9..CCCC4gQ.mB/PffM", "U*U***U*"}, @@ -745,6 +759,30 @@ static struct { {"_J9..SDizxmRI1GjnQuE", "zxyDPWgydbQjgq"}, {"_K9..SaltNrQgIYUAeoY", "726 even"}, {"_J9..SDSD5YGyRCr4W4c", ""}, +/* "old"-style, valid salts */ + {"CCNf8Sbh3HDfQ", "U*U*U*U*"}, + {"CCX.K.MFy4Ois", "U*U***U"}, + {"CC4rMpbg9AMZ.", "U*U***U*"}, + {"XXxzOu6maQKqQ", "*U*U*U*U"}, + {"SDbsugeBiC58A", ""}, + {"./xZjzHv5vzVE", "password"}, + {"0A2hXM1rXbYgo", "password"}, + {"A9RXdR23Y.cY6", "password"}, + {"ZziFATVXHo2.6", "password"}, + {"zZDDIZ0NOlPzw", "password"}, +/* "old"-style, "reasonable" invalid salts, UFC-crypt behavior expected */ + {"\001\002wyd0KZo65Jo", "password"}, + {"a_C10Dk/ExaG.", "password"}, + {"~\377.5OTsRVjwLo", "password"}, +/* The below are erroneous inputs, so NULL return is expected/required */ + {"", ""}, /* no salt */ + {" ", ""}, /* setting string is too short */ + {"a:", ""}, /* unsafe character */ + {"\na", ""}, /* unsafe character */ + {"_/......", ""}, /* setting string is too short for its type */ + {"_........", ""}, /* zero iteration count */ + {"_/!......", ""}, /* invalid character in count */ + {"_/......!", ""}, /* invalid character in salt */ {NULL} }; @@ -752,8 +790,12 @@ int main(void) { int i; - for (i = 0; tests[i].hash; i++) - if (strcmp(crypt(tests[i].pw, tests[i].hash), tests[i].hash)) { + for (i = 0; tests[i].hash; i++) { + char *hash = crypt(tests[i].pw, tests[i].hash); + if (!hash && strlen(tests[i].hash) < 13) + continue; /* expected failure */ + if (!strcmp(hash, tests[i].hash)) + continue; /* expected success */ puts("FAILED"); return 1; } diff --git a/ext/standard/crypt_sha256.c b/ext/standard/crypt_sha256.c new file mode 100644 index 000000000..3e234cee9 --- /dev/null +++ b/ext/standard/crypt_sha256.c @@ -0,0 +1,759 @@ +/* SHA256-based Unix crypt implementation. + Released into the Public Domain by Ulrich Drepper . */ +/* Windows VC++ port by Pierre Joye */ + +#include "php.h" +#include "php_main.h" + +#include +#include + +#ifdef PHP_WIN32 +# include "win32/php_stdint.h" +# define __alignof__ __alignof +# define alloca _alloca +#else +# if HAVE_INTTYPES_H +# include +# elif HAVE_STDINT_H +# include +# endif +# ifndef HAVE_ALIGNOF +# include +# define __alignof__(type) offsetof (struct { char c; type member;}, member) +# endif +# if HAVE_ATTRIBUTE_ALIGNED +# define ALIGNED(size) __attribute__ ((__aligned__ (size))) +# else +# define ALIGNED(size) +# endif +#endif + +#include +#include + +#ifdef PHP_WIN32 +# include +#else +# include +# include +# if HAVE_STRING_H +//# define __USE_GNU 1 +# include +# else +# include +# endif +#endif + +char * __php_stpncpy(char *dst, const char *src, size_t len) +{ + size_t n = strlen(src); + if (n > len) { + n = len; + } + return strncpy(dst, src, len) + n; +} + +void * __php_mempcpy(void * dst, const void * src, size_t len) +{ + return (((char *)memcpy(dst, src, len)) + len); +} + +#ifndef MIN +# define MIN(a, b) (((a) < (b)) ? (a) : (b)) +#endif +#ifndef MAX +# define MAX(a, b) (((a) > (b)) ? (a) : (b)) +#endif + +/* Structure to save state of computation between the single steps. */ +struct sha256_ctx { + uint32_t H[8]; + + uint32_t total[2]; + uint32_t buflen; + char buffer[128]; /* NB: always correctly aligned for uint32_t. */ +}; + +#if PHP_WIN32 || (!defined(WORDS_BIGENDIAN)) +# define SWAP(n) \ + (((n) << 24) | (((n) & 0xff00) << 8) | (((n) >> 8) & 0xff00) | ((n) >> 24)) +#else +# define SWAP(n) (n) +#endif + +/* This array contains the bytes used to pad the buffer to the next + 64-byte boundary. (FIPS 180-2:5.1.1) */ +static const unsigned char fillbuf[64] = { 0x80, 0 /* , 0, 0, ... */ }; + + +/* Constants for SHA256 from FIPS 180-2:4.2.2. */ +static const uint32_t K[64] = { + 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, + 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, + 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, + 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, + 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, + 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, + 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, + 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, + 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, + 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, + 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, + 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, + 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, + 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, + 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, + 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 +}; + + +/* Process LEN bytes of BUFFER, accumulating context into CTX. + It is assumed that LEN % 64 == 0. */ +static void sha256_process_block (const void *buffer, size_t len, struct sha256_ctx *ctx) { + const uint32_t *words = buffer; + size_t nwords = len / sizeof (uint32_t); + unsigned int t; + + uint32_t a = ctx->H[0]; + uint32_t b = ctx->H[1]; + uint32_t c = ctx->H[2]; + uint32_t d = ctx->H[3]; + uint32_t e = ctx->H[4]; + uint32_t f = ctx->H[5]; + uint32_t g = ctx->H[6]; + uint32_t h = ctx->H[7]; + + /* First increment the byte count. FIPS 180-2 specifies the possible + length of the file up to 2^64 bits. Here we only compute the + number of bytes. Do a double word increment. */ + ctx->total[0] += len; + if (ctx->total[0] < len) { + ++ctx->total[1]; + } + + /* Process all bytes in the buffer with 64 bytes in each round of + the loop. */ + while (nwords > 0) { + uint32_t W[64]; + uint32_t a_save = a; + uint32_t b_save = b; + uint32_t c_save = c; + uint32_t d_save = d; + uint32_t e_save = e; + uint32_t f_save = f; + uint32_t g_save = g; + uint32_t h_save = h; + + /* Operators defined in FIPS 180-2:4.1.2. */ +#define Ch(x, y, z) ((x & y) ^ (~x & z)) +#define Maj(x, y, z) ((x & y) ^ (x & z) ^ (y & z)) +#define S0(x) (CYCLIC (x, 2) ^ CYCLIC (x, 13) ^ CYCLIC (x, 22)) +#define S1(x) (CYCLIC (x, 6) ^ CYCLIC (x, 11) ^ CYCLIC (x, 25)) +#define R0(x) (CYCLIC (x, 7) ^ CYCLIC (x, 18) ^ (x >> 3)) +#define R1(x) (CYCLIC (x, 17) ^ CYCLIC (x, 19) ^ (x >> 10)) + + /* It is unfortunate that C does not provide an operator for + cyclic rotation. Hope the C compiler is smart enough. */ +#define CYCLIC(w, s) ((w >> s) | (w << (32 - s))) + + /* Compute the message schedule according to FIPS 180-2:6.2.2 step 2. */ + for (t = 0; t < 16; ++t) { + W[t] = SWAP (*words); + ++words; + } + for (t = 16; t < 64; ++t) + W[t] = R1 (W[t - 2]) + W[t - 7] + R0 (W[t - 15]) + W[t - 16]; + + /* The actual computation according to FIPS 180-2:6.2.2 step 3. */ + for (t = 0; t < 64; ++t) { + uint32_t T1 = h + S1 (e) + Ch (e, f, g) + K[t] + W[t]; + uint32_t T2 = S0 (a) + Maj (a, b, c); + h = g; + g = f; + f = e; + e = d + T1; + d = c; + c = b; + b = a; + a = T1 + T2; + } + + /* Add the starting values of the context according to FIPS 180-2:6.2.2 + step 4. */ + a += a_save; + b += b_save; + c += c_save; + d += d_save; + e += e_save; + f += f_save; + g += g_save; + h += h_save; + + /* Prepare for the next round. */ + nwords -= 16; + } + + /* Put checksum in context given as argument. */ + ctx->H[0] = a; + ctx->H[1] = b; + ctx->H[2] = c; + ctx->H[3] = d; + ctx->H[4] = e; + ctx->H[5] = f; + ctx->H[6] = g; + ctx->H[7] = h; +} + + +/* Initialize structure containing state of computation. + (FIPS 180-2:5.3.2) */ +static void sha256_init_ctx(struct sha256_ctx *ctx) { + ctx->H[0] = 0x6a09e667; + ctx->H[1] = 0xbb67ae85; + ctx->H[2] = 0x3c6ef372; + ctx->H[3] = 0xa54ff53a; + ctx->H[4] = 0x510e527f; + ctx->H[5] = 0x9b05688c; + ctx->H[6] = 0x1f83d9ab; + ctx->H[7] = 0x5be0cd19; + + ctx->total[0] = ctx->total[1] = 0; + ctx->buflen = 0; +} + + +/* Process the remaining bytes in the internal buffer and the usual + prolog according to the standard and write the result to RESBUF. + + IMPORTANT: On some systems it is required that RESBUF is correctly + aligned for a 32 bits value. */ +static void * sha256_finish_ctx(struct sha256_ctx *ctx, void *resbuf) { + /* Take yet unprocessed bytes into account. */ + uint32_t bytes = ctx->buflen; + size_t pad; + unsigned int i; + + /* Now count remaining bytes. */ + ctx->total[0] += bytes; + if (ctx->total[0] < bytes) { + ++ctx->total[1]; + } + + pad = bytes >= 56 ? 64 + 56 - bytes : 56 - bytes; + memcpy(&ctx->buffer[bytes], fillbuf, pad); + + /* Put the 64-bit file length in *bits* at the end of the buffer. */ + *(uint32_t *) &ctx->buffer[bytes + pad + 4] = SWAP (ctx->total[0] << 3); + *(uint32_t *) &ctx->buffer[bytes + pad] = SWAP ((ctx->total[1] << 3) | + (ctx->total[0] >> 29)); + + /* Process last bytes. */ + sha256_process_block(ctx->buffer, bytes + pad + 8, ctx); + + /* Put result from CTX in first 32 bytes following RESBUF. */ + for (i = 0; i < 8; ++i) { + ((uint32_t *) resbuf)[i] = SWAP(ctx->H[i]); + } + + return resbuf; +} + + +static void sha256_process_bytes(const void *buffer, size_t len, struct sha256_ctx *ctx) { + /* When we already have some bits in our internal buffer concatenate + both inputs first. */ + if (ctx->buflen != 0) { + size_t left_over = ctx->buflen; + size_t add = 128 - left_over > len ? len : 128 - left_over; + + memcpy(&ctx->buffer[left_over], buffer, add); + ctx->buflen += add; + + if (ctx->buflen > 64) { + sha256_process_block(ctx->buffer, ctx->buflen & ~63, ctx); + ctx->buflen &= 63; + /* The regions in the following copy operation cannot overlap. */ + memcpy(ctx->buffer, &ctx->buffer[(left_over + add) & ~63], ctx->buflen); + } + + buffer = (const char *) buffer + add; + len -= add; + } + + /* Process available complete blocks. */ + if (len >= 64) { +/* To check alignment gcc has an appropriate operator. Other +compilers don't. */ +#if __GNUC__ >= 2 +# define UNALIGNED_P(p) (((uintptr_t) p) % __alignof__ (uint32_t) != 0) +#else +# define UNALIGNED_P(p) (((uintptr_t) p) % sizeof (uint32_t) != 0) +#endif + if (UNALIGNED_P (buffer)) + while (len > 64) { + sha256_process_block(memcpy(ctx->buffer, buffer, 64), 64, ctx); + buffer = (const char *) buffer + 64; + len -= 64; + } else { + sha256_process_block(buffer, len & ~63, ctx); + buffer = (const char *) buffer + (len & ~63); + len &= 63; + } + } + + /* Move remaining bytes into internal buffer. */ + if (len > 0) { + size_t left_over = ctx->buflen; + + memcpy(&ctx->buffer[left_over], buffer, len); + left_over += len; + if (left_over >= 64) { + sha256_process_block(ctx->buffer, 64, ctx); + left_over -= 64; + memcpy(ctx->buffer, &ctx->buffer[64], left_over); + } + ctx->buflen = left_over; + } +} + + +/* Define our magic string to mark salt for SHA256 "encryption" + replacement. */ +static const char sha256_salt_prefix[] = "$5$"; + +/* Prefix for optional rounds specification. */ +static const char sha256_rounds_prefix[] = "rounds="; + +/* Maximum salt string length. */ +#define SALT_LEN_MAX 16 +/* Default number of rounds if not explicitly specified. */ +#define ROUNDS_DEFAULT 5000 +/* Minimum number of rounds. */ +#define ROUNDS_MIN 1000 +/* Maximum number of rounds. */ +#define ROUNDS_MAX 999999999 + +/* Table with characters for base64 transformation. */ +static const char b64t[64] = +"./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; + +char * php_sha256_crypt_r(const char *key, const char *salt, char *buffer, int buflen) +{ +#ifdef PHP_WIN32 +# if _MSC <= 1300 +# pragma pack(push, 16) + unsigned char alt_result[32]; + unsigned char temp_result[32]; +# pragma pack(pop) +# else + __declspec(align(32)) unsigned char alt_result[32]; + __declspec(align(32)) unsigned char temp_result[32]; +# endif +#else + unsigned char alt_result[32] ALIGNED(__alignof__ (uint32_t)); + unsigned char temp_result[32] ALIGNED(__alignof__ (uint32_t)); +#endif + + struct sha256_ctx ctx; + struct sha256_ctx alt_ctx; + size_t salt_len; + size_t key_len; + size_t cnt; + char *cp; + char *copied_key = NULL; + char *copied_salt = NULL; + char *p_bytes; + char *s_bytes; + /* Default number of rounds. */ + size_t rounds = ROUNDS_DEFAULT; + zend_bool rounds_custom = 0; + + /* Find beginning of salt string. The prefix should normally always + be present. Just in case it is not. */ + if (strncmp(sha256_salt_prefix, salt, sizeof(sha256_salt_prefix) - 1) == 0) { + /* Skip salt prefix. */ + salt += sizeof(sha256_salt_prefix) - 1; + } + + if (strncmp(salt, sha256_rounds_prefix, sizeof(sha256_rounds_prefix) - 1) == 0) { + const char *num = salt + sizeof(sha256_rounds_prefix) - 1; + char *endp; + unsigned long int srounds = strtoul(num, &endp, 10); + if (*endp == '$') { + salt = endp + 1; + rounds = MAX(ROUNDS_MIN, MIN(srounds, ROUNDS_MAX)); + rounds_custom = 1; + } + } + + salt_len = MIN(strcspn(salt, "$"), SALT_LEN_MAX); + key_len = strlen(key); + + if ((key - (char *) 0) % __alignof__ (uint32_t) != 0) { + char *tmp = (char *) alloca(key_len + __alignof__(uint32_t)); + key = copied_key = memcpy(tmp + __alignof__(uint32_t) - (tmp - (char *) 0) % __alignof__(uint32_t), key, key_len); + } + + if ((salt - (char *) 0) % __alignof__(uint32_t) != 0) { + char *tmp = (char *) alloca(salt_len + __alignof__(uint32_t)); + salt = copied_salt = + memcpy(tmp + __alignof__(uint32_t) - (tmp - (char *) 0) % __alignof__ (uint32_t), salt, salt_len); + } + + /* Prepare for the real work. */ + sha256_init_ctx(&ctx); + + /* Add the key string. */ + sha256_process_bytes(key, key_len, &ctx); + + /* The last part is the salt string. This must be at most 16 + characters and it ends at the first `$' character (for + compatibility with existing implementations). */ + sha256_process_bytes(salt, salt_len, &ctx); + + + /* Compute alternate SHA256 sum with input KEY, SALT, and KEY. The + final result will be added to the first context. */ + sha256_init_ctx(&alt_ctx); + + /* Add key. */ + sha256_process_bytes(key, key_len, &alt_ctx); + + /* Add salt. */ + sha256_process_bytes(salt, salt_len, &alt_ctx); + + /* Add key again. */ + sha256_process_bytes(key, key_len, &alt_ctx); + + /* Now get result of this (32 bytes) and add it to the other + context. */ + sha256_finish_ctx(&alt_ctx, alt_result); + + /* Add for any character in the key one byte of the alternate sum. */ + for (cnt = key_len; cnt > 32; cnt -= 32) { + sha256_process_bytes(alt_result, 32, &ctx); + } + sha256_process_bytes(alt_result, cnt, &ctx); + + /* Take the binary representation of the length of the key and for every + 1 add the alternate sum, for every 0 the key. */ + for (cnt = key_len; cnt > 0; cnt >>= 1) { + if ((cnt & 1) != 0) { + sha256_process_bytes(alt_result, 32, &ctx); + } else { + sha256_process_bytes(key, key_len, &ctx); + } + } + + /* Create intermediate result. */ + sha256_finish_ctx(&ctx, alt_result); + + /* Start computation of P byte sequence. */ + sha256_init_ctx(&alt_ctx); + + /* For every character in the password add the entire password. */ + for (cnt = 0; cnt < key_len; ++cnt) { + sha256_process_bytes(key, key_len, &alt_ctx); + } + + /* Finish the digest. */ + sha256_finish_ctx(&alt_ctx, temp_result); + + /* Create byte sequence P. */ + cp = p_bytes = alloca(key_len); + for (cnt = key_len; cnt >= 32; cnt -= 32) { + cp = __php_mempcpy((void *)cp, (const void *)temp_result, 32); + } + memcpy(cp, temp_result, cnt); + + /* Start computation of S byte sequence. */ + sha256_init_ctx(&alt_ctx); + + /* For every character in the password add the entire password. */ + for (cnt = 0; cnt < 16 + alt_result[0]; ++cnt) { + sha256_process_bytes(salt, salt_len, &alt_ctx); + } + + /* Finish the digest. */ + sha256_finish_ctx(&alt_ctx, temp_result); + + /* Create byte sequence S. */ + cp = s_bytes = alloca(salt_len); + for (cnt = salt_len; cnt >= 32; cnt -= 32) { + cp = __php_mempcpy(cp, temp_result, 32); + } + memcpy(cp, temp_result, cnt); + + /* Repeatedly run the collected hash value through SHA256 to burn + CPU cycles. */ + for (cnt = 0; cnt < rounds; ++cnt) { + /* New context. */ + sha256_init_ctx(&ctx); + + /* Add key or last result. */ + if ((cnt & 1) != 0) { + sha256_process_bytes(p_bytes, key_len, &ctx); + } else { + sha256_process_bytes(alt_result, 32, &ctx); + } + + /* Add salt for numbers not divisible by 3. */ + if (cnt % 3 != 0) { + sha256_process_bytes(s_bytes, salt_len, &ctx); + } + + /* Add key for numbers not divisible by 7. */ + if (cnt % 7 != 0) { + sha256_process_bytes(p_bytes, key_len, &ctx); + } + + /* Add key or last result. */ + if ((cnt & 1) != 0) { + sha256_process_bytes(alt_result, 32, &ctx); + } else { + sha256_process_bytes(p_bytes, key_len, &ctx); + } + + /* Create intermediate result. */ + sha256_finish_ctx(&ctx, alt_result); + } + + /* Now we can construct the result string. It consists of three + parts. */ + cp = __php_stpncpy(buffer, sha256_salt_prefix, MAX(0, buflen)); + buflen -= sizeof(sha256_salt_prefix) - 1; + + if (rounds_custom) { +#ifdef PHP_WIN32 + int n = _snprintf(cp, MAX(0, buflen), "%s%u$", sha256_rounds_prefix, rounds); +#else + int n = snprintf(cp, MAX(0, buflen), "%s%zu$", sha256_rounds_prefix, rounds); +#endif + cp += n; + buflen -= n; + } + + cp = __php_stpncpy(cp, salt, MIN ((size_t) MAX (0, buflen), salt_len)); + buflen -= MIN((size_t) MAX (0, buflen), salt_len); + + if (buflen > 0) { + *cp++ = '$'; + --buflen; + } + +#define b64_from_24bit(B2, B1, B0, N) \ + do { \ + unsigned int w = ((B2) << 16) | ((B1) << 8) | (B0); \ + int n = (N); \ + while (n-- > 0 && buflen > 0) \ + { \ + *cp++ = b64t[w & 0x3f]; \ + --buflen; \ + w >>= 6; \ + } \ + } while (0) + + b64_from_24bit(alt_result[0], alt_result[10], alt_result[20], 4); + b64_from_24bit(alt_result[21], alt_result[1], alt_result[11], 4); + b64_from_24bit(alt_result[12], alt_result[22], alt_result[2], 4); + b64_from_24bit(alt_result[3], alt_result[13], alt_result[23], 4); + b64_from_24bit(alt_result[24], alt_result[4], alt_result[14], 4); + b64_from_24bit(alt_result[15], alt_result[25], alt_result[5], 4); + b64_from_24bit(alt_result[6], alt_result[16], alt_result[26], 4); + b64_from_24bit(alt_result[27], alt_result[7], alt_result[17], 4); + b64_from_24bit(alt_result[18], alt_result[28], alt_result[8], 4); + b64_from_24bit(alt_result[9], alt_result[19], alt_result[29], 4); + b64_from_24bit(0, alt_result[31], alt_result[30], 3); + if (buflen <= 0) { + errno = ERANGE; + buffer = NULL; + } else + *cp = '\0'; /* Terminate the string. */ + + /* Clear the buffer for the intermediate result so that people + attaching to processes or reading core dumps cannot get any + information. We do it in this way to clear correct_words[] + inside the SHA256 implementation as well. */ + sha256_init_ctx(&ctx); + sha256_finish_ctx(&ctx, alt_result); + memset(temp_result, '\0', sizeof(temp_result)); + memset(p_bytes, '\0', key_len); + memset(s_bytes, '\0', salt_len); + memset(&ctx, '\0', sizeof(ctx)); + memset(&alt_ctx, '\0', sizeof(alt_ctx)); + + if (copied_key != NULL) { + memset(copied_key, '\0', key_len); + + } + if (copied_salt != NULL) { + memset(copied_salt, '\0', salt_len); + } + + return buffer; +} + + +/* This entry point is equivalent to the `crypt' function in Unix + libcs. */ +char * php_sha256_crypt(const char *key, const char *salt) +{ + /* We don't want to have an arbitrary limit in the size of the + password. We can compute an upper bound for the size of the + result in advance and so we can prepare the buffer we pass to + `sha256_crypt_r'. */ + static char *buffer; + static int buflen; + int needed = (sizeof(sha256_salt_prefix) - 1 + + sizeof(sha256_rounds_prefix) + 9 + 1 + + strlen(salt) + 1 + 43 + 1); + + if (buflen < needed) { + char *new_buffer = (char *) realloc(buffer, needed); + if (new_buffer == NULL) { + return NULL; + } + + buffer = new_buffer; + buflen = needed; + } + + return php_sha256_crypt_r(key, salt, buffer, buflen); +} + + +#ifdef TEST +static const struct +{ + const char *input; + const char result[32]; +} tests[] = + { + /* Test vectors from FIPS 180-2: appendix B.1. */ + { "abc", + "\xba\x78\x16\xbf\x8f\x01\xcf\xea\x41\x41\x40\xde\x5d\xae\x22\x23" + "\xb0\x03\x61\xa3\x96\x17\x7a\x9c\xb4\x10\xff\x61\xf2\x00\x15\xad" }, + /* Test vectors from FIPS 180-2: appendix B.2. */ + { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", + "\x24\x8d\x6a\x61\xd2\x06\x38\xb8\xe5\xc0\x26\x93\x0c\x3e\x60\x39" + "\xa3\x3c\xe4\x59\x64\xff\x21\x67\xf6\xec\xed\xd4\x19\xdb\x06\xc1" }, + /* Test vectors from the NESSIE project. */ + { "", + "\xe3\xb0\xc4\x42\x98\xfc\x1c\x14\x9a\xfb\xf4\xc8\x99\x6f\xb9\x24" + "\x27\xae\x41\xe4\x64\x9b\x93\x4c\xa4\x95\x99\x1b\x78\x52\xb8\x55" }, + { "a", + "\xca\x97\x81\x12\xca\x1b\xbd\xca\xfa\xc2\x31\xb3\x9a\x23\xdc\x4d" + "\xa7\x86\xef\xf8\x14\x7c\x4e\x72\xb9\x80\x77\x85\xaf\xee\x48\xbb" }, + { "message digest", + "\xf7\x84\x6f\x55\xcf\x23\xe1\x4e\xeb\xea\xb5\xb4\xe1\x55\x0c\xad" + "\x5b\x50\x9e\x33\x48\xfb\xc4\xef\xa3\xa1\x41\x3d\x39\x3c\xb6\x50" }, + { "abcdefghijklmnopqrstuvwxyz", + "\x71\xc4\x80\xdf\x93\xd6\xae\x2f\x1e\xfa\xd1\x44\x7c\x66\xc9\x52" + "\x5e\x31\x62\x18\xcf\x51\xfc\x8d\x9e\xd8\x32\xf2\xda\xf1\x8b\x73" }, + { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", + "\x24\x8d\x6a\x61\xd2\x06\x38\xb8\xe5\xc0\x26\x93\x0c\x3e\x60\x39" + "\xa3\x3c\xe4\x59\x64\xff\x21\x67\xf6\xec\xed\xd4\x19\xdb\x06\xc1" }, + { "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", + "\xdb\x4b\xfc\xbd\x4d\xa0\xcd\x85\xa6\x0c\x3c\x37\xd3\xfb\xd8\x80" + "\x5c\x77\xf1\x5f\xc6\xb1\xfd\xfe\x61\x4e\xe0\xa7\xc8\xfd\xb4\xc0" }, + { "123456789012345678901234567890123456789012345678901234567890" + "12345678901234567890", + "\xf3\x71\xbc\x4a\x31\x1f\x2b\x00\x9e\xef\x95\x2d\xd8\x3c\xa8\x0e" + "\x2b\x60\x02\x6c\x8e\x93\x55\x92\xd0\xf9\xc3\x08\x45\x3c\x81\x3e" } + }; +#define ntests (sizeof (tests) / sizeof (tests[0])) + + +static const struct +{ + const char *salt; + const char *input; + const char *expected; +} tests2[] = +{ + { "$5$saltstring", "Hello world!", + "$5$saltstring$5B8vYYiY.CVt1RlTTf8KbXBH3hsxY/GNooZaBBGWEc5" }, + { "$5$rounds=10000$saltstringsaltstring", "Hello world!", + "$5$rounds=10000$saltstringsaltst$3xv.VbSHBb41AL9AvLeujZkZRBAwqFMz2." + "opqey6IcA" }, + { "$5$rounds=5000$toolongsaltstring", "This is just a test", + "$5$rounds=5000$toolongsaltstrin$Un/5jzAHMgOGZ5.mWJpuVolil07guHPvOW8" + "mGRcvxa5" }, + { "$5$rounds=1400$anotherlongsaltstring", + "a very much longer text to encrypt. This one even stretches over more" + "than one line.", + "$5$rounds=1400$anotherlongsalts$Rx.j8H.h8HjEDGomFU8bDkXm3XIUnzyxf12" + "oP84Bnq1" }, + { "$5$rounds=77777$short", + "we have a short salt string but not a short password", + "$5$rounds=77777$short$JiO1O3ZpDAxGJeaDIuqCoEFysAe1mZNJRs3pw0KQRd/" }, + { "$5$rounds=123456$asaltof16chars..", "a short string", + "$5$rounds=123456$asaltof16chars..$gP3VQ/6X7UUEW3HkBn2w1/Ptq2jxPyzV/" + "cZKmF/wJvD" }, + { "$5$rounds=10$roundstoolow", "the minimum number is still observed", + "$5$rounds=1000$roundstoolow$yfvwcWrQ8l/K0DAWyuPMDNHpIVlTQebY9l/gL97" + "2bIC" }, +}; +#define ntests2 (sizeof (tests2) / sizeof (tests2[0])) + + +int main(void) { + struct sha256_ctx ctx; + char sum[32]; + int result = 0; + int cnt, i; + char buf[1000]; + static const char expected[32] = + "\xcd\xc7\x6e\x5c\x99\x14\xfb\x92\x81\xa1\xc7\xe2\x84\xd7\x3e\x67" + "\xf1\x80\x9a\x48\xa4\x97\x20\x0e\x04\x6d\x39\xcc\xc7\x11\x2c\xd0"; + + for (cnt = 0; cnt < (int) ntests; ++cnt) { + sha256_init_ctx(&ctx); + sha256_process_bytes(tests[cnt].input, strlen(tests[cnt].input), &ctx); + sha256_finish_ctx(&ctx, sum); + if (memcmp(tests[cnt].result, sum, 32) != 0) { + printf("test %d run %d failed\n", cnt, 1); + result = 1; + } + + sha256_init_ctx(&ctx); + for (i = 0; tests[cnt].input[i] != '\0'; ++i) { + sha256_process_bytes(&tests[cnt].input[i], 1, &ctx); + } + sha256_finish_ctx(&ctx, sum); + if (memcmp(tests[cnt].result, sum, 32) != 0) { + printf("test %d run %d failed\n", cnt, 2); + result = 1; + } + } + + /* Test vector from FIPS 180-2: appendix B.3. */ + + memset(buf, 'a', sizeof(buf)); + sha256_init_ctx(&ctx); + for (i = 0; i < 1000; ++i) { + sha256_process_bytes (buf, sizeof (buf), &ctx); + } + + sha256_finish_ctx(&ctx, sum); + + if (memcmp(expected, sum, 32) != 0) { + printf("test %d failed\n", cnt); + result = 1; + } + + for (cnt = 0; cnt < ntests2; ++cnt) { + char *cp = php_sha256_crypt(tests2[cnt].input, tests2[cnt].salt); + if (strcmp(cp, tests2[cnt].expected) != 0) { + printf("test %d: expected \"%s\", got \"%s\"\n", cnt, tests2[cnt].expected, cp); + result = 1; + } + } + + if (result == 0) + puts("all tests OK"); + + return result; +} +#endif diff --git a/ext/standard/crypt_sha512.c b/ext/standard/crypt_sha512.c new file mode 100644 index 000000000..ba9a63918 --- /dev/null +++ b/ext/standard/crypt_sha512.c @@ -0,0 +1,823 @@ +/* SHA512-based Unix crypt implementation. + Released into the Public Domain by Ulrich Drepper . */ +/* Windows VC++ port by Pierre Joye */ + +#include "php.h" +#include "php_main.h" + +#include +#include +#ifdef PHP_WIN32 +# include "win32/php_stdint.h" +# define __alignof__ __alignof +# define alloca _alloca +#else +# if HAVE_INTTYPES_H +# include +# elif HAVE_STDINT_H +# include +# endif +# ifndef HAVE_ALIGNOF +# include +# define __alignof__(type) offsetof (struct { char c; type member;}, member) +# endif +# if HAVE_ATTRIBUTE_ALIGNED +# define ALIGNED(size) __attribute__ ((__aligned__ (size))) +# else +# define ALIGNED(size) +# endif +#endif + +#include +#include + +#ifdef PHP_WIN32 +# include +#else +# include +# include +# if HAVE_STRING_H +# include +# else +# include +# endif +#endif + +extern void * __php_mempcpy(void * dst, const void * src, size_t len); +extern char * __php_stpncpy(char *dst, const char *src, size_t len); + +#ifndef MIN +# define MIN(a, b) (((a) < (b)) ? (a) : (b)) +#endif +#ifndef MAX +# define MAX(a, b) (((a) > (b)) ? (a) : (b)) +#endif + +/* Structure to save state of computation between the single steps. */ +struct sha512_ctx +{ + uint64_t H[8]; + + uint64_t total[2]; + uint64_t buflen; + char buffer[256]; /* NB: always correctly aligned for uint64_t. */ +}; + + +#if PHP_WIN32 || (!defined(WORDS_BIGENDIAN)) +# define SWAP(n) \ + (((n) << 56) \ + | (((n) & 0xff00) << 40) \ + | (((n) & 0xff0000) << 24) \ + | (((n) & 0xff000000) << 8) \ + | (((n) >> 8) & 0xff000000) \ + | (((n) >> 24) & 0xff0000) \ + | (((n) >> 40) & 0xff00) \ + | ((n) >> 56)) +#else +# define SWAP(n) (n) +#endif + +/* This array contains the bytes used to pad the buffer to the next + 64-byte boundary. (FIPS 180-2:5.1.2) */ +static const unsigned char fillbuf[128] = { 0x80, 0 /* , 0, 0, ... */ }; + +/* Constants for SHA512 from FIPS 180-2:4.2.3. */ +static const uint64_t K[80] = { + UINT64_C (0x428a2f98d728ae22), UINT64_C (0x7137449123ef65cd), + UINT64_C (0xb5c0fbcfec4d3b2f), UINT64_C (0xe9b5dba58189dbbc), + UINT64_C (0x3956c25bf348b538), UINT64_C (0x59f111f1b605d019), + UINT64_C (0x923f82a4af194f9b), UINT64_C (0xab1c5ed5da6d8118), + UINT64_C (0xd807aa98a3030242), UINT64_C (0x12835b0145706fbe), + UINT64_C (0x243185be4ee4b28c), UINT64_C (0x550c7dc3d5ffb4e2), + UINT64_C (0x72be5d74f27b896f), UINT64_C (0x80deb1fe3b1696b1), + UINT64_C (0x9bdc06a725c71235), UINT64_C (0xc19bf174cf692694), + UINT64_C (0xe49b69c19ef14ad2), UINT64_C (0xefbe4786384f25e3), + UINT64_C (0x0fc19dc68b8cd5b5), UINT64_C (0x240ca1cc77ac9c65), + UINT64_C (0x2de92c6f592b0275), UINT64_C (0x4a7484aa6ea6e483), + UINT64_C (0x5cb0a9dcbd41fbd4), UINT64_C (0x76f988da831153b5), + UINT64_C (0x983e5152ee66dfab), UINT64_C (0xa831c66d2db43210), + UINT64_C (0xb00327c898fb213f), UINT64_C (0xbf597fc7beef0ee4), + UINT64_C (0xc6e00bf33da88fc2), UINT64_C (0xd5a79147930aa725), + UINT64_C (0x06ca6351e003826f), UINT64_C (0x142929670a0e6e70), + UINT64_C (0x27b70a8546d22ffc), UINT64_C (0x2e1b21385c26c926), + UINT64_C (0x4d2c6dfc5ac42aed), UINT64_C (0x53380d139d95b3df), + UINT64_C (0x650a73548baf63de), UINT64_C (0x766a0abb3c77b2a8), + UINT64_C (0x81c2c92e47edaee6), UINT64_C (0x92722c851482353b), + UINT64_C (0xa2bfe8a14cf10364), UINT64_C (0xa81a664bbc423001), + UINT64_C (0xc24b8b70d0f89791), UINT64_C (0xc76c51a30654be30), + UINT64_C (0xd192e819d6ef5218), UINT64_C (0xd69906245565a910), + UINT64_C (0xf40e35855771202a), UINT64_C (0x106aa07032bbd1b8), + UINT64_C (0x19a4c116b8d2d0c8), UINT64_C (0x1e376c085141ab53), + UINT64_C (0x2748774cdf8eeb99), UINT64_C (0x34b0bcb5e19b48a8), + UINT64_C (0x391c0cb3c5c95a63), UINT64_C (0x4ed8aa4ae3418acb), + UINT64_C (0x5b9cca4f7763e373), UINT64_C (0x682e6ff3d6b2b8a3), + UINT64_C (0x748f82ee5defb2fc), UINT64_C (0x78a5636f43172f60), + UINT64_C (0x84c87814a1f0ab72), UINT64_C (0x8cc702081a6439ec), + UINT64_C (0x90befffa23631e28), UINT64_C (0xa4506cebde82bde9), + UINT64_C (0xbef9a3f7b2c67915), UINT64_C (0xc67178f2e372532b), + UINT64_C (0xca273eceea26619c), UINT64_C (0xd186b8c721c0c207), + UINT64_C (0xeada7dd6cde0eb1e), UINT64_C (0xf57d4f7fee6ed178), + UINT64_C (0x06f067aa72176fba), UINT64_C (0x0a637dc5a2c898a6), + UINT64_C (0x113f9804bef90dae), UINT64_C (0x1b710b35131c471b), + UINT64_C (0x28db77f523047d84), UINT64_C (0x32caab7b40c72493), + UINT64_C (0x3c9ebe0a15c9bebc), UINT64_C (0x431d67c49c100d4c), + UINT64_C (0x4cc5d4becb3e42b6), UINT64_C (0x597f299cfc657e2a), + UINT64_C (0x5fcb6fab3ad6faec), UINT64_C (0x6c44198c4a475817) + }; + + +/* Process LEN bytes of BUFFER, accumulating context into CTX. + It is assumed that LEN % 128 == 0. */ +static void +sha512_process_block(const void *buffer, size_t len, struct sha512_ctx *ctx) { + const uint64_t *words = buffer; + size_t nwords = len / sizeof(uint64_t); + uint64_t a = ctx->H[0]; + uint64_t b = ctx->H[1]; + uint64_t c = ctx->H[2]; + uint64_t d = ctx->H[3]; + uint64_t e = ctx->H[4]; + uint64_t f = ctx->H[5]; + uint64_t g = ctx->H[6]; + uint64_t h = ctx->H[7]; + + /* First increment the byte count. FIPS 180-2 specifies the possible + length of the file up to 2^128 bits. Here we only compute the + number of bytes. Do a double word increment. */ + ctx->total[0] += len; + if (ctx->total[0] < len) { + ++ctx->total[1]; + } + + /* Process all bytes in the buffer with 128 bytes in each round of + the loop. */ + while (nwords > 0) { + uint64_t W[80]; + uint64_t a_save = a; + uint64_t b_save = b; + uint64_t c_save = c; + uint64_t d_save = d; + uint64_t e_save = e; + uint64_t f_save = f; + uint64_t g_save = g; + uint64_t h_save = h; + unsigned int t; + +/* Operators defined in FIPS 180-2:4.1.2. */ +#define Ch(x, y, z) ((x & y) ^ (~x & z)) +#define Maj(x, y, z) ((x & y) ^ (x & z) ^ (y & z)) +#define S0(x) (CYCLIC (x, 28) ^ CYCLIC (x, 34) ^ CYCLIC (x, 39)) +#define S1(x) (CYCLIC (x, 14) ^ CYCLIC (x, 18) ^ CYCLIC (x, 41)) +#define R0(x) (CYCLIC (x, 1) ^ CYCLIC (x, 8) ^ (x >> 7)) +#define R1(x) (CYCLIC (x, 19) ^ CYCLIC (x, 61) ^ (x >> 6)) + + /* It is unfortunate that C does not provide an operator for + cyclic rotation. Hope the C compiler is smart enough. */ +#define CYCLIC(w, s) ((w >> s) | (w << (64 - s))) + + /* Compute the message schedule according to FIPS 180-2:6.3.2 step 2. */ + for (t = 0; t < 16; ++t) { + W[t] = SWAP (*words); + ++words; + } + + for (t = 16; t < 80; ++t) { + W[t] = R1 (W[t - 2]) + W[t - 7] + R0 (W[t - 15]) + W[t - 16]; + } + + /* The actual computation according to FIPS 180-2:6.3.2 step 3. */ + for (t = 0; t < 80; ++t) { + uint64_t T1 = h + S1 (e) + Ch (e, f, g) + K[t] + W[t]; + uint64_t T2 = S0 (a) + Maj (a, b, c); + h = g; + g = f; + f = e; + e = d + T1; + d = c; + c = b; + b = a; + a = T1 + T2; + } + + /* Add the starting values of the context according to FIPS 180-2:6.3.2 + step 4. */ + a += a_save; + b += b_save; + c += c_save; + d += d_save; + e += e_save; + f += f_save; + g += g_save; + h += h_save; + + /* Prepare for the next round. */ + nwords -= 16; + } + + /* Put checksum in context given as argument. */ + ctx->H[0] = a; + ctx->H[1] = b; + ctx->H[2] = c; + ctx->H[3] = d; + ctx->H[4] = e; + ctx->H[5] = f; + ctx->H[6] = g; + ctx->H[7] = h; +} + + +/* Initialize structure containing state of computation. + (FIPS 180-2:5.3.3) */ +static void sha512_init_ctx (struct sha512_ctx *ctx) { + ctx->H[0] = UINT64_C (0x6a09e667f3bcc908); + ctx->H[1] = UINT64_C (0xbb67ae8584caa73b); + ctx->H[2] = UINT64_C (0x3c6ef372fe94f82b); + ctx->H[3] = UINT64_C (0xa54ff53a5f1d36f1); + ctx->H[4] = UINT64_C (0x510e527fade682d1); + ctx->H[5] = UINT64_C (0x9b05688c2b3e6c1f); + ctx->H[6] = UINT64_C (0x1f83d9abfb41bd6b); + ctx->H[7] = UINT64_C (0x5be0cd19137e2179); + + ctx->total[0] = ctx->total[1] = 0; + ctx->buflen = 0; +} + + +/* Process the remaining bytes in the internal buffer and the usual + prolog according to the standard and write the result to RESBUF. + + IMPORTANT: On some systems it is required that RESBUF is correctly + aligned for a 32 bits value. */ +static void * sha512_finish_ctx (struct sha512_ctx *ctx, void *resbuf) { + /* Take yet unprocessed bytes into account. */ + uint64_t bytes = ctx->buflen; + size_t pad; + unsigned int i; + + /* Now count remaining bytes. */ + ctx->total[0] += bytes; + if (ctx->total[0] < bytes) { + ++ctx->total[1]; + } + + pad = bytes >= 112 ? 128 + 112 - (size_t)bytes : 112 - (size_t)bytes; + memcpy(&ctx->buffer[bytes], fillbuf, pad); + + /* Put the 128-bit file length in *bits* at the end of the buffer. */ + *(uint64_t *) &ctx->buffer[bytes + pad + 8] = SWAP(ctx->total[0] << 3); + *(uint64_t *) &ctx->buffer[bytes + pad] = SWAP((ctx->total[1] << 3) | + (ctx->total[0] >> 61)); + + /* Process last bytes. */ + sha512_process_block(ctx->buffer, (size_t)(bytes + pad + 16), ctx); + + /* Put result from CTX in first 64 bytes following RESBUF. */ + for (i = 0; i < 8; ++i) { + ((uint64_t *) resbuf)[i] = SWAP(ctx->H[i]); + } + + return resbuf; +} + +static void +sha512_process_bytes(const void *buffer, size_t len, struct sha512_ctx *ctx) { + /* When we already have some bits in our internal buffer concatenate + both inputs first. */ + if (ctx->buflen != 0) { + size_t left_over = (size_t)ctx->buflen; + size_t add = (size_t)(256 - left_over > len ? len : 256 - left_over); + + memcpy(&ctx->buffer[left_over], buffer, add); + ctx->buflen += add; + + if (ctx->buflen > 128) { + sha512_process_block(ctx->buffer, ctx->buflen & ~127, ctx); + + ctx->buflen &= 127; + /* The regions in the following copy operation cannot overlap. */ + memcpy(ctx->buffer, &ctx->buffer[(left_over + add) & ~127], + (size_t)ctx->buflen); + } + + buffer = (const char *) buffer + add; + len -= add; + } + + /* Process available complete blocks. */ + if (len >= 128) { +#if !_STRING_ARCH_unaligned +/* To check alignment gcc has an appropriate operator. Other + compilers don't. */ +# if __GNUC__ >= 2 +# define UNALIGNED_P(p) (((uintptr_t) p) % __alignof__ (uint64_t) != 0) +# else +# define UNALIGNED_P(p) (((uintptr_t) p) % sizeof(uint64_t) != 0) +# endif + if (UNALIGNED_P(buffer)) + while (len > 128) { + sha512_process_block(memcpy(ctx->buffer, buffer, 128), 128, ctx); + buffer = (const char *) buffer + 128; + len -= 128; + } + else +#endif + { + sha512_process_block(buffer, len & ~127, ctx); + buffer = (const char *) buffer + (len & ~127); + len &= 127; + } + } + + /* Move remaining bytes into internal buffer. */ + if (len > 0) { + size_t left_over = (size_t)ctx->buflen; + + memcpy(&ctx->buffer[left_over], buffer, len); + left_over += len; + if (left_over >= 128) { + sha512_process_block(ctx->buffer, 128, ctx); + left_over -= 128; + memcpy(ctx->buffer, &ctx->buffer[128], left_over); + } + ctx->buflen = left_over; + } +} + + +/* Define our magic string to mark salt for SHA512 "encryption" + replacement. */ +static const char sha512_salt_prefix[] = "$6$"; + +/* Prefix for optional rounds specification. */ +static const char sha512_rounds_prefix[] = "rounds="; + +/* Maximum salt string length. */ +#define SALT_LEN_MAX 16 +/* Default number of rounds if not explicitly specified. */ +#define ROUNDS_DEFAULT 5000 +/* Minimum number of rounds. */ +#define ROUNDS_MIN 1000 +/* Maximum number of rounds. */ +#define ROUNDS_MAX 999999999 + +/* Table with characters for base64 transformation. */ +static const char b64t[64] = +"./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; + + +char * +php_sha512_crypt_r(const char *key, const char *salt, char *buffer, int buflen) { +#ifdef PHP_WIN32 +# if _MSC <= 1300 +# pragma pack(push, 16) + unsigned char alt_result[64]; + unsigned char temp_result[64]; +# pragma pack(pop) +# else + __declspec(align(64)) unsigned char alt_result[64]; + __declspec(align(64)) unsigned char temp_result[64]; +# endif +#else + unsigned char alt_result[64] ALIGNED(__alignof__ (uint64_t)); + unsigned char temp_result[64] ALIGNED(__alignof__ (uint64_t)); +#endif + struct sha512_ctx ctx; + struct sha512_ctx alt_ctx; + size_t salt_len; + size_t key_len; + size_t cnt; + char *cp; + char *copied_key = NULL; + char *copied_salt = NULL; + char *p_bytes; + char *s_bytes; + /* Default number of rounds. */ + size_t rounds = ROUNDS_DEFAULT; + zend_bool rounds_custom = 0; + + /* Find beginning of salt string. The prefix should normally always + be present. Just in case it is not. */ + if (strncmp(sha512_salt_prefix, salt, sizeof(sha512_salt_prefix) - 1) == 0) { + /* Skip salt prefix. */ + salt += sizeof(sha512_salt_prefix) - 1; + } + + if (strncmp(salt, sha512_rounds_prefix, sizeof(sha512_rounds_prefix) - 1) == 0) { + const char *num = salt + sizeof(sha512_rounds_prefix) - 1; + char *endp; + unsigned long int srounds = strtoul(num, &endp, 10); + + if (*endp == '$') { + salt = endp + 1; + rounds = MAX(ROUNDS_MIN, MIN(srounds, ROUNDS_MAX)); + rounds_custom = 1; + } + } + + salt_len = MIN(strcspn(salt, "$"), SALT_LEN_MAX); + key_len = strlen(key); + + if ((key - (char *) 0) % __alignof__ (uint64_t) != 0) { + char *tmp = (char *) alloca (key_len + __alignof__ (uint64_t)); + key = copied_key = + memcpy(tmp + __alignof__(uint64_t) - (tmp - (char *) 0) % __alignof__(uint64_t), key, key_len); + } + + if ((salt - (char *) 0) % __alignof__ (uint64_t) != 0) { + char *tmp = (char *) alloca(salt_len + __alignof__(uint64_t)); + + salt = copied_salt = memcpy(tmp + __alignof__(uint64_t) - (tmp - (char *) 0) % __alignof__(uint64_t), salt, salt_len); + } + + /* Prepare for the real work. */ + sha512_init_ctx(&ctx); + + /* Add the key string. */ + sha512_process_bytes(key, key_len, &ctx); + + /* The last part is the salt string. This must be at most 16 + characters and it ends at the first `$' character (for + compatibility with existing implementations). */ + sha512_process_bytes(salt, salt_len, &ctx); + + + /* Compute alternate SHA512 sum with input KEY, SALT, and KEY. The + final result will be added to the first context. */ + sha512_init_ctx(&alt_ctx); + + /* Add key. */ + sha512_process_bytes(key, key_len, &alt_ctx); + + /* Add salt. */ + sha512_process_bytes(salt, salt_len, &alt_ctx); + + /* Add key again. */ + sha512_process_bytes(key, key_len, &alt_ctx); + + /* Now get result of this (64 bytes) and add it to the other + context. */ + sha512_finish_ctx(&alt_ctx, alt_result); + + /* Add for any character in the key one byte of the alternate sum. */ + for (cnt = key_len; cnt > 64; cnt -= 64) { + sha512_process_bytes(alt_result, 64, &ctx); + } + sha512_process_bytes(alt_result, cnt, &ctx); + + /* Take the binary representation of the length of the key and for every + 1 add the alternate sum, for every 0 the key. */ + for (cnt = key_len; cnt > 0; cnt >>= 1) { + if ((cnt & 1) != 0) { + sha512_process_bytes(alt_result, 64, &ctx); + } else { + sha512_process_bytes(key, key_len, &ctx); + } + } + + /* Create intermediate result. */ + sha512_finish_ctx(&ctx, alt_result); + + /* Start computation of P byte sequence. */ + sha512_init_ctx(&alt_ctx); + + /* For every character in the password add the entire password. */ + for (cnt = 0; cnt < key_len; ++cnt) { + sha512_process_bytes(key, key_len, &alt_ctx); + } + + /* Finish the digest. */ + sha512_finish_ctx(&alt_ctx, temp_result); + + /* Create byte sequence P. */ + cp = p_bytes = alloca(key_len); + for (cnt = key_len; cnt >= 64; cnt -= 64) { + cp = __php_mempcpy((void *) cp, (const void *)temp_result, 64); + } + + memcpy(cp, temp_result, cnt); + + /* Start computation of S byte sequence. */ + sha512_init_ctx(&alt_ctx); + + /* For every character in the password add the entire password. */ + for (cnt = 0; cnt < 16 + alt_result[0]; ++cnt) { + sha512_process_bytes(salt, salt_len, &alt_ctx); + } + + /* Finish the digest. */ + sha512_finish_ctx(&alt_ctx, temp_result); + + /* Create byte sequence S. */ + cp = s_bytes = alloca(salt_len); + for (cnt = salt_len; cnt >= 64; cnt -= 64) { + cp = __php_mempcpy(cp, temp_result, 64); + } + memcpy(cp, temp_result, cnt); + + /* Repeatedly run the collected hash value through SHA512 to burn + CPU cycles. */ + for (cnt = 0; cnt < rounds; ++cnt) { + /* New context. */ + sha512_init_ctx(&ctx); + + /* Add key or last result. */ + if ((cnt & 1) != 0) { + sha512_process_bytes(p_bytes, key_len, &ctx); + } else { + sha512_process_bytes(alt_result, 64, &ctx); + } + + /* Add salt for numbers not divisible by 3. */ + if (cnt % 3 != 0) { + sha512_process_bytes(s_bytes, salt_len, &ctx); + } + + /* Add key for numbers not divisible by 7. */ + if (cnt % 7 != 0) { + sha512_process_bytes(p_bytes, key_len, &ctx); + } + + /* Add key or last result. */ + if ((cnt & 1) != 0) { + sha512_process_bytes(alt_result, 64, &ctx); + } else { + sha512_process_bytes(p_bytes, key_len, &ctx); + } + + /* Create intermediate result. */ + sha512_finish_ctx(&ctx, alt_result); + } + + /* Now we can construct the result string. It consists of three + parts. */ + cp = __php_stpncpy(buffer, sha512_salt_prefix, MAX(0, buflen)); + buflen -= sizeof(sha512_salt_prefix) - 1; + + if (rounds_custom) { +#ifdef PHP_WIN32 + int n = _snprintf(cp, MAX(0, buflen), "%s%u$", sha512_rounds_prefix, rounds); +#else + int n = snprintf(cp, MAX(0, buflen), "%s%zu$", sha512_rounds_prefix, rounds); +#endif + cp += n; + buflen -= n; + } + + cp = __php_stpncpy(cp, salt, MIN((size_t) MAX(0, buflen), salt_len)); + buflen -= (int) MIN((size_t) MAX(0, buflen), salt_len); + + if (buflen > 0) { + *cp++ = '$'; + --buflen; + } + +#define b64_from_24bit(B2, B1, B0, N) \ + do { \ + unsigned int w = ((B2) << 16) | ((B1) << 8) | (B0); \ + int n = (N); \ + while (n-- > 0 && buflen > 0) \ + { \ + *cp++ = b64t[w & 0x3f]; \ + --buflen; \ + w >>= 6; \ + } \ + } while (0) + + b64_from_24bit(alt_result[0], alt_result[21], alt_result[42], 4); + b64_from_24bit(alt_result[22], alt_result[43], alt_result[1], 4); + b64_from_24bit(alt_result[44], alt_result[2], alt_result[23], 4); + b64_from_24bit(alt_result[3], alt_result[24], alt_result[45], 4); + b64_from_24bit(alt_result[25], alt_result[46], alt_result[4], 4); + b64_from_24bit(alt_result[47], alt_result[5], alt_result[26], 4); + b64_from_24bit(alt_result[6], alt_result[27], alt_result[48], 4); + b64_from_24bit(alt_result[28], alt_result[49], alt_result[7], 4); + b64_from_24bit(alt_result[50], alt_result[8], alt_result[29], 4); + b64_from_24bit(alt_result[9], alt_result[30], alt_result[51], 4); + b64_from_24bit(alt_result[31], alt_result[52], alt_result[10], 4); + b64_from_24bit(alt_result[53], alt_result[11], alt_result[32], 4); + b64_from_24bit(alt_result[12], alt_result[33], alt_result[54], 4); + b64_from_24bit(alt_result[34], alt_result[55], alt_result[13], 4); + b64_from_24bit(alt_result[56], alt_result[14], alt_result[35], 4); + b64_from_24bit(alt_result[15], alt_result[36], alt_result[57], 4); + b64_from_24bit(alt_result[37], alt_result[58], alt_result[16], 4); + b64_from_24bit(alt_result[59], alt_result[17], alt_result[38], 4); + b64_from_24bit(alt_result[18], alt_result[39], alt_result[60], 4); + b64_from_24bit(alt_result[40], alt_result[61], alt_result[19], 4); + b64_from_24bit(alt_result[62], alt_result[20], alt_result[41], 4); + b64_from_24bit(0, 0, alt_result[63], 2); + + if (buflen <= 0) { + errno = ERANGE; + buffer = NULL; + } else { + *cp = '\0'; /* Terminate the string. */ + } + + /* Clear the buffer for the intermediate result so that people + attaching to processes or reading core dumps cannot get any + information. We do it in this way to clear correct_words[] + inside the SHA512 implementation as well. */ + sha512_init_ctx(&ctx); + sha512_finish_ctx(&ctx, alt_result); + memset(temp_result, '\0', sizeof(temp_result)); + memset(p_bytes, '\0', key_len); + memset(s_bytes, '\0', salt_len); + memset(&ctx, '\0', sizeof(ctx)); + memset(&alt_ctx, '\0', sizeof(alt_ctx)); + if (copied_key != NULL) { + memset(copied_key, '\0', key_len); + } + if (copied_salt != NULL) { + memset(copied_salt, '\0', salt_len); + } + + return buffer; +} + + +/* This entry point is equivalent to the `crypt' function in Unix + libcs. */ +char * +php_sha512_crypt(const char *key, const char *salt) { + /* We don't want to have an arbitrary limit in the size of the + password. We can compute an upper bound for the size of the + result in advance and so we can prepare the buffer we pass to + `sha512_crypt_r'. */ + static char *buffer; + static int buflen; + int needed = (int)(sizeof(sha512_salt_prefix) - 1 + + sizeof(sha512_rounds_prefix) + 9 + 1 + + strlen(salt) + 1 + 86 + 1); + + if (buflen < needed) { + char *new_buffer = (char *) realloc(buffer, needed); + if (new_buffer == NULL) { + return NULL; + } + + buffer = new_buffer; + buflen = needed; + } + + return php_sha512_crypt_r (key, salt, buffer, buflen); +} + +#ifdef TEST +static const struct { + const char *input; + const char result[64]; +} tests[] = + { + /* Test vectors from FIPS 180-2: appendix C.1. */ + { "abc", + "\xdd\xaf\x35\xa1\x93\x61\x7a\xba\xcc\x41\x73\x49\xae\x20\x41\x31" + "\x12\xe6\xfa\x4e\x89\xa9\x7e\xa2\x0a\x9e\xee\xe6\x4b\x55\xd3\x9a" + "\x21\x92\x99\x2a\x27\x4f\xc1\xa8\x36\xba\x3c\x23\xa3\xfe\xeb\xbd" + "\x45\x4d\x44\x23\x64\x3c\xe8\x0e\x2a\x9a\xc9\x4f\xa5\x4c\xa4\x9f" }, + /* Test vectors from FIPS 180-2: appendix C.2. */ + { "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn" + "hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu", + "\x8e\x95\x9b\x75\xda\xe3\x13\xda\x8c\xf4\xf7\x28\x14\xfc\x14\x3f" + "\x8f\x77\x79\xc6\xeb\x9f\x7f\xa1\x72\x99\xae\xad\xb6\x88\x90\x18" + "\x50\x1d\x28\x9e\x49\x00\xf7\xe4\x33\x1b\x99\xde\xc4\xb5\x43\x3a" + "\xc7\xd3\x29\xee\xb6\xdd\x26\x54\x5e\x96\xe5\x5b\x87\x4b\xe9\x09" }, + /* Test vectors from the NESSIE project. */ + { "", + "\xcf\x83\xe1\x35\x7e\xef\xb8\xbd\xf1\x54\x28\x50\xd6\x6d\x80\x07" + "\xd6\x20\xe4\x05\x0b\x57\x15\xdc\x83\xf4\xa9\x21\xd3\x6c\xe9\xce" + "\x47\xd0\xd1\x3c\x5d\x85\xf2\xb0\xff\x83\x18\xd2\x87\x7e\xec\x2f" + "\x63\xb9\x31\xbd\x47\x41\x7a\x81\xa5\x38\x32\x7a\xf9\x27\xda\x3e" }, + { "a", + "\x1f\x40\xfc\x92\xda\x24\x16\x94\x75\x09\x79\xee\x6c\xf5\x82\xf2" + "\xd5\xd7\xd2\x8e\x18\x33\x5d\xe0\x5a\xbc\x54\xd0\x56\x0e\x0f\x53" + "\x02\x86\x0c\x65\x2b\xf0\x8d\x56\x02\x52\xaa\x5e\x74\x21\x05\x46" + "\xf3\x69\xfb\xbb\xce\x8c\x12\xcf\xc7\x95\x7b\x26\x52\xfe\x9a\x75" }, + { "message digest", + "\x10\x7d\xbf\x38\x9d\x9e\x9f\x71\xa3\xa9\x5f\x6c\x05\x5b\x92\x51" + "\xbc\x52\x68\xc2\xbe\x16\xd6\xc1\x34\x92\xea\x45\xb0\x19\x9f\x33" + "\x09\xe1\x64\x55\xab\x1e\x96\x11\x8e\x8a\x90\x5d\x55\x97\xb7\x20" + "\x38\xdd\xb3\x72\xa8\x98\x26\x04\x6d\xe6\x66\x87\xbb\x42\x0e\x7c" }, + { "abcdefghijklmnopqrstuvwxyz", + "\x4d\xbf\xf8\x6c\xc2\xca\x1b\xae\x1e\x16\x46\x8a\x05\xcb\x98\x81" + "\xc9\x7f\x17\x53\xbc\xe3\x61\x90\x34\x89\x8f\xaa\x1a\xab\xe4\x29" + "\x95\x5a\x1b\xf8\xec\x48\x3d\x74\x21\xfe\x3c\x16\x46\x61\x3a\x59" + "\xed\x54\x41\xfb\x0f\x32\x13\x89\xf7\x7f\x48\xa8\x79\xc7\xb1\xf1" }, + { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", + "\x20\x4a\x8f\xc6\xdd\xa8\x2f\x0a\x0c\xed\x7b\xeb\x8e\x08\xa4\x16" + "\x57\xc1\x6e\xf4\x68\xb2\x28\xa8\x27\x9b\xe3\x31\xa7\x03\xc3\x35" + "\x96\xfd\x15\xc1\x3b\x1b\x07\xf9\xaa\x1d\x3b\xea\x57\x78\x9c\xa0" + "\x31\xad\x85\xc7\xa7\x1d\xd7\x03\x54\xec\x63\x12\x38\xca\x34\x45" }, + { "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", + "\x1e\x07\xbe\x23\xc2\x6a\x86\xea\x37\xea\x81\x0c\x8e\xc7\x80\x93" + "\x52\x51\x5a\x97\x0e\x92\x53\xc2\x6f\x53\x6c\xfc\x7a\x99\x96\xc4" + "\x5c\x83\x70\x58\x3e\x0a\x78\xfa\x4a\x90\x04\x1d\x71\xa4\xce\xab" + "\x74\x23\xf1\x9c\x71\xb9\xd5\xa3\xe0\x12\x49\xf0\xbe\xbd\x58\x94" }, + { "123456789012345678901234567890123456789012345678901234567890" + "12345678901234567890", + "\x72\xec\x1e\xf1\x12\x4a\x45\xb0\x47\xe8\xb7\xc7\x5a\x93\x21\x95" + "\x13\x5b\xb6\x1d\xe2\x4e\xc0\xd1\x91\x40\x42\x24\x6e\x0a\xec\x3a" + "\x23\x54\xe0\x93\xd7\x6f\x30\x48\xb4\x56\x76\x43\x46\x90\x0c\xb1" + "\x30\xd2\xa4\xfd\x5d\xd1\x6a\xbb\x5e\x30\xbc\xb8\x50\xde\xe8\x43" } + }; +#define ntests (sizeof (tests) / sizeof (tests[0])) + + +static const struct +{ + const char *salt; + const char *input; + const char *expected; +} tests2[] = { + { "$6$saltstring", "Hello world!", + "$6$saltstring$svn8UoSVapNtMuq1ukKS4tPQd8iKwSMHWjl/O817G3uBnIFNjnQJu" + "esI68u4OTLiBFdcbYEdFCoEOfaS35inz1"}, + { "$6$rounds=10000$saltstringsaltstring", "Hello world!", + "$6$rounds=10000$saltstringsaltst$OW1/O6BYHV6BcXZu8QVeXbDWra3Oeqh0sb" + "HbbMCVNSnCM/UrjmM0Dp8vOuZeHBy/YTBmSK6H9qs/y3RnOaw5v." }, + { "$6$rounds=5000$toolongsaltstring", "This is just a test", + "$6$rounds=5000$toolongsaltstrin$lQ8jolhgVRVhY4b5pZKaysCLi0QBxGoNeKQ" + "zQ3glMhwllF7oGDZxUhx1yxdYcz/e1JSbq3y6JMxxl8audkUEm0" }, + { "$6$rounds=1400$anotherlongsaltstring", + "a very much longer text to encrypt. This one even stretches over more" + "than one line.", + "$6$rounds=1400$anotherlongsalts$POfYwTEok97VWcjxIiSOjiykti.o/pQs.wP" + "vMxQ6Fm7I6IoYN3CmLs66x9t0oSwbtEW7o7UmJEiDwGqd8p4ur1" }, + { "$6$rounds=77777$short", + "we have a short salt string but not a short password", + "$6$rounds=77777$short$WuQyW2YR.hBNpjjRhpYD/ifIw05xdfeEyQoMxIXbkvr0g" + "ge1a1x3yRULJ5CCaUeOxFmtlcGZelFl5CxtgfiAc0" }, + { "$6$rounds=123456$asaltof16chars..", "a short string", + "$6$rounds=123456$asaltof16chars..$BtCwjqMJGx5hrJhZywWvt0RLE8uZ4oPwc" + "elCjmw2kSYu.Ec6ycULevoBK25fs2xXgMNrCzIMVcgEJAstJeonj1" }, + { "$6$rounds=10$roundstoolow", "the minimum number is still observed", + "$6$rounds=1000$roundstoolow$kUMsbe306n21p9R.FRkW3IGn.S9NPN0x50YhH1x" + "hLsPuWGsUSklZt58jaTfF4ZEQpyUNGc0dqbpBYYBaHHrsX." }, +}; +#define ntests2 (sizeof (tests2) / sizeof (tests2[0])) + + +int main (void) { + struct sha512_ctx ctx; + char sum[64]; + int result = 0; + int cnt; + int i; + char buf[1000]; + static const char expected[64] = + "\xe7\x18\x48\x3d\x0c\xe7\x69\x64\x4e\x2e\x42\xc7\xbc\x15\xb4\x63" + "\x8e\x1f\x98\xb1\x3b\x20\x44\x28\x56\x32\xa8\x03\xaf\xa9\x73\xeb" + "\xde\x0f\xf2\x44\x87\x7e\xa6\x0a\x4c\xb0\x43\x2c\xe5\x77\xc3\x1b" + "\xeb\x00\x9c\x5c\x2c\x49\xaa\x2e\x4e\xad\xb2\x17\xad\x8c\xc0\x9b"; + + for (cnt = 0; cnt < (int) ntests; ++cnt) { + sha512_init_ctx (&ctx); + sha512_process_bytes (tests[cnt].input, strlen (tests[cnt].input), &ctx); + sha512_finish_ctx (&ctx, sum); + if (memcmp (tests[cnt].result, sum, 64) != 0) { + printf ("test %d run %d failed\n", cnt, 1); + result = 1; + } + + sha512_init_ctx (&ctx); + for (i = 0; tests[cnt].input[i] != '\0'; ++i) { + sha512_process_bytes (&tests[cnt].input[i], 1, &ctx); + } + sha512_finish_ctx (&ctx, sum); + if (memcmp (tests[cnt].result, sum, 64) != 0) { + printf ("test %d run %d failed\n", cnt, 2); + result = 1; + } + } + + /* Test vector from FIPS 180-2: appendix C.3. */ + + memset (buf, 'a', sizeof (buf)); + sha512_init_ctx (&ctx); + for (i = 0; i < 1000; ++i) { + sha512_process_bytes (buf, sizeof (buf), &ctx); + } + + sha512_finish_ctx (&ctx, sum); + if (memcmp (expected, sum, 64) != 0) { + printf ("test %d failed\n", cnt); + result = 1; + } + + for (cnt = 0; cnt < ntests2; ++cnt) { + char *cp = php_sha512_crypt(tests2[cnt].input, tests2[cnt].salt); + + if (strcmp (cp, tests2[cnt].expected) != 0) { + printf ("test %d: expected \"%s\", got \"%s\"\n", + cnt, tests2[cnt].expected, cp); + result = 1; + } + } + + if (result == 0) { + puts ("all tests OK"); + } + + return result; +} +#endif diff --git a/ext/standard/css.c b/ext/standard/css.c index 5a62621e5..d4179538d 100644 --- a/ext/standard/css.c +++ b/ext/standard/css.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: css.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: css.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php.h" #include "info.h" diff --git a/ext/standard/css.h b/ext/standard/css.h index 855c21eed..d7cc796fc 100644 --- a/ext/standard/css.h +++ b/ext/standard/css.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: css.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: css.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef CSS_H #define CSS_H diff --git a/ext/standard/cyr_convert.c b/ext/standard/cyr_convert.c index 3a847be18..be11cd02a 100644 --- a/ext/standard/cyr_convert.c +++ b/ext/standard/cyr_convert.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: cyr_convert.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: cyr_convert.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include diff --git a/ext/standard/cyr_convert.h b/ext/standard/cyr_convert.h index 74a1a3628..3ff5c5904 100644 --- a/ext/standard/cyr_convert.h +++ b/ext/standard/cyr_convert.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: cyr_convert.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: cyr_convert.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef CYR_CONVERT_H #define CYR_CONVERT_H diff --git a/ext/standard/datetime.c b/ext/standard/datetime.c index 6afd94569..87fd1b674 100644 --- a/ext/standard/datetime.c +++ b/ext/standard/datetime.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: datetime.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: datetime.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php.h" #include "zend_operators.h" diff --git a/ext/standard/datetime.h b/ext/standard/datetime.h index a944f270c..0ac21ea91 100644 --- a/ext/standard/datetime.h +++ b/ext/standard/datetime.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: datetime.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: datetime.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef DATETIME_H #define DATETIME_H diff --git a/ext/standard/dir.c b/ext/standard/dir.c index f2b8d24cb..fcaf1f0b2 100644 --- a/ext/standard/dir.c +++ b/ext/standard/dir.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: dir.c 286555 2009-07-30 12:06:40Z felipe $ */ +/* $Id: dir.c 293036 2010-01-03 09:23:27Z sebastian $ */ /* {{{ includes/startup/misc */ diff --git a/ext/standard/dl.c b/ext/standard/dl.c index 37eda68a5..04990075c 100644 --- a/ext/standard/dl.c +++ b/ext/standard/dl.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: dl.c 286859 2009-08-06 01:33:54Z scottmac $ */ +/* $Id: dl.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php.h" #include "dl.h" @@ -146,8 +146,18 @@ PHPAPI int php_load_extension(char *filename, int type, int start_now TSRMLS_DC) /* load dynamic symbol */ handle = DL_LOAD(libpath); if (!handle) { +#if PHP_WIN32 + char *err = GET_DL_ERROR(); + if (err) { + php_error_docref(NULL TSRMLS_CC, error_type, "Unable to load dynamic library '%s' - %s", libpath, err); + LocalFree(err); + } else { + php_error_docref(NULL TSRMLS_CC, error_type, "Unable to load dynamic library '%s' - %s", libpath, "Unknown reason"); + } +#else php_error_docref(NULL TSRMLS_CC, error_type, "Unable to load dynamic library '%s' - %s", libpath, GET_DL_ERROR()); GET_DL_ERROR(); /* free the buffer storing the error */ +#endif efree(libpath); return FAILURE; } diff --git a/ext/standard/dl.h b/ext/standard/dl.h index 8d9ce1e84..6eb3fb632 100644 --- a/ext/standard/dl.h +++ b/ext/standard/dl.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: dl.h 272444 2008-12-31 18:55:22Z helly $ */ +/* $Id: dl.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef DL_H #define DL_H diff --git a/ext/standard/dns.c b/ext/standard/dns.c index 7507884e6..96d6fb77b 100644 --- a/ext/standard/dns.c +++ b/ext/standard/dns.c @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: dns.c 287120 2009-08-11 22:07:35Z scottmac $ */ +/* $Id: dns.c 292413 2009-12-21 15:22:40Z jani $ */ /* {{{ includes */ #include "php.h" @@ -44,10 +44,10 @@ #undef T_UNSPEC #endif #if HAVE_ARPA_NAMESER_H -#include +#ifdef DARWIN +# define BIND_8_COMPAT 1 #endif -#if HAVE_ARPA_NAMESER_COMPAT_H -#include +#include #endif #if HAVE_RESOLV_H #include @@ -810,14 +810,8 @@ PHP_FUNCTION(dns_get_record) n = php_dns_search(handle, hostname, C_IN, type_to_fetch, answer.qb2, sizeof answer); if (n < 0) { - if (php_dns_errno(handle) == NO_DATA) { - php_dns_free_handle(handle); - continue; - } - php_dns_free_handle(handle); - zval_dtor(return_value); - RETURN_FALSE; + continue; } cp = answer.qb2 + HFIXEDSZ; diff --git a/ext/standard/exec.c b/ext/standard/exec.c index 6c2dd6000..54c25f2ef 100644 --- a/ext/standard/exec.c +++ b/ext/standard/exec.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ | Ilia Alshanetsky | +----------------------------------------------------------------------+ */ -/* $Id: exec.c 289688 2009-10-15 21:36:42Z pajoye $ */ +/* $Id: exec.c 294429 2010-02-03 18:11:24Z pajoye $ */ #include #include "php.h" @@ -121,7 +121,7 @@ PHPAPI int php_exec(int type, char *cmd, zval *array, zval *return_value TSRMLS_ if (type != 3) { b = buf; - + while (php_stream_get_line(stream, b, EXEC_INPUT_BUF, &bufl)) { /* no new line found, let's read some more */ if (b[bufl - 1] != '\n' && !php_stream_eof(stream)) { @@ -157,7 +157,7 @@ PHPAPI int php_exec(int type, char *cmd, zval *array, zval *return_value TSRMLS_ } if (bufl) { /* strip trailing whitespaces if we have not done so already */ - if ((type == 2 && bufl && !l) || type != 2) { + if ((type == 2 && buf != b) || type != 2) { l = bufl; while (l-- && isspace(((unsigned char *)buf)[l])); if (l != (int)(bufl - 1)) { diff --git a/ext/standard/exec.h b/ext/standard/exec.h index 669fa1b19..18ba00836 100644 --- a/ext/standard/exec.h +++ b/ext/standard/exec.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: exec.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: exec.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef EXEC_H #define EXEC_H diff --git a/ext/standard/file.c b/ext/standard/file.c index 61eb06c11..0bfe060f2 100644 --- a/ext/standard/file.c +++ b/ext/standard/file.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -21,7 +21,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: file.c 289422 2009-10-09 14:37:45Z pajoye $ */ +/* $Id: file.c 294896 2010-02-11 18:03:57Z johannes $ */ /* Synced with php 3.0 revision 1.218 1999-06-16 [ssb] */ @@ -50,16 +50,6 @@ # include "win32/param.h" # include "win32/winutil.h" # include "win32/fnmatch.h" -#elif defined(NETWARE) -# include -# include -# ifdef USE_WINSOCK -# include -# else -# include -# include -# include -# endif #else # if HAVE_SYS_PARAM_H # include @@ -846,7 +836,7 @@ PHP_FUNCTION(tempnam) return; } - if (PG(safe_mode) &&(!php_checkuid(dir, NULL, CHECKUID_ALLOW_ONLY_DIR))) { + if (PG(safe_mode) &&(!php_checkuid(dir, NULL, CHECKUID_CHECK_FILE_AND_DIR))) { RETURN_FALSE; } @@ -1636,16 +1626,9 @@ PHP_NAMED_FUNCTION(php_if_fstat) MAKE_LONG_ZVAL_INCREF(stat_rdev, -1); #endif MAKE_LONG_ZVAL_INCREF(stat_size, stat_ssb.sb.st_size); -#ifdef NETWARE - MAKE_LONG_ZVAL_INCREF(stat_atime, stat_ssb.sb.st_atime.tv_sec); - MAKE_LONG_ZVAL_INCREF(stat_mtime, stat_ssb.sb.st_mtime.tv_sec); - MAKE_LONG_ZVAL_INCREF(stat_ctime, stat_ssb.sb.st_ctime.tv_sec); -#else MAKE_LONG_ZVAL_INCREF(stat_atime, stat_ssb.sb.st_atime); MAKE_LONG_ZVAL_INCREF(stat_mtime, stat_ssb.sb.st_mtime); MAKE_LONG_ZVAL_INCREF(stat_ctime, stat_ssb.sb.st_ctime); -#endif - #ifdef HAVE_ST_BLKSIZE MAKE_LONG_ZVAL_INCREF(stat_blksize, stat_ssb.sb.st_blksize); #else diff --git a/ext/standard/file.h b/ext/standard/file.h index d3720f9f1..63804b72b 100644 --- a/ext/standard/file.h +++ b/ext/standard/file.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: file.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: file.h 293036 2010-01-03 09:23:27Z sebastian $ */ /* Synced with php 3.0 revision 1.30 1999-06-16 [ssb] */ diff --git a/ext/standard/filestat.c b/ext/standard/filestat.c index 031422f7a..72aaf98b0 100644 --- a/ext/standard/filestat.c +++ b/ext/standard/filestat.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: filestat.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: filestat.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php.h" #include "safe_mode.h" @@ -386,7 +386,7 @@ PHP_FUNCTION(disk_free_space) } /* }}} */ -#if !defined(WINDOWS) +#if !defined(WINDOWS) && !defined(NETWARE) static void php_do_chgrp(INTERNAL_FUNCTION_PARAMETERS, int do_lchgrp) /* {{{ */ { char *filename; @@ -487,7 +487,7 @@ PHP_FUNCTION(lchgrp) /* }}} */ #endif /* !NETWARE */ -#if !defined(WINDOWS) +#if !defined(WINDOWS) && !defined(NETWARE) static void php_do_chown(INTERNAL_FUNCTION_PARAMETERS, int do_lchown) /* {{{ */ { char *filename; @@ -899,23 +899,11 @@ PHPAPI void php_stat(const char *filename, php_stat_len filename_length, int typ case FS_GROUP: RETURN_LONG((long)ssb.sb.st_gid); case FS_ATIME: -#ifdef NETWARE - RETURN_LONG((long)ssb.sb.st_atime.tv_sec); -#else RETURN_LONG((long)ssb.sb.st_atime); -#endif case FS_MTIME: -#ifdef NETWARE - RETURN_LONG((long)ssb.sb.st_mtime.tv_sec); -#else RETURN_LONG((long)ssb.sb.st_mtime); -#endif case FS_CTIME: -#ifdef NETWARE - RETURN_LONG((long)ssb.sb.st_ctime.tv_sec); -#else RETURN_LONG((long)ssb.sb.st_ctime); -#endif case FS_TYPE: if (S_ISLNK(ssb.sb.st_mode)) { RETURN_STRING("link", 1); @@ -963,15 +951,9 @@ PHPAPI void php_stat(const char *filename, php_stat_len filename_length, int typ MAKE_LONG_ZVAL_INCREF(stat_rdev, -1); #endif MAKE_LONG_ZVAL_INCREF(stat_size, stat_sb->st_size); -#ifdef NETWARE - MAKE_LONG_ZVAL_INCREF(stat_atime, (stat_sb->st_atime).tv_sec); - MAKE_LONG_ZVAL_INCREF(stat_mtime, (stat_sb->st_mtime).tv_sec); - MAKE_LONG_ZVAL_INCREF(stat_ctime, (stat_sb->st_ctime).tv_sec); -#else MAKE_LONG_ZVAL_INCREF(stat_atime, stat_sb->st_atime); MAKE_LONG_ZVAL_INCREF(stat_mtime, stat_sb->st_mtime); MAKE_LONG_ZVAL_INCREF(stat_ctime, stat_sb->st_ctime); -#endif #ifdef HAVE_ST_BLKSIZE MAKE_LONG_ZVAL_INCREF(stat_blksize, stat_sb->st_blksize); #else @@ -1125,6 +1107,51 @@ FileFunction(php_if_lstat, FS_LSTAT) FileFunction(php_if_stat, FS_STAT) /* }}} */ +/* {{{ proto bool realpath_cache_size() + Get current size of realpath cache */ +PHP_FUNCTION(realpath_cache_size) +{ + if (zend_parse_parameters_none() == FAILURE) { + return; + } + RETURN_LONG(realpath_cache_size(TSRMLS_C)); +} + +/* {{{ proto bool realpath_cache_get() + Get current size of realpath cache */ +PHP_FUNCTION(realpath_cache_get) +{ + realpath_cache_bucket **buckets = realpath_cache_get_buckets(TSRMLS_C), **end = buckets + realpath_cache_max_buckets(TSRMLS_C); + + if (zend_parse_parameters_none() == FAILURE) { + return; + } + + array_init(return_value); + while(buckets < end) { + realpath_cache_bucket *bucket = *buckets; + while(bucket) { + zval *entry; + MAKE_STD_ZVAL(entry); + array_init(entry); + + add_assoc_long(entry, "key", bucket->key); + add_assoc_bool(entry, "is_dir", bucket->is_dir); + add_assoc_stringl(entry, "realpath", bucket->realpath, bucket->realpath_len, 1); + add_assoc_long(entry, "expires", bucket->expires); +#ifdef PHP_WIN32 + add_assoc_bool(entry, "is_rvalid", bucket->is_rvalid); + add_assoc_bool(entry, "is_wvalid", bucket->is_wvalid); + add_assoc_bool(entry, "is_readable", bucket->is_readable); + add_assoc_bool(entry, "is_writable", bucket->is_writable); +#endif + zend_hash_update(Z_ARRVAL_P(return_value), bucket->path, bucket->path_len+1, &entry, sizeof(zval *), NULL); + bucket = bucket->next; + } + buckets++; + } +} + /* * Local variables: * tab-width: 4 diff --git a/ext/standard/filters.c b/ext/standard/filters.c index 888b14e35..c534cc4b4 100644 --- a/ext/standard/filters.c +++ b/ext/standard/filters.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -20,7 +20,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: filters.c 284646 2009-07-23 12:18:40Z iliaa $ */ +/* $Id: filters.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php.h" #include "php_globals.h" diff --git a/ext/standard/flock_compat.c b/ext/standard/flock_compat.c index a01423cc9..696e972a4 100644 --- a/ext/standard/flock_compat.c +++ b/ext/standard/flock_compat.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: flock_compat.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: flock_compat.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php.h" #include diff --git a/ext/standard/flock_compat.h b/ext/standard/flock_compat.h index a2d347fae..c7265fc2e 100644 --- a/ext/standard/flock_compat.h +++ b/ext/standard/flock_compat.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: flock_compat.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: flock_compat.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef FLOCK_COMPAT_H #define FLOCK_COMPAT_H @@ -42,9 +42,12 @@ PHPAPI int flock(int fd, int operation); #define PHP_LOCK_NB 4 #ifdef PHP_WIN32 -#define EWOULDBLOCK WSAEWOULDBLOCK -# define fsync _commit -# define ftruncate(a, b) chsize(a, b) +# ifdef EWOULDBLOCK +# undef EWOULDBLOCK +# endif +# define EWOULDBLOCK WSAEWOULDBLOCK +# define fsync _commit +# define ftruncate(a, b) chsize(a, b) #endif /* defined(PHP_WIN32) */ #if !HAVE_INET_ATON diff --git a/ext/standard/formatted_print.c b/ext/standard/formatted_print.c index d44aae543..5f5f2a66f 100644 --- a/ext/standard/formatted_print.c +++ b/ext/standard/formatted_print.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: formatted_print.c 284649 2009-07-23 14:54:04Z jani $ */ +/* $Id: formatted_print.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include /* modf() */ #include "php.h" @@ -232,14 +232,14 @@ php_sprintf_appenddouble(char **buffer, int *pos, if (zend_isnan(number)) { is_negative = (number<0); php_sprintf_appendstring(buffer, pos, size, "NaN", 3, 0, padding, - alignment, precision, is_negative, 0, always_sign); + alignment, 3, is_negative, 0, always_sign); return; } if (zend_isinf(number)) { is_negative = (number<0); php_sprintf_appendstring(buffer, pos, size, "INF", 3, 0, padding, - alignment, precision, is_negative, 0, always_sign); + alignment, 3, is_negative, 0, always_sign); return; } diff --git a/ext/standard/fsock.c b/ext/standard/fsock.c index 270e4d529..87e3e52e0 100644 --- a/ext/standard/fsock.c +++ b/ext/standard/fsock.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: fsock.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: fsock.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php.h" #include "php_globals.h" diff --git a/ext/standard/fsock.h b/ext/standard/fsock.h index 8c5db51d2..377661300 100644 --- a/ext/standard/fsock.h +++ b/ext/standard/fsock.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: fsock.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: fsock.h 293036 2010-01-03 09:23:27Z sebastian $ */ /* Synced with php 3.0 revision 1.24 1999-06-18 [ssb] */ diff --git a/ext/standard/ftok.c b/ext/standard/ftok.c index 3c768a8e0..a41c12679 100644 --- a/ext/standard/ftok.c +++ b/ext/standard/ftok.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: ftok.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: ftok.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php.h" diff --git a/ext/standard/ftp_fopen_wrapper.c b/ext/standard/ftp_fopen_wrapper.c index b2175e8a2..6e20d5a48 100644 --- a/ext/standard/ftp_fopen_wrapper.c +++ b/ext/standard/ftp_fopen_wrapper.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -18,7 +18,7 @@ | Sara Golemon | +----------------------------------------------------------------------+ */ -/* $Id: ftp_fopen_wrapper.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: ftp_fopen_wrapper.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php.h" #include "php_globals.h" @@ -834,32 +834,19 @@ static int php_stream_ftp_url_stat(php_stream_wrapper *wrapper, char *url, int f tm.tm_sec += stamp - mktime(gmt); tm.tm_isdst = gmt->tm_isdst; -#ifdef NETWARE - ssb->sb.st_mtime.tv_sec = mktime(&tm); -#else ssb->sb.st_mtime = mktime(&tm); -#endif } else { /* error or unsupported command */ mdtm_error: -#ifdef NETWARE - ssb->sb.st_mtime.tv_sec = -1; -#else ssb->sb.st_mtime = -1; -#endif } ssb->sb.st_ino = 0; /* Unknown values */ ssb->sb.st_dev = 0; ssb->sb.st_uid = 0; ssb->sb.st_gid = 0; -#ifdef NETWARE - ssb->sb.st_atime.tv_sec = -1; - ssb->sb.st_ctime.tv_sec = -1; -#else ssb->sb.st_atime = -1; ssb->sb.st_ctime = -1; -#endif ssb->sb.st_nlink = 1; ssb->sb.st_rdev = -1; diff --git a/ext/standard/head.c b/ext/standard/head.c index 9e9d9d54e..807d30b10 100644 --- a/ext/standard/head.c +++ b/ext/standard/head.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -15,7 +15,7 @@ | Author: Rasmus Lerdorf | +----------------------------------------------------------------------+ */ -/* $Id: head.c 286508 2009-07-29 13:44:16Z iliaa $ */ +/* $Id: head.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include #include "php.h" diff --git a/ext/standard/head.h b/ext/standard/head.h index 1eef0f290..7d7f6ca1c 100644 --- a/ext/standard/head.h +++ b/ext/standard/head.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: head.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: head.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef HEAD_H #define HEAD_H diff --git a/ext/standard/html.c b/ext/standard/html.c index 6f1bab29a..c9c7a7555 100644 --- a/ext/standard/html.c +++ b/ext/standard/html.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: html.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: html.c 293036 2010-01-03 09:23:27Z sebastian $ */ /* * HTML entity resources: @@ -144,7 +144,7 @@ static entity_table_t ent_uni_greek[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, "thetasym", "upsih", NULL, NULL, NULL, - "piv" + "piv" }; static entity_table_t ent_uni_punct[] = { @@ -154,7 +154,7 @@ static entity_table_t ent_uni_punct[] = { NULL, NULL, NULL, "ndash", "mdash", NULL, NULL, NULL, /* 8216 */ "lsquo", "rsquo", "sbquo", NULL, "ldquo", "rdquo", "bdquo", NULL, - "dagger", "Dagger", "bull", NULL, NULL, NULL, "hellip", + "dagger", "Dagger", "bull", NULL, NULL, NULL, "hellip", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "permil", NULL, /* 8242 */ "prime", "Prime", NULL, NULL, NULL, NULL, NULL, "lsaquo", "rsaquo", NULL, @@ -194,39 +194,39 @@ static entity_table_t ent_uni_8592_9002[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 8656 (0x21d0) */ - "lArr", "uArr", "rArr", "dArr", "hArr", "vArr", NULL, NULL, - NULL, NULL, "lAarr", "rAarr", NULL, "rarrw", NULL, NULL, + "lArr", "uArr", "rArr", "dArr", "hArr", NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 8672 (0x21e0) */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 8704 (0x2200) */ - "forall", "comp", "part", "exist", "nexist", "empty", NULL, "nabla", - "isin", "notin", "epsis", "ni", "notni", "bepsi", NULL, "prod", + "forall", NULL, "part", "exist", NULL, "empty", NULL, "nabla", + "isin", "notin", NULL, "ni", NULL, NULL, NULL, "prod", /* 8720 (0x2210) */ - "coprod", "sum", "minus", "mnplus", "plusdo", NULL, "setmn", "lowast", - "compfn", NULL, "radic", NULL, NULL, "prop", "infin", "ang90", + NULL, "sum", "minus", NULL, NULL, NULL, NULL, "lowast", + NULL, NULL, "radic", NULL, NULL, "prop", "infin", NULL, /* 8736 (0x2220) */ - "ang", "angmsd", "angsph", "mid", "nmid", "par", "npar", "and", - "or", "cap", "cup", "int", NULL, NULL, "conint", NULL, + "ang", NULL, NULL, NULL, NULL, NULL, NULL, "and", + "or", "cap", "cup", "int", NULL, NULL, NULL, NULL, /* 8752 (0x2230) */ - NULL, NULL, NULL, NULL, "there4", "becaus", NULL, NULL, - NULL, NULL, NULL, NULL, "sim", "bsim", NULL, NULL, + NULL, NULL, NULL, NULL, "there4", NULL, NULL, NULL, + NULL, NULL, NULL, NULL, "sim", NULL, NULL, NULL, /* 8768 (0x2240) */ - "wreath", "nsim", NULL, "sime", "nsime", "cong", NULL, "ncong", - "asymp", "nap", "ape", NULL, "bcong", "asymp", "bump", "bumpe", + NULL, NULL, NULL, NULL, NULL, "cong", NULL, NULL, + "asymp", NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 8784 (0x2250) */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 8800 (0x2260) */ - "ne", "equiv", NULL, NULL, "le", "ge", "lE", "gE", - "lnE", "gnE", "Lt", "Gt", "twixt", NULL, "nlt", "ngt", + "ne", "equiv", NULL, NULL, "le", "ge", NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 8816 (0x2270) */ - "nles", "nges", "lsim", "gsim", NULL, NULL, "lg", "gl", - NULL, NULL, "pr", "sc", "cupre", "sscue", "prsim", "scsim", + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 8832 (0x2280) */ - "npr", "nsc", "sub", "sup", "nsub", "nsup", "sube", "supe", + NULL, NULL, "sub", "sup", "nsub", NULL, "sube", "supe", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 8848 (0x2290) */ NULL, NULL, NULL, NULL, NULL, "oplus", NULL, "otimes", @@ -380,8 +380,8 @@ static entity_table_t ent_macroman[] = { struct html_entity_map { enum entity_charset charset; /* charset identifier */ - unsigned short basechar; /* char code at start of table */ - unsigned short endchar; /* last char code in the table */ + unsigned int basechar; /* char code at start of table */ + unsigned int endchar; /* last char code in the table */ entity_table_t *table; /* the table of mappings */ }; @@ -483,16 +483,31 @@ struct basic_entities_dec { } \ mbseq[mbpos++] = (mbchar); } +/* skip one byte and return */ +#define MB_FAILURE(pos) do { \ + *newpos = pos + 1; \ + *status = FAILURE; \ + return 0; \ +} while (0) + #define CHECK_LEN(pos, chars_need) \ - if((str_len - (pos)) < chars_need) { \ - *newpos = pos; \ - *status = FAILURE; \ - return 0; \ + if (chars_need < 1) { \ + if((str_len - (pos)) < chars_need) { \ + *newpos = pos; \ + *status = FAILURE; \ + return 0; \ + } \ + } else { \ + if((str_len - (pos)) < chars_need) { \ + *newpos = pos + 1; \ + *status = FAILURE; \ + return 0; \ + } \ } /* {{{ get_next_char */ -inline static unsigned short get_next_char(enum entity_charset charset, +inline static unsigned int get_next_char(enum entity_charset charset, unsigned char * str, int str_len, int * newpos, @@ -503,206 +518,191 @@ inline static unsigned short get_next_char(enum entity_charset charset, int pos = *newpos; int mbpos = 0; int mbspace = *mbseqlen; - unsigned short this_char = str[pos++]; + unsigned int this_char = 0; unsigned char next_char; *status = SUCCESS; - + if (mbspace <= 0) { *mbseqlen = 0; - return this_char; + CHECK_LEN(pos, 1); + *newpos = pos + 1; + return str[pos]; } - - MB_WRITE((unsigned char)this_char); - + switch (charset) { case cs_utf_8: { - unsigned long utf = 0; - int stat = 0; - int more = 1; - - /* unpack utf-8 encoding into a wide char. - * Code stolen from the mbstring extension */ - - do { + unsigned char c; + CHECK_LEN(pos, 1); + c = str[pos]; + if (c < 0x80) { + MB_WRITE(c); + this_char = c; + pos++; + } else if (c < 0xc0) { + MB_FAILURE(pos); + } else if (c < 0xe0) { + CHECK_LEN(pos, 2); + if (str[pos + 1] < 0x80 || str[pos + 1] > 0xbf) { + MB_FAILURE(pos); + } + this_char = ((c & 0x1f) << 6) | (str[pos + 1] & 0x3f); if (this_char < 0x80) { - more = 0; - if(stat) { - /* we didn't finish the UTF sequence correctly */ - --pos; - *status = FAILURE; - } - break; - } else if (this_char < 0xc0) { - switch (stat) { - case 0x10: /* 2, 2nd */ - case 0x21: /* 3, 3rd */ - case 0x32: /* 4, 4th */ - case 0x43: /* 5, 5th */ - case 0x54: /* 6, 6th */ - /* last byte in sequence */ - more = 0; - utf |= (this_char & 0x3f); - this_char = (unsigned short)utf; - break; - case 0x20: /* 3, 2nd */ - case 0x31: /* 4, 3rd */ - case 0x42: /* 5, 4th */ - case 0x53: /* 6, 5th */ - /* penultimate char */ - utf |= ((this_char & 0x3f) << 6); - stat++; - break; - case 0x30: /* 4, 2nd */ - case 0x41: /* 5, 3rd */ - case 0x52: /* 6, 4th */ - utf |= ((this_char & 0x3f) << 12); - stat++; - break; - case 0x40: /* 5, 2nd */ - case 0x51: - utf |= ((this_char & 0x3f) << 18); - stat++; - break; - case 0x50: /* 6, 2nd */ - utf |= ((this_char & 0x3f) << 24); - stat++; - break; - default: - /* invalid */ - *status = FAILURE; - more = 0; - } + MB_FAILURE(pos); } - /* lead byte */ - else if (this_char < 0xe0) { - stat = 0x10; /* 2 byte */ - utf = (this_char & 0x1f) << 6; - CHECK_LEN(pos, 1); - } else if (this_char < 0xf0) { - stat = 0x20; /* 3 byte */ - utf = (this_char & 0xf) << 12; - CHECK_LEN(pos, 2); - } else if (this_char < 0xf8) { - stat = 0x30; /* 4 byte */ - utf = (this_char & 0x7) << 18; - CHECK_LEN(pos, 3); - } else if (this_char < 0xfc) { - stat = 0x40; /* 5 byte */ - utf = (this_char & 0x3) << 24; - CHECK_LEN(pos, 4); - } else if (this_char < 0xfe) { - stat = 0x50; /* 6 byte */ - utf = (this_char & 0x1) << 30; - CHECK_LEN(pos, 5); - } else { - /* invalid; bail */ - more = 0; - *status = FAILURE; - break; + MB_WRITE((unsigned char)c); + MB_WRITE((unsigned char)str[pos + 1]); + pos += 2; + } else if (c < 0xf0) { + CHECK_LEN(pos, 3); + if (str[pos + 1] < 0x80 || str[pos + 1] > 0xbf) { + MB_FAILURE(pos); } - - if (more) { - this_char = str[pos++]; - MB_WRITE((unsigned char)this_char); + if (str[pos + 2] < 0x80 || str[pos + 2] > 0xbf) { + MB_FAILURE(pos); + } + this_char = ((c & 0x0f) << 12) | ((str[pos + 1] & 0x3f) << 6) | (str[pos + 2] & 0x3f); + if (this_char < 0x800) { + MB_FAILURE(pos); + } else if (this_char >= 0xd800 && this_char <= 0xdfff) { + MB_FAILURE(pos); } - } while (more); + MB_WRITE((unsigned char)c); + MB_WRITE((unsigned char)str[pos + 1]); + MB_WRITE((unsigned char)str[pos + 2]); + pos += 3; + } else if (c < 0xf8) { + CHECK_LEN(pos, 4); + if (str[pos + 1] < 0x80 || str[pos + 1] > 0xbf) { + MB_FAILURE(pos); + } + if (str[pos + 2] < 0x80 || str[pos + 2] > 0xbf) { + MB_FAILURE(pos); + } + if (str[pos + 3] < 0x80 || str[pos + 3] > 0xbf) { + MB_FAILURE(pos); + } + this_char = ((c & 0x07) << 18) | ((str[pos + 1] & 0x3f) << 12) | ((str[pos + 2] & 0x3f) << 6) | (str[pos + 3] & 0x3f); + if (this_char < 0x10000) { + MB_FAILURE(pos); + } + MB_WRITE((unsigned char)c); + MB_WRITE((unsigned char)str[pos + 1]); + MB_WRITE((unsigned char)str[pos + 2]); + MB_WRITE((unsigned char)str[pos + 3]); + pos += 4; + } else { + MB_FAILURE(pos); + } } break; case cs_big5: case cs_gb2312: case cs_big5hkscs: { + CHECK_LEN(pos, 1); + this_char = str[pos++]; /* check if this is the first of a 2-byte sequence */ - if (this_char >= 0xa1 && this_char <= 0xfe) { + if (this_char >= 0x81 && this_char <= 0xfe) { /* peek at the next char */ CHECK_LEN(pos, 1); - next_char = str[pos]; + next_char = str[pos++]; if ((next_char >= 0x40 && next_char <= 0x7e) || (next_char >= 0xa1 && next_char <= 0xfe)) { /* yes, this a wide char */ - this_char <<= 8; + MB_WRITE(this_char); MB_WRITE(next_char); - this_char |= next_char; - pos++; + this_char = (this_char << 8) | next_char; + } else { + MB_FAILURE(pos); } - + } else { + MB_WRITE(this_char); } - break; } + break; case cs_sjis: { + CHECK_LEN(pos, 1); + this_char = str[pos++]; /* check if this is the first of a 2-byte sequence */ - if ( (this_char >= 0x81 && this_char <= 0x9f) || - (this_char >= 0xe0 && this_char <= 0xef) - ) { + if ((this_char >= 0x81 && this_char <= 0x9f) || + (this_char >= 0xe0 && this_char <= 0xfc)) { /* peek at the next char */ CHECK_LEN(pos, 1); - next_char = str[pos]; + next_char = str[pos++]; if ((next_char >= 0x40 && next_char <= 0x7e) || (next_char >= 0x80 && next_char <= 0xfc)) { /* yes, this a wide char */ - this_char <<= 8; + MB_WRITE(this_char); MB_WRITE(next_char); - this_char |= next_char; - pos++; + this_char = (this_char << 8) | next_char; + } else { + MB_FAILURE(pos); } - + } else { + MB_WRITE(this_char); } break; } case cs_eucjp: { + CHECK_LEN(pos, 1); + this_char = str[pos++]; /* check if this is the first of a multi-byte sequence */ if (this_char >= 0xa1 && this_char <= 0xfe) { /* peek at the next char */ CHECK_LEN(pos, 1); - next_char = str[pos]; + next_char = str[pos++]; if (next_char >= 0xa1 && next_char <= 0xfe) { /* yes, this a jis kanji char */ - this_char <<= 8; + MB_WRITE(this_char); MB_WRITE(next_char); - this_char |= next_char; - pos++; + this_char = (this_char << 8) | next_char; + } else { + MB_FAILURE(pos); } - } else if (this_char == 0x8e) { /* peek at the next char */ CHECK_LEN(pos, 1); - next_char = str[pos]; + next_char = str[pos++]; if (next_char >= 0xa1 && next_char <= 0xdf) { /* JIS X 0201 kana */ - this_char <<= 8; + MB_WRITE(this_char); MB_WRITE(next_char); - this_char |= next_char; - pos++; + this_char = (this_char << 8) | next_char; + } else { + MB_FAILURE(pos); } - } else if (this_char == 0x8f) { /* peek at the next two char */ unsigned char next2_char; CHECK_LEN(pos, 2); next_char = str[pos]; - next2_char = str[pos+1]; + next2_char = str[pos + 1]; + pos += 2; if ((next_char >= 0xa1 && next_char <= 0xfe) && (next2_char >= 0xa1 && next2_char <= 0xfe)) { /* JIS X 0212 hojo-kanji */ - this_char <<= 8; + MB_WRITE(this_char); MB_WRITE(next_char); - this_char |= next_char; - pos++; - this_char <<= 8; MB_WRITE(next2_char); - this_char |= next2_char; - pos++; + this_char = (this_char << 16) | (next_char << 8) | next2_char; + } else { + MB_FAILURE(pos); } - + } else { + MB_WRITE(this_char); } break; } default: + /* single-byte charsets */ + CHECK_LEN(pos, 1); + this_char = str[pos++]; + MB_WRITE(this_char); break; } MB_RETURN; @@ -1133,7 +1133,7 @@ PHPAPI char *php_escape_html_entities_ex(unsigned char *old, int oldlen, int *ne unsigned char mbsequence[16]; /* allow up to 15 characters in a multibyte sequence */ int mbseqlen = sizeof(mbsequence); int status = SUCCESS; - unsigned short this_char = get_next_char(charset, old, oldlen, &i, mbsequence, &mbseqlen, &status); + unsigned int this_char = get_next_char(charset, old, oldlen, &i, mbsequence, &mbseqlen, &status); if(status == FAILURE) { /* invalid MB sequence */ diff --git a/ext/standard/html.h b/ext/standard/html.h index 9cd9e8b04..86bae2d20 100644 --- a/ext/standard/html.h +++ b/ext/standard/html.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: html.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: html.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef HTML_H #define HTML_H diff --git a/ext/standard/http.c b/ext/standard/http.c index e3ee24ff0..3f57bbeb5 100644 --- a/ext/standard/http.c +++ b/ext/standard/http.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: http.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: http.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php_http.h" #include "php_ini.h" diff --git a/ext/standard/http_fopen_wrapper.c b/ext/standard/http_fopen_wrapper.c index c1757d114..5a30d7fa2 100644 --- a/ext/standard/http_fopen_wrapper.c +++ b/ext/standard/http_fopen_wrapper.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -19,7 +19,7 @@ | Sara Golemon | +----------------------------------------------------------------------+ */ -/* $Id: http_fopen_wrapper.c 286790 2009-08-04 09:24:48Z tony2001 $ */ +/* $Id: http_fopen_wrapper.c 294506 2010-02-04 09:17:20Z pajoye $ */ #include "php.h" #include "php_globals.h" @@ -416,15 +416,19 @@ php_stream *php_stream_url_wrap_http_ex(php_stream_wrapper *wrapper, char *path, } /* auth header if it was specified */ - if (((have_header & HTTP_HEADER_AUTH) == 0) && resource->user && resource->pass) { + if (((have_header & HTTP_HEADER_AUTH) == 0) && resource->user) { /* decode the strings first */ php_url_decode(resource->user, strlen(resource->user)); - php_url_decode(resource->pass, strlen(resource->pass)); /* scratch is large enough, since it was made large enough for the whole URL */ strcpy(scratch, resource->user); strcat(scratch, ":"); - strcat(scratch, resource->pass); + + /* Note: password is optional! */ + if (resource->pass) { + php_url_decode(resource->pass, strlen(resource->pass)); + strcat(scratch, resource->pass); + } tmp = (char*)php_base64_encode((unsigned char*)scratch, strlen(scratch), NULL); @@ -610,6 +614,13 @@ php_stream *php_stream_url_wrap_http_ex(php_stream_wrapper *wrapper, char *path, size_t http_header_line_length; if (php_stream_get_line(stream, http_header_line, HTTP_HEADER_BLOCK_SIZE, &http_header_line_length) && *http_header_line != '\n' && *http_header_line != '\r') { char *e = http_header_line + http_header_line_length - 1; + if (*e != '\n') { + do { /* partial header */ + php_stream_get_line(stream, http_header_line, HTTP_HEADER_BLOCK_SIZE, &http_header_line_length); + e = http_header_line + http_header_line_length - 1; + } while (*e != '\n'); + continue; + } while (*e == '\n' || *e == '\r') { e--; } @@ -739,7 +750,7 @@ php_stream *php_stream_url_wrap_http_ex(php_stream_wrapper *wrapper, char *path, s++; \ } \ } \ -} \ +} /* check for control characters in login, password & path */ if (strncasecmp(new_path, "http://", sizeof("http://") - 1) || strncasecmp(new_path, "https://", sizeof("https://") - 1)) { CHECK_FOR_CNTRL_CHARS(resource->user) diff --git a/ext/standard/image.c b/ext/standard/image.c index b6d41f43b..689f4a85a 100644 --- a/ext/standard/image.c +++ b/ext/standard/image.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: image.c 277324 2009-03-17 03:25:57Z scottmac $ */ +/* $Id: image.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php.h" #include diff --git a/ext/standard/incomplete_class.c b/ext/standard/incomplete_class.c index d66921e83..e64365f3f 100644 --- a/ext/standard/incomplete_class.c +++ b/ext/standard/incomplete_class.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: incomplete_class.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: incomplete_class.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php.h" #include "basic_functions.h" diff --git a/ext/standard/info.c b/ext/standard/info.c index fd5eeacfd..7746d0658 100644 --- a/ext/standard/info.c +++ b/ext/standard/info.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: info.c 289430 2009-10-09 17:15:46Z pajoye $ */ +/* $Id: info.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php.h" #include "php_ini.h" diff --git a/ext/standard/info.h b/ext/standard/info.h index 173415b58..4eaf06e1f 100644 --- a/ext/standard/info.h +++ b/ext/standard/info.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: info.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: info.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef INFO_H #define INFO_H diff --git a/ext/standard/iptc.c b/ext/standard/iptc.c index 93b144ce8..b5c0b2507 100644 --- a/ext/standard/iptc.c +++ b/ext/standard/iptc.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: iptc.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: iptc.c 293036 2010-01-03 09:23:27Z sebastian $ */ /* * Functions to parse & compse IPTC data. diff --git a/ext/standard/lcg.c b/ext/standard/lcg.c index 385015191..ae94f48e5 100644 --- a/ext/standard/lcg.c +++ b/ext/standard/lcg.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: lcg.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: lcg.c 294448 2010-02-03 20:10:35Z pajoye $ */ #include "php.h" #include "php_lcg.h" @@ -78,7 +78,7 @@ static void lcg_seed(TSRMLS_D) /* {{{ */ struct timeval tv; if (gettimeofday(&tv, NULL) == 0) { - LCG(s1) = tv.tv_sec ^ (~tv.tv_usec); + LCG(s1) = tv.tv_sec ^ (tv.tv_usec<<11); } else { LCG(s1) = 1; } @@ -88,6 +88,11 @@ static void lcg_seed(TSRMLS_D) /* {{{ */ LCG(s2) = (long) getpid(); #endif + /* Add entropy to s2 by calling gettimeofday() again */ + if (gettimeofday(&tv, NULL) == 0) { + LCG(s2) ^= (tv.tv_usec<<11); + } + LCG(seeded) = 1; } /* }}} */ diff --git a/ext/standard/levenshtein.c b/ext/standard/levenshtein.c index b02dcc5cb..8a3b74702 100644 --- a/ext/standard/levenshtein.c +++ b/ext/standard/levenshtein.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -15,7 +15,7 @@ | Author: Hartmut Holzgraefe | +----------------------------------------------------------------------+ */ -/* $Id: levenshtein.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: levenshtein.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php.h" #include diff --git a/ext/standard/link.c b/ext/standard/link.c index 923622147..ac45b4bde 100644 --- a/ext/standard/link.c +++ b/ext/standard/link.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: link.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: link.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php.h" #include "php_filestat.h" diff --git a/ext/standard/link_win32.c b/ext/standard/link_win32.c index 97c7cb718..f7f58039e 100644 --- a/ext/standard/link_win32.c +++ b/ext/standard/link_win32.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: link_win32.c 287813 2009-08-27 14:45:41Z pajoye $ */ +/* $Id: link_win32.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef PHP_WIN32 #include "php.h" diff --git a/ext/standard/mail.c b/ext/standard/mail.c index 2825881b4..09fa2ef94 100644 --- a/ext/standard/mail.c +++ b/ext/standard/mail.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: mail.c 282504 2009-06-21 15:29:16Z iliaa $ */ +/* $Id: mail.c 294548 2010-02-05 00:19:32Z pajoye $ */ #include #include @@ -241,7 +241,7 @@ PHPAPI int php_mail(char *to, char *subject, char *message, char *headers, char php_basename(tmp, strlen(tmp), NULL, 0,&f, &f_len TSRMLS_CC); if (headers != NULL) { - spprintf(&hdr, 0, "X-PHP-Originating-Script: %ld:%s\r\n%s", php_getuid(), f, headers); + spprintf(&hdr, 0, "X-PHP-Originating-Script: %ld:%s\n%s", php_getuid(), f, headers); } else { spprintf(&hdr, 0, "X-PHP-Originating-Script: %ld:%s\n", php_getuid(), f); } diff --git a/ext/standard/math.c b/ext/standard/math.c index 89b7fcfb2..8a3949e20 100644 --- a/ext/standard/math.c +++ b/ext/standard/math.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -19,7 +19,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: math.c 277398 2009-03-18 10:18:10Z dmitry $ */ +/* $Id: math.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php.h" #include "php_math.h" diff --git a/ext/standard/md5.c b/ext/standard/md5.c index 5ddd40f8a..e84fe4b7e 100644 --- a/ext/standard/md5.c +++ b/ext/standard/md5.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: md5.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: md5.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php.h" #include "md5.h" diff --git a/ext/standard/md5.h b/ext/standard/md5.h index f9d55aba1..b976752b7 100644 --- a/ext/standard/md5.h +++ b/ext/standard/md5.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: md5.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: md5.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef MD5_H #define MD5_H diff --git a/ext/standard/metaphone.c b/ext/standard/metaphone.c index 06186d07f..bf1067130 100644 --- a/ext/standard/metaphone.c +++ b/ext/standard/metaphone.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: metaphone.c 283127 2009-06-30 11:46:20Z felipe $ */ +/* $Id: metaphone.c 293036 2010-01-03 09:23:27Z sebastian $ */ /* Based on CPANs "Text-Metaphone-1.96" by Michael G Schwern diff --git a/ext/standard/microtime.c b/ext/standard/microtime.c index 9a7c179f5..116fb02a1 100644 --- a/ext/standard/microtime.c +++ b/ext/standard/microtime.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: microtime.c 280906 2009-05-21 14:21:40Z lbarnaud $ */ +/* $Id: microtime.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php.h" diff --git a/ext/standard/microtime.h b/ext/standard/microtime.h index 8838d2ca2..419150d8b 100644 --- a/ext/standard/microtime.h +++ b/ext/standard/microtime.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: microtime.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: microtime.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef MICROTIME_H #define MICROTIME_H diff --git a/ext/standard/pack.c b/ext/standard/pack.c index 4aa4d5649..0723ece75 100644 --- a/ext/standard/pack.c +++ b/ext/standard/pack.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -15,7 +15,7 @@ | Author: Chris Schneider | +----------------------------------------------------------------------+ */ -/* $Id: pack.c 287647 2009-08-24 18:40:13Z iliaa $ */ +/* $Id: pack.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php.h" diff --git a/ext/standard/pack.h b/ext/standard/pack.h index 70d37151e..ba5899727 100644 --- a/ext/standard/pack.h +++ b/ext/standard/pack.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: pack.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: pack.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PACK_H #define PACK_H diff --git a/ext/standard/pageinfo.c b/ext/standard/pageinfo.c index 89022c7c1..a1b323b08 100644 --- a/ext/standard/pageinfo.c +++ b/ext/standard/pageinfo.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: pageinfo.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: pageinfo.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php.h" #include "pageinfo.h" @@ -68,11 +68,7 @@ PHPAPI void php_statpage(TSRMLS_D) BG(page_uid) = pstat->st_uid; BG(page_gid) = pstat->st_gid; BG(page_inode) = pstat->st_ino; -#ifdef NETWARE - BG(page_mtime) = (pstat->st_mtime).tv_sec; -#else BG(page_mtime) = pstat->st_mtime; -#endif } else { /* handler for situations where there is no source file, ex. php -r */ BG(page_uid) = getuid(); BG(page_gid) = getgid(); diff --git a/ext/standard/pageinfo.h b/ext/standard/pageinfo.h index 5722beded..0405de23f 100644 --- a/ext/standard/pageinfo.h +++ b/ext/standard/pageinfo.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: pageinfo.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: pageinfo.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PAGEINFO_H #define PAGEINFO_H diff --git a/ext/standard/php_array.h b/ext/standard/php_array.h index 76a5a66d0..92a4f2267 100644 --- a/ext/standard/php_array.h +++ b/ext/standard/php_array.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -19,7 +19,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_array.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_array.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_ARRAY_H #define PHP_ARRAY_H diff --git a/ext/standard/php_assert.h b/ext/standard/php_assert.h index f8a634a16..bf4de1a86 100644 --- a/ext/standard/php_assert.h +++ b/ext/standard/php_assert.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_assert.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_assert.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_ASSERT_H #define PHP_ASSERT_H diff --git a/ext/standard/php_browscap.h b/ext/standard/php_browscap.h index 4107a4bd2..c26098a93 100644 --- a/ext/standard/php_browscap.h +++ b/ext/standard/php_browscap.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_browscap.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_browscap.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_BROWSCAP_H #define PHP_BROWSCAP_H diff --git a/ext/standard/php_crypt.h b/ext/standard/php_crypt.h index 8b06dadc3..c0dafe631 100644 --- a/ext/standard/php_crypt.h +++ b/ext/standard/php_crypt.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_crypt.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_crypt.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_CRYPT_H #define PHP_CRYPT_H diff --git a/ext/standard/php_crypt_r.c b/ext/standard/php_crypt_r.c index d1e0cda7f..3d9d0229d 100644 --- a/ext/standard/php_crypt_r.c +++ b/ext/standard/php_crypt_r.c @@ -1,9 +1,9 @@ -/* $Id: php_crypt_r.c 290154 2009-11-02 20:46:52Z pajoye $ */ +/* $Id: php_crypt_r.c 293036 2010-01-03 09:23:27Z sebastian $ */ /* +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | diff --git a/ext/standard/php_crypt_r.h b/ext/standard/php_crypt_r.h index 57143dbcc..e5fbf2601 100644 --- a/ext/standard/php_crypt_r.h +++ b/ext/standard/php_crypt_r.h @@ -1,9 +1,9 @@ -/* $Id: php_crypt_r.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_crypt_r.h 293036 2010-01-03 09:23:27Z sebastian $ */ /* +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -49,6 +49,8 @@ PHPAPI char *php_crypt_r (const char *__key, const char *__salt, struct php_cryp extern char * php_md5_crypt_r(const char *pw, const char *salt, char *out); extern char * php_crypt_blowfish_rn(__CONST char *key, __CONST char *setting, char *output, int size); +extern char * php_sha512_crypt_r (const char *key, const char *salt, char *buffer, int buflen); +extern char * php_sha256_crypt_r (const char *key, const char *salt, char *buffer, int buflen); #ifdef __cplusplus } diff --git a/ext/standard/php_dir.h b/ext/standard/php_dir.h index edc76158d..5e80f3e6d 100644 --- a/ext/standard/php_dir.h +++ b/ext/standard/php_dir.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_dir.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_dir.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_DIR_H #define PHP_DIR_H diff --git a/ext/standard/php_dns.h b/ext/standard/php_dns.h index 2fa6746b0..95900ae64 100644 --- a/ext/standard/php_dns.h +++ b/ext/standard/php_dns.h @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_dns.h 287120 2009-08-11 22:07:35Z scottmac $ */ +/* $Id: php_dns.h 289691 2009-10-16 02:10:52Z scottmac $ */ #ifndef PHP_DNS_H #define PHP_DNS_H @@ -28,8 +28,6 @@ ((int)dns_search(res, dname, class, type, answer, anslen, (struct sockaddr *)&from, &fromsize)) #define php_dns_free_handle(res) \ dns_free(res) -#define php_dns_errno(_res) \ - (NO_DATA) #elif defined(HAVE_RES_NSEARCH) #define php_dns_search(res, dname, class, type, answer, anslen) \ @@ -37,15 +35,11 @@ #define php_dns_free_handle(res) \ res_nclose(res); \ php_dns_free_res(*res) -#define php_dns_errno(res) \ - (res->res_h_errno) #elif defined(HAVE_RES_SEARCH) #define php_dns_search(res, dname, class, type, answer, anslen) \ res_search(dname, class, type, answer, anslen) #define php_dns_free_handle(res) /* noop */ -#define php_dns_errno(res) \ - (_res.res_h_errno) #endif diff --git a/ext/standard/php_ext_syslog.h b/ext/standard/php_ext_syslog.h index 0b6e3af03..353c24e81 100644 --- a/ext/standard/php_ext_syslog.h +++ b/ext/standard/php_ext_syslog.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_ext_syslog.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_ext_syslog.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_EXT_SYSLOG_H #define PHP_EXT_SYSLOG_H diff --git a/ext/standard/php_filestat.h b/ext/standard/php_filestat.h index 49810550f..7eee0fa2c 100644 --- a/ext/standard/php_filestat.h +++ b/ext/standard/php_filestat.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_filestat.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_filestat.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_FILESTAT_H #define PHP_FILESTAT_H @@ -24,6 +24,8 @@ PHP_RINIT_FUNCTION(filestat); PHP_RSHUTDOWN_FUNCTION(filestat); +PHP_FUNCTION(realpath_cache_size); +PHP_FUNCTION(realpath_cache_get); PHP_FUNCTION(clearstatcache); PHP_FUNCTION(fileatime); PHP_FUNCTION(filectime); diff --git a/ext/standard/php_fopen_wrapper.c b/ext/standard/php_fopen_wrapper.c index f3dbf91ad..808a973a9 100644 --- a/ext/standard/php_fopen_wrapper.c +++ b/ext/standard/php_fopen_wrapper.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ | Hartmut Holzgraefe | +----------------------------------------------------------------------+ */ -/* $Id: php_fopen_wrapper.c 287507 2009-08-20 12:40:15Z jani $ */ +/* $Id: php_fopen_wrapper.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include #include diff --git a/ext/standard/php_fopen_wrappers.h b/ext/standard/php_fopen_wrappers.h index 7709e3e0b..d9dee9494 100644 --- a/ext/standard/php_fopen_wrappers.h +++ b/ext/standard/php_fopen_wrappers.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_fopen_wrappers.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_fopen_wrappers.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_FOPEN_WRAPPERS_H #define PHP_FOPEN_WRAPPERS_H diff --git a/ext/standard/php_ftok.h b/ext/standard/php_ftok.h index c7e4018d7..ac023b778 100644 --- a/ext/standard/php_ftok.h +++ b/ext/standard/php_ftok.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_ftok.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_ftok.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_FTOK_H #define PHP_FTOK_H diff --git a/ext/standard/php_http.h b/ext/standard/php_http.h index 6de68b4a1..f0ed15f20 100644 --- a/ext/standard/php_http.h +++ b/ext/standard/php_http.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_http.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_http.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_HTTP_H #define PHP_HTTP_H diff --git a/ext/standard/php_image.h b/ext/standard/php_image.h index f699dbbee..093980ae0 100644 --- a/ext/standard/php_image.h +++ b/ext/standard/php_image.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_image.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_image.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_IMAGE_H #define PHP_IMAGE_H diff --git a/ext/standard/php_incomplete_class.h b/ext/standard/php_incomplete_class.h index d84e7a530..3ec93c704 100644 --- a/ext/standard/php_incomplete_class.h +++ b/ext/standard/php_incomplete_class.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_incomplete_class.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_incomplete_class.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_INCOMPLETE_CLASS_H #define PHP_INCOMPLETE_CLASS_H diff --git a/ext/standard/php_iptc.h b/ext/standard/php_iptc.h index 7a4e3cedc..e47753c09 100644 --- a/ext/standard/php_iptc.h +++ b/ext/standard/php_iptc.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_iptc.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_iptc.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_IPTC_H #define PHP_IPTC_H diff --git a/ext/standard/php_lcg.h b/ext/standard/php_lcg.h index 58b7d3347..8ccd218f8 100644 --- a/ext/standard/php_lcg.h +++ b/ext/standard/php_lcg.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_lcg.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_lcg.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_LCG_H #define PHP_LCG_H diff --git a/ext/standard/php_link.h b/ext/standard/php_link.h index 8c63be632..916029da7 100644 --- a/ext/standard/php_link.h +++ b/ext/standard/php_link.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_link.h 273611 2009-01-16 01:00:22Z pajoye $ */ +/* $Id: php_link.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_LINK_H #define PHP_LINK_H diff --git a/ext/standard/php_mail.h b/ext/standard/php_mail.h index a3516dccb..e8d3875ec 100644 --- a/ext/standard/php_mail.h +++ b/ext/standard/php_mail.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_mail.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_mail.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_MAIL_H #define PHP_MAIL_H diff --git a/ext/standard/php_math.h b/ext/standard/php_math.h index f130e2f4e..1d124f0d0 100644 --- a/ext/standard/php_math.h +++ b/ext/standard/php_math.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_math.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_math.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_MATH_H #define PHP_MATH_H diff --git a/ext/standard/php_metaphone.h b/ext/standard/php_metaphone.h index 622aa31cc..da8c67b95 100644 --- a/ext/standard/php_metaphone.h +++ b/ext/standard/php_metaphone.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_metaphone.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_metaphone.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_METAPHONE_H #define PHP_METAPHONE_H diff --git a/ext/standard/php_rand.h b/ext/standard/php_rand.h index 220f436d5..887ac7058 100644 --- a/ext/standard/php_rand.h +++ b/ext/standard/php_rand.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -20,7 +20,7 @@ | Based on code from: Shawn Cokus | +----------------------------------------------------------------------+ */ -/* $Id: php_rand.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_rand.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_RAND_H #define PHP_RAND_H diff --git a/ext/standard/php_smart_str.h b/ext/standard/php_smart_str.h index 298997873..8dd964716 100644 --- a/ext/standard/php_smart_str.h +++ b/ext/standard/php_smart_str.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_smart_str.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_smart_str.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_SMART_STR_H #define PHP_SMART_STR_H diff --git a/ext/standard/php_smart_str_public.h b/ext/standard/php_smart_str_public.h index e189549fd..c851fac39 100644 --- a/ext/standard/php_smart_str_public.h +++ b/ext/standard/php_smart_str_public.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_smart_str_public.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_smart_str_public.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_SMART_STR_PUBLIC_H #define PHP_SMART_STR_PUBLIC_H diff --git a/ext/standard/php_standard.h b/ext/standard/php_standard.h index 005fa2972..447f6d7f1 100644 --- a/ext/standard/php_standard.h +++ b/ext/standard/php_standard.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_standard.h 286857 2009-08-05 23:20:17Z scottmac $ */ +/* $Id: php_standard.h 293036 2010-01-03 09:23:27Z sebastian $ */ #include "basic_functions.h" #include "php_math.h" diff --git a/ext/standard/php_string.h b/ext/standard/php_string.h index 4d85671a2..fd3c8b5e4 100644 --- a/ext/standard/php_string.h +++ b/ext/standard/php_string.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_string.h 287198 2009-08-13 06:44:50Z stas $ */ +/* $Id: php_string.h 293036 2010-01-03 09:23:27Z sebastian $ */ /* Synced with php 3.0 revision 1.43 1999-06-16 [ssb] */ diff --git a/ext/standard/php_type.h b/ext/standard/php_type.h index 9a8ae44fd..550d4d545 100644 --- a/ext/standard/php_type.h +++ b/ext/standard/php_type.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_type.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_type.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_TYPE_H #define PHP_TYPE_H diff --git a/ext/standard/php_uuencode.h b/ext/standard/php_uuencode.h index b722e1be3..d6432a6ce 100644 --- a/ext/standard/php_uuencode.h +++ b/ext/standard/php_uuencode.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_uuencode.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_uuencode.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_UUENCODE_H #define PHP_UUENCODE_H diff --git a/ext/standard/php_var.h b/ext/standard/php_var.h index 442762d40..76546f3bf 100644 --- a/ext/standard/php_var.h +++ b/ext/standard/php_var.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_var.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_var.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_VAR_H #define PHP_VAR_H diff --git a/ext/standard/php_versioning.h b/ext/standard/php_versioning.h index ecfd9483b..6a91e6152 100644 --- a/ext/standard/php_versioning.h +++ b/ext/standard/php_versioning.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_versioning.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_versioning.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_VERSIONING_H #define PHP_VERSIONING_H diff --git a/ext/standard/proc_open.c b/ext/standard/proc_open.c index d7dbccdf8..afb507144 100644 --- a/ext/standard/proc_open.c +++ b/ext/standard/proc_open.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -15,7 +15,7 @@ | Author: Wez Furlong | +----------------------------------------------------------------------+ */ -/* $Id: proc_open.c 286752 2009-08-03 19:05:56Z felipe $ */ +/* $Id: proc_open.c 293036 2010-01-03 09:23:27Z sebastian $ */ #if 0 && (defined(__linux__) || defined(sun) || defined(__IRIX__)) # define _BSD_SOURCE /* linux wants this when XOPEN mode is on */ diff --git a/ext/standard/proc_open.h b/ext/standard/proc_open.h index 473c9f047..40249f211 100644 --- a/ext/standard/proc_open.h +++ b/ext/standard/proc_open.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -15,7 +15,7 @@ | Author: Wez Furlong | +----------------------------------------------------------------------+ */ -/* $Id: proc_open.h 284431 2009-07-20 11:48:04Z gwynne $ */ +/* $Id: proc_open.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef PHP_WIN32 typedef HANDLE php_file_descriptor_t; diff --git a/ext/standard/quot_print.c b/ext/standard/quot_print.c index c24ed0bb2..7f0fae072 100644 --- a/ext/standard/quot_print.c +++ b/ext/standard/quot_print.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: quot_print.c 272979 2009-01-07 17:20:18Z felipe $ */ +/* $Id: quot_print.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include diff --git a/ext/standard/quot_print.h b/ext/standard/quot_print.h index 8f25c0b8b..4a769e0dd 100644 --- a/ext/standard/quot_print.h +++ b/ext/standard/quot_print.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: quot_print.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: quot_print.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef QUOT_PRINT_H #define QUOT_PRINT_H diff --git a/ext/standard/rand.c b/ext/standard/rand.c index 4b1cac36b..db5523a7b 100644 --- a/ext/standard/rand.c +++ b/ext/standard/rand.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -23,7 +23,7 @@ | Shawn Cokus | +----------------------------------------------------------------------+ */ -/* $Id: rand.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: rand.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include diff --git a/ext/standard/scanf.c b/ext/standard/scanf.c index 093c08a47..81a49e42b 100644 --- a/ext/standard/scanf.c +++ b/ext/standard/scanf.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: scanf.c 278157 2009-04-02 05:17:36Z kalle $ */ +/* $Id: scanf.c 293036 2010-01-03 09:23:27Z sebastian $ */ /* scanf.c -- diff --git a/ext/standard/scanf.h b/ext/standard/scanf.h index b1fbd49a7..46243bd33 100644 --- a/ext/standard/scanf.h +++ b/ext/standard/scanf.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: scanf.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: scanf.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef SCANF_H #define SCANF_H diff --git a/ext/standard/sha1.c b/ext/standard/sha1.c index 09c194353..084de7f1e 100644 --- a/ext/standard/sha1.c +++ b/ext/standard/sha1.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: sha1.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: sha1.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php.h" diff --git a/ext/standard/sha1.h b/ext/standard/sha1.h index 885d98858..cd7e63106 100644 --- a/ext/standard/sha1.h +++ b/ext/standard/sha1.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: sha1.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: sha1.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef SHA1_H #define SHA1_H diff --git a/ext/standard/soundex.c b/ext/standard/soundex.c index aa42d9558..d22d36191 100644 --- a/ext/standard/soundex.c +++ b/ext/standard/soundex.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -15,7 +15,7 @@ | Author: Bjrn Borud - Guardian Networks AS | +----------------------------------------------------------------------+ */ -/* $Id: soundex.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: soundex.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php.h" #include diff --git a/ext/standard/streamsfuncs.c b/ext/standard/streamsfuncs.c index b57c7f9ae..a0300606f 100644 --- a/ext/standard/streamsfuncs.c +++ b/ext/standard/streamsfuncs.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: streamsfuncs.c 286744 2009-08-03 15:58:18Z felipe $ */ +/* $Id: streamsfuncs.c 293995 2010-01-25 15:57:24Z johannes $ */ #include "php.h" #include "php_globals.h" @@ -484,9 +484,7 @@ PHP_FUNCTION(stream_get_meta_data) if (stream->wrapperdata) { MAKE_STD_ZVAL(newval); - *newval = *(stream->wrapperdata); - zval_copy_ctor(newval); - INIT_PZVAL(newval); + MAKE_COPY_ZVAL(&stream->wrapperdata, newval); add_assoc_zval(return_value, "wrapper_data", newval); } @@ -1444,6 +1442,26 @@ PHP_FUNCTION(stream_socket_enable_crypto) } /* }}} */ +/* {{{ proto string stream_resolve_include_path(string filename) +Determine what file will be opened by calls to fopen() with a relative path */ +PHP_FUNCTION(stream_resolve_include_path) +{ + char *filename, *resolved_path; + int filename_len; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &filename, &filename_len) == FAILURE) { + return; + } + + resolved_path = zend_resolve_path(filename, filename_len TSRMLS_CC); + + if (resolved_path) { + RETURN_STRING(resolved_path, 0); + } + RETURN_FALSE; +} +/* }}} */ + /* {{{ proto bool stream_is_local(resource stream|string url) U */ PHP_FUNCTION(stream_is_local) diff --git a/ext/standard/streamsfuncs.h b/ext/standard/streamsfuncs.h index 4519520ac..e4e20e123 100644 --- a/ext/standard/streamsfuncs.h +++ b/ext/standard/streamsfuncs.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: streamsfuncs.h 274392 2009-01-23 15:49:49Z kalle $ */ +/* $Id: streamsfuncs.h 293995 2010-01-25 15:57:24Z johannes $ */ /* Flags for stream_socket_client */ #define PHP_STREAM_CLIENT_PERSISTENT 1 @@ -56,6 +56,7 @@ PHP_FUNCTION(stream_filter_append); PHP_FUNCTION(stream_filter_remove); PHP_FUNCTION(stream_socket_enable_crypto); PHP_FUNCTION(stream_socket_shutdown); +PHP_FUNCTION(stream_resolve_include_path); PHP_FUNCTION(stream_is_local); PHP_FUNCTION(stream_supports_lock); diff --git a/ext/standard/string.c b/ext/standard/string.c index 88d3add13..2ebd18a04 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: string.c 287916 2009-08-31 12:28:46Z iliaa $ */ +/* $Id: string.c 294517 2010-02-04 09:44:16Z pajoye $ */ /* Synced with php 3.0 revision 1.193 1999-06-16 [ssb] */ @@ -3530,9 +3530,7 @@ static void php_str_replace_in_subject(zval *search, zval *replace, zval **subje /* If search is an array */ if (Z_TYPE_P(search) == IS_ARRAY) { /* Duplicate subject string for repeated replacement */ - *result = **subject; - zval_copy_ctor(result); - INIT_PZVAL(result); + MAKE_COPY_ZVAL(subject, result); zend_hash_internal_pointer_reset(Z_ARRVAL_P(search)); @@ -3616,9 +3614,7 @@ static void php_str_replace_in_subject(zval *search, zval *replace, zval **subje Z_STRVAL_P(search), Z_STRLEN_P(search), Z_STRVAL_P(replace), Z_STRLEN_P(replace), &Z_STRLEN_P(result), case_sensitivity, replace_count); } else { - *result = **subject; - zval_copy_ctor(result); - INIT_PZVAL(result); + MAKE_COPY_ZVAL(subject, result); } } } @@ -3918,7 +3914,7 @@ PHP_FUNCTION(nl2br) tmp = str; end = str + str_len; - /* it is really faster to scan twice and allocate mem once insted scanning once + /* it is really faster to scan twice and allocate mem once instead of scanning once and constantly reallocing */ while (tmp < end) { if (*tmp == '\r') { @@ -4247,7 +4243,7 @@ PHPAPI size_t php_strip_tags_ex(char *rbuf, int len, int *stateptr, char *allow, { char *tbuf, *buf, *p, *tp, *rp, c, lc; int br, i=0, depth=0, in_q = 0; - int state = 0; + int state = 0, pos; if (stateptr) state = *stateptr; @@ -4260,7 +4256,7 @@ PHPAPI size_t php_strip_tags_ex(char *rbuf, int len, int *stateptr, char *allow, br = 0; if (allow) { php_strtolower(allow, allow_len); - tbuf = emalloc(PHP_TAG_BUF_SIZE+1); + tbuf = emalloc(PHP_TAG_BUF_SIZE + 1); tp = tbuf; } else { tbuf = tp = NULL; @@ -4281,7 +4277,11 @@ PHPAPI size_t php_strip_tags_ex(char *rbuf, int len, int *stateptr, char *allow, lc = '<'; state = 1; if (allow) { - tp = ((tp-tbuf) >= PHP_TAG_BUF_SIZE ? tbuf: tp); + if (tp - tbuf >= PHP_TAG_BUF_SIZE) { + pos = tp - tbuf; + tbuf = erealloc(tbuf, (tp - tbuf) + PHP_TAG_BUF_SIZE + 1); + tp = tbuf + pos; + } *(tp++) = '<'; } } else if (state == 1) { @@ -4296,7 +4296,11 @@ PHPAPI size_t php_strip_tags_ex(char *rbuf, int len, int *stateptr, char *allow, br++; } } else if (allow && state == 1) { - tp = ((tp-tbuf) >= PHP_TAG_BUF_SIZE ? tbuf: tp); + if (tp - tbuf >= PHP_TAG_BUF_SIZE) { + pos = tp - tbuf; + tbuf = erealloc(tbuf, (tp - tbuf) + PHP_TAG_BUF_SIZE + 1); + tp = tbuf + pos; + } *(tp++) = c; } else if (state == 0) { *(rp++) = c; @@ -4310,7 +4314,11 @@ PHPAPI size_t php_strip_tags_ex(char *rbuf, int len, int *stateptr, char *allow, br--; } } else if (allow && state == 1) { - tp = ((tp-tbuf) >= PHP_TAG_BUF_SIZE ? tbuf: tp); + if (tp - tbuf >= PHP_TAG_BUF_SIZE) { + pos = tp - tbuf; + tbuf = erealloc(tbuf, (tp - tbuf) + PHP_TAG_BUF_SIZE + 1); + tp = tbuf + pos; + } *(tp++) = c; } else if (state == 0) { *(rp++) = c; @@ -4332,7 +4340,11 @@ PHPAPI size_t php_strip_tags_ex(char *rbuf, int len, int *stateptr, char *allow, lc = '>'; in_q = state = 0; if (allow) { - tp = ((tp-tbuf) >= PHP_TAG_BUF_SIZE ? tbuf: tp); + if (tp - tbuf >= PHP_TAG_BUF_SIZE) { + pos = tp - tbuf; + tbuf = erealloc(tbuf, (tp - tbuf) + PHP_TAG_BUF_SIZE + 1); + tp = tbuf + pos; + } *(tp++) = '>'; *tp='\0'; if (php_tag_find(tbuf, tp-tbuf, allow)) { @@ -4382,10 +4394,14 @@ PHPAPI size_t php_strip_tags_ex(char *rbuf, int len, int *stateptr, char *allow, } else if (state == 0) { *(rp++) = c; } else if (allow && state == 1) { - tp = ((tp-tbuf) >= PHP_TAG_BUF_SIZE ? tbuf: tp); + if (tp - tbuf >= PHP_TAG_BUF_SIZE) { + pos = tp - tbuf; + tbuf = erealloc(tbuf, (tp - tbuf) + PHP_TAG_BUF_SIZE + 1); + tp = tbuf + pos; + } *(tp++) = c; } - if (state && p != buf && *(p-1) != '\\' && (!in_q || *p == in_q)) { + if (state && p != buf && (state == 1 || *(p-1) != '\\') && (!in_q || *p == in_q)) { if (in_q) { in_q = 0; } else { @@ -4403,7 +4419,11 @@ PHPAPI size_t php_strip_tags_ex(char *rbuf, int len, int *stateptr, char *allow, if (state == 0) { *(rp++) = c; } else if (allow && state == 1) { - tp = ((tp-tbuf) >= PHP_TAG_BUF_SIZE ? tbuf: tp); + if (tp - tbuf >= PHP_TAG_BUF_SIZE) { + pos = tp - tbuf; + tbuf = erealloc(tbuf, (tp - tbuf) + PHP_TAG_BUF_SIZE + 1); + tp = tbuf + pos; + } *(tp++) = c; } } @@ -4458,7 +4478,11 @@ reg_char: if (state == 0) { *(rp++) = c; } else if (allow && state == 1) { - tp = ((tp-tbuf) >= PHP_TAG_BUF_SIZE ? tbuf: tp); + if (tp - tbuf >= PHP_TAG_BUF_SIZE) { + pos = tp - tbuf; + tbuf = erealloc(tbuf, (tp - tbuf) + PHP_TAG_BUF_SIZE + 1); + tp = tbuf + pos; + } *(tp++) = c; } break; diff --git a/ext/standard/strnatcmp.c b/ext/standard/strnatcmp.c index 3a60bc76e..e1c6960e9 100644 --- a/ext/standard/strnatcmp.c +++ b/ext/standard/strnatcmp.c @@ -38,7 +38,7 @@ #if 0 static char const *version UNUSED = - "$Id: strnatcmp.c 289419 2009-10-09 14:33:38Z pajoye $"; + "$Id: strnatcmp.c 288896 2009-09-28 13:29:53Z rasmus $"; #endif /* {{{ compare_right */ diff --git a/ext/standard/syslog.c b/ext/standard/syslog.c index aa8c47248..8208319dc 100644 --- a/ext/standard/syslog.c +++ b/ext/standard/syslog.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: syslog.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: syslog.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php.h" diff --git a/ext/standard/tests/array/array_flip_variation2.phpt b/ext/standard/tests/array/array_flip_variation2.phpt index 1474a6955..997c39130 100644 Binary files a/ext/standard/tests/array/array_flip_variation2.phpt and b/ext/standard/tests/array/array_flip_variation2.phpt differ diff --git a/ext/standard/tests/array/bug50006.phpt b/ext/standard/tests/array/bug50006.phpt new file mode 100644 index 000000000..f03a00262 --- /dev/null +++ b/ext/standard/tests/array/bug50006.phpt @@ -0,0 +1,29 @@ +--TEST-- +Bug #50006 (Segfault caused by uksort()) +--FILE-- + 0, + 'bar-bazbazbaz-' => 0, + 'foo' => 0, +); +uksort($data, 'magic_sort_cmp'); +print_r($data); + +function magic_sort_cmp($a, $b) { + $a = substr($a, 1); + $b = substr($b, 1); + if (!$a) return $b ? -1 : 0; + if (!$b) return 1; + return magic_sort_cmp($a, $b); +} + +?> +--EXPECTF-- +Array +( + [foo] => 0 + [bar-bazbazbaz-] => 0 + [bar-bazbazbaz.] => 0 +) diff --git a/ext/standard/tests/array/bug50006_1.phpt b/ext/standard/tests/array/bug50006_1.phpt new file mode 100644 index 000000000..fbb7ddd59 --- /dev/null +++ b/ext/standard/tests/array/bug50006_1.phpt @@ -0,0 +1,29 @@ +--TEST-- +Bug #50006 (Segfault caused by uksort()) - usort variant +--FILE-- + +--EXPECTF-- +Array +( + [0] => foo + [1] => bar-bazbazbaz- + [2] => bar-bazbazbaz. +) diff --git a/ext/standard/tests/array/bug50006_2.phpt b/ext/standard/tests/array/bug50006_2.phpt new file mode 100644 index 000000000..19c0d1425 --- /dev/null +++ b/ext/standard/tests/array/bug50006_2.phpt @@ -0,0 +1,29 @@ +--TEST-- +Bug #50006 (Segfault caused by uksort()) - uasort variant +--FILE-- + +--EXPECTF-- +Array +( + [2] => foo + [1] => bar-bazbazbaz- + [0] => bar-bazbazbaz. +) diff --git a/ext/standard/tests/array/uasort_variation5.phpt b/ext/standard/tests/array/uasort_variation5.phpt index 22d9da31c..e6996a55f 100644 --- a/ext/standard/tests/array/uasort_variation5.phpt +++ b/ext/standard/tests/array/uasort_variation5.phpt @@ -139,7 +139,7 @@ array(4) { [1]=> string(7) "Heredoc" [3]=> - string(43) "heredoc string with!@# and 123 + string(4%d) "heredoc string with!@# and 123 Test this!!!" } Done diff --git a/ext/standard/tests/bug49244.phpt b/ext/standard/tests/bug49244.phpt new file mode 100644 index 000000000..1ba24fb9b --- /dev/null +++ b/ext/standard/tests/bug49244.phpt @@ -0,0 +1,32 @@ +--TEST-- +Bug #49244 (Floating point NaN cause garbage characters) +--FILE-- + +--EXPECT-- +{NaN} NaN +{NaN} NaN +{NaN} NaN +{NaN} NaN +{NaN} NaN +{NaN} NaN +{NaN} NaN +{NaN} NaN +{NaN} NaN +{NaN} NaN +{NaN} NaN +{NaN} NaN +{NaN} NaN +{NaN} NaN +{NaN} NaN +{NaN} NaN +{NaN} NaN +{NaN} NaN +{NaN} NaN +{NaN} NaN diff --git a/ext/standard/tests/file/005_variation2-win32.phpt b/ext/standard/tests/file/005_variation2-win32.phpt index 513182dde..45dcbc5f0 100644 --- a/ext/standard/tests/file/005_variation2-win32.phpt +++ b/ext/standard/tests/file/005_variation2-win32.phpt @@ -108,18 +108,18 @@ Warning: filectime(): stat failed for | in %s on line %d *** testing touch *** -Warning: touch(): Unable to create file because %s in %s on line %d +Warning: touch(): %s in %s on line %d bool(false) -Warning: touch(): Unable to create file because %s in %s on line %d +Warning: touch(): %s in %s on line %d bool(false) -Warning: touch(): Unable to create file because %s in %s on line %d +Warning: touch(): %s in %s on line %d bool(false) -Warning: touch(): Unable to create file because %s in %s on line %d +Warning: touch(): %s in %s on line %d bool(false) -Warning: touch(): Unable to create file | because %s in %s on line %d +Warning: touch(): %s in %s on line %d bool(false) Done diff --git a/ext/standard/tests/file/bug26615.phpt b/ext/standard/tests/file/bug26615.phpt index 9fee92a69..3689fdfe1 100644 --- a/ext/standard/tests/file/bug26615.phpt +++ b/ext/standard/tests/file/bug26615.phpt @@ -1,6 +1,6 @@ --TEST-- Bug #26615 (exec crash on long input lines) ---INI--- +--INI-- variables_order=E --FILE-- &1', $out); +if (strpos($ret, 'privilege')) { + die('skip. SeCreateSymbolicLinkPrivilege not enable for this user.'); +} ?> --FILE-- ksklnm@@$$&$&^%&^%&^%& html EOT; - +if(substr(PHP_OS, 0, 3) == "WIN") { + $string_with_tags = str_replace("\r",'', $string_with_tags); +} /* try reading the file opened in different modes of reading */ $file_modes = array("r","rb", "rt","r+", "r+b", "r+t"); @@ -62,7 +64,7 @@ for($mode_counter = 0; $mode_counter < count($file_modes); $mode_counter++) { echo "Done\n"; ?> ---EXPECTF-- +--EXPECT-- *** Testing fgetss() : Basic operations *** -- Testing fgetss() with file opened using r mode -- diff --git a/ext/standard/tests/file/fgetss_basic2-win32.phpt b/ext/standard/tests/file/fgetss_basic2-win32.phpt index 5a87b4c03..9187fe532 100644 --- a/ext/standard/tests/file/fgetss_basic2-win32.phpt +++ b/ext/standard/tests/file/fgetss_basic2-win32.phpt @@ -29,7 +29,9 @@ $string_with_tags = <<ksklnm@@$$&$&^%&^%&^%& html EOT; - +if(substr(PHP_OS, 0, 3) == "WIN") { + $string_with_tags = str_replace("\r",'', $string_with_tags); +} $filename = dirname(__FILE__)."/fgetss_basic2.tmp"; /* try reading the file opened in different modes of reading */ diff --git a/ext/standard/tests/file/fgetss_variation1-win32.phpt b/ext/standard/tests/file/fgetss_variation1-win32.phpt index dc3ee930c..0aca5d376 100644 --- a/ext/standard/tests/file/fgetss_variation1-win32.phpt +++ b/ext/standard/tests/file/fgetss_variation1-win32.phpt @@ -36,6 +36,10 @@ this text contains some html tags body
    br
    this is the line with \n character. EOT; +if(substr(PHP_OS, 0, 3) == "WIN") { + $string_with_tags = str_replace("\r",'', $string_with_tags); +} + $filename = dirname(__FILE__)."/fgetss_variation1.tmp"; /* try reading the file opened in different modes of reading */ @@ -73,7 +77,7 @@ for($mode_counter = 0; $mode_counter < count($file_modes); $mode_counter++) { echo "Done\n"; ?> ---EXPECTF-- +--EXPECT-- *** Testing fgetss() : usage variations *** -- Testing fgetss() with file opened using w mode -- diff --git a/ext/standard/tests/file/fgetss_variation3-win32.phpt b/ext/standard/tests/file/fgetss_variation3-win32.phpt index ea8ee2f8c..7539b3687 100644 --- a/ext/standard/tests/file/fgetss_variation3-win32.phpt +++ b/ext/standard/tests/file/fgetss_variation3-win32.phpt @@ -35,6 +35,10 @@ this text contains some html tags body
    br
    this is the line with \n character. EOT; +if(substr(PHP_OS, 0, 3) == "WIN") { + $string_with_tags = str_replace("\r",'', $string_with_tags); +} + $filename = dirname(__FILE__)."/fgetss_variation3.tmp"; /* try reading the file opened in different modes of reading */ @@ -76,7 +80,7 @@ for($mode_counter = 0; $mode_counter < count($file_modes); $mode_counter++) { echo "Done\n"; ?> ---EXPECTF-- +--EXPECT-- *** Testing fgetss() : usage variations *** -- Testing fgetss() with file opened using w+ mode -- diff --git a/ext/standard/tests/file/fgetss_variation4.phpt b/ext/standard/tests/file/fgetss_variation4.phpt index 134a9652a..6c201d1a9 100644 --- a/ext/standard/tests/file/fgetss_variation4.phpt +++ b/ext/standard/tests/file/fgetss_variation4.phpt @@ -1,5 +1,10 @@ --TEST-- Test fgetss() function : usage variations - read modes, file pointer at EOF +--SKIPIF-- + --FILE-- body
    br
    this is the line with \n character. EOT; +if(substr(PHP_OS, 0, 3) == "WIN") { + $string_with_tags = str_replace("\r",'', $string_with_tags); +} $filename = dirname(__FILE__)."/fgetss_variation5.tmp"; @@ -77,7 +80,7 @@ for($mode_counter = 0; $mode_counter < count($file_modes); $mode_counter++) { echo "Done\n"; ?> ---EXPECTF-- +--EXPECT-- *** Testing fgetss() : usage variations *** -- Testing fgetss() with file opened using w+ mode -- diff --git a/ext/standard/tests/file/file.inc b/ext/standard/tests/file/file.inc index efb425ca4..c0f86e7c3 100644 --- a/ext/standard/tests/file/file.inc +++ b/ext/standard/tests/file/file.inc @@ -347,16 +347,16 @@ function create_files( $file_path, filled => total files filled, always returned as 1 perms_changed => total files permission changed */ -function create_links( $file_path, - $filename, - $link_count = 1, - $link_type = "soft", - $link_size = 1024, - $link_name_prefix = "link", - $link_name_suffix = 1, - $link_file_content = "text", - $link_perms = 0755, - $link_file_extension = ".tmp" +function create_links($file_path, + $filename, + $link_count = 1, + $link_type = "soft", + $link_size = 1024, + $link_name_prefix = "link", + $link_name_suffix = 1, + $link_file_content = "text", + $link_perms = 0755, + $link_file_extension = ".tmp" ) { $return_value = array('created' => 0, 'filled' => 0, 'perms_changed' => 0); diff --git a/ext/standard/tests/file/fopen_variation10-win32.phpt b/ext/standard/tests/file/fopen_variation10-win32.phpt index bf8d3889f..c949f86fa 100644 --- a/ext/standard/tests/file/fopen_variation10-win32.phpt +++ b/ext/standard/tests/file/fopen_variation10-win32.phpt @@ -6,6 +6,11 @@ Dave Kelsey --FILE-- --FILE-- $value) { *** Testing mkdir() : usage variation *** --uppercase NULL-- -Error: 2 - mkdir(): No such file or directory, %s(%d) +Error: 2 - mkdir(): %s, %s(%d) --lowercase null-- -Error: 2 - mkdir(): No such file or directory, %s(%d) +Error: 2 - mkdir(): %s, %s(%d) --lowercase false-- -Error: 2 - mkdir(): No such file or directory, %s(%d) +Error: 2 - mkdir(): %s, %s(%d) --uppercase FALSE-- -Error: 2 - mkdir(): No such file or directory, %s(%d) +Error: 2 - mkdir(): %s, %s(%d) --empty string DQ-- -Error: 2 - mkdir(): No such file or directory, %s(%d) +Error: 2 - mkdir(): %s, %s(%d) --empty string SQ-- -Error: 2 - mkdir(): No such file or directory, %s(%d) +Error: 2 - mkdir(): %s, %s(%d) --undefined var-- -Error: 2 - mkdir(): No such file or directory, %s(%d) +Error: 2 - mkdir(): %s, %s(%d) --unset var-- -Error: 2 - mkdir(): No such file or directory, %s(%d) +Error: 2 - mkdir(): %s, %s(%d) --single space-- Error: 2 - mkdir(): %s, %s(%d) diff --git a/ext/standard/tests/file/realpath_cache.phpt b/ext/standard/tests/file/realpath_cache.phpt new file mode 100644 index 000000000..567f0e2c7 --- /dev/null +++ b/ext/standard/tests/file/realpath_cache.phpt @@ -0,0 +1,30 @@ +--TEST-- +realpath_cache_size() and realpath_cache_get() +--SKIPIF-- + +--FILE-- + +--EXPECTF-- +int(%d) +array(4) { + ["key"]=> + int(%d) + ["is_dir"]=> + bool(true) + ["realpath"]=> + string(%d) "%sfile" + ["expires"]=> + int(%d) +} +Done diff --git a/ext/standard/tests/file/realpath_cache_win32.phpt b/ext/standard/tests/file/realpath_cache_win32.phpt new file mode 100644 index 000000000..16fc412b0 --- /dev/null +++ b/ext/standard/tests/file/realpath_cache_win32.phpt @@ -0,0 +1,38 @@ +--TEST-- +realpath_cache_size() and realpath_cache_get() +--SKIPIF-- + +--FILE-- + +--EXPECTF-- +int(%d) +array(8) { + ["key"]=> + int(%d) + ["is_dir"]=> + bool(true) + ["realpath"]=> + string(%d) "%sfile" + ["expires"]=> + int(%d) + ["is_rvalid"]=> + bool(%s) + ["is_wvalid"]=> + bool(%s) + ["is_readable"]=> + bool(%s) + ["is_writable"]=> + bool(%s) +} +Done diff --git a/ext/standard/tests/file/rename_variation-win32.phpt b/ext/standard/tests/file/rename_variation-win32.phpt index cebf0334c..a10c6dfbe 100644 --- a/ext/standard/tests/file/rename_variation-win32.phpt +++ b/ext/standard/tests/file/rename_variation-win32.phpt @@ -69,7 +69,7 @@ bool(false) bool(true) -- Iteration 2 -- -Warning: rename(%s/rename_variation/rename_variation.tmp/,%s/rename_variation2.tmp): No such file or directory in %s on line %d +Warning: rename(%s/rename_variation/rename_variation.tmp/,%s/rename_variation2.tmp): The filename, directory name, or volume label syntax is incorrect. (code: 123) in %s on line %d bool(false) bool(false) bool(false) diff --git a/ext/standard/tests/file/rename_variation11-win32.phpt b/ext/standard/tests/file/rename_variation11-win32.phpt index d17b0d283..c13a09a95 100644 --- a/ext/standard/tests/file/rename_variation11-win32.phpt +++ b/ext/standard/tests/file/rename_variation11-win32.phpt @@ -92,12 +92,12 @@ bool(true) -- Iteration 5 -- -Warning: rename(%s\renameVar11\renameVar11Sub\..\\\renameVar11Sub\\..\\..\renameVar11Sub\renameMe.tmp,%s\renameVar11\renameVar11Sub\..\\\renameVar11Sub\\..\\..\renameVar11Sub\IwasRenamed.tmp): No such file or directory in %s on line %d +Warning: rename(%s\renameVar11\renameVar11Sub\..\\\renameVar11Sub\\..\\..\renameVar11Sub\renameMe.tmp,%s\renameVar11\renameVar11Sub\..\\\renameVar11Sub\\..\\..\renameVar11Sub\IwasRenamed.tmp): The system cannot find the path specified. (code: 3) in %s on line %d bool(false) -- Iteration 6 -- -Warning: rename(%s\renameVar11\renameVar11Sub\BADDIR\renameMe.tmp,%s\renameVar11\renameVar11Sub\BADDIR\IwasRenamed.tmp): No such file or directory in %s on line %d +Warning: rename(%s\renameVar11\renameVar11Sub\BADDIR\renameMe.tmp,%s\renameVar11\renameVar11Sub\BADDIR\IwasRenamed.tmp): The system cannot find the path specified. (code: 3) in %s on line %d bool(false) -- Iteration 7 -- @@ -118,7 +118,7 @@ bool(true) -- Iteration 11 -- -Warning: rename(BADDIR\renameMe.tmp,BADDIR\IwasRenamed.tmp): No such file or directory in %s on line %d +Warning: rename(BADDIR\renameMe.tmp,BADDIR\IwasRenamed.tmp): The system cannot find the path specified. (code: 3) in %s on line %d bool(false) -- Iteration 12 -- diff --git a/ext/standard/tests/file/rename_variation12-win32.phpt b/ext/standard/tests/file/rename_variation12-win32.phpt new file mode 100644 index 000000000..de5fc1400 --- /dev/null +++ b/ext/standard/tests/file/rename_variation12-win32.phpt @@ -0,0 +1,121 @@ +--TEST-- +Test rename() function : variation - various relative, absolute paths +--CREDITS-- +Dave Kelsey +--SKIPIF-- + +--FILE-- + +--EXPECTF-- +*** Testing rename() with absolute and relative paths *** + +-- Iteration 1 -- +bool(true) +bool(true) + +-- Iteration 2 -- +bool(true) +bool(true) + +-- Iteration 3 -- +bool(true) +bool(true) + +-- Iteration 4 -- +bool(true) +bool(true) + +-- Iteration 5 -- + +Warning: rename(%s/renameVar11/renameVar11Sub/..///renameVar11Sub//..//../renameVar11Sub/renameMe.tmp,%s/renameVar11/renameVar11Sub/..///renameVar11Sub//..//../renameVar11Sub/IwasRenamed.tmp): The system cannot find the path specified. (code: 3) in %s on line %d +bool(false) + +-- Iteration 6 -- + +Warning: rename(%s/renameVar11/renameVar11Sub/BADDIR/renameMe.tmp,%s/renameVar11/renameVar11Sub/BADDIR/IwasRenamed.tmp): The system cannot find the path specified. (code: 3) in %s on line %d +bool(false) + +-- Iteration 7 -- +bool(true) +bool(true) + +-- Iteration 8 -- +bool(true) +bool(true) + +-- Iteration 9 -- +bool(true) +bool(true) + +-- Iteration 10 -- +bool(true) +bool(true) + +-- Iteration 11 -- + +Warning: rename(BADDIR/renameMe.tmp,BADDIR/IwasRenamed.tmp): The system cannot find the path specified. (code: 3) in %s on line %d +bool(false) + +*** Done *** \ No newline at end of file diff --git a/ext/standard/tests/file/rename_variation12.phpt b/ext/standard/tests/file/rename_variation12.phpt index 11274f03d..168beeffc 100644 --- a/ext/standard/tests/file/rename_variation12.phpt +++ b/ext/standard/tests/file/rename_variation12.phpt @@ -2,6 +2,10 @@ Test rename() function : variation - various relative, absolute paths --CREDITS-- Dave Kelsey +--SKIPIF-- + --FILE-- --SKIPIF-- --FILE-- &1', $out); +if (strpos($ret, 'privilege')) { + die('skip. SeCreateSymbolicLinkPrivilege not enable for this user.'); +} ?> --FILE-- +--FILE-- + +--CLEAN-- + +--EXPECTF-- +*** Testing rename() on non-existing file *** + +Warning: rename(%s/non_existent_file.tmp,%s/rename_variation8_new.tmp): The system cannot find the file specified. (code: 2) in %s on line %d +bool(false) +bool(false) +bool(false) + +*** Testing rename() on existing directory *** +bool(true) +bool(false) +bool(true) + +*** Testing rename() on non-existing directory *** + +Warning: rename(%s/non_existent_dir,%s/rename_basic_dir2): The system cannot find the file specified. (code: 2) in %s on line %d +bool(false) +bool(false) +bool(false) +Done + diff --git a/ext/standard/tests/file/rename_variation8.phpt b/ext/standard/tests/file/rename_variation8.phpt index 6b3644aee..6e236c376 100644 --- a/ext/standard/tests/file/rename_variation8.phpt +++ b/ext/standard/tests/file/rename_variation8.phpt @@ -1,5 +1,9 @@ --TEST-- Test rename() function: variation +--SKIPIF-- + --FILE-- --CLEAN-- --EXPECTF-- diff --git a/ext/standard/tests/file/rename_variation9.phpt b/ext/standard/tests/file/rename_variation9.phpt index d923e4a3d..272fa9402 100644 --- a/ext/standard/tests/file/rename_variation9.phpt +++ b/ext/standard/tests/file/rename_variation9.phpt @@ -41,7 +41,7 @@ echo "Done\n"; unlink(dirname(__FILE__)."/rename_variation9_new.tmp"); rmdir(dirname(__FILE__)."/rename_variation_dir9_new"); ?> ---EXPECTF-- +--EXPECT-- *** Testing rename() by giving stream context as third argument *** bool(true) bool(false) diff --git a/ext/standard/tests/file/rmdir_variation1-win32.phpt b/ext/standard/tests/file/rmdir_variation1-win32.phpt index 0732821c5..2516e6162 100644 --- a/ext/standard/tests/file/rmdir_variation1-win32.phpt +++ b/ext/standard/tests/file/rmdir_variation1-win32.phpt @@ -90,35 +90,35 @@ foreach($inputs as $key =>$value) { *** Testing rmdir() : usage variation *** --uppercase NULL-- -Error: 2 - rmdir(): No such file or directory, %s(%d) +Error: 2 - rmdir(): %s, %s(%d) bool(false) --lowercase null-- -Error: 2 - rmdir(): No such file or directory, %s(%d) +Error: 2 - rmdir(): %s, %s(%d) bool(false) --lowercase false-- -Error: 2 - rmdir(): No such file or directory, %s(%d) +Error: 2 - rmdir(): %s, %s(%d) bool(false) --uppercase FALSE-- -Error: 2 - rmdir(): No such file or directory, %s(%d) +Error: 2 - rmdir(): %s, %s(%d) bool(false) --empty string DQ-- -Error: 2 - rmdir(): No such file or directory, %s(%d) +Error: 2 - rmdir(): %s, %s(%d) bool(false) --empty string SQ-- -Error: 2 - rmdir(): No such file or directory, %s(%d) +Error: 2 - rmdir(): %s, %s(%d) bool(false) --undefined var-- -Error: 2 - rmdir(): No such file or directory, %s(%d) +Error: 2 - rmdir(): %s, %s(%d) bool(false) --unset var-- -Error: 2 - rmdir(): No such file or directory, %s(%d) +Error: 2 - rmdir(): %s, %s(%d) bool(false) --single space-- diff --git a/ext/standard/tests/file/rmdir_variation1.phpt b/ext/standard/tests/file/rmdir_variation1.phpt index a7a499007..04fee0ee2 100644 --- a/ext/standard/tests/file/rmdir_variation1.phpt +++ b/ext/standard/tests/file/rmdir_variation1.phpt @@ -81,7 +81,7 @@ $inputs = array( foreach($inputs as $key =>$value) { echo "\n--$key--\n"; - var_dump( rmdir($value) ); + var_dump(rmdir($value)); }; ?> diff --git a/ext/standard/tests/file/tempnam_variation3-win32.phpt b/ext/standard/tests/file/tempnam_variation3-win32.phpt index ec7718f97..fb457cb6a 100644 --- a/ext/standard/tests/file/tempnam_variation3-win32.phpt +++ b/ext/standard/tests/file/tempnam_variation3-win32.phpt @@ -3,7 +3,7 @@ Test tempnam() function: usage variations - obscure prefixes --SKIPIF-- --FILE-- "; - print($file_name); - echo "\n"; + /* creating the files in existing dir */ + if (file_exists($file_name) && !$res_arr[$i]) { + echo "Failed\n"; + } + if ($res_arr[$i]) { + $file_dir = dirname($file_name); + if (realpath($file_dir) == $file_path || realpath($file_dir . "\\") == $file_path) { + echo "OK\n"; + } else { + echo "Failed, not created in the correct directory " . realpath($file_dir) . ' vs ' . $file_path ."\n"; + } + + if (!is_writable($file_name)) { + printf("%o\n", fileperms($file_name) ); - echo "File permissions are => "; - printf("%o", fileperms($file_name) ); - echo "\n"; - - echo "File created in => "; - $file_dir = dirname($file_name); - if (realpath($file_dir) == realpath(sys_get_temp_dir()) || realpath($file_dir."\\") == realpath(sys_get_temp_dir())) { - echo "temp dir\n"; - } - else if (realpath($file_dir) == realpath($file_path) || realpath($file_dir."\\") == realpath($file_path)) { - echo "directory specified\n"; - } - else { - echo "unknown location\n"; - } - } - else { - echo "-- File is not created --\n"; - } - - unlink($file_name); + } + } else { + echo "OK\n"; + } + @unlink($file_name); } rmdir($file_path); -echo "\n*** Done ***\n"; +echo "\n*** Done. ***\n"; ?> --EXPECTF-- *** Testing tempnam() with obscure prefixes *** -- Iteration 0 -- -File name is => %s\%s -File permissions are => 100666 -File created in => directory specified +OK -- Iteration 1 -- -File name is => %s\%s -File permissions are => 100666 -File created in => directory specified +OK -- Iteration 2 -- -File name is => %s\%s -File permissions are => 100666 -File created in => directory specified +OK -- Iteration 3 -- -File name is => %s\%s -File permissions are => 100666 -File created in => directory specified +OK -- Iteration 4 -- -File name is => %s\%s -File permissions are => 100666 -File created in => directory specified +OK -- Iteration 5 -- -File name is => %s\%s -File permissions are => 100666 -File created in => directory specified +Failed, not created in the correct directory %s vs %s +0 -- Iteration 6 -- -File name is => %s\%s -File permissions are => 100666 -File created in => directory specified +OK -- Iteration 7 -- -Warning: tempnam() expects parameter 2 to be string, array given in %s on line %d --- File is not created -- - -Warning: unlink(): No such file or directory in %s on line %d +Warning: tempnam() expects parameter 2 to be string, array given in %s\ext\standard\tests\file\tempnam_variation3-win32.php on line %d +OK -- Iteration 8 -- -File name is => %s\di%s -File permissions are => 100666 -File created in => directory specified +OK -- Iteration 9 -- -File name is => %s\ph%s -File permissions are => 100666 -File created in => directory specified - -*** Done *** +OK +*** Done. *** diff --git a/ext/standard/tests/file/tempnam_variation3.phpt b/ext/standard/tests/file/tempnam_variation3.phpt index a0b9511b6..69ab16c89 100644 --- a/ext/standard/tests/file/tempnam_variation3.phpt +++ b/ext/standard/tests/file/tempnam_variation3.phpt @@ -108,7 +108,7 @@ File created in => directory specified Warning: tempnam() expects parameter 2 to be string, array given in %s on line %d -- File is not created -- -Warning: unlink(): No such file or directory in %s on line %d +Warning: unlink(): %s in %s on line %d -- Iteration 8 -- File name is => %s/dir%s File permissions are => 100600 diff --git a/ext/standard/tests/file/tempnam_variation7-win32.phpt b/ext/standard/tests/file/tempnam_variation7-win32.phpt index 5096934e0..34e352a49 100644 --- a/ext/standard/tests/file/tempnam_variation7-win32.phpt +++ b/ext/standard/tests/file/tempnam_variation7-win32.phpt @@ -17,50 +17,47 @@ if(substr(PHP_OS, 0, 3) != "WIN") echo "*** Testing tempnam() with invalid/non-existing directory names ***\n"; /* An array of names, which will be passed as a dir name */ $names_arr = array( - /* Invalid args */ - -1, - TRUE, - FALSE, - NULL, - "", - " ", - "\0", - array(), - - /* Non-existing dirs */ - "/no/such/file/dir", - "php" + /* Invalid args */ + -1, + TRUE, + FALSE, + NULL, + "", + " ", + "\0", + array(), + /* Non-existing dirs */ + "/no/such/file/dir", + "php" ); for( $i=0; $i "; + print($file_name); + echo "\n"; - if( file_exists($file_name) ){ + echo "File permissions are => "; + printf("%o", fileperms($file_name) ); + echo "\n"; - echo "File name is => "; - print($file_name); - echo "\n"; + echo "File created in => "; + $file_dir = dirname($file_name); + if (realpath($file_dir) == realpath(sys_get_temp_dir()) || realpath($file_dir."\\") == realpath(sys_get_temp_dir())) { + echo "temp dir\n"; + } else { + echo "unknown location\n"; + } + } else { + echo "-- File is not created --\n"; + } - echo "File permissions are => "; - printf("%o", fileperms($file_name) ); - echo "\n"; - - echo "File created in => "; - $file_dir = dirname($file_name); - if (realpath($file_dir) == realpath(sys_get_temp_dir()) || realpath($file_dir."\\") == realpath(sys_get_temp_dir())) { - echo "temp dir\n"; - } - else { - echo "unknown location\n"; - } - } - else { - echo "-- File is not created --\n"; - } - - unlink($file_name); + unlink($file_name); } echo "\n*** Done ***\n"; @@ -100,7 +97,7 @@ File created in => temp dir Warning: tempnam() expects parameter 1 to be string, array given in %s on line %d -- File is not created -- -Warning: unlink(): No such file or directory in %s on line %d +Warning: unlink(): %s in %s on line %d -- Iteration 8 -- File name is => %s%et%s File permissions are => 100666 diff --git a/ext/standard/tests/file/tempnam_variation7.phpt b/ext/standard/tests/file/tempnam_variation7.phpt index 0e314dabe..18d074d28 100644 --- a/ext/standard/tests/file/tempnam_variation7.phpt +++ b/ext/standard/tests/file/tempnam_variation7.phpt @@ -102,7 +102,7 @@ File created in => temp dir Warning: tempnam() expects parameter 1 to be string, array given in %s on line %d -- File is not created -- -Warning: unlink(): No such file or directory in %s on line %d +Warning: unlink(): %s in %s on line %d -- Iteration 8 -- File name is => %s%etempnam_variation3.tmp%s File permissions are => 100600 diff --git a/ext/standard/tests/file/unlink_error-win32.phpt b/ext/standard/tests/file/unlink_error-win32.phpt index 2c913aeb5..e55f6ed5c 100644 --- a/ext/standard/tests/file/unlink_error-win32.phpt +++ b/ext/standard/tests/file/unlink_error-win32.phpt @@ -77,15 +77,15 @@ bool(true) -- Testing unlink() on invalid arguments -- -Warning: unlink(): No such file or directory in %s on line %d +Warning: unlink(): %s in %s on line %d bool(false) bool(false) -Warning: unlink(): No such file or directory in %s on line %d +Warning: unlink(): %s in %s on line %d bool(false) bool(false) -Warning: unlink(): No such file or directory in %s on line %d +Warning: unlink(): %s in %s on line %d bool(false) bool(false) diff --git a/ext/standard/tests/file/userstreams_003.phpt b/ext/standard/tests/file/userstreams_003.phpt index b30636d20..01a8efbf5 100644 --- a/ext/standard/tests/file/userstreams_003.phpt +++ b/ext/standard/tests/file/userstreams_003.phpt @@ -101,7 +101,7 @@ bool(false) value: int(0) ptrparam: -int(8192) +int(%d) $option === 3 === 3: bool(true) $value === 0 === 0: diff --git a/ext/standard/tests/file/windows_acls/common.inc b/ext/standard/tests/file/windows_acls/common.inc index 2a1adeb0a..c4276014a 100644 --- a/ext/standard/tests/file/windows_acls/common.inc +++ b/ext/standard/tests/file/windows_acls/common.inc @@ -118,7 +118,7 @@ function create_dir($name, $perms) { function create_file($name, $perms) { if (empty($name)) { - echo "create_dir: Empty name is not allowed\n"; + echo "create_file: Empty name is not allowed\n"; return; } diff --git a/ext/standard/tests/file/windows_links/bug48746.phpt b/ext/standard/tests/file/windows_links/bug48746.phpt new file mode 100644 index 000000000..6c88c6319 --- /dev/null +++ b/ext/standard/tests/file/windows_links/bug48746.phpt @@ -0,0 +1,55 @@ +--TEST-- +Bug#48746 - Junction not working properly + +--CREDIT-- +Venkat Raman Don (don.raman@microsoft.com) + +--SKIPIF-- + +--FILE-- + +--EXPECT-- +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) diff --git a/ext/standard/tests/file/windows_links/bug48746_1.phpt b/ext/standard/tests/file/windows_links/bug48746_1.phpt new file mode 100644 index 000000000..ca8450a89 --- /dev/null +++ b/ext/standard/tests/file/windows_links/bug48746_1.phpt @@ -0,0 +1,56 @@ +--TEST-- +Bug#48746 - Junction not working properly + +--CREDIT-- +Venkat Raman Don (don.raman@microsoft.com) + +--SKIPIF-- + +--FILE-- +"); +include_once "mklink_junction\\a.php"; +file_put_contents("$fullpath\\mnt\\test\\directory\\b.php", ""); +require "$fullpath\\mnt\\test\\directory\\b.php"; +file_put_contents("$fullpath\\mnt\\test\\mklink_junction\\c.php", ""); +require_once "$fullpath\\mnt\\test\\mklink_junction\\c.php"; +var_dump(is_file("mklink_junction\\a.php")); +var_dump(is_file("$fullpath\\mnt\\test\\directory\\b.php")); +var_dump(is_file("$fullpath\\mnt\\test\\mklink_junction\\c.php")); +unlink("$fullpath\\mnt\\test\\directory\\b.php"); +unlink("$fullpath\\mnt\\test\\mklink_junction\\c.php"); +unlink("mklink_junction\\a.php"); +chdir($old_dir); +rmdir(__DIR__ . "\\mnt\\test\\directory"); +rmdir(__DIR__ . "\\mnt\\test\\mklink_junction"); +rmdir(__DIR__ . "\\mnt\\test\\mounted_volume"); +rmdir(__DIR__ . "\\mnt\\test"); +rmdir(__DIR__ . "\\mnt"); + +?> +--EXPECT-- +I am included. +I am included. +I am included. +bool(true) +bool(true) +bool(true) diff --git a/ext/standard/tests/file/windows_links/bug48746_2.phpt b/ext/standard/tests/file/windows_links/bug48746_2.phpt new file mode 100644 index 000000000..7beed1691 --- /dev/null +++ b/ext/standard/tests/file/windows_links/bug48746_2.phpt @@ -0,0 +1,66 @@ +--TEST-- +Bug#48746 - Junction not working properly + +--CREDIT-- +Venkat Raman Don (don.raman@microsoft.com) + +--SKIPIF-- +&1', $out); +if (strpos($ret, 'privilege')) { + die('skip. SeCreateSymbolicLinkPrivilege not enable for this user.'); +} +unlink('mklink bug48746_tmp.lnk'); +?> +--FILE-- +"); +file_put_contents("$fullpath\\mnt\\test\\directory\\b.php", ""); +print_r(scandir("mklink_junction")); +print_r(scandir("$fullpath\\mnt\\test\\directory")); +print_r(scandir("$fullpath\\mnt\\test\\mklink_junction")); +unlink("$fullpath\\mnt\\test\\directory\\b.php"); +unlink("mklink_junction\\a.php"); +chdir($old_dir); +rmdir(__DIR__ . "\\mnt\\test\\directory"); +rmdir(__DIR__ . "\\mnt\\test\\mklink_junction"); +rmdir(__DIR__ . "\\mnt\\test\\mounted_volume"); +rmdir(__DIR__ . "\\mnt\\test"); +rmdir(__DIR__ . "\\mnt"); + +?> +--EXPECT-- +Array +( + [0] => . + [1] => .. + [2] => a.php + [3] => b.php +) +Array +( + [0] => . + [1] => .. + [2] => a.php + [3] => b.php +) +Array +( + [0] => . + [1] => .. + [2] => a.php + [3] => b.php +) diff --git a/ext/standard/tests/file/windows_links/bug48746_3.phpt b/ext/standard/tests/file/windows_links/bug48746_3.phpt new file mode 100644 index 000000000..a0dcbdc02 --- /dev/null +++ b/ext/standard/tests/file/windows_links/bug48746_3.phpt @@ -0,0 +1,48 @@ +--TEST-- +Bug#48746 - Junction not working properly + +--CREDIT-- +Venkat Raman Don (don.raman@microsoft.com) + +--SKIPIF-- +&1', $out); +if (strpos($out[0], 'recognized')) { + die('skip. junction.exe not found in PATH.'); +} + +?> +--FILE-- +"); +file_put_contents("junction\\b.php", ""); +include "junction/a.php"; +require_once "junction\\b.php"; +print_r(scandir("junction")); +unlink("junction\\a.php"); +unlink("junction\\b.php"); +chdir($old_dir); +rmdir(__DIR__ . "\\mnt\\test\\directory"); +rmdir(__DIR__ . "\\mnt\\test\\junction"); +rmdir(__DIR__ . "\\mnt\\test"); +rmdir(__DIR__ . "\\mnt"); + +?> +--EXPECT-- +I am included. +I am included. +Array +( + [0] => . + [1] => .. + [2] => a.php + [3] => b.php +) diff --git a/ext/standard/tests/general_functions/.getservbyport_basic.phpt.swp b/ext/standard/tests/general_functions/.getservbyport_basic.phpt.swp deleted file mode 100644 index dc8000aa0..000000000 Binary files a/ext/standard/tests/general_functions/.getservbyport_basic.phpt.swp and /dev/null differ diff --git a/ext/standard/tests/general_functions/bug49692.ini b/ext/standard/tests/general_functions/bug49692.ini new file mode 100644 index 000000000..5def69a2b --- /dev/null +++ b/ext/standard/tests/general_functions/bug49692.ini @@ -0,0 +1,4 @@ +//my.ini file +[sitemap] +/home = default:index +/info = default:info diff --git a/ext/standard/tests/general_functions/bug49692.phpt b/ext/standard/tests/general_functions/bug49692.phpt new file mode 100644 index 000000000..80a1612d9 --- /dev/null +++ b/ext/standard/tests/general_functions/bug49692.phpt @@ -0,0 +1,20 @@ +--TEST-- +Bug #49692: parse_ini_file() throws errors when key contains '/' (forward slash) +--CREDITS-- +Rafael Dohms +--FILE-- + +--EXPECTF-- +array(1) { + ["sitemap"]=> + array(2) { + ["/home"]=> + string(13) "default:index" + ["/info"]=> + string(12) "default:info" + } +} diff --git a/ext/standard/tests/general_functions/bug49847.phpt b/ext/standard/tests/general_functions/bug49847.phpt new file mode 100644 index 000000000..8895202d0 --- /dev/null +++ b/ext/standard/tests/general_functions/bug49847.phpt @@ -0,0 +1,25 @@ +--TEST-- +Bug #49847 (exec() fails on lines larger then 4095 bytes) +--FILE-- + +--EXPECTF-- +array(1) { + [0]=> + string(4098) "%s 1" +} diff --git a/ext/standard/tests/general_functions/bug50690.phpt b/ext/standard/tests/general_functions/bug50690.phpt new file mode 100644 index 000000000..4d9f0dc5e --- /dev/null +++ b/ext/standard/tests/general_functions/bug50690.phpt @@ -0,0 +1,14 @@ +--TEST-- +Bug #23650 (putenv() does not assign values when the value is one character) +--FILE-- + +--EXPECT-- +string(2) "ab" +string(1) "c" +bool(false) diff --git a/ext/standard/tests/general_functions/bug50732.phpt b/ext/standard/tests/general_functions/bug50732.phpt new file mode 100644 index 000000000..ed8341dec --- /dev/null +++ b/ext/standard/tests/general_functions/bug50732.phpt @@ -0,0 +1,12 @@ +--TEST-- +Bug #50732 (exec() adds single byte twice to $output array) +--FILE-- + +--EXPECT-- +array(1) { + [0]=> + string(1) "x" +} diff --git a/ext/standard/tests/general_functions/get_cfg_var_variation8.phpt b/ext/standard/tests/general_functions/get_cfg_var_variation8.phpt index 22188c7e6..31bcb80fc 100644 --- a/ext/standard/tests/general_functions/get_cfg_var_variation8.phpt +++ b/ext/standard/tests/general_functions/get_cfg_var_variation8.phpt @@ -14,7 +14,7 @@ var_dump(get_cfg_var( 'register_globals' ) ); ?> --EXPECTF-- -PHP Warning: Directive 'register_globals' is deprecated in PHP 5.3 and greater in %s on line 0 +Warning: Directive 'register_globals' is deprecated in PHP 5.3 and greater in %s on line 0 *** Test by calling method or function with deprecated option *** string(1) "1" diff --git a/ext/standard/tests/general_functions/import_request.phpt b/ext/standard/tests/general_functions/import_request.phpt index a1181471c..0f9e93bf0 100644 --- a/ext/standard/tests/general_functions/import_request.phpt +++ b/ext/standard/tests/general_functions/import_request.phpt @@ -30,24 +30,24 @@ echo "Done\n"; --EXPECTF-- Warning: import_request_variables() expects at least 1 parameter, 0 given in %s on line %d NULL -NULL +bool(false) Notice: import_request_variables(): No prefix specified - possible security hazard in %s on line %d -NULL +bool(false) Notice: import_request_variables(): No prefix specified - possible security hazard in %s on line %d Warning: import_request_variables(): Attempted GLOBALS variable overwrite in %s on line %d Warning: import_request_variables(): Numeric key detected - possible security hazard in %s on line %d -NULL +bool(true) Notice: Undefined variable: ap in %s on line %d string(1) "1" string(3) "heh" string(1) "3" NULL -NULL +bool(true) Notice: Undefined variable: g_ap in %s on line %d string(1) "1" @@ -55,7 +55,7 @@ string(3) "heh" string(1) "3" NULL string(2) "hm" -NULL +bool(true) string(1) "1" string(3) "heh" string(1) "3" @@ -66,7 +66,7 @@ array(1) { [0]=> string(2) "ar" } -NULL +bool(true) Notice: Undefined variable: r_ap in %s on line %d string(1) "1" diff --git a/ext/standard/tests/general_functions/is_callable_basic1.phpt b/ext/standard/tests/general_functions/is_callable_basic1.phpt index e836d734f..fe4d6e26e 100644 --- a/ext/standard/tests/general_functions/is_callable_basic1.phpt +++ b/ext/standard/tests/general_functions/is_callable_basic1.phpt @@ -64,7 +64,7 @@ check_iscallable($defined_functions); ?> ===DONE=== ---EXPECT--- +--EXPECT-- *** Testing is_callable() on defined functions *** -- Iteration 1 -- bool(true) @@ -106,4 +106,4 @@ Hello_World bool(true) bool(true) Hello_World -===DONE=== \ No newline at end of file +===DONE=== diff --git a/ext/standard/tests/general_functions/phpcredits.phpt b/ext/standard/tests/general_functions/phpcredits.phpt index 69515dfe6..0aff6142f 100644 --- a/ext/standard/tests/general_functions/phpcredits.phpt +++ b/ext/standard/tests/general_functions/phpcredits.phpt @@ -37,7 +37,7 @@ Language Design & Concept PHP Quality Assurance Team %a -PHP Website Team +%wWebsites and Infrastructure team%w %a bool(true) diff --git a/ext/standard/tests/general_functions/proc_nice_basic.phpt b/ext/standard/tests/general_functions/proc_nice_basic.phpt index 5a9575627..3a958901a 100644 --- a/ext/standard/tests/general_functions/proc_nice_basic.phpt +++ b/ext/standard/tests/general_functions/proc_nice_basic.phpt @@ -5,6 +5,10 @@ Italian PHP TestFest 2009 Cesena 19-20-21 june Fabio Fabbrucci (fabbrucci@grupporetina.com) Michele Orselli (mo@ideato.it) Simone Gentili (sensorario@gmail.com) +--SKIPIF-- + --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- ==DONE== --EXPECTF-- -PHP Warning: Directive 'safe_mode' is deprecated in PHP 5.3 and greater in Unknown on line 0 +Warning: Directive 'safe_mode' is deprecated in PHP 5.3 and greater in Unknown on line 0 Warning: putenv(): Safe Mode warning: Cannot set environment variable 'FOO' - it's not in the allowed list in %s on line %d diff --git a/ext/standard/tests/general_functions/putenv_error2.phpt b/ext/standard/tests/general_functions/putenv_error2.phpt index 365f0e544..456a7ab69 100644 --- a/ext/standard/tests/general_functions/putenv_error2.phpt +++ b/ext/standard/tests/general_functions/putenv_error2.phpt @@ -12,7 +12,7 @@ putenv('BAZ=bop'); ?> ==DONE== --EXPECTF-- -PHP Warning: Directive 'safe_mode' is deprecated in PHP 5.3 and greater in Unknown on line 0 +Warning: Directive 'safe_mode' is deprecated in PHP 5.3 and greater in Unknown on line 0 Warning: putenv(): Safe Mode warning: Cannot override protected environment variable 'FOO' in %s on line %d diff --git a/ext/standard/tests/general_functions/strval.phpt b/ext/standard/tests/general_functions/strval.phpt index 1789e41d6..350678578 100644 --- a/ext/standard/tests/general_functions/strval.phpt +++ b/ext/standard/tests/general_functions/strval.phpt @@ -267,10 +267,10 @@ string(4) "true" -- Iteration 54 -- string(4) "true" -- Iteration 55 -- -string(54) "This is a multiline heredoc +string(5%d) "This is a multiline heredoc string. Numeric = 1232455." -- Iteration 56 -- -string(10) "12345 +string(1%d) "12345 2345" -- Iteration 57 -- string(0) "" diff --git a/ext/standard/tests/general_functions/sunfuncts.phpt b/ext/standard/tests/general_functions/sunfuncts.phpt deleted file mode 100644 index 59acb122c..000000000 --- a/ext/standard/tests/general_functions/sunfuncts.phpt +++ /dev/null @@ -1,42 +0,0 @@ ---TEST-- -date_sunrise() and date_sunset() functions ---INI-- -precision=13 ---FILE-- - ---EXPECTF-- -1041395864 06:37 6.6290131458%d -1041432452 16:47 16.792451114%d -1044073855 06:30 6.5154089279%d -1044112463 17:14 17.239870289%d -1046491495 06:04 6.0822145033%d -1046533075 17:37 17.632011035%d -1049167581 05:26 5.4394438111%d -1049212774 17:59 17.993035729%d -1051757532 04:52 4.8701934126%d -1051806007 18:20 18.335390508%d -1054434776 04:32 4.5489827182%d -1054485647 18:40 18.679812949%d -1057026949 04:35 4.5971956372%d -1057078197 18:49 18.832563396%d -1059706409 04:53 4.8916575089%d -1059755837 18:37 18.621440704%d -1062385999 05:13 5.2220951121%d -1062432291 18:04 18.080957168%d -1064979098 05:31 5.5273199215%d -1065021952 17:25 17.431339135%d -1067658845 05:54 5.9016292870%d -1067698274 16:51 16.853902453%d -1070252387 06:19 6.3299242689%d -1070289382 16:36 16.606312600%d diff --git a/ext/standard/tests/mail/mail_basic.phpt b/ext/standard/tests/mail/mail_basic.phpt index 77ff3512d..fecb50f32 100644 --- a/ext/standard/tests/mail/mail_basic.phpt +++ b/ext/standard/tests/mail/mail_basic.phpt @@ -2,6 +2,7 @@ Test mail() function : basic functionality --INI-- sendmail_path=tee mailBasic.out >/dev/null +mail.add_x_header = Off --SKIPIF-- --INI-- -sendmail_path="echo --- > /tmp/php_test_mailBasic2.out" +sendmail_path="sed > /tmp/php_test_mailBasic2.out" +mail.add_x_header = Off --FILE-- @@ -44,5 +40,10 @@ unlink($outFile); *** Testing mail() : basic functionality *** -- extra parameters -- bool(true) +To: user@company.com +Subject: Test Subject +KHeaders + +A Message --- Extras ===DONE=== diff --git a/ext/standard/tests/mail/mail_variation2.phpt b/ext/standard/tests/mail/mail_variation2.phpt index 59ef1d902..d6eafd2e5 100644 --- a/ext/standard/tests/mail/mail_variation2.phpt +++ b/ext/standard/tests/mail/mail_variation2.phpt @@ -1,8 +1,9 @@ --TEST-- Test mail() function : variation force extra parameters --INI-- -sendmail_path="echo --- > /tmp/php_test_mailVariation2.out" -mail.force_extra_parameters="forced params" +sendmail_path="sed > /tmp/php_test_mailVariation2.out" +mail.force_extra_parameters="-e4a---forced-params" +mail.add_x_header = Off --SKIPIF-- --EXPECTF-- -PHP Warning: Directive 'define_syslog_variables' is deprecated in PHP 5.3 and greater in Unknown on line 0 +Warning: Directive 'define_syslog_variables' is deprecated in PHP 5.3 and greater in Unknown on line 0 bool(true) diff --git a/ext/standard/tests/misc/time_sleep_until_error2.phpt b/ext/standard/tests/misc/time_sleep_until_error2.phpt index 311dd72f6..d20c8ab65 100644 --- a/ext/standard/tests/misc/time_sleep_until_error2.phpt +++ b/ext/standard/tests/misc/time_sleep_until_error2.phpt @@ -1,5 +1,9 @@ --TEST-- time_sleep_until() function - error test for time_sleep_until() +--SKIPIF-- + --CREDITS-- Filippo De Santis fd@ideato.it #PHPTestFest Cesena Italia on 2009-06-20 diff --git a/ext/standard/tests/network/define_syslog_variables_variation-win32.phpt b/ext/standard/tests/network/define_syslog_variables_variation-win32.phpt deleted file mode 100644 index ac7dac8ab..000000000 --- a/ext/standard/tests/network/define_syslog_variables_variation-win32.phpt +++ /dev/null @@ -1,97 +0,0 @@ ---TEST-- -Test define_syslog_variables() function : variation ---INI-- -define_syslog_variables = true ---SKIPIF-- - ---FILE-- - -===DONE=== ---EXPECT-- -*** Testing define_syslog_variables() : variation *** -PASSED -===DONE=== -PHP Warning: Directive 'define_syslog_variables' is deprecated in PHP 5.3 and greater in Unknown on line 0 diff --git a/ext/standard/tests/network/define_syslog_variables_variation.phpt b/ext/standard/tests/network/define_syslog_variables_variation.phpt index 1e35633bc..e5842b036 100644 --- a/ext/standard/tests/network/define_syslog_variables_variation.phpt +++ b/ext/standard/tests/network/define_syslog_variables_variation.phpt @@ -1,12 +1,5 @@ --TEST-- Test define_syslog_variables() function : variation ---SKIPIF-- - ---INI-- -define_syslog_variables = true --FILE-- ===DONE=== ---EXPECT-- -PHP Warning: Directive 'define_syslog_variables' is deprecated in PHP 5.3 and greater in Unknown on line 0 +--EXPECTF-- +Deprecated: Function define_syslog_variables() is deprecated in %s on line %d *** Testing define_syslog_variables() : variation *** PASSED ===DONE=== diff --git a/ext/standard/tests/php_ini_loaded_file.phpt b/ext/standard/tests/php_ini_loaded_file.phpt index ab26953ea..b443c5f70 100644 --- a/ext/standard/tests/php_ini_loaded_file.phpt +++ b/ext/standard/tests/php_ini_loaded_file.phpt @@ -8,6 +8,5 @@ Testfest 2009 Munich ---EXPECT-- -bool(false) - +--EXPECTF-- +string(%d) "%s/tmp-php.ini" diff --git a/ext/standard/tests/streams/bug49936.phpt b/ext/standard/tests/streams/bug49936.phpt new file mode 100644 index 000000000..d77e161c5 --- /dev/null +++ b/ext/standard/tests/streams/bug49936.phpt @@ -0,0 +1,26 @@ +--TEST-- +Bug #49936 (crash with ftp stream in php_stream_context_get_option()) +--SKIPIF-- + +--FILE-- + +--EXPECTF-- +Warning: opendir(): connect() failed: Connection refused in %s on line %d + +Warning: opendir(ftp://...@localhost/): failed to open dir: operation failed in %s on line %d +bool(false) + +Warning: opendir(): connect() failed: Connection refused in %s on line %d + +Warning: opendir(ftp://...@localhost/): failed to open dir: operation failed in %s on line %d +bool(false) diff --git a/ext/standard/tests/streams/bug49936_win32.phpt b/ext/standard/tests/streams/bug49936_win32.phpt new file mode 100644 index 000000000..4db4a5044 --- /dev/null +++ b/ext/standard/tests/streams/bug49936_win32.phpt @@ -0,0 +1,30 @@ +--TEST-- +Bug #49936 (crash with ftp stream in php_stream_context_get_option()) +--SKIPIF-- + +--INI-- +default_socket_timeout=2 +--FILE-- + +--EXPECTF-- +Warning: opendir(): connect() failed: %s + in %s on line %d + +Warning: opendir(ftp://...@localhost/): failed to open dir: operation failed in %s on line %d +bool(false) + +Warning: opendir(): connect() failed: %s + in %s on line %d + +Warning: opendir(ftp://...@localhost/): failed to open dir: operation failed in %s on line %d +bool(false) diff --git a/ext/standard/tests/streams/stream_resolve_include_path.phpt b/ext/standard/tests/streams/stream_resolve_include_path.phpt new file mode 100644 index 000000000..aea5cdd96 --- /dev/null +++ b/ext/standard/tests/streams/stream_resolve_include_path.phpt @@ -0,0 +1,37 @@ +--TEST-- +stream_resolve_include_path(string path) +--FILE-- += 0x80 +var_dump(_bin2hex(htmlspecialchars("\x80", ENT_QUOTES, 'Shift_JIS'))); +foreach (array_map('chr', range(0xa0, 0xdf)) as $c) { + var_dump(_bin2hex(htmlspecialchars($c, ENT_QUOTES, 'Shift_JIS'))); +} +var_dump(_bin2hex(htmlspecialchars("\xfd", ENT_QUOTES, 'Shift_JIS'))); +var_dump(_bin2hex(htmlspecialchars("\xfe", ENT_QUOTES, 'Shift_JIS'))); +var_dump(_bin2hex(htmlspecialchars("\xff", ENT_QUOTES, 'Shift_JIS'))); + +echo "--\n"; +// Shift_JIS: incomplete / invalid multibyte sequences +foreach (array_map('chr', array_merge(range(0x81, 0x9f), range(0xe0, 0xfc))) as $c) { + var_dump(_bin2hex(htmlspecialchars("$c", ENT_QUOTES, 'Shift_JIS'))); + var_dump(_bin2hex(htmlspecialchars("$c\x3f", ENT_QUOTES, 'Shift_JIS'))); + var_dump(_bin2hex(htmlspecialchars("$c\x40", ENT_QUOTES, 'Shift_JIS'))); + var_dump(_bin2hex(htmlspecialchars("$c\x7e", ENT_QUOTES, 'Shift_JIS'))); + var_dump(_bin2hex(htmlspecialchars("$c\x7f", ENT_QUOTES, 'Shift_JIS'))); + var_dump(_bin2hex(htmlspecialchars("$c\x80", ENT_QUOTES, 'Shift_JIS'))); + var_dump(_bin2hex(htmlspecialchars("$c\xfc", ENT_QUOTES, 'Shift_JIS'))); + var_dump(_bin2hex(htmlspecialchars("$c\xfd", ENT_QUOTES, 'Shift_JIS'))); + var_dump(_bin2hex(htmlspecialchars("$c\xfe", ENT_QUOTES, 'Shift_JIS'))); + var_dump(_bin2hex(htmlspecialchars("$c\xff", ENT_QUOTES, 'Shift_JIS'))); +} + +echo "--\n"; +// EUC-JP: non-lead byte >= 0x80 +foreach (array_map('chr', array_merge(range(0x80, 0x8d), range(0x90, 0x9f))) as $c) { + var_dump(_bin2hex(htmlspecialchars($c, ENT_QUOTES, 'EUC-JP'))); +} +var_dump(_bin2hex(htmlspecialchars("\xff", ENT_QUOTES, 'EUC-JP'))); + +// EUC-JP: control codes that are virtually lead bytes +var_dump(_bin2hex(htmlspecialchars("\x8e", ENT_QUOTES, 'EUC-JP'))); +var_dump(_bin2hex(htmlspecialchars("\x8f", ENT_QUOTES, 'EUC-JP'))); +var_dump(_bin2hex(htmlspecialchars("\x8e\xa1", ENT_QUOTES, 'EUC-JP'))); +var_dump(_bin2hex(htmlspecialchars("\x8f\xa1", ENT_QUOTES, 'EUC-JP'))); +var_dump(_bin2hex(htmlspecialchars("\x8e\xa1\xa3", ENT_QUOTES, 'EUC-JP'))); +var_dump(_bin2hex(htmlspecialchars("\x8f\xa1\xa3", ENT_QUOTES, 'EUC-JP'))); + +echo "--\n"; +// EUC-JP: incomplete / invalid multibyte sequences +foreach (array_map('chr', array_merge(range(0xa1, 0xfe))) as $c) { + var_dump(_bin2hex(htmlspecialchars("$c", ENT_QUOTES, 'EUC-JP'))); + var_dump(_bin2hex(htmlspecialchars("$c\x26", ENT_QUOTES, 'EUC-JP'))); + var_dump(_bin2hex(htmlspecialchars("$c\x80", ENT_QUOTES, 'EUC-JP'))); + var_dump(_bin2hex(htmlspecialchars("$c\xa0", ENT_QUOTES, 'EUC-JP'))); + var_dump(_bin2hex(htmlspecialchars("$c\xa1", ENT_QUOTES, 'EUC-JP'))); + var_dump(_bin2hex(htmlspecialchars("$c\xfe", ENT_QUOTES, 'EUC-JP'))); + var_dump(_bin2hex(htmlspecialchars("$c\xff", ENT_QUOTES, 'EUC-JP'))); + var_dump(_bin2hex(htmlspecialchars("\x8e$c", ENT_QUOTES, 'EUC-JP'))); + var_dump(_bin2hex(htmlspecialchars("\x8e$c\x26", ENT_QUOTES, 'EUC-JP'))); + var_dump(_bin2hex(htmlspecialchars("\x8e$c\x80", ENT_QUOTES, 'EUC-JP'))); + var_dump(_bin2hex(htmlspecialchars("\x8e$c\xa0", ENT_QUOTES, 'EUC-JP'))); + var_dump(_bin2hex(htmlspecialchars("\x8e$c\xa1", ENT_QUOTES, 'EUC-JP'))); + var_dump(_bin2hex(htmlspecialchars("\x8e$c\xfe", ENT_QUOTES, 'EUC-JP'))); + var_dump(_bin2hex(htmlspecialchars("\x8e$c\xff", ENT_QUOTES, 'EUC-JP'))); + var_dump(_bin2hex(htmlspecialchars("\x8f$c", ENT_QUOTES, 'EUC-JP'))); + var_dump(_bin2hex(htmlspecialchars("\x8f$c\x26", ENT_QUOTES, 'EUC-JP'))); + var_dump(_bin2hex(htmlspecialchars("\x8f$c\x80", ENT_QUOTES, 'EUC-JP'))); + var_dump(_bin2hex(htmlspecialchars("\x8f$c\xa0", ENT_QUOTES, 'EUC-JP'))); + var_dump(_bin2hex(htmlspecialchars("\x8f$c\xa1", ENT_QUOTES, 'EUC-JP'))); + var_dump(_bin2hex(htmlspecialchars("\x8f$c\xfe", ENT_QUOTES, 'EUC-JP'))); + var_dump(_bin2hex(htmlspecialchars("\x8f$c\xff", ENT_QUOTES, 'EUC-JP'))); +} + +echo "--\n"; +// BIG5: non-lead byte >= 0x80 +var_dump(_bin2hex(htmlspecialchars("\x80", ENT_QUOTES, 'BIG5'))); +var_dump(_bin2hex(htmlspecialchars("\xff", ENT_QUOTES, 'BIG5'))); + +echo "--\n"; +// BIG5: incomplete / invalid multibyte sequences +foreach (array_map('chr', range(0x81, 0xfe)) as $c) { + var_dump(_bin2hex(htmlspecialchars("$c", ENT_QUOTES, 'BIG5'))); + var_dump(_bin2hex(htmlspecialchars("$c\x3f", ENT_QUOTES, 'BIG5'))); + var_dump(_bin2hex(htmlspecialchars("$c\x40", ENT_QUOTES, 'BIG5'))); + var_dump(_bin2hex(htmlspecialchars("$c\x7e", ENT_QUOTES, 'BIG5'))); + var_dump(_bin2hex(htmlspecialchars("$c\x7f", ENT_QUOTES, 'BIG5'))); + var_dump(_bin2hex(htmlspecialchars("$c\x80", ENT_QUOTES, 'BIG5'))); + var_dump(_bin2hex(htmlspecialchars("$c\xa0", ENT_QUOTES, 'BIG5'))); + var_dump(_bin2hex(htmlspecialchars("$c\xa1", ENT_QUOTES, 'BIG5'))); + var_dump(_bin2hex(htmlspecialchars("$c\xfe", ENT_QUOTES, 'BIG5'))); + var_dump(_bin2hex(htmlspecialchars("$c\xff", ENT_QUOTES, 'BIG5'))); +} +?> +--EXPECT-- +string(0) "" +string(4) "c280" +string(0) "" +string(0) "" +string(14) "26416c7068613b" +string(14) "26616c7068613b" +string(4) "dfbf" +string(6) "e0a080" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(16) "266865617274733b" +string(6) "efbfbf" +string(0) "" +string(0) "" +string(0) "" +string(8) "f0908080" +string(8) "f7bfbfbf" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +-- +string(4) "c280" +string(6) "e0a080" +string(8) "f0908080" +-- +string(0) "" +string(0) "" +string(0) "" +string(6) "ecbfbf" +string(0) "" +string(0) "" +string(6) "ee8080" +string(2) "80" +string(2) "a0" +string(2) "a1" +string(2) "a2" +string(2) "a3" +string(2) "a4" +string(2) "a5" +string(2) "a6" +string(2) "a7" +string(2) "a8" +string(2) "a9" +string(2) "aa" +string(2) "ab" +string(2) "ac" +string(2) "ad" +string(2) "ae" +string(2) "af" +string(2) "b0" +string(2) "b1" +string(2) "b2" +string(2) "b3" +string(2) "b4" +string(2) "b5" +string(2) "b6" +string(2) "b7" +string(2) "b8" +string(2) "b9" +string(2) "ba" +string(2) "bb" +string(2) "bc" +string(2) "bd" +string(2) "be" +string(2) "bf" +string(2) "c0" +string(2) "c1" +string(2) "c2" +string(2) "c3" +string(2) "c4" +string(2) "c5" +string(2) "c6" +string(2) "c7" +string(2) "c8" +string(2) "c9" +string(2) "ca" +string(2) "cb" +string(2) "cc" +string(2) "cd" +string(2) "ce" +string(2) "cf" +string(2) "d0" +string(2) "d1" +string(2) "d2" +string(2) "d3" +string(2) "d4" +string(2) "d5" +string(2) "d6" +string(2) "d7" +string(2) "d8" +string(2) "d9" +string(2) "da" +string(2) "db" +string(2) "dc" +string(2) "dd" +string(2) "de" +string(2) "df" +string(2) "fd" +string(2) "fe" +string(2) "ff" +-- +string(0) "" +string(0) "" +string(4) "8140" +string(4) "817e" +string(0) "" +string(4) "8180" +string(4) "81fc" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "8240" +string(4) "827e" +string(0) "" +string(4) "8280" +string(4) "82fc" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "8340" +string(4) "837e" +string(0) "" +string(4) "8380" +string(4) "83fc" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "8440" +string(4) "847e" +string(0) "" +string(4) "8480" +string(4) "84fc" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "8540" +string(4) "857e" +string(0) "" +string(4) "8580" +string(4) "85fc" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "8640" +string(4) "867e" +string(0) "" +string(4) "8680" +string(4) "86fc" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "8740" +string(4) "877e" +string(0) "" +string(4) "8780" +string(4) "87fc" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "8840" +string(4) "887e" +string(0) "" +string(4) "8880" +string(4) "88fc" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "8940" +string(4) "897e" +string(0) "" +string(4) "8980" +string(4) "89fc" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "8a40" +string(4) "8a7e" +string(0) "" +string(4) "8a80" +string(4) "8afc" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "8b40" +string(4) "8b7e" +string(0) "" +string(4) "8b80" +string(4) "8bfc" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "8c40" +string(4) "8c7e" +string(0) "" +string(4) "8c80" +string(4) "8cfc" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "8d40" +string(4) "8d7e" +string(0) "" +string(4) "8d80" +string(4) "8dfc" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "8e40" +string(4) "8e7e" +string(0) "" +string(4) "8e80" +string(4) "8efc" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "8f40" +string(4) "8f7e" +string(0) "" +string(4) "8f80" +string(4) "8ffc" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "9040" +string(4) "907e" +string(0) "" +string(4) "9080" +string(4) "90fc" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "9140" +string(4) "917e" +string(0) "" +string(4) "9180" +string(4) "91fc" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "9240" +string(4) "927e" +string(0) "" +string(4) "9280" +string(4) "92fc" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "9340" +string(4) "937e" +string(0) "" +string(4) "9380" +string(4) "93fc" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "9440" +string(4) "947e" +string(0) "" +string(4) "9480" +string(4) "94fc" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "9540" +string(4) "957e" +string(0) "" +string(4) "9580" +string(4) "95fc" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "9640" +string(4) "967e" +string(0) "" +string(4) "9680" +string(4) "96fc" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "9740" +string(4) "977e" +string(0) "" +string(4) "9780" +string(4) "97fc" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "9840" +string(4) "987e" +string(0) "" +string(4) "9880" +string(4) "98fc" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "9940" +string(4) "997e" +string(0) "" +string(4) "9980" +string(4) "99fc" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "9a40" +string(4) "9a7e" +string(0) "" +string(4) "9a80" +string(4) "9afc" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "9b40" +string(4) "9b7e" +string(0) "" +string(4) "9b80" +string(4) "9bfc" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "9c40" +string(4) "9c7e" +string(0) "" +string(4) "9c80" +string(4) "9cfc" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "9d40" +string(4) "9d7e" +string(0) "" +string(4) "9d80" +string(4) "9dfc" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "9e40" +string(4) "9e7e" +string(0) "" +string(4) "9e80" +string(4) "9efc" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "9f40" +string(4) "9f7e" +string(0) "" +string(4) "9f80" +string(4) "9ffc" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "e040" +string(4) "e07e" +string(0) "" +string(4) "e080" +string(4) "e0fc" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "e140" +string(4) "e17e" +string(0) "" +string(4) "e180" +string(4) "e1fc" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "e240" +string(4) "e27e" +string(0) "" +string(4) "e280" +string(4) "e2fc" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "e340" +string(4) "e37e" +string(0) "" +string(4) "e380" +string(4) "e3fc" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "e440" +string(4) "e47e" +string(0) "" +string(4) "e480" +string(4) "e4fc" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "e540" +string(4) "e57e" +string(0) "" +string(4) "e580" +string(4) "e5fc" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "e640" +string(4) "e67e" +string(0) "" +string(4) "e680" +string(4) "e6fc" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "e740" +string(4) "e77e" +string(0) "" +string(4) "e780" +string(4) "e7fc" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "e840" +string(4) "e87e" +string(0) "" +string(4) "e880" +string(4) "e8fc" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "e940" +string(4) "e97e" +string(0) "" +string(4) "e980" +string(4) "e9fc" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "ea40" +string(4) "ea7e" +string(0) "" +string(4) "ea80" +string(4) "eafc" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "eb40" +string(4) "eb7e" +string(0) "" +string(4) "eb80" +string(4) "ebfc" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "ec40" +string(4) "ec7e" +string(0) "" +string(4) "ec80" +string(4) "ecfc" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "ed40" +string(4) "ed7e" +string(0) "" +string(4) "ed80" +string(4) "edfc" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "ee40" +string(4) "ee7e" +string(0) "" +string(4) "ee80" +string(4) "eefc" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "ef40" +string(4) "ef7e" +string(0) "" +string(4) "ef80" +string(4) "effc" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "f040" +string(4) "f07e" +string(0) "" +string(4) "f080" +string(4) "f0fc" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "f140" +string(4) "f17e" +string(0) "" +string(4) "f180" +string(4) "f1fc" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "f240" +string(4) "f27e" +string(0) "" +string(4) "f280" +string(4) "f2fc" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "f340" +string(4) "f37e" +string(0) "" +string(4) "f380" +string(4) "f3fc" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "f440" +string(4) "f47e" +string(0) "" +string(4) "f480" +string(4) "f4fc" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "f540" +string(4) "f57e" +string(0) "" +string(4) "f580" +string(4) "f5fc" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "f640" +string(4) "f67e" +string(0) "" +string(4) "f680" +string(4) "f6fc" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "f740" +string(4) "f77e" +string(0) "" +string(4) "f780" +string(4) "f7fc" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "f840" +string(4) "f87e" +string(0) "" +string(4) "f880" +string(4) "f8fc" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "f940" +string(4) "f97e" +string(0) "" +string(4) "f980" +string(4) "f9fc" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "fa40" +string(4) "fa7e" +string(0) "" +string(4) "fa80" +string(4) "fafc" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "fb40" +string(4) "fb7e" +string(0) "" +string(4) "fb80" +string(4) "fbfc" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "fc40" +string(4) "fc7e" +string(0) "" +string(4) "fc80" +string(4) "fcfc" +string(0) "" +string(0) "" +string(0) "" +-- +string(2) "80" +string(2) "81" +string(2) "82" +string(2) "83" +string(2) "84" +string(2) "85" +string(2) "86" +string(2) "87" +string(2) "88" +string(2) "89" +string(2) "8a" +string(2) "8b" +string(2) "8c" +string(2) "8d" +string(2) "90" +string(2) "91" +string(2) "92" +string(2) "93" +string(2) "94" +string(2) "95" +string(2) "96" +string(2) "97" +string(2) "98" +string(2) "99" +string(2) "9a" +string(2) "9b" +string(2) "9c" +string(2) "9d" +string(2) "9e" +string(2) "9f" +string(2) "ff" +string(0) "" +string(0) "" +string(4) "8ea1" +string(0) "" +string(0) "" +string(6) "8fa1a3" +-- +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "a1a1" +string(4) "a1fe" +string(0) "" +string(4) "8ea1" +string(14) "8ea126616d703b" +string(6) "8ea180" +string(6) "8ea1a0" +string(0) "" +string(0) "" +string(6) "8ea1ff" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fa1a1" +string(6) "8fa1fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "a2a1" +string(4) "a2fe" +string(0) "" +string(4) "8ea2" +string(14) "8ea226616d703b" +string(6) "8ea280" +string(6) "8ea2a0" +string(0) "" +string(0) "" +string(6) "8ea2ff" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fa2a1" +string(6) "8fa2fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "a3a1" +string(4) "a3fe" +string(0) "" +string(4) "8ea3" +string(14) "8ea326616d703b" +string(6) "8ea380" +string(6) "8ea3a0" +string(0) "" +string(0) "" +string(6) "8ea3ff" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fa3a1" +string(6) "8fa3fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "a4a1" +string(4) "a4fe" +string(0) "" +string(4) "8ea4" +string(14) "8ea426616d703b" +string(6) "8ea480" +string(6) "8ea4a0" +string(0) "" +string(0) "" +string(6) "8ea4ff" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fa4a1" +string(6) "8fa4fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "a5a1" +string(4) "a5fe" +string(0) "" +string(4) "8ea5" +string(14) "8ea526616d703b" +string(6) "8ea580" +string(6) "8ea5a0" +string(0) "" +string(0) "" +string(6) "8ea5ff" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fa5a1" +string(6) "8fa5fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "a6a1" +string(4) "a6fe" +string(0) "" +string(4) "8ea6" +string(14) "8ea626616d703b" +string(6) "8ea680" +string(6) "8ea6a0" +string(0) "" +string(0) "" +string(6) "8ea6ff" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fa6a1" +string(6) "8fa6fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "a7a1" +string(4) "a7fe" +string(0) "" +string(4) "8ea7" +string(14) "8ea726616d703b" +string(6) "8ea780" +string(6) "8ea7a0" +string(0) "" +string(0) "" +string(6) "8ea7ff" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fa7a1" +string(6) "8fa7fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "a8a1" +string(4) "a8fe" +string(0) "" +string(4) "8ea8" +string(14) "8ea826616d703b" +string(6) "8ea880" +string(6) "8ea8a0" +string(0) "" +string(0) "" +string(6) "8ea8ff" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fa8a1" +string(6) "8fa8fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "a9a1" +string(4) "a9fe" +string(0) "" +string(4) "8ea9" +string(14) "8ea926616d703b" +string(6) "8ea980" +string(6) "8ea9a0" +string(0) "" +string(0) "" +string(6) "8ea9ff" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fa9a1" +string(6) "8fa9fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "aaa1" +string(4) "aafe" +string(0) "" +string(4) "8eaa" +string(14) "8eaa26616d703b" +string(6) "8eaa80" +string(6) "8eaaa0" +string(0) "" +string(0) "" +string(6) "8eaaff" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8faaa1" +string(6) "8faafe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "aba1" +string(4) "abfe" +string(0) "" +string(4) "8eab" +string(14) "8eab26616d703b" +string(6) "8eab80" +string(6) "8eaba0" +string(0) "" +string(0) "" +string(6) "8eabff" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8faba1" +string(6) "8fabfe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "aca1" +string(4) "acfe" +string(0) "" +string(4) "8eac" +string(14) "8eac26616d703b" +string(6) "8eac80" +string(6) "8eaca0" +string(0) "" +string(0) "" +string(6) "8eacff" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8faca1" +string(6) "8facfe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "ada1" +string(4) "adfe" +string(0) "" +string(4) "8ead" +string(14) "8ead26616d703b" +string(6) "8ead80" +string(6) "8eada0" +string(0) "" +string(0) "" +string(6) "8eadff" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fada1" +string(6) "8fadfe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "aea1" +string(4) "aefe" +string(0) "" +string(4) "8eae" +string(14) "8eae26616d703b" +string(6) "8eae80" +string(6) "8eaea0" +string(0) "" +string(0) "" +string(6) "8eaeff" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8faea1" +string(6) "8faefe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "afa1" +string(4) "affe" +string(0) "" +string(4) "8eaf" +string(14) "8eaf26616d703b" +string(6) "8eaf80" +string(6) "8eafa0" +string(0) "" +string(0) "" +string(6) "8eafff" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fafa1" +string(6) "8faffe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "b0a1" +string(4) "b0fe" +string(0) "" +string(4) "8eb0" +string(14) "8eb026616d703b" +string(6) "8eb080" +string(6) "8eb0a0" +string(0) "" +string(0) "" +string(6) "8eb0ff" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fb0a1" +string(6) "8fb0fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "b1a1" +string(4) "b1fe" +string(0) "" +string(4) "8eb1" +string(14) "8eb126616d703b" +string(6) "8eb180" +string(6) "8eb1a0" +string(0) "" +string(0) "" +string(6) "8eb1ff" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fb1a1" +string(6) "8fb1fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "b2a1" +string(4) "b2fe" +string(0) "" +string(4) "8eb2" +string(14) "8eb226616d703b" +string(6) "8eb280" +string(6) "8eb2a0" +string(0) "" +string(0) "" +string(6) "8eb2ff" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fb2a1" +string(6) "8fb2fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "b3a1" +string(4) "b3fe" +string(0) "" +string(4) "8eb3" +string(14) "8eb326616d703b" +string(6) "8eb380" +string(6) "8eb3a0" +string(0) "" +string(0) "" +string(6) "8eb3ff" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fb3a1" +string(6) "8fb3fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "b4a1" +string(4) "b4fe" +string(0) "" +string(4) "8eb4" +string(14) "8eb426616d703b" +string(6) "8eb480" +string(6) "8eb4a0" +string(0) "" +string(0) "" +string(6) "8eb4ff" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fb4a1" +string(6) "8fb4fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "b5a1" +string(4) "b5fe" +string(0) "" +string(4) "8eb5" +string(14) "8eb526616d703b" +string(6) "8eb580" +string(6) "8eb5a0" +string(0) "" +string(0) "" +string(6) "8eb5ff" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fb5a1" +string(6) "8fb5fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "b6a1" +string(4) "b6fe" +string(0) "" +string(4) "8eb6" +string(14) "8eb626616d703b" +string(6) "8eb680" +string(6) "8eb6a0" +string(0) "" +string(0) "" +string(6) "8eb6ff" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fb6a1" +string(6) "8fb6fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "b7a1" +string(4) "b7fe" +string(0) "" +string(4) "8eb7" +string(14) "8eb726616d703b" +string(6) "8eb780" +string(6) "8eb7a0" +string(0) "" +string(0) "" +string(6) "8eb7ff" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fb7a1" +string(6) "8fb7fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "b8a1" +string(4) "b8fe" +string(0) "" +string(4) "8eb8" +string(14) "8eb826616d703b" +string(6) "8eb880" +string(6) "8eb8a0" +string(0) "" +string(0) "" +string(6) "8eb8ff" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fb8a1" +string(6) "8fb8fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "b9a1" +string(4) "b9fe" +string(0) "" +string(4) "8eb9" +string(14) "8eb926616d703b" +string(6) "8eb980" +string(6) "8eb9a0" +string(0) "" +string(0) "" +string(6) "8eb9ff" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fb9a1" +string(6) "8fb9fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "baa1" +string(4) "bafe" +string(0) "" +string(4) "8eba" +string(14) "8eba26616d703b" +string(6) "8eba80" +string(6) "8ebaa0" +string(0) "" +string(0) "" +string(6) "8ebaff" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fbaa1" +string(6) "8fbafe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "bba1" +string(4) "bbfe" +string(0) "" +string(4) "8ebb" +string(14) "8ebb26616d703b" +string(6) "8ebb80" +string(6) "8ebba0" +string(0) "" +string(0) "" +string(6) "8ebbff" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fbba1" +string(6) "8fbbfe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "bca1" +string(4) "bcfe" +string(0) "" +string(4) "8ebc" +string(14) "8ebc26616d703b" +string(6) "8ebc80" +string(6) "8ebca0" +string(0) "" +string(0) "" +string(6) "8ebcff" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fbca1" +string(6) "8fbcfe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "bda1" +string(4) "bdfe" +string(0) "" +string(4) "8ebd" +string(14) "8ebd26616d703b" +string(6) "8ebd80" +string(6) "8ebda0" +string(0) "" +string(0) "" +string(6) "8ebdff" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fbda1" +string(6) "8fbdfe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "bea1" +string(4) "befe" +string(0) "" +string(4) "8ebe" +string(14) "8ebe26616d703b" +string(6) "8ebe80" +string(6) "8ebea0" +string(0) "" +string(0) "" +string(6) "8ebeff" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fbea1" +string(6) "8fbefe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "bfa1" +string(4) "bffe" +string(0) "" +string(4) "8ebf" +string(14) "8ebf26616d703b" +string(6) "8ebf80" +string(6) "8ebfa0" +string(0) "" +string(0) "" +string(6) "8ebfff" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fbfa1" +string(6) "8fbffe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "c0a1" +string(4) "c0fe" +string(0) "" +string(4) "8ec0" +string(14) "8ec026616d703b" +string(6) "8ec080" +string(6) "8ec0a0" +string(0) "" +string(0) "" +string(6) "8ec0ff" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fc0a1" +string(6) "8fc0fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "c1a1" +string(4) "c1fe" +string(0) "" +string(4) "8ec1" +string(14) "8ec126616d703b" +string(6) "8ec180" +string(6) "8ec1a0" +string(0) "" +string(0) "" +string(6) "8ec1ff" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fc1a1" +string(6) "8fc1fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "c2a1" +string(4) "c2fe" +string(0) "" +string(4) "8ec2" +string(14) "8ec226616d703b" +string(6) "8ec280" +string(6) "8ec2a0" +string(0) "" +string(0) "" +string(6) "8ec2ff" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fc2a1" +string(6) "8fc2fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "c3a1" +string(4) "c3fe" +string(0) "" +string(4) "8ec3" +string(14) "8ec326616d703b" +string(6) "8ec380" +string(6) "8ec3a0" +string(0) "" +string(0) "" +string(6) "8ec3ff" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fc3a1" +string(6) "8fc3fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "c4a1" +string(4) "c4fe" +string(0) "" +string(4) "8ec4" +string(14) "8ec426616d703b" +string(6) "8ec480" +string(6) "8ec4a0" +string(0) "" +string(0) "" +string(6) "8ec4ff" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fc4a1" +string(6) "8fc4fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "c5a1" +string(4) "c5fe" +string(0) "" +string(4) "8ec5" +string(14) "8ec526616d703b" +string(6) "8ec580" +string(6) "8ec5a0" +string(0) "" +string(0) "" +string(6) "8ec5ff" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fc5a1" +string(6) "8fc5fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "c6a1" +string(4) "c6fe" +string(0) "" +string(4) "8ec6" +string(14) "8ec626616d703b" +string(6) "8ec680" +string(6) "8ec6a0" +string(0) "" +string(0) "" +string(6) "8ec6ff" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fc6a1" +string(6) "8fc6fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "c7a1" +string(4) "c7fe" +string(0) "" +string(4) "8ec7" +string(14) "8ec726616d703b" +string(6) "8ec780" +string(6) "8ec7a0" +string(0) "" +string(0) "" +string(6) "8ec7ff" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fc7a1" +string(6) "8fc7fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "c8a1" +string(4) "c8fe" +string(0) "" +string(4) "8ec8" +string(14) "8ec826616d703b" +string(6) "8ec880" +string(6) "8ec8a0" +string(0) "" +string(0) "" +string(6) "8ec8ff" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fc8a1" +string(6) "8fc8fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "c9a1" +string(4) "c9fe" +string(0) "" +string(4) "8ec9" +string(14) "8ec926616d703b" +string(6) "8ec980" +string(6) "8ec9a0" +string(0) "" +string(0) "" +string(6) "8ec9ff" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fc9a1" +string(6) "8fc9fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "caa1" +string(4) "cafe" +string(0) "" +string(4) "8eca" +string(14) "8eca26616d703b" +string(6) "8eca80" +string(6) "8ecaa0" +string(0) "" +string(0) "" +string(6) "8ecaff" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fcaa1" +string(6) "8fcafe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "cba1" +string(4) "cbfe" +string(0) "" +string(4) "8ecb" +string(14) "8ecb26616d703b" +string(6) "8ecb80" +string(6) "8ecba0" +string(0) "" +string(0) "" +string(6) "8ecbff" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fcba1" +string(6) "8fcbfe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "cca1" +string(4) "ccfe" +string(0) "" +string(4) "8ecc" +string(14) "8ecc26616d703b" +string(6) "8ecc80" +string(6) "8ecca0" +string(0) "" +string(0) "" +string(6) "8eccff" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fcca1" +string(6) "8fccfe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "cda1" +string(4) "cdfe" +string(0) "" +string(4) "8ecd" +string(14) "8ecd26616d703b" +string(6) "8ecd80" +string(6) "8ecda0" +string(0) "" +string(0) "" +string(6) "8ecdff" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fcda1" +string(6) "8fcdfe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "cea1" +string(4) "cefe" +string(0) "" +string(4) "8ece" +string(14) "8ece26616d703b" +string(6) "8ece80" +string(6) "8ecea0" +string(0) "" +string(0) "" +string(6) "8eceff" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fcea1" +string(6) "8fcefe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "cfa1" +string(4) "cffe" +string(0) "" +string(4) "8ecf" +string(14) "8ecf26616d703b" +string(6) "8ecf80" +string(6) "8ecfa0" +string(0) "" +string(0) "" +string(6) "8ecfff" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fcfa1" +string(6) "8fcffe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "d0a1" +string(4) "d0fe" +string(0) "" +string(4) "8ed0" +string(14) "8ed026616d703b" +string(6) "8ed080" +string(6) "8ed0a0" +string(0) "" +string(0) "" +string(6) "8ed0ff" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fd0a1" +string(6) "8fd0fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "d1a1" +string(4) "d1fe" +string(0) "" +string(4) "8ed1" +string(14) "8ed126616d703b" +string(6) "8ed180" +string(6) "8ed1a0" +string(0) "" +string(0) "" +string(6) "8ed1ff" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fd1a1" +string(6) "8fd1fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "d2a1" +string(4) "d2fe" +string(0) "" +string(4) "8ed2" +string(14) "8ed226616d703b" +string(6) "8ed280" +string(6) "8ed2a0" +string(0) "" +string(0) "" +string(6) "8ed2ff" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fd2a1" +string(6) "8fd2fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "d3a1" +string(4) "d3fe" +string(0) "" +string(4) "8ed3" +string(14) "8ed326616d703b" +string(6) "8ed380" +string(6) "8ed3a0" +string(0) "" +string(0) "" +string(6) "8ed3ff" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fd3a1" +string(6) "8fd3fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "d4a1" +string(4) "d4fe" +string(0) "" +string(4) "8ed4" +string(14) "8ed426616d703b" +string(6) "8ed480" +string(6) "8ed4a0" +string(0) "" +string(0) "" +string(6) "8ed4ff" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fd4a1" +string(6) "8fd4fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "d5a1" +string(4) "d5fe" +string(0) "" +string(4) "8ed5" +string(14) "8ed526616d703b" +string(6) "8ed580" +string(6) "8ed5a0" +string(0) "" +string(0) "" +string(6) "8ed5ff" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fd5a1" +string(6) "8fd5fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "d6a1" +string(4) "d6fe" +string(0) "" +string(4) "8ed6" +string(14) "8ed626616d703b" +string(6) "8ed680" +string(6) "8ed6a0" +string(0) "" +string(0) "" +string(6) "8ed6ff" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fd6a1" +string(6) "8fd6fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "d7a1" +string(4) "d7fe" +string(0) "" +string(4) "8ed7" +string(14) "8ed726616d703b" +string(6) "8ed780" +string(6) "8ed7a0" +string(0) "" +string(0) "" +string(6) "8ed7ff" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fd7a1" +string(6) "8fd7fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "d8a1" +string(4) "d8fe" +string(0) "" +string(4) "8ed8" +string(14) "8ed826616d703b" +string(6) "8ed880" +string(6) "8ed8a0" +string(0) "" +string(0) "" +string(6) "8ed8ff" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fd8a1" +string(6) "8fd8fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "d9a1" +string(4) "d9fe" +string(0) "" +string(4) "8ed9" +string(14) "8ed926616d703b" +string(6) "8ed980" +string(6) "8ed9a0" +string(0) "" +string(0) "" +string(6) "8ed9ff" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fd9a1" +string(6) "8fd9fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "daa1" +string(4) "dafe" +string(0) "" +string(4) "8eda" +string(14) "8eda26616d703b" +string(6) "8eda80" +string(6) "8edaa0" +string(0) "" +string(0) "" +string(6) "8edaff" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fdaa1" +string(6) "8fdafe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "dba1" +string(4) "dbfe" +string(0) "" +string(4) "8edb" +string(14) "8edb26616d703b" +string(6) "8edb80" +string(6) "8edba0" +string(0) "" +string(0) "" +string(6) "8edbff" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fdba1" +string(6) "8fdbfe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "dca1" +string(4) "dcfe" +string(0) "" +string(4) "8edc" +string(14) "8edc26616d703b" +string(6) "8edc80" +string(6) "8edca0" +string(0) "" +string(0) "" +string(6) "8edcff" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fdca1" +string(6) "8fdcfe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "dda1" +string(4) "ddfe" +string(0) "" +string(4) "8edd" +string(14) "8edd26616d703b" +string(6) "8edd80" +string(6) "8edda0" +string(0) "" +string(0) "" +string(6) "8eddff" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fdda1" +string(6) "8fddfe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "dea1" +string(4) "defe" +string(0) "" +string(4) "8ede" +string(14) "8ede26616d703b" +string(6) "8ede80" +string(6) "8edea0" +string(0) "" +string(0) "" +string(6) "8edeff" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fdea1" +string(6) "8fdefe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "dfa1" +string(4) "dffe" +string(0) "" +string(4) "8edf" +string(14) "8edf26616d703b" +string(6) "8edf80" +string(6) "8edfa0" +string(0) "" +string(0) "" +string(6) "8edfff" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fdfa1" +string(6) "8fdffe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "e0a1" +string(4) "e0fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fe0a1" +string(6) "8fe0fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "e1a1" +string(4) "e1fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fe1a1" +string(6) "8fe1fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "e2a1" +string(4) "e2fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fe2a1" +string(6) "8fe2fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "e3a1" +string(4) "e3fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fe3a1" +string(6) "8fe3fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "e4a1" +string(4) "e4fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fe4a1" +string(6) "8fe4fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "e5a1" +string(4) "e5fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fe5a1" +string(6) "8fe5fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "e6a1" +string(4) "e6fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fe6a1" +string(6) "8fe6fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "e7a1" +string(4) "e7fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fe7a1" +string(6) "8fe7fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "e8a1" +string(4) "e8fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fe8a1" +string(6) "8fe8fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "e9a1" +string(4) "e9fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fe9a1" +string(6) "8fe9fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "eaa1" +string(4) "eafe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8feaa1" +string(6) "8feafe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "eba1" +string(4) "ebfe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8feba1" +string(6) "8febfe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "eca1" +string(4) "ecfe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8feca1" +string(6) "8fecfe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "eda1" +string(4) "edfe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8feda1" +string(6) "8fedfe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "eea1" +string(4) "eefe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8feea1" +string(6) "8feefe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "efa1" +string(4) "effe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8fefa1" +string(6) "8feffe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "f0a1" +string(4) "f0fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8ff0a1" +string(6) "8ff0fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "f1a1" +string(4) "f1fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8ff1a1" +string(6) "8ff1fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "f2a1" +string(4) "f2fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8ff2a1" +string(6) "8ff2fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "f3a1" +string(4) "f3fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8ff3a1" +string(6) "8ff3fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "f4a1" +string(4) "f4fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8ff4a1" +string(6) "8ff4fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "f5a1" +string(4) "f5fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8ff5a1" +string(6) "8ff5fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "f6a1" +string(4) "f6fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8ff6a1" +string(6) "8ff6fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "f7a1" +string(4) "f7fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8ff7a1" +string(6) "8ff7fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "f8a1" +string(4) "f8fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8ff8a1" +string(6) "8ff8fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "f9a1" +string(4) "f9fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8ff9a1" +string(6) "8ff9fe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "faa1" +string(4) "fafe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8ffaa1" +string(6) "8ffafe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "fba1" +string(4) "fbfe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8ffba1" +string(6) "8ffbfe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "fca1" +string(4) "fcfe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8ffca1" +string(6) "8ffcfe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "fda1" +string(4) "fdfe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8ffda1" +string(6) "8ffdfe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(4) "fea1" +string(4) "fefe" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(0) "" +string(6) "8ffea1" +string(6) "8ffefe" +string(0) "" +-- +string(2) "80" +string(2) "ff" +-- +string(0) "" +string(0) "" +string(4) "8140" +string(4) "817e" +string(0) "" +string(0) "" +string(0) "" +string(4) "81a1" +string(4) "81fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "8240" +string(4) "827e" +string(0) "" +string(0) "" +string(0) "" +string(4) "82a1" +string(4) "82fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "8340" +string(4) "837e" +string(0) "" +string(0) "" +string(0) "" +string(4) "83a1" +string(4) "83fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "8440" +string(4) "847e" +string(0) "" +string(0) "" +string(0) "" +string(4) "84a1" +string(4) "84fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "8540" +string(4) "857e" +string(0) "" +string(0) "" +string(0) "" +string(4) "85a1" +string(4) "85fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "8640" +string(4) "867e" +string(0) "" +string(0) "" +string(0) "" +string(4) "86a1" +string(4) "86fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "8740" +string(4) "877e" +string(0) "" +string(0) "" +string(0) "" +string(4) "87a1" +string(4) "87fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "8840" +string(4) "887e" +string(0) "" +string(0) "" +string(0) "" +string(4) "88a1" +string(4) "88fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "8940" +string(4) "897e" +string(0) "" +string(0) "" +string(0) "" +string(4) "89a1" +string(4) "89fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "8a40" +string(4) "8a7e" +string(0) "" +string(0) "" +string(0) "" +string(4) "8aa1" +string(4) "8afe" +string(0) "" +string(0) "" +string(0) "" +string(4) "8b40" +string(4) "8b7e" +string(0) "" +string(0) "" +string(0) "" +string(4) "8ba1" +string(4) "8bfe" +string(0) "" +string(0) "" +string(0) "" +string(4) "8c40" +string(4) "8c7e" +string(0) "" +string(0) "" +string(0) "" +string(4) "8ca1" +string(4) "8cfe" +string(0) "" +string(0) "" +string(0) "" +string(4) "8d40" +string(4) "8d7e" +string(0) "" +string(0) "" +string(0) "" +string(4) "8da1" +string(4) "8dfe" +string(0) "" +string(0) "" +string(0) "" +string(4) "8e40" +string(4) "8e7e" +string(0) "" +string(0) "" +string(0) "" +string(4) "8ea1" +string(4) "8efe" +string(0) "" +string(0) "" +string(0) "" +string(4) "8f40" +string(4) "8f7e" +string(0) "" +string(0) "" +string(0) "" +string(4) "8fa1" +string(4) "8ffe" +string(0) "" +string(0) "" +string(0) "" +string(4) "9040" +string(4) "907e" +string(0) "" +string(0) "" +string(0) "" +string(4) "90a1" +string(4) "90fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "9140" +string(4) "917e" +string(0) "" +string(0) "" +string(0) "" +string(4) "91a1" +string(4) "91fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "9240" +string(4) "927e" +string(0) "" +string(0) "" +string(0) "" +string(4) "92a1" +string(4) "92fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "9340" +string(4) "937e" +string(0) "" +string(0) "" +string(0) "" +string(4) "93a1" +string(4) "93fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "9440" +string(4) "947e" +string(0) "" +string(0) "" +string(0) "" +string(4) "94a1" +string(4) "94fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "9540" +string(4) "957e" +string(0) "" +string(0) "" +string(0) "" +string(4) "95a1" +string(4) "95fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "9640" +string(4) "967e" +string(0) "" +string(0) "" +string(0) "" +string(4) "96a1" +string(4) "96fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "9740" +string(4) "977e" +string(0) "" +string(0) "" +string(0) "" +string(4) "97a1" +string(4) "97fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "9840" +string(4) "987e" +string(0) "" +string(0) "" +string(0) "" +string(4) "98a1" +string(4) "98fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "9940" +string(4) "997e" +string(0) "" +string(0) "" +string(0) "" +string(4) "99a1" +string(4) "99fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "9a40" +string(4) "9a7e" +string(0) "" +string(0) "" +string(0) "" +string(4) "9aa1" +string(4) "9afe" +string(0) "" +string(0) "" +string(0) "" +string(4) "9b40" +string(4) "9b7e" +string(0) "" +string(0) "" +string(0) "" +string(4) "9ba1" +string(4) "9bfe" +string(0) "" +string(0) "" +string(0) "" +string(4) "9c40" +string(4) "9c7e" +string(0) "" +string(0) "" +string(0) "" +string(4) "9ca1" +string(4) "9cfe" +string(0) "" +string(0) "" +string(0) "" +string(4) "9d40" +string(4) "9d7e" +string(0) "" +string(0) "" +string(0) "" +string(4) "9da1" +string(4) "9dfe" +string(0) "" +string(0) "" +string(0) "" +string(4) "9e40" +string(4) "9e7e" +string(0) "" +string(0) "" +string(0) "" +string(4) "9ea1" +string(4) "9efe" +string(0) "" +string(0) "" +string(0) "" +string(4) "9f40" +string(4) "9f7e" +string(0) "" +string(0) "" +string(0) "" +string(4) "9fa1" +string(4) "9ffe" +string(0) "" +string(0) "" +string(0) "" +string(4) "a040" +string(4) "a07e" +string(0) "" +string(0) "" +string(0) "" +string(4) "a0a1" +string(4) "a0fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "a140" +string(4) "a17e" +string(0) "" +string(0) "" +string(0) "" +string(4) "a1a1" +string(4) "a1fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "a240" +string(4) "a27e" +string(0) "" +string(0) "" +string(0) "" +string(4) "a2a1" +string(4) "a2fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "a340" +string(4) "a37e" +string(0) "" +string(0) "" +string(0) "" +string(4) "a3a1" +string(4) "a3fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "a440" +string(4) "a47e" +string(0) "" +string(0) "" +string(0) "" +string(4) "a4a1" +string(4) "a4fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "a540" +string(4) "a57e" +string(0) "" +string(0) "" +string(0) "" +string(4) "a5a1" +string(4) "a5fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "a640" +string(4) "a67e" +string(0) "" +string(0) "" +string(0) "" +string(4) "a6a1" +string(4) "a6fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "a740" +string(4) "a77e" +string(0) "" +string(0) "" +string(0) "" +string(4) "a7a1" +string(4) "a7fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "a840" +string(4) "a87e" +string(0) "" +string(0) "" +string(0) "" +string(4) "a8a1" +string(4) "a8fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "a940" +string(4) "a97e" +string(0) "" +string(0) "" +string(0) "" +string(4) "a9a1" +string(4) "a9fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "aa40" +string(4) "aa7e" +string(0) "" +string(0) "" +string(0) "" +string(4) "aaa1" +string(4) "aafe" +string(0) "" +string(0) "" +string(0) "" +string(4) "ab40" +string(4) "ab7e" +string(0) "" +string(0) "" +string(0) "" +string(4) "aba1" +string(4) "abfe" +string(0) "" +string(0) "" +string(0) "" +string(4) "ac40" +string(4) "ac7e" +string(0) "" +string(0) "" +string(0) "" +string(4) "aca1" +string(4) "acfe" +string(0) "" +string(0) "" +string(0) "" +string(4) "ad40" +string(4) "ad7e" +string(0) "" +string(0) "" +string(0) "" +string(4) "ada1" +string(4) "adfe" +string(0) "" +string(0) "" +string(0) "" +string(4) "ae40" +string(4) "ae7e" +string(0) "" +string(0) "" +string(0) "" +string(4) "aea1" +string(4) "aefe" +string(0) "" +string(0) "" +string(0) "" +string(4) "af40" +string(4) "af7e" +string(0) "" +string(0) "" +string(0) "" +string(4) "afa1" +string(4) "affe" +string(0) "" +string(0) "" +string(0) "" +string(4) "b040" +string(4) "b07e" +string(0) "" +string(0) "" +string(0) "" +string(4) "b0a1" +string(4) "b0fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "b140" +string(4) "b17e" +string(0) "" +string(0) "" +string(0) "" +string(4) "b1a1" +string(4) "b1fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "b240" +string(4) "b27e" +string(0) "" +string(0) "" +string(0) "" +string(4) "b2a1" +string(4) "b2fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "b340" +string(4) "b37e" +string(0) "" +string(0) "" +string(0) "" +string(4) "b3a1" +string(4) "b3fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "b440" +string(4) "b47e" +string(0) "" +string(0) "" +string(0) "" +string(4) "b4a1" +string(4) "b4fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "b540" +string(4) "b57e" +string(0) "" +string(0) "" +string(0) "" +string(4) "b5a1" +string(4) "b5fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "b640" +string(4) "b67e" +string(0) "" +string(0) "" +string(0) "" +string(4) "b6a1" +string(4) "b6fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "b740" +string(4) "b77e" +string(0) "" +string(0) "" +string(0) "" +string(4) "b7a1" +string(4) "b7fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "b840" +string(4) "b87e" +string(0) "" +string(0) "" +string(0) "" +string(4) "b8a1" +string(4) "b8fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "b940" +string(4) "b97e" +string(0) "" +string(0) "" +string(0) "" +string(4) "b9a1" +string(4) "b9fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "ba40" +string(4) "ba7e" +string(0) "" +string(0) "" +string(0) "" +string(4) "baa1" +string(4) "bafe" +string(0) "" +string(0) "" +string(0) "" +string(4) "bb40" +string(4) "bb7e" +string(0) "" +string(0) "" +string(0) "" +string(4) "bba1" +string(4) "bbfe" +string(0) "" +string(0) "" +string(0) "" +string(4) "bc40" +string(4) "bc7e" +string(0) "" +string(0) "" +string(0) "" +string(4) "bca1" +string(4) "bcfe" +string(0) "" +string(0) "" +string(0) "" +string(4) "bd40" +string(4) "bd7e" +string(0) "" +string(0) "" +string(0) "" +string(4) "bda1" +string(4) "bdfe" +string(0) "" +string(0) "" +string(0) "" +string(4) "be40" +string(4) "be7e" +string(0) "" +string(0) "" +string(0) "" +string(4) "bea1" +string(4) "befe" +string(0) "" +string(0) "" +string(0) "" +string(4) "bf40" +string(4) "bf7e" +string(0) "" +string(0) "" +string(0) "" +string(4) "bfa1" +string(4) "bffe" +string(0) "" +string(0) "" +string(0) "" +string(4) "c040" +string(4) "c07e" +string(0) "" +string(0) "" +string(0) "" +string(4) "c0a1" +string(4) "c0fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "c140" +string(4) "c17e" +string(0) "" +string(0) "" +string(0) "" +string(4) "c1a1" +string(4) "c1fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "c240" +string(4) "c27e" +string(0) "" +string(0) "" +string(0) "" +string(4) "c2a1" +string(4) "c2fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "c340" +string(4) "c37e" +string(0) "" +string(0) "" +string(0) "" +string(4) "c3a1" +string(4) "c3fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "c440" +string(4) "c47e" +string(0) "" +string(0) "" +string(0) "" +string(4) "c4a1" +string(4) "c4fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "c540" +string(4) "c57e" +string(0) "" +string(0) "" +string(0) "" +string(4) "c5a1" +string(4) "c5fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "c640" +string(4) "c67e" +string(0) "" +string(0) "" +string(0) "" +string(4) "c6a1" +string(4) "c6fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "c740" +string(4) "c77e" +string(0) "" +string(0) "" +string(0) "" +string(4) "c7a1" +string(4) "c7fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "c840" +string(4) "c87e" +string(0) "" +string(0) "" +string(0) "" +string(4) "c8a1" +string(4) "c8fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "c940" +string(4) "c97e" +string(0) "" +string(0) "" +string(0) "" +string(4) "c9a1" +string(4) "c9fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "ca40" +string(4) "ca7e" +string(0) "" +string(0) "" +string(0) "" +string(4) "caa1" +string(4) "cafe" +string(0) "" +string(0) "" +string(0) "" +string(4) "cb40" +string(4) "cb7e" +string(0) "" +string(0) "" +string(0) "" +string(4) "cba1" +string(4) "cbfe" +string(0) "" +string(0) "" +string(0) "" +string(4) "cc40" +string(4) "cc7e" +string(0) "" +string(0) "" +string(0) "" +string(4) "cca1" +string(4) "ccfe" +string(0) "" +string(0) "" +string(0) "" +string(4) "cd40" +string(4) "cd7e" +string(0) "" +string(0) "" +string(0) "" +string(4) "cda1" +string(4) "cdfe" +string(0) "" +string(0) "" +string(0) "" +string(4) "ce40" +string(4) "ce7e" +string(0) "" +string(0) "" +string(0) "" +string(4) "cea1" +string(4) "cefe" +string(0) "" +string(0) "" +string(0) "" +string(4) "cf40" +string(4) "cf7e" +string(0) "" +string(0) "" +string(0) "" +string(4) "cfa1" +string(4) "cffe" +string(0) "" +string(0) "" +string(0) "" +string(4) "d040" +string(4) "d07e" +string(0) "" +string(0) "" +string(0) "" +string(4) "d0a1" +string(4) "d0fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "d140" +string(4) "d17e" +string(0) "" +string(0) "" +string(0) "" +string(4) "d1a1" +string(4) "d1fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "d240" +string(4) "d27e" +string(0) "" +string(0) "" +string(0) "" +string(4) "d2a1" +string(4) "d2fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "d340" +string(4) "d37e" +string(0) "" +string(0) "" +string(0) "" +string(4) "d3a1" +string(4) "d3fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "d440" +string(4) "d47e" +string(0) "" +string(0) "" +string(0) "" +string(4) "d4a1" +string(4) "d4fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "d540" +string(4) "d57e" +string(0) "" +string(0) "" +string(0) "" +string(4) "d5a1" +string(4) "d5fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "d640" +string(4) "d67e" +string(0) "" +string(0) "" +string(0) "" +string(4) "d6a1" +string(4) "d6fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "d740" +string(4) "d77e" +string(0) "" +string(0) "" +string(0) "" +string(4) "d7a1" +string(4) "d7fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "d840" +string(4) "d87e" +string(0) "" +string(0) "" +string(0) "" +string(4) "d8a1" +string(4) "d8fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "d940" +string(4) "d97e" +string(0) "" +string(0) "" +string(0) "" +string(4) "d9a1" +string(4) "d9fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "da40" +string(4) "da7e" +string(0) "" +string(0) "" +string(0) "" +string(4) "daa1" +string(4) "dafe" +string(0) "" +string(0) "" +string(0) "" +string(4) "db40" +string(4) "db7e" +string(0) "" +string(0) "" +string(0) "" +string(4) "dba1" +string(4) "dbfe" +string(0) "" +string(0) "" +string(0) "" +string(4) "dc40" +string(4) "dc7e" +string(0) "" +string(0) "" +string(0) "" +string(4) "dca1" +string(4) "dcfe" +string(0) "" +string(0) "" +string(0) "" +string(4) "dd40" +string(4) "dd7e" +string(0) "" +string(0) "" +string(0) "" +string(4) "dda1" +string(4) "ddfe" +string(0) "" +string(0) "" +string(0) "" +string(4) "de40" +string(4) "de7e" +string(0) "" +string(0) "" +string(0) "" +string(4) "dea1" +string(4) "defe" +string(0) "" +string(0) "" +string(0) "" +string(4) "df40" +string(4) "df7e" +string(0) "" +string(0) "" +string(0) "" +string(4) "dfa1" +string(4) "dffe" +string(0) "" +string(0) "" +string(0) "" +string(4) "e040" +string(4) "e07e" +string(0) "" +string(0) "" +string(0) "" +string(4) "e0a1" +string(4) "e0fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "e140" +string(4) "e17e" +string(0) "" +string(0) "" +string(0) "" +string(4) "e1a1" +string(4) "e1fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "e240" +string(4) "e27e" +string(0) "" +string(0) "" +string(0) "" +string(4) "e2a1" +string(4) "e2fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "e340" +string(4) "e37e" +string(0) "" +string(0) "" +string(0) "" +string(4) "e3a1" +string(4) "e3fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "e440" +string(4) "e47e" +string(0) "" +string(0) "" +string(0) "" +string(4) "e4a1" +string(4) "e4fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "e540" +string(4) "e57e" +string(0) "" +string(0) "" +string(0) "" +string(4) "e5a1" +string(4) "e5fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "e640" +string(4) "e67e" +string(0) "" +string(0) "" +string(0) "" +string(4) "e6a1" +string(4) "e6fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "e740" +string(4) "e77e" +string(0) "" +string(0) "" +string(0) "" +string(4) "e7a1" +string(4) "e7fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "e840" +string(4) "e87e" +string(0) "" +string(0) "" +string(0) "" +string(4) "e8a1" +string(4) "e8fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "e940" +string(4) "e97e" +string(0) "" +string(0) "" +string(0) "" +string(4) "e9a1" +string(4) "e9fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "ea40" +string(4) "ea7e" +string(0) "" +string(0) "" +string(0) "" +string(4) "eaa1" +string(4) "eafe" +string(0) "" +string(0) "" +string(0) "" +string(4) "eb40" +string(4) "eb7e" +string(0) "" +string(0) "" +string(0) "" +string(4) "eba1" +string(4) "ebfe" +string(0) "" +string(0) "" +string(0) "" +string(4) "ec40" +string(4) "ec7e" +string(0) "" +string(0) "" +string(0) "" +string(4) "eca1" +string(4) "ecfe" +string(0) "" +string(0) "" +string(0) "" +string(4) "ed40" +string(4) "ed7e" +string(0) "" +string(0) "" +string(0) "" +string(4) "eda1" +string(4) "edfe" +string(0) "" +string(0) "" +string(0) "" +string(4) "ee40" +string(4) "ee7e" +string(0) "" +string(0) "" +string(0) "" +string(4) "eea1" +string(4) "eefe" +string(0) "" +string(0) "" +string(0) "" +string(4) "ef40" +string(4) "ef7e" +string(0) "" +string(0) "" +string(0) "" +string(4) "efa1" +string(4) "effe" +string(0) "" +string(0) "" +string(0) "" +string(4) "f040" +string(4) "f07e" +string(0) "" +string(0) "" +string(0) "" +string(4) "f0a1" +string(4) "f0fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "f140" +string(4) "f17e" +string(0) "" +string(0) "" +string(0) "" +string(4) "f1a1" +string(4) "f1fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "f240" +string(4) "f27e" +string(0) "" +string(0) "" +string(0) "" +string(4) "f2a1" +string(4) "f2fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "f340" +string(4) "f37e" +string(0) "" +string(0) "" +string(0) "" +string(4) "f3a1" +string(4) "f3fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "f440" +string(4) "f47e" +string(0) "" +string(0) "" +string(0) "" +string(4) "f4a1" +string(4) "f4fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "f540" +string(4) "f57e" +string(0) "" +string(0) "" +string(0) "" +string(4) "f5a1" +string(4) "f5fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "f640" +string(4) "f67e" +string(0) "" +string(0) "" +string(0) "" +string(4) "f6a1" +string(4) "f6fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "f740" +string(4) "f77e" +string(0) "" +string(0) "" +string(0) "" +string(4) "f7a1" +string(4) "f7fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "f840" +string(4) "f87e" +string(0) "" +string(0) "" +string(0) "" +string(4) "f8a1" +string(4) "f8fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "f940" +string(4) "f97e" +string(0) "" +string(0) "" +string(0) "" +string(4) "f9a1" +string(4) "f9fe" +string(0) "" +string(0) "" +string(0) "" +string(4) "fa40" +string(4) "fa7e" +string(0) "" +string(0) "" +string(0) "" +string(4) "faa1" +string(4) "fafe" +string(0) "" +string(0) "" +string(0) "" +string(4) "fb40" +string(4) "fb7e" +string(0) "" +string(0) "" +string(0) "" +string(4) "fba1" +string(4) "fbfe" +string(0) "" +string(0) "" +string(0) "" +string(4) "fc40" +string(4) "fc7e" +string(0) "" +string(0) "" +string(0) "" +string(4) "fca1" +string(4) "fcfe" +string(0) "" +string(0) "" +string(0) "" +string(4) "fd40" +string(4) "fd7e" +string(0) "" +string(0) "" +string(0) "" +string(4) "fda1" +string(4) "fdfe" +string(0) "" +string(0) "" +string(0) "" +string(4) "fe40" +string(4) "fe7e" +string(0) "" +string(0) "" +string(0) "" +string(4) "fea1" +string(4) "fefe" +string(0) "" diff --git a/ext/standard/tests/strings/bug50052.phpt b/ext/standard/tests/strings/bug50052.phpt index 24a5a201f..96d859992 100644 --- a/ext/standard/tests/strings/bug50052.phpt +++ b/ext/standard/tests/strings/bug50052.phpt @@ -1,5 +1,5 @@ --TEST-- -Bug #20934 (html_entity_decode() crash when "" is passed) +Bug #50052 (Different Hashes on Windows and Linux on wrong Salt size) --FILE-- '; +var_dump(strip_tags($var, ""), strip_tags($var)); +?> +--EXPECT-- +string(2066) "" +string(0) "" diff --git a/ext/standard/tests/strings/bug51059.phpt b/ext/standard/tests/strings/bug51059.phpt new file mode 100644 index 000000000..f2cbe9def --- /dev/null +++ b/ext/standard/tests/strings/bug51059.phpt @@ -0,0 +1,11 @@ +--TEST-- +Bug #51059 crypt() segfaults on certain salts +--FILE-- + +--EXPECT-- +OK diff --git a/ext/standard/tests/strings/crypt_blowfish_invalid_rounds.phpt b/ext/standard/tests/strings/crypt_blowfish_invalid_rounds.phpt new file mode 100644 index 000000000..6d40b0770 --- /dev/null +++ b/ext/standard/tests/strings/crypt_blowfish_invalid_rounds.phpt @@ -0,0 +1,22 @@ +--TEST-- +Test Blowfish crypt() with invalid rounds +--FILE-- + +--EXPECT-- +32. OK +33. OK +34. OK +35. OK +36. OK +37. OK +38. OK diff --git a/ext/standard/tests/strings/crypt_sha256.phpt b/ext/standard/tests/strings/crypt_sha256.phpt new file mode 100644 index 000000000..86c7245fe --- /dev/null +++ b/ext/standard/tests/strings/crypt_sha256.phpt @@ -0,0 +1,64 @@ +--TEST-- +crypt() SHA-256 +--SKIPIF-- + +--FILE-- + array( + b'$5$saltstring', + b'Hello world!', + b'$5$saltstring$5B8vYYiY.CVt1RlTTf8KbXBH3hsxY/GNooZaBBGWEc5' + ), + 2 => array( + b'$5$rounds=10000$saltstringsaltstring', + b'Hello world!', + b'$5$rounds=10000$saltstringsaltst$3xv.VbSHBb41AL9AvLeujZkZRBAwqFMz2.opqey6IcA' + ), + 3 => array( + b'$5$rounds=10000$saltstringsaltstring', + b'Hello world!', + b'$5$rounds=10000$saltstringsaltst$3xv.VbSHBb41AL9AvLeujZkZRBAwqFMz2.opqey6IcA' + ), + 4 => array( + b'$5$rounds=5000$toolongsaltstring', + b'This is just a test', + b'$5$rounds=5000$toolongsaltstrin$Un/5jzAHMgOGZ5.mWJpuVolil07guHPvOW8mGRcvxa5' + ), + 5 => array( + b'$5$rounds=1400$anotherlongsaltstring', + b'a very much longer text to encrypt. This one even stretches over morethan one line.', + b'$5$rounds=1400$anotherlongsalts$Rx.j8H.h8HjEDGomFU8bDkXm3XIUnzyxf12oP84Bnq1' + ), + 6 => array( + b'$5$rounds=77777$short', + b'we have a short salt string but not a short password', + b'$5$rounds=77777$short$JiO1O3ZpDAxGJeaDIuqCoEFysAe1mZNJRs3pw0KQRd/' + ), + 7 => array( + b'$5$rounds=123456$asaltof16chars..', + b'a short string', + b'$5$rounds=123456$asaltof16chars..$gP3VQ/6X7UUEW3HkBn2w1/Ptq2jxPyzV/cZKmF/wJvD' + ), + 8 => array( + b'$5$rounds=10$roundstoolow', + b'the minimum number is still observed', + b'$5$rounds=1000$roundstoolow$yfvwcWrQ8l/K0DAWyuPMDNHpIVlTQebY9l/gL972bIC' + ) +); + +foreach ($tests as $iter => $t) { + $res = crypt($t[1], $t[0]); + if ($res != $t[2]) echo "Iteration $iter failed. +Expected: <$t[2]> +Got <$res>\n"; +} +echo "Passes.";?> +--EXPECTF-- +Passes. + diff --git a/ext/standard/tests/strings/crypt_sha512.phpt b/ext/standard/tests/strings/crypt_sha512.phpt new file mode 100644 index 000000000..d6f9df601 --- /dev/null +++ b/ext/standard/tests/strings/crypt_sha512.phpt @@ -0,0 +1,65 @@ +--TEST-- +crypt() SHA-512 +--SKIPIF-- + +--FILE-- + array( + b'$6$saltstring', + b'Hello world!', + b'$6$saltstring$svn8UoSVapNtMuq1ukKS4tPQd8iKwSMHWjl/O817G3uBnIFNjnQJuesI68u4OTLiBFdcbYEdFCoEOfaS35inz1' + ), + 2 => array( + b'$6$rounds=10000$saltstringsaltstring', + b'Hello world!', + b'$6$rounds=10000$saltstringsaltst$OW1/O6BYHV6BcXZu8QVeXbDWra3Oeqh0sbHbbMCVNSnCM/UrjmM0Dp8vOuZeHBy/YTBmSK6H9qs/y3RnOaw5v.' + ), + 3 => array( + b'$6$rounds=5000$toolongsaltstring', + b'This is just a test', + b'$6$rounds=5000$toolongsaltstrin$lQ8jolhgVRVhY4b5pZKaysCLi0QBxGoNeKQzQ3glMhwllF7oGDZxUhx1yxdYcz/e1JSbq3y6JMxxl8audkUEm0' + ), + 4 => array( + b'$6$rounds=1400$anotherlongsaltstring', + b'a very much longer text to encrypt. This one even stretches over morethan one line.', + b'$6$rounds=1400$anotherlongsalts$POfYwTEok97VWcjxIiSOjiykti.o/pQs.wPvMxQ6Fm7I6IoYN3CmLs66x9t0oSwbtEW7o7UmJEiDwGqd8p4ur1' + ), + 5 => array( + b'$6$rounds=77777$short', + b'we have a short salt string but not a short password', + b'$6$rounds=77777$short$WuQyW2YR.hBNpjjRhpYD/ifIw05xdfeEyQoMxIXbkvr0gge1a1x3yRULJ5CCaUeOxFmtlcGZelFl5CxtgfiAc0' + ), + 6 => array( + b'$6$rounds=123456$asaltof16chars..', + b'a short string', + b'$6$rounds=123456$asaltof16chars..$BtCwjqMJGx5hrJhZywWvt0RLE8uZ4oPwcelCjmw2kSYu.Ec6ycULevoBK25fs2xXgMNrCzIMVcgEJAstJeonj1' + ), + 7 => array( + b'$6$rounds=10$roundstoolow', + b'the minimum number is still observed', + b'$6$rounds=1000$roundstoolow$kUMsbe306n21p9R.FRkW3IGn.S9NPN0x50YhH1xhLsPuWGsUSklZt58jaTfF4ZEQpyUNGc0dqbpBYYBaHHrsX.' + ), + 8 => array( + b'$6$$bar$', + b'foo', + b'$6$$QMXjqd7rHQZPQ1yHsXkQqC1FBzDiVfTHXL.LaeDAeVV.IzMaV9VU4MQ8kPuZa2SOP1A0RPm772EaFYjpEJtdu.' + ), +); + +foreach ($tests as $iter => $t) { + $res = crypt($t[1], $t[0]); + if ($res != $t[2]) echo "Iteration $iter failed. +Expected: <$t[2]> +Got <$res>\n"; +} +echo "Passes."; +?> +--EXPECTF-- +Passes. + diff --git a/ext/standard/tests/strings/html_entity_decode_html4.phpt b/ext/standard/tests/strings/html_entity_decode_html4.phpt new file mode 100644 index 000000000..3c92bf6fb --- /dev/null +++ b/ext/standard/tests/strings/html_entity_decode_html4.phpt @@ -0,0 +1,516 @@ +--TEST-- +html_entity_decode() conformance check (HTML 4) +--FILE-- + +--EXPECT-- +22 +26 +3c +3e +c2a0 +c2a1 +c2a2 +c2a3 +c2a4 +c2a5 +c2a6 +c2a7 +c2a8 +c2a9 +c2aa +c2ab +c2ac +c2ad +c2ae +c2af +c2b0 +c2b1 +c2b2 +c2b3 +c2b4 +c2b5 +c2b6 +c2b7 +c2b8 +c2b9 +c2ba +c2bb +c2bc +c2bd +c2be +c2bf +c380 +c381 +c382 +c383 +c384 +c385 +c386 +c387 +c388 +c389 +c38a +c38b +c38c +c38d +c38e +c38f +c390 +c391 +c392 +c393 +c394 +c395 +c396 +c397 +c398 +c399 +c39a +c39b +c39c +c39d +c39e +c39f +c3a0 +c3a1 +c3a2 +c3a3 +c3a4 +c3a5 +c3a6 +c3a7 +c3a8 +c3a9 +c3aa +c3ab +c3ac +c3ad +c3ae +c3af +c3b0 +c3b1 +c3b2 +c3b3 +c3b4 +c3b5 +c3b6 +c3b7 +c3b8 +c3b9 +c3ba +c3bb +c3bc +c3bd +c3be +c3bf +c592 +c593 +c5a0 +c5a1 +c5b8 +c692 +cb86 +cb9c +ce91 +ce92 +ce93 +ce94 +ce95 +ce96 +ce97 +ce98 +ce99 +ce9a +ce9b +ce9c +ce9d +ce9e +ce9f +cea0 +cea1 +cea3 +cea4 +cea5 +cea6 +cea7 +cea8 +cea9 +ceb1 +ceb2 +ceb3 +ceb4 +ceb5 +ceb6 +ceb7 +ceb8 +ceb9 +ceba +cebb +cebc +cebd +cebe +cebf +cf80 +cf81 +cf82 +cf83 +cf84 +cf85 +cf86 +cf87 +cf88 +cf89 +cf91 +cf92 +cf96 +e28082 +e28083 +e28089 +e2808c +e2808d +e2808e +e2808f +e28093 +e28094 +e28098 +e28099 +e2809a +e2809c +e2809d +e2809e +e280a0 +e280a1 +e280a2 +e280a6 +e280b0 +e280b2 +e280b3 +e280b9 +e280ba +e280be +e28184 +e282ac +e28491 +e28498 +e2849c +e284a2 +e284b5 +e28690 +e28691 +e28692 +e28693 +e28694 +e286b5 +e28790 +e28791 +e28792 +e28793 +e28794 +e28880 +e28882 +e28883 +e28885 +e28887 +e28888 +e28889 +e2888b +e2888f +e28891 +e28892 +e28897 +e2889a +e2889d +e2889e +e288a0 +e288a7 +e288a8 +e288a9 +e288aa +e288ab +e288b4 +e288bc +e28985 +e28988 +e289a0 +e289a1 +e289a4 +e289a5 +e28a82 +e28a83 +e28a84 +e28a86 +e28a87 +e28a95 +e28a97 +e28aa5 +e28b85 +e28c88 +e28c89 +e28c8a +e28c8b +e28ca9 +e28caa +e2978a +e299a0 +e299a3 +e299a5 +e299a6 diff --git a/ext/standard/tests/strings/htmlentities-utf-2.phpt b/ext/standard/tests/strings/htmlentities-utf-2.phpt index a80100cb1..c5f4ac4ea 100755 --- a/ext/standard/tests/strings/htmlentities-utf-2.phpt +++ b/ext/standard/tests/strings/htmlentities-utf-2.phpt @@ -36,8 +36,8 @@ foreach($strings as $string) { %unicode|string%(0) "" %unicode|string%(2) "79" %unicode|string%(2) "79" -%unicode|string%(8) "2667743b" -%unicode|string%(8) "2667743b" +%unicode|string%(0) "" +%unicode|string%(0) "" %unicode|string%(8) "566f696c" %unicode|string%(8) "566f696c" %unicode|string%(12) "436c69636873" @@ -52,10 +52,10 @@ foreach($strings as $string) { %unicode|string%(2) "79" %unicode|string%(8) "f7bfbfbf" %unicode|string%(8) "f7bfbfbf" -%unicode|string%(10) "fbbfbfbfbf" -%unicode|string%(10) "fbbfbfbfbf" -%unicode|string%(12) "fdbfbfbfbfbf" -%unicode|string%(12) "fdbfbfbfbfbf" +%unicode|string%(0) "" +%unicode|string%(0) "" +%unicode|string%(0) "" +%unicode|string%(0) "" %unicode|string%(4) "4142" %unicode|string%(4) "4142" %unicode|string%(4) "4242" diff --git a/ext/standard/tests/strings/htmlentities-utf.phpt b/ext/standard/tests/strings/htmlentities-utf.phpt index b85803a16..1daafc61d 100755 --- a/ext/standard/tests/strings/htmlentities-utf.phpt +++ b/ext/standard/tests/strings/htmlentities-utf.phpt @@ -36,8 +36,8 @@ foreach($strings as $string) { %unicode|string%(0) "" %unicode|string%(0) "" %unicode|string%(0) "" -%unicode|string%(8) "2667743b" -%unicode|string%(8) "2667743b" +%unicode|string%(0) "" +%unicode|string%(0) "" %unicode|string%(0) "" %unicode|string%(0) "" %unicode|string%(0) "" @@ -52,10 +52,10 @@ foreach($strings as $string) { %unicode|string%(0) "" %unicode|string%(8) "f7bfbfbf" %unicode|string%(8) "f7bfbfbf" -%unicode|string%(10) "fbbfbfbfbf" -%unicode|string%(10) "fbbfbfbfbf" -%unicode|string%(12) "fdbfbfbfbfbf" -%unicode|string%(12) "fdbfbfbfbfbf" +%unicode|string%(0) "" +%unicode|string%(0) "" +%unicode|string%(0) "" +%unicode|string%(0) "" %unicode|string%(0) "" %unicode|string%(0) "" %unicode|string%(0) "" diff --git a/ext/standard/tests/strings/htmlentities02.phpt b/ext/standard/tests/strings/htmlentities02.phpt index b8b9e6315..5d708c21c 100644 --- a/ext/standard/tests/strings/htmlentities02.phpt +++ b/ext/standard/tests/strings/htmlentities02.phpt @@ -10,7 +10,7 @@ if (!$result) { --INI-- output_handler= default_charset= -mbstring.internal_encoding=none +mbstring.internal_encoding=pass --FILE-- > 6), + 0x80 | ($k & 0x3f)); + } else if ($k < 0x10000) { + $retval = pack('C3', + 0xe0 | ($k >> 12), + 0x80 | (($k >> 6) & 0x3f), + 0x80 | ($k & 0x3f)); + } else if ($k < 0x200000) { + $retval = pack('C4', + 0xf0 | ($k >> 18), + 0x80 | (($k >> 12) & 0x3f), + 0x80 | (($k >> 6) & 0x3f), + 0x80 | ($k & 0x3f)); + } else if ($k < 0x4000000) { + $retval = pack('C5', + 0xf8 | ($k >> 24), + 0x80 | (($k >> 18) & 0x3f), + 0x80 | (($k >> 12) & 0x3f), + 0x80 | (($k >> 6) & 0x3f), + 0x80 | ($k & 0x3f)); + } else { + $retval = pack('C6', + 0xfc | ($k >> 30), + 0x80 | (($k >> 24) & 0x3f), + 0x80 | (($k >> 18) & 0x3f), + 0x80 | (($k >> 12) & 0x3f), + 0x80 | (($k >> 6) & 0x3f), + 0x80 | ($k & 0x3f)); + } + return $retval; +} + +for ($i = 0; $i < 0x110000; $i++) { + if ($i >= 0xd800 && $i < 0xe000) + continue; + $str = utf32_utf8($i); + $result = htmlentities($str, ENT_QUOTES, 'UTF-8'); + if ($str != $result) { + printf("%s\tU+%05X\n", $result, $i); + } +} +?> +--EXPECT-- +" U+00022 +& U+00026 +' U+00027 +< U+0003C +> U+0003E +  U+000A0 +¡ U+000A1 +¢ U+000A2 +£ U+000A3 +¤ U+000A4 +¥ U+000A5 +¦ U+000A6 +§ U+000A7 +¨ U+000A8 +© U+000A9 +ª U+000AA +« U+000AB +¬ U+000AC +­ U+000AD +® U+000AE +¯ U+000AF +° U+000B0 +± U+000B1 +² U+000B2 +³ U+000B3 +´ U+000B4 +µ U+000B5 +¶ U+000B6 +· U+000B7 +¸ U+000B8 +¹ U+000B9 +º U+000BA +» U+000BB +¼ U+000BC +½ U+000BD +¾ U+000BE +¿ U+000BF +À U+000C0 +Á U+000C1 + U+000C2 +à U+000C3 +Ä U+000C4 +Å U+000C5 +Æ U+000C6 +Ç U+000C7 +È U+000C8 +É U+000C9 +Ê U+000CA +Ë U+000CB +Ì U+000CC +Í U+000CD +Î U+000CE +Ï U+000CF +Ð U+000D0 +Ñ U+000D1 +Ò U+000D2 +Ó U+000D3 +Ô U+000D4 +Õ U+000D5 +Ö U+000D6 +× U+000D7 +Ø U+000D8 +Ù U+000D9 +Ú U+000DA +Û U+000DB +Ü U+000DC +Ý U+000DD +Þ U+000DE +ß U+000DF +à U+000E0 +á U+000E1 +â U+000E2 +ã U+000E3 +ä U+000E4 +å U+000E5 +æ U+000E6 +ç U+000E7 +è U+000E8 +é U+000E9 +ê U+000EA +ë U+000EB +ì U+000EC +í U+000ED +î U+000EE +ï U+000EF +ð U+000F0 +ñ U+000F1 +ò U+000F2 +ó U+000F3 +ô U+000F4 +õ U+000F5 +ö U+000F6 +÷ U+000F7 +ø U+000F8 +ù U+000F9 +ú U+000FA +û U+000FB +ü U+000FC +ý U+000FD +þ U+000FE +ÿ U+000FF +Œ U+00152 +œ U+00153 +Š U+00160 +š U+00161 +Ÿ U+00178 +ƒ U+00192 +ˆ U+002C6 +˜ U+002DC +Α U+00391 +Β U+00392 +Γ U+00393 +Δ U+00394 +Ε U+00395 +Ζ U+00396 +Η U+00397 +Θ U+00398 +Ι U+00399 +Κ U+0039A +Λ U+0039B +Μ U+0039C +Ν U+0039D +Ξ U+0039E +Ο U+0039F +Π U+003A0 +Ρ U+003A1 +Σ U+003A3 +Τ U+003A4 +Υ U+003A5 +Φ U+003A6 +Χ U+003A7 +Ψ U+003A8 +Ω U+003A9 +α U+003B1 +β U+003B2 +γ U+003B3 +δ U+003B4 +ε U+003B5 +ζ U+003B6 +η U+003B7 +θ U+003B8 +ι U+003B9 +κ U+003BA +λ U+003BB +μ U+003BC +ν U+003BD +ξ U+003BE +ο U+003BF +π U+003C0 +ρ U+003C1 +ς U+003C2 +σ U+003C3 +τ U+003C4 +υ U+003C5 +φ U+003C6 +χ U+003C7 +ψ U+003C8 +ω U+003C9 +ϑ U+003D1 +ϒ U+003D2 +ϖ U+003D6 +  U+02002 +  U+02003 +  U+02009 +‌ U+0200C +‍ U+0200D +‎ U+0200E +‏ U+0200F +– U+02013 +— U+02014 +‘ U+02018 +’ U+02019 +‚ U+0201A +“ U+0201C +” U+0201D +„ U+0201E +† U+02020 +‡ U+02021 +• U+02022 +… U+02026 +‰ U+02030 +′ U+02032 +″ U+02033 +‹ U+02039 +› U+0203A +‾ U+0203E +⁄ U+02044 +€ U+020AC +ℑ U+02111 +℘ U+02118 +ℜ U+0211C +™ U+02122 +ℵ U+02135 +← U+02190 +↑ U+02191 +→ U+02192 +↓ U+02193 +↔ U+02194 +↵ U+021B5 +⇐ U+021D0 +⇑ U+021D1 +⇒ U+021D2 +⇓ U+021D3 +⇔ U+021D4 +∀ U+02200 +∂ U+02202 +∃ U+02203 +∅ U+02205 +∇ U+02207 +∈ U+02208 +∉ U+02209 +∋ U+0220B +∏ U+0220F +∑ U+02211 +− U+02212 +∗ U+02217 +√ U+0221A +∝ U+0221D +∞ U+0221E +∠ U+02220 +∧ U+02227 +∨ U+02228 +∩ U+02229 +∪ U+0222A +∫ U+0222B +∴ U+02234 +∼ U+0223C +≅ U+02245 +≈ U+02248 +≠ U+02260 +≡ U+02261 +≤ U+02264 +≥ U+02265 +⊂ U+02282 +⊃ U+02283 +⊄ U+02284 +⊆ U+02286 +⊇ U+02287 +⊕ U+02295 +⊗ U+02297 +⊥ U+022A5 +⋅ U+022C5 +⌈ U+02308 +⌉ U+02309 +⌊ U+0230A +⌋ U+0230B +⟨ U+02329 +⟩ U+0232A +◊ U+025CA +♠ U+02660 +♣ U+02663 +♥ U+02665 +♦ U+02666 diff --git a/ext/standard/tests/strings/parse_str_basic3.phpt b/ext/standard/tests/strings/parse_str_basic3.phpt index 5b0641e14..0cc761615 100644 --- a/ext/standard/tests/strings/parse_str_basic3.phpt +++ b/ext/standard/tests/strings/parse_str_basic3.phpt @@ -91,7 +91,7 @@ var_dump($res); ?> ===DONE=== --EXPECTF-- -PHP Warning: Directive 'magic_quotes_gpc' is deprecated in PHP 5.3 and greater in Unknown on line 0 +Warning: Directive 'magic_quotes_gpc' is deprecated in PHP 5.3 and greater in Unknown on line 0 *** Testing parse_str() : basic functionality *** Test string with array values diff --git a/ext/standard/tests/strings/setlocale_variation2.phpt b/ext/standard/tests/strings/setlocale_variation2.phpt index 98c405b70..af8739a76 100644 --- a/ext/standard/tests/strings/setlocale_variation2.phpt +++ b/ext/standard/tests/strings/setlocale_variation2.phpt @@ -18,6 +18,10 @@ if (substr(PHP_OS, 0, 3) == 'WIN') { /* setlocale() to set all available locales in the system and check the success count */ echo "*** Testing setlocale() : usage variations ***\n"; +function good_locale($locale) { + return $locale !== 'tt_RU@iqtelif.UTF-8'; +} + /* Prototype : array list_system_locales( void ) * Description: To get the currently installed locle in this platform * Arguments : Nil @@ -38,8 +42,8 @@ function list_system_locales() { $system_locales = explode("\n", $all_locales); - // return all the locale found in the system - return $system_locales; + // return all the locale found in the system, except for broken one + return array_filter($system_locales, 'good_locale'); } // gather all the locales installed in the system diff --git a/ext/standard/type.c b/ext/standard/type.c index be165d6bf..8b84662b6 100644 --- a/ext/standard/type.c +++ b/ext/standard/type.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: type.c 278172 2009-04-02 09:56:33Z dmitry $ */ +/* $Id: type.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php.h" #include "php_incomplete_class.h" diff --git a/ext/standard/uniqid.c b/ext/standard/uniqid.c index e69f00568..ef25240d1 100644 --- a/ext/standard/uniqid.c +++ b/ext/standard/uniqid.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: uniqid.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: uniqid.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php.h" diff --git a/ext/standard/uniqid.h b/ext/standard/uniqid.h index 716cb8c25..da98a8fad 100644 --- a/ext/standard/uniqid.h +++ b/ext/standard/uniqid.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: uniqid.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: uniqid.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef UNIQID_H #define UNIQID_H diff --git a/ext/standard/url.c b/ext/standard/url.c index 06d33fd9f..eebcdd05f 100644 --- a/ext/standard/url.c +++ b/ext/standard/url.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -15,7 +15,7 @@ | Author: Jim Winstead | +----------------------------------------------------------------------+ */ -/* $Id: url.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: url.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include #include @@ -201,10 +201,21 @@ PHPAPI php_url *php_url_parse_ex(char const *str, int length) e = ue; if (!(p = memchr(s, '/', (ue - s)))) { - if ((p = memchr(s, '?', (ue - s)))) { - e = p; - } else if ((p = memchr(s, '#', (ue - s)))) { - e = p; + char *query, *fragment; + + query = memchr(s, '?', (ue - s)); + fragment = memchr(s, '#', (ue - s)); + + if (query && fragment) { + if (query > fragment) { + p = e = fragment; + } else { + p = e = query; + } + } else if (query) { + p = e = query; + } else if (fragment) { + p = e = fragment; } } else { e = p; @@ -285,10 +296,10 @@ PHPAPI php_url *php_url_parse_ex(char const *str, int length) if ((p = memchr(s, '?', (ue - s)))) { pp = strchr(s, '#'); - + if (pp && pp < p) { p = pp; - pp = strchr(pp+2, '#'); + goto label_parse; } if (p - s) { diff --git a/ext/standard/url.h b/ext/standard/url.h index a478d304a..a9c2e03c0 100644 --- a/ext/standard/url.h +++ b/ext/standard/url.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -15,7 +15,7 @@ | Author: Jim Winstead | +----------------------------------------------------------------------+ */ -/* $Id: url.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: url.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef URL_H #define URL_H diff --git a/ext/standard/url_scanner_ex.h b/ext/standard/url_scanner_ex.h index d3fb96594..f454d9f65 100644 --- a/ext/standard/url_scanner_ex.h +++ b/ext/standard/url_scanner_ex.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: url_scanner_ex.h 286379 2009-07-26 23:20:34Z jani $ */ +/* $Id: url_scanner_ex.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef URL_SCANNER_EX_H #define URL_SCANNER_EX_H diff --git a/ext/standard/user_filters.c b/ext/standard/user_filters.c index fc0069aff..3922fc56a 100644 --- a/ext/standard/user_filters.c +++ b/ext/standard/user_filters.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: user_filters.c 273098 2009-01-08 18:40:27Z lbarnaud $ */ +/* $Id: user_filters.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php.h" #include "php_globals.h" diff --git a/ext/standard/uuencode.c b/ext/standard/uuencode.c index 2980e1285..0ef1fd462 100644 --- a/ext/standard/uuencode.c +++ b/ext/standard/uuencode.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: uuencode.c 280460 2009-05-13 16:29:26Z kalle $ */ +/* $Id: uuencode.c 293036 2010-01-03 09:23:27Z sebastian $ */ /* * Portions of this code are based on Berkeley's uuencode/uudecode diff --git a/ext/standard/var.c b/ext/standard/var.c index 0ed635e2e..6d2614f4c 100644 --- a/ext/standard/var.c +++ b/ext/standard/var.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: var.c 287123 2009-08-11 22:46:07Z stas $ */ +/* $Id: var.c 293036 2010-01-03 09:23:27Z sebastian $ */ /* {{{ includes */ @@ -612,9 +612,9 @@ static void php_var_serialize_class(smart_str *buf, zval *struc, zval *retval_pt break; } pefree(prot_name, ce->type & ZEND_INTERNAL_CLASS); - php_error_docref(NULL TSRMLS_CC, E_NOTICE, "\"%s\" returned as member variable from __sleep() but does not exist", Z_STRVAL_PP(name)); php_var_serialize_string(buf, Z_STRVAL_PP(name), Z_STRLEN_PP(name)); php_var_serialize_intern(buf, nvalp, var_hash TSRMLS_CC); + php_error_docref(NULL TSRMLS_CC, E_NOTICE, "\"%s\" returned as member variable from __sleep() but does not exist", Z_STRVAL_PP(name)); } while (0); } else { php_var_serialize_string(buf, Z_STRVAL_PP(name), Z_STRLEN_PP(name)); diff --git a/ext/standard/var_unserializer.c b/ext/standard/var_unserializer.c index 01d2fd9f6..82c16222a 100644 --- a/ext/standard/var_unserializer.c +++ b/ext/standard/var_unserializer.c @@ -1,9 +1,9 @@ -/* Generated by re2c 0.13.5 on Wed Apr 8 09:34:35 2009 */ +/* Generated by re2c 0.13.5 on Mon Nov 23 09:26:17 2009 */ /* +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: var_unserializer.c 278451 2009-04-08 18:10:46Z rasmus $ */ +/* $Id: var_unserializer.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php.h" #include "ext/standard/php_var.h" diff --git a/ext/standard/var_unserializer.c.orig b/ext/standard/var_unserializer.c.orig index 7eebfc0a8..578f593ef 100644 --- a/ext/standard/var_unserializer.c.orig +++ b/ext/standard/var_unserializer.c.orig @@ -1,10 +1,10 @@ -/* Generated by re2c 0.13.5 on Wed Apr 8 09:34:35 2009 */ +/* Generated by re2c 0.13.5 on Mon Nov 23 09:26:17 2009 */ #line 1 "ext/standard/var_unserializer.re" /* +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: var_unserializer.c 278451 2009-04-08 18:10:46Z rasmus $ */ +/* $Id: var_unserializer.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php.h" #include "ext/standard/php_var.h" diff --git a/ext/standard/var_unserializer.re b/ext/standard/var_unserializer.re index 0b009fa50..6cd6628aa 100644 --- a/ext/standard/var_unserializer.re +++ b/ext/standard/var_unserializer.re @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: var_unserializer.re 277374 2009-03-17 23:07:40Z felipe $ */ +/* $Id: var_unserializer.re 293035 2010-01-03 08:22:14Z sebastian $ */ #include "php.h" #include "ext/standard/php_var.h" diff --git a/ext/standard/versioning.c b/ext/standard/versioning.c index 172c555b4..0ab2472c7 100644 --- a/ext/standard/versioning.c +++ b/ext/standard/versioning.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: versioning.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: versioning.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include #include diff --git a/ext/sybase_ct/php_sybase_ct.c b/ext/sybase_ct/php_sybase_ct.c index b1774aea6..8871988df 100644 --- a/ext/sybase_ct/php_sybase_ct.c +++ b/ext/sybase_ct/php_sybase_ct.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_sybase_ct.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_sybase_ct.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H diff --git a/ext/sybase_ct/php_sybase_ct.h b/ext/sybase_ct/php_sybase_ct.h index d0da053f6..9add20caa 100644 --- a/ext/sybase_ct/php_sybase_ct.h +++ b/ext/sybase_ct/php_sybase_ct.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_sybase_ct.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_sybase_ct.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_SYBASE_CT_H #define PHP_SYBASE_CT_H diff --git a/ext/sysvmsg/php_sysvmsg.h b/ext/sysvmsg/php_sysvmsg.h index 002381cdc..f42475689 100644 --- a/ext/sysvmsg/php_sysvmsg.h +++ b/ext/sysvmsg/php_sysvmsg.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_sysvmsg.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_sysvmsg.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_SYSVMSG_H #define PHP_SYSVMSG_H diff --git a/ext/sysvmsg/sysvmsg.c b/ext/sysvmsg/sysvmsg.c index acedc3f33..9b04934b6 100644 --- a/ext/sysvmsg/sysvmsg.c +++ b/ext/sysvmsg/sysvmsg.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: sysvmsg.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: sysvmsg.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -145,7 +145,7 @@ PHP_MINFO_FUNCTION(sysvmsg) { php_info_print_table_start(); php_info_print_table_row(2, "sysvmsg support", "enabled"); - php_info_print_table_row(2, "Revision", "$Revision: 272370 $"); + php_info_print_table_row(2, "Revision", "$Revision: 293036 $"); php_info_print_table_end(); } /* }}} */ diff --git a/ext/sysvsem/php_sysvsem.h b/ext/sysvsem/php_sysvsem.h index a8cf72876..acafae5cd 100644 --- a/ext/sysvsem/php_sysvsem.h +++ b/ext/sysvsem/php_sysvsem.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_sysvsem.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_sysvsem.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_SYSVSEM_H #define PHP_SYSVSEM_H diff --git a/ext/sysvsem/sysvsem.c b/ext/sysvsem/sysvsem.c index 33ae22fc1..768af1c76 100644 --- a/ext/sysvsem/sysvsem.c +++ b/ext/sysvsem/sysvsem.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: sysvsem.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: sysvsem.c 293036 2010-01-03 09:23:27Z sebastian $ */ /* Latest update build anc tested on Linux 2.2.14 * diff --git a/ext/sysvshm/php_sysvshm.h b/ext/sysvshm/php_sysvshm.h index 6cc3126b5..c313044bc 100644 --- a/ext/sysvshm/php_sysvshm.h +++ b/ext/sysvshm/php_sysvshm.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_sysvshm.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_sysvshm.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_SYSVSHM_H #define PHP_SYSVSHM_H diff --git a/ext/sysvshm/sysvshm.c b/ext/sysvshm/sysvshm.c index 94c24b36f..32af9a063 100644 --- a/ext/sysvshm/sysvshm.c +++ b/ext/sysvshm/sysvshm.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: sysvshm.c 281742 2009-06-06 02:40:49Z mattwil $ */ +/* $Id: sysvshm.c 293036 2010-01-03 09:23:27Z sebastian $ */ /* This has been built and tested on Linux 2.2.14 * diff --git a/ext/tidy/php_tidy.h b/ext/tidy/php_tidy.h index f4df21610..84864cb6c 100644 --- a/ext/tidy/php_tidy.h +++ b/ext/tidy/php_tidy.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_tidy.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_tidy.h 294004 2010-01-25 17:29:37Z johannes $ */ #ifndef PHP_TIDY_H #define PHP_TIDY_H @@ -28,6 +28,7 @@ extern zend_module_entry tidy_module_entry; ZEND_NAMED_FE(name, ZEND_FN(func_name), arg_types) #define TIDY_NODE_METHOD(name) PHP_FUNCTION(tnm_ ##name) #define TIDY_NODE_ME(name, param) TIDY_METHOD_MAP(name, tnm_ ##name, param) +#define TIDY_NODE_PRIVATE_ME(name, param) ZEND_NAMED_ME(name, ZEND_FN(tnm_ ##name), param, ZEND_ACC_PRIVATE) #define TIDY_DOC_METHOD(name) PHP_FUNCTION(tdm_ ##name) #define TIDY_DOC_ME(name, param) TIDY_METHOD_MAP(name, tdm_ ##name, param) #define TIDY_ATTR_METHOD(name) PHP_FUNCTION(tam_ ##name) diff --git a/ext/tidy/tests/023.phpt b/ext/tidy/tests/023.phpt index e7ee4b3c0..1f7b02d56 100644 --- a/ext/tidy/tests/023.phpt +++ b/ext/tidy/tests/023.phpt @@ -6,16 +6,11 @@ tidy and tidyNode OO isHtml()); - $tidy = new tidy(); $tidy->parseString(''); @@ -30,8 +25,6 @@ var_dump(tidy_get_root($tidy)->child[0]->child[0]->hasChildren()); ?> --EXPECT-- -object(tidyNode)#1 (0) { -} object(tidy)#1 (2) { ["errorBuffer"]=> NULL @@ -39,7 +32,6 @@ object(tidy)#1 (2) { NULL } ------- -bool(false) bool(true) bool(true) bool(false) diff --git a/ext/tidy/tests/025.phpt b/ext/tidy/tests/025.phpt index a7bd544d6..631ec2e5e 100644 --- a/ext/tidy/tests/025.phpt +++ b/ext/tidy/tests/025.phpt @@ -5,15 +5,6 @@ tidyNode tests --FILE-- isPhp()); -var_dump($node->isText()); -var_dump($node->isComment()); -var_dump($node->hasSiblings()); -var_dump((string)$node); - $tidy=tidy_parse_string('<% %>'); var_dump($tidy->Root()->child[0]->isAsp()); @@ -34,11 +25,6 @@ var_dump($tidy->Root()->child[0]->child[0]->hasSiblings()); ?> --EXPECT-- -bool(false) -bool(false) -bool(false) -bool(false) -string(0) "" bool(true) bool(true) bool(true) diff --git a/ext/tidy/tests/035.phpt b/ext/tidy/tests/035.phpt new file mode 100644 index 000000000..832f90fe5 --- /dev/null +++ b/ext/tidy/tests/035.phpt @@ -0,0 +1,12 @@ +--TEST-- +tidyNode::__construct() +--SKIPIF-- + +--FILE-- + +--EXPECTF-- +Fatal error: Call to private tidyNode::__construct() from invalid context in %s on line %d diff --git a/ext/tidy/tests/bug_50558.phpt b/ext/tidy/tests/bug_50558.phpt new file mode 100644 index 000000000..b37cb9219 --- /dev/null +++ b/ext/tidy/tests/bug_50558.phpt @@ -0,0 +1,28 @@ +--TEST-- +Bug #50558 - Broken object model when extending tidy +--SKIPIF-- + +--FILE-- + +--EXPECTF-- +bool(true) +object(MyTidy)#%d (%d) { + ["errorBuffer"]=> + NULL + ["value"]=> + NULL +} diff --git a/ext/tidy/tidy.c b/ext/tidy/tidy.c index 43c6a413d..34b4d23c5 100644 --- a/ext/tidy/tidy.c +++ b/ext/tidy/tidy.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: tidy.c 272922 2009-01-06 23:45:16Z iliaa $ */ +/* $Id: tidy.c 294893 2010-02-11 17:36:40Z johannes $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -206,8 +206,6 @@ static char *php_tidy_file_to_mem(char *, zend_bool, int * TSRMLS_DC); static void tidy_object_free_storage(void * TSRMLS_DC); static zend_object_value tidy_object_new_node(zend_class_entry * TSRMLS_DC); static zend_object_value tidy_object_new_doc(zend_class_entry * TSRMLS_DC); -static zend_class_entry *tidy_get_ce_node(const zval * TSRMLS_DC); -static zend_class_entry *tidy_get_ce_doc(const zval * TSRMLS_DC); static zval * tidy_instanciate(zend_class_entry *, zval * TSRMLS_DC); static int tidy_doc_cast_handler(zval *, zval *, int TSRMLS_DC); static int tidy_node_cast_handler(zval *, zval *, int TSRMLS_DC); @@ -268,6 +266,7 @@ static TIDY_NODE_METHOD(isJste); static TIDY_NODE_METHOD(isAsp); static TIDY_NODE_METHOD(isPhp); static TIDY_NODE_METHOD(getParent); +static TIDY_NODE_METHOD(__construct); /* }}} */ ZEND_DECLARE_MODULE_GLOBALS(tidy) @@ -443,6 +442,7 @@ static const zend_function_entry tidy_funcs_node[] = { TIDY_NODE_ME(isAsp, NULL) TIDY_NODE_ME(isPhp, NULL) TIDY_NODE_ME(getParent, NULL) + TIDY_NODE_PRIVATE_ME(__construct, NULL) {NULL, NULL, NULL} }; @@ -740,16 +740,6 @@ static zend_object_value tidy_object_new_doc(zend_class_entry *class_type TSRMLS return retval; } -static zend_class_entry *tidy_get_ce_node(const zval *object TSRMLS_DC) -{ - return tidy_ce_node; -} - -static zend_class_entry *tidy_get_ce_doc(const zval *object TSRMLS_DC) -{ - return tidy_ce_doc; -} - static zval * tidy_instanciate(zend_class_entry *pce, zval *object TSRMLS_DC) { if (!object) { @@ -1064,9 +1054,6 @@ static PHP_MINIT_FUNCTION(tidy) REGISTER_TIDY_CLASS(tidy, doc, NULL, 0); REGISTER_TIDY_CLASS(tidyNode, node, NULL, ZEND_ACC_FINAL_CLASS); - tidy_object_handlers_doc.get_class_entry = tidy_get_ce_doc; - tidy_object_handlers_node.get_class_entry = tidy_get_ce_node; - tidy_object_handlers_doc.cast_object = tidy_doc_cast_handler; tidy_object_handlers_node.cast_object = tidy_node_cast_handler; @@ -1098,7 +1085,7 @@ static PHP_MINFO_FUNCTION(tidy) php_info_print_table_start(); php_info_print_table_header(2, "Tidy support", "enabled"); php_info_print_table_row(2, "libTidy Release", (char *)tidyReleaseDate()); - php_info_print_table_row(2, "Extension Version", PHP_TIDY_MODULE_VERSION " ($Id: tidy.c 272922 2009-01-06 23:45:16Z iliaa $)"); + php_info_print_table_row(2, "Extension Version", PHP_TIDY_MODULE_VERSION " ($Id: tidy.c 294893 2010-02-11 17:36:40Z johannes $)"); php_info_print_table_end(); DISPLAY_INI_ENTRIES(); @@ -1790,6 +1777,14 @@ static TIDY_NODE_METHOD(getParent) } /* }}} */ +/* {{{ proto void tidyNode::__construct() + __constructor for tidyNode. */ +static TIDY_NODE_METHOD(__construct) +{ + php_error_docref(NULL TSRMLS_CC, E_ERROR, "You should not create a tidyNode manually"); +} +/* }}} */ + static void _php_tidy_register_nodetypes(INIT_FUNC_ARGS) { TIDY_NODE_CONST(ROOT, Root); diff --git a/ext/tokenizer/php_tokenizer.h b/ext/tokenizer/php_tokenizer.h index 6f5e7e82c..29e985bad 100644 --- a/ext/tokenizer/php_tokenizer.h +++ b/ext/tokenizer/php_tokenizer.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_tokenizer.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_tokenizer.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_TOKENIZER_H #define PHP_TOKENIZER_H diff --git a/ext/tokenizer/tokenizer.c b/ext/tokenizer/tokenizer.c index afc20f0d1..fa597f614 100644 --- a/ext/tokenizer/tokenizer.c +++ b/ext/tokenizer/tokenizer.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: tokenizer.c 277761 2009-03-25 15:23:58Z dmitry $ */ +/* $Id: tokenizer.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/tokenizer/tokenizer_data.c b/ext/tokenizer/tokenizer_data.c index a1e86960c..38f4ddefd 100644 --- a/ext/tokenizer/tokenizer_data.c +++ b/ext/tokenizer/tokenizer_data.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: tokenizer_data.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: tokenizer_data.c 293036 2010-01-03 09:23:27Z sebastian $ */ /* DO NOT EDIT THIS FILE! diff --git a/ext/wddx/php_wddx.h b/ext/wddx/php_wddx.h index 4ba445ab0..7b816fff3 100644 --- a/ext/wddx/php_wddx.h +++ b/ext/wddx/php_wddx.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_wddx.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_wddx.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_WDDX_H #define PHP_WDDX_H diff --git a/ext/wddx/php_wddx_api.h b/ext/wddx/php_wddx_api.h index 6a069bfad..db732bdd4 100644 --- a/ext/wddx/php_wddx_api.h +++ b/ext/wddx/php_wddx_api.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_wddx_api.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_wddx_api.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_WDDX_API_H #define PHP_WDDX_API_H diff --git a/ext/wddx/wddx.c b/ext/wddx/wddx.c index 82b3eb906..507a42399 100644 --- a/ext/wddx/wddx.c +++ b/ext/wddx/wddx.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: wddx.c 282200 2009-06-16 02:54:26Z felipe $ */ +/* $Id: wddx.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/xml/compat.c b/ext/xml/compat.c index 878b9214a..9c8761ba4 100644 --- a/ext/xml/compat.c +++ b/ext/xml/compat.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | diff --git a/ext/xml/expat_compat.h b/ext/xml/expat_compat.h index 83c79ed4f..7b4bc4087 100644 --- a/ext/xml/expat_compat.h +++ b/ext/xml/expat_compat.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: expat_compat.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: expat_compat.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_EXPAT_COMPAT_H #define PHP_EXPAT_COMPAT_H diff --git a/ext/xml/php_xml.h b/ext/xml/php_xml.h index db2d79290..cd6ebec61 100644 --- a/ext/xml/php_xml.h +++ b/ext/xml/php_xml.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_xml.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_xml.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_XML_H #define PHP_XML_H diff --git a/ext/xml/tests/bug32001b.phpt b/ext/xml/tests/bug32001b.phpt index f4aea08e5..ddf26ce3c 100755 --- a/ext/xml/tests/bug32001b.phpt +++ b/ext/xml/tests/bug32001b.phpt @@ -95,9 +95,7 @@ $suite = array( ); if (XML_SAX_IMPL == 'libxml') { - $php = getenv('TEST_PHP_EXECUTABLE'); - preg_match("/^libxml2 Version.*\$/im", `$php -i`, $match); - echo $match[0], "\n"; + echo "libxml2 Version => " . LIBXML_DOTTED_VERSION. "\n"; } else { echo "libxml2 Version => NONE\n"; } diff --git a/ext/xml/tests/bug50576.phpt b/ext/xml/tests/bug50576.phpt new file mode 100644 index 000000000..fd3d0cbb4 --- /dev/null +++ b/ext/xml/tests/bug50576.phpt @@ -0,0 +1,133 @@ +--TEST-- +Bug #50576 (XML_OPTION_SKIP_TAGSTART option has no effect) +--SKIPIF-- + +--FILE-- + + + +867 + + +XML; + +$xml_parser = xml_parser_create(); +xml_parser_set_option($xml_parser, XML_OPTION_SKIP_TAGSTART, 4); +xml_parse_into_struct($xml_parser, $XML, $vals, $index); +echo 'Index array' . PHP_EOL; +print_r($index); +echo 'Vals array' . PHP_EOL; +print_r($vals); +xml_parser_free($xml_parser); + +function startElement($parser, $name, $attribs) { echo $name . PHP_EOL; } +function endElement($parser, $name) { echo $name . PHP_EOL; } +$xml_parser = xml_parser_create(); +xml_set_element_handler($xml_parser, 'startElement', 'endElement'); +xml_parser_set_option($xml_parser, XML_OPTION_SKIP_TAGSTART, 4); +xml_parse($xml_parser, $XML); +xml_parser_free($xml_parser); + +?> +--EXPECTF-- +Index array +Array +( + [LISTOFAWARDS] => Array + ( + [0] => 0 + [1] => 5 + [2] => 6 + ) + + [COUNT] => Array + ( + [0] => 1 + [1] => 3 + [2] => 4 + ) + + [TOTAL] => Array + ( + [0] => 2 + ) + +) +Vals array +Array +( + [0] => Array + ( + [tag] => LISTOFAWARDS + [type] => open + [level] => 1 + [attributes] => Array + ( + [XMLNS:NS1] => http://www.fpdsng.com/FPDS + ) + + [value] => + + ) + + [1] => Array + ( + [tag] => COUNT + [type] => open + [level] => 2 + [value] => + + ) + + [2] => Array + ( + [tag] => TOTAL + [type] => complete + [level] => 3 + [value] => 867 + ) + + [3] => Array + ( + [tag] => COUNT + [value] => + + [type] => cdata + [level] => 2 + ) + + [4] => Array + ( + [tag] => COUNT + [type] => close + [level] => 2 + ) + + [5] => Array + ( + [tag] => LISTOFAWARDS + [value] => + + [type] => cdata + [level] => 1 + ) + + [6] => Array + ( + [tag] => LISTOFAWARDS + [type] => close + [level] => 1 + ) + +) +LISTOFAWARDS +COUNT +TOTAL +TOTAL +COUNT +LISTOFAWARDS diff --git a/ext/xml/xml.c b/ext/xml/xml.c index 2a9240e6c..5dd532a26 100644 --- a/ext/xml/xml.c +++ b/ext/xml/xml.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: xml.c 287790 2009-08-27 05:05:42Z rasmus $ */ +/* $Id: xml.c 294434 2010-02-03 18:35:58Z pajoye $ */ #define IS_EXT_MODULE @@ -804,7 +804,7 @@ void _xml_startElementHandler(void *userData, const XML_Char *name, const XML_Ch if (parser->startElementHandler) { args[0] = _xml_resource_zval(parser->index); - args[1] = _xml_string_zval(tag_name); + args[1] = _xml_string_zval(((char *) tag_name) + parser->toffset); MAKE_STD_ZVAL(args[2]); array_init(args[2]); @@ -884,7 +884,7 @@ void _xml_endElementHandler(void *userData, const XML_Char *name) if (parser->endElementHandler) { args[0] = _xml_resource_zval(parser->index); - args[1] = _xml_string_zval(tag_name); + args[1] = _xml_string_zval(((char *) tag_name) + parser->toffset); if ((retval = xml_call_handler(parser, parser->endElementHandler, parser->endElementPtr, 2, args))) { zval_ptr_dtor(&retval); @@ -1270,9 +1270,7 @@ PHP_FUNCTION(xml_set_object) #endif */ ALLOC_ZVAL(parser->object); - *parser->object = *mythis; - zval_copy_ctor(parser->object); - INIT_PZVAL(parser->object); + MAKE_COPY_ZVAL(&mythis, parser->object); RETVAL_TRUE; } diff --git a/ext/xmlreader/php_xmlreader.c b/ext/xmlreader/php_xmlreader.c index 26c8bd272..ad9c206bb 100644 --- a/ext/xmlreader/php_xmlreader.c +++ b/ext/xmlreader/php_xmlreader.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_xmlreader.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_xmlreader.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/xmlreader/php_xmlreader.h b/ext/xmlreader/php_xmlreader.h index de3790ce0..3d510a008 100644 --- a/ext/xmlreader/php_xmlreader.h +++ b/ext/xmlreader/php_xmlreader.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_xmlreader.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_xmlreader.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_XMLREADER_H #define PHP_XMLREADER_H diff --git a/ext/xmlrpc/php_xmlrpc.h b/ext/xmlrpc/php_xmlrpc.h index ce18b53a8..d1bc19cd5 100644 --- a/ext/xmlrpc/php_xmlrpc.h +++ b/ext/xmlrpc/php_xmlrpc.h @@ -37,7 +37,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -51,7 +51,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_xmlrpc.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_xmlrpc.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef _PHP_XMLRPC_H #define _PHP_XMLRPC_H diff --git a/ext/xmlrpc/tests/bug50282.phpt b/ext/xmlrpc/tests/bug50282.phpt new file mode 100644 index 000000000..eb35fe3f2 --- /dev/null +++ b/ext/xmlrpc/tests/bug50282.phpt @@ -0,0 +1,43 @@ +--TEST-- +Bug #50282 (xmlrpc_encode_request() changes object into array in calling function) +--SKIPIF-- + +--FILE-- + +--EXPECTF-- +object(One)#%d (1) { + ["x"]=> + int(10) +} +string(279) " + +test + + + + + + x + + 10 + + + + + + + +" +object(One)#%d (1) { + ["x"]=> + int(10) +} diff --git a/ext/xmlrpc/tests/bug50285.phpt b/ext/xmlrpc/tests/bug50285.phpt new file mode 100644 index 000000000..cf766fc40 --- /dev/null +++ b/ext/xmlrpc/tests/bug50285.phpt @@ -0,0 +1,115 @@ +--TEST-- +Bug #50285 (xmlrpc does not preserve keys in encoded indexed arrays) +--FILE-- +'One', 3=>'Three', 5=>'Five'); +} + +function test2($func, $params) { + return array('One', 'Three', 'Five', 5); +} + +function test3($func, $params) { + return array('One', 3 => 'Three', b'Five' => 5, 'Six'); +} + +function test4($func, $params) { + return array('One', 'Three', 'Five', b'Six' => 6); +} + +$server = xmlrpc_server_create(); +$result = xmlrpc_server_register_method($server, 'test1', 'test1'); +$HTTP_RAW_POST_DATA = << + +test1 + + +EOD; +$response = xmlrpc_server_call_method($server, $HTTP_RAW_POST_DATA, null); +var_dump(xmlrpc_decode($response)); + +// ------------ + +$server = xmlrpc_server_create(); +$result = xmlrpc_server_register_method($server, 'test2', 'test2'); +$HTTP_RAW_POST_DATA = << + +test2 + + +EOD; +$response = xmlrpc_server_call_method($server, $HTTP_RAW_POST_DATA, null); +var_dump(xmlrpc_decode($response)); + +// ------------ + +$server = xmlrpc_server_create(); +$result = xmlrpc_server_register_method($server, 'test3', 'test3'); +$HTTP_RAW_POST_DATA = << + +test3 + + +EOD; +$response = xmlrpc_server_call_method($server, $HTTP_RAW_POST_DATA, null); +var_dump(xmlrpc_decode($response)); + +// ------------ + +$server = xmlrpc_server_create(); +$result = xmlrpc_server_register_method($server, 'test4', 'test4'); +$HTTP_RAW_POST_DATA = << + +test4 + + +EOD; +$response = xmlrpc_server_call_method($server, $HTTP_RAW_POST_DATA, null); +var_dump(xmlrpc_decode($response)); + +?> +--EXPECT-- +array(3) { + [1]=> + string(3) "One" + [3]=> + string(5) "Three" + [5]=> + string(4) "Five" +} +array(4) { + [0]=> + string(3) "One" + [1]=> + string(5) "Three" + [2]=> + string(4) "Five" + [3]=> + int(5) +} +array(4) { + [0]=> + string(3) "One" + [3]=> + string(5) "Three" + ["Five"]=> + int(5) + [4]=> + string(3) "Six" +} +array(4) { + [0]=> + string(3) "One" + [1]=> + string(5) "Three" + [2]=> + string(4) "Five" + ["Six"]=> + int(6) +} diff --git a/ext/xmlrpc/tests/bug50761.phpt b/ext/xmlrpc/tests/bug50761.phpt new file mode 100644 index 000000000..653d8502f --- /dev/null +++ b/ext/xmlrpc/tests/bug50761.phpt @@ -0,0 +1,62 @@ +--TEST-- +Bug #50761 (system.multiCall crashes) +--FILE-- + + +system.multiCall + + +methodNametestMethodA +paramsA + + + +methodNametestMethodB +paramsB + + + +'; + +function testA($methodName, $params, $var){ return "C"; } +function testB($methodName, $params, $var){ return "D"; } + +$server = xmlrpc_server_create(); +xmlrpc_server_register_method($server, 'testMethodA', 'testA'); +xmlrpc_server_register_method($server, 'testMethodB', 'testB'); +$res = xmlrpc_server_call_method($server, $req, null); +echo $res; +?> +--EXPECT-- + + + + + + + + + + + + C + + + + + + + + + D + + + + + + + + + + diff --git a/ext/xmlrpc/xmlrpc-epi-php.c b/ext/xmlrpc/xmlrpc-epi-php.c index 77ec4ecbf..054ea2f2a 100644 --- a/ext/xmlrpc/xmlrpc-epi-php.c +++ b/ext/xmlrpc/xmlrpc-epi-php.c @@ -37,7 +37,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -51,7 +51,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: xmlrpc-epi-php.c 287434 2009-08-18 00:41:43Z stas $ */ +/* $Id: xmlrpc-epi-php.c 294452 2010-02-03 20:19:05Z pajoye $ */ /********************************************************************** * BUGS: * @@ -484,7 +484,7 @@ static void set_output_options(php_output_options* options, zval* output_opts) static XMLRPC_VECTOR_TYPE determine_vector_type (HashTable *ht) { int bArray = 0, bStruct = 0, bMixed = 0; - unsigned long num_index; + unsigned long num_index, last_num = 0; char* my_key; zend_hash_internal_pointer_reset(ht); @@ -495,8 +495,12 @@ static XMLRPC_VECTOR_TYPE determine_vector_type (HashTable *ht) if (bStruct) { bMixed = 1; break; + } else if (last_num > 0 && last_num != num_index-1) { + bStruct = 1; + break; } bArray = 1; + last_num = num_index; } else if (res == HASH_KEY_NON_EXISTANT) { break; } else if (res == HASH_KEY_IS_STRING) { @@ -556,6 +560,8 @@ static XMLRPC_VALUE PHP_to_XMLRPC_worker (const char* key, zval* in_val, int dep zval** pIter; char* my_key; HashTable *ht = NULL; + zval *val_arr; + XMLRPC_VECTOR_TYPE vtype; ht = HASH_OF(val); if (ht && ht->nApplyCount > 1) { @@ -563,12 +569,16 @@ static XMLRPC_VALUE PHP_to_XMLRPC_worker (const char* key, zval* in_val, int dep return NULL; } - convert_to_array(val); - xReturn = XMLRPC_CreateVector(key, determine_vector_type(Z_ARRVAL_P(val))); + MAKE_STD_ZVAL(val_arr); + MAKE_COPY_ZVAL(&val, val_arr); + convert_to_array(val_arr); + + vtype = determine_vector_type(Z_ARRVAL_P(val_arr)); + xReturn = XMLRPC_CreateVector(key, vtype); - zend_hash_internal_pointer_reset(Z_ARRVAL_P(val)); - while(zend_hash_get_current_data(Z_ARRVAL_P(val), (void**)&pIter) == SUCCESS) { - int res = my_zend_hash_get_current_key(Z_ARRVAL_P(val), &my_key, &num_index); + zend_hash_internal_pointer_reset(Z_ARRVAL_P(val_arr)); + while(zend_hash_get_current_data(Z_ARRVAL_P(val_arr), (void**)&pIter) == SUCCESS) { + int res = my_zend_hash_get_current_key(Z_ARRVAL_P(val_arr), &my_key, &num_index); switch (res) { case HASH_KEY_NON_EXISTANT: @@ -580,7 +590,15 @@ static XMLRPC_VALUE PHP_to_XMLRPC_worker (const char* key, zval* in_val, int dep ht->nApplyCount++; } if (res == HASH_KEY_IS_LONG) { - XMLRPC_AddValueToVector(xReturn, PHP_to_XMLRPC_worker(0, *pIter, depth++ TSRMLS_CC)); + char *num_str = NULL; + + if (vtype != xmlrpc_vector_array) { + spprintf(&num_str, 0, "%ld", num_index); + } + XMLRPC_AddValueToVector(xReturn, PHP_to_XMLRPC_worker(num_str, *pIter, depth++ TSRMLS_CC)); + if (num_str) { + efree(num_str); + } } else { XMLRPC_AddValueToVector(xReturn, PHP_to_XMLRPC_worker(my_key, *pIter, depth++ TSRMLS_CC)); } @@ -589,8 +607,9 @@ static XMLRPC_VALUE PHP_to_XMLRPC_worker (const char* key, zval* in_val, int dep } break; } - zend_hash_move_forward(Z_ARRVAL_P(val)); - } + zend_hash_move_forward(Z_ARRVAL_P(val_arr)); + } + zval_ptr_dtor(&val_arr); } break; default: @@ -892,12 +911,26 @@ PHP_FUNCTION(xmlrpc_server_destroy) static XMLRPC_VALUE php_xmlrpc_callback(XMLRPC_SERVER server, XMLRPC_REQUEST xRequest, void* data) /* {{{ */ { xmlrpc_callback_data* pData = (xmlrpc_callback_data*)data; + zval** php_function; zval* xmlrpc_params; zval* callback_params[3]; TSRMLS_FETCH(); + zval_dtor(pData->xmlrpc_method); + zval_dtor(pData->return_data); + /* convert xmlrpc to native php types */ + ZVAL_STRING(pData->xmlrpc_method, XMLRPC_RequestGetMethodName(xRequest), 1); xmlrpc_params = XMLRPC_to_PHP(XMLRPC_RequestGetData(xRequest)); + + /* check if the called method has been previous registered */ + if(zend_hash_find(Z_ARRVAL_P(pData->server->method_map), + Z_STRVAL_P(pData->xmlrpc_method), + Z_STRLEN_P(pData->xmlrpc_method) + 1, + (void**)&php_function) == SUCCESS) { + + pData->php_function = *php_function; + } /* setup data hoojum */ callback_params[0] = pData->xmlrpc_method; @@ -913,7 +946,7 @@ static XMLRPC_VALUE php_xmlrpc_callback(XMLRPC_SERVER server, XMLRPC_REQUEST xRe zval_ptr_dtor(&xmlrpc_params); - return NULL; + return PHP_to_XMLRPC(pData->return_data TSRMLS_CC); } /* }}} */ @@ -1082,34 +1115,17 @@ PHP_FUNCTION(xmlrpc_server_call_method) if (xRequest) { const char* methodname = XMLRPC_RequestGetMethodName(xRequest); - zval **php_function; XMLRPC_VALUE xAnswer = NULL; MAKE_STD_ZVAL(data.xmlrpc_method); /* init. very important. spent a frustrating day finding this out. */ MAKE_STD_ZVAL(data.return_data); Z_TYPE_P(data.return_data) = IS_NULL; /* in case value is never init'd, we don't dtor to think it is a string or something */ Z_TYPE_P(data.xmlrpc_method) = IS_NULL; - if (!methodname) { - methodname = ""; - } - /* setup some data to pass to the callback function */ - Z_STRVAL_P(data.xmlrpc_method) = estrdup(methodname); - Z_STRLEN_P(data.xmlrpc_method) = strlen(methodname); - Z_TYPE_P(data.xmlrpc_method) = IS_STRING; data.caller_params = *caller_params; data.php_executed = 0; data.server = server; - /* check if the called method has been previous registered */ - if (zend_hash_find(Z_ARRVAL_P(server->method_map), - Z_STRVAL_P(data.xmlrpc_method), - Z_STRLEN_P(data.xmlrpc_method) + 1, - (void**)&php_function) == SUCCESS) { - - data.php_function = *php_function; - } - /* We could just call the php method directly ourselves at this point, but we do this * with a C callback in case the xmlrpc library ever implements some cool usage stats, * or somesuch. @@ -1119,7 +1135,7 @@ PHP_FUNCTION(xmlrpc_server_call_method) zval_dtor(data.return_data); FREE_ZVAL(data.return_data); data.return_data = XMLRPC_to_PHP(xAnswer); - } else if (data.php_executed && !out.b_php_out) { + } else if (data.php_executed && !out.b_php_out && !xAnswer) { xAnswer = PHP_to_XMLRPC(data.return_data TSRMLS_CC); } diff --git a/ext/xmlwriter/php_xmlwriter.c b/ext/xmlwriter/php_xmlwriter.c index 9af9809d7..3443bd7df 100644 --- a/ext/xmlwriter/php_xmlwriter.c +++ b/ext/xmlwriter/php_xmlwriter.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_xmlwriter.c 281145 2009-05-26 08:10:49Z pajoye $ */ +/* $Id: php_xmlwriter.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/xmlwriter/php_xmlwriter.h b/ext/xmlwriter/php_xmlwriter.h index 86240b3a5..a62b4fe4e 100644 --- a/ext/xmlwriter/php_xmlwriter.h +++ b/ext/xmlwriter/php_xmlwriter.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_xmlwriter.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_xmlwriter.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_XMLWRITER_H #define PHP_XMLWRITER_H diff --git a/ext/xsl/php_xsl.c b/ext/xsl/php_xsl.c index 4bbf59d37..5839230cf 100644 --- a/ext/xsl/php_xsl.c +++ b/ext/xsl/php_xsl.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_xsl.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_xsl.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/xsl/php_xsl.h b/ext/xsl/php_xsl.h index 38d2c87db..ce8d975dd 100644 --- a/ext/xsl/php_xsl.h +++ b/ext/xsl/php_xsl.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_xsl.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_xsl.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_XSL_H #define PHP_XSL_H diff --git a/ext/xsl/tests/xsltprocessor_registerPHPFunctions-funcnostring.phpt b/ext/xsl/tests/xsltprocessor_registerPHPFunctions-funcnostring.phpt index a0d6bf6b7..d9a70517e 100644 --- a/ext/xsl/tests/xsltprocessor_registerPHPFunctions-funcnostring.phpt +++ b/ext/xsl/tests/xsltprocessor_registerPHPFunctions-funcnostring.phpt @@ -30,8 +30,8 @@ Warning: XSLTProcessor::transformToXml(): xmlXPathCompiledEval: evaluation faile Warning: XSLTProcessor::transformToXml(): runtime error: file %s line %d element value-of in %s on line %d -Warning: XSLTProcessor::transformToXml(): XPath evaluation returned no result. in %s on line %d -NULL +Warning: XSLTProcessor::transformToXml(): xsltValueOf: text copy failed in %s on line %d +bool(false) --CREDITS-- Christian Weiske, cweiske@php.net PHP Testfest Berlin 2009-05-09 diff --git a/ext/xsl/tests/xsltprocessor_registerPHPFunctions-funcundef.phpt b/ext/xsl/tests/xsltprocessor_registerPHPFunctions-funcundef.phpt index 1aa7bb051..a0ddf96a6 100644 --- a/ext/xsl/tests/xsltprocessor_registerPHPFunctions-funcundef.phpt +++ b/ext/xsl/tests/xsltprocessor_registerPHPFunctions-funcundef.phpt @@ -29,8 +29,8 @@ Warning: XSLTProcessor::transformToXml(): xmlXPathCompiledEval: evaluation faile Warning: XSLTProcessor::transformToXml(): runtime error: file %s line %d element value-of in %s on line %d -Warning: XSLTProcessor::transformToXml(): XPath evaluation returned no result. in %s on line %d -NULL +Warning: XSLTProcessor::transformToXml(): xsltValueOf: text copy failed in %s on line %d +bool(false) --CREDITS-- Christian Weiske, cweiske@php.net PHP Testfest Berlin 2009-05-09 diff --git a/ext/xsl/xsl_fe.h b/ext/xsl/xsl_fe.h index f21b89846..48377ca1e 100644 --- a/ext/xsl/xsl_fe.h +++ b/ext/xsl/xsl_fe.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: xsl_fe.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: xsl_fe.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef XSL_FE_H #define XSL_FE_H diff --git a/ext/xsl/xsltprocessor.c b/ext/xsl/xsltprocessor.c index e07bdd564..e6d7e5333 100644 --- a/ext/xsl/xsltprocessor.c +++ b/ext/xsl/xsltprocessor.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: xsltprocessor.c 287968 2009-09-02 13:07:44Z iliaa $ */ +/* $Id: xsltprocessor.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/ext/zip/lib/zip_close.c b/ext/zip/lib/zip_close.c index bc640c77b..0796f2746 100644 --- a/ext/zip/lib/zip_close.c +++ b/ext/zip/lib/zip_close.c @@ -135,6 +135,7 @@ zip_close(struct zip *za) if ((temp=_zip_create_temp_output(za, &out)) == NULL) { _zip_cdir_free(cd); + free(filelist); return -1; } @@ -192,7 +193,8 @@ zip_close(struct zip *za) error = 1; break; } - if (_zip_dirent_read(&de, za->zp, NULL, 0, 1, &za->error) != 0) { + if (_zip_dirent_read(&de, za->zp, NULL, NULL, 1, + &za->error) != 0) { error = 1; break; } @@ -264,6 +266,8 @@ zip_close(struct zip *za) _zip_dirent_finalize(&de); } + free(filelist); + if (!error) { if (write_cdir(za, cd, out) < 0) error = 1; @@ -306,6 +310,8 @@ zip_close(struct zip *za) mask = umask(0); umask(mask); chmod(za->zn, 0666&~mask); + if (za->ch_comment) + free(za->ch_comment); _zip_free(za); free(temp); @@ -443,6 +449,7 @@ add_data_uncomp(struct zip *za, zip_source_callback cb, void *ud, zstr.next_out = (Bytef *)b2; zstr.avail_out = sizeof(b2); + zstr.next_in = NULL; zstr.avail_in = 0; flush = 0; diff --git a/ext/zip/lib/zip_dirent.c b/ext/zip/lib/zip_dirent.c index 425f7ff92..39fcb6f62 100644 --- a/ext/zip/lib/zip_dirent.c +++ b/ext/zip/lib/zip_dirent.c @@ -68,6 +68,30 @@ _zip_cdir_free(struct zip_cdir *cd) +int +_zip_cdir_grow(struct zip_cdir *cd, int nentry, struct zip_error *error) +{ + struct zip_dirent *entry; + + if (nentry < cd->nentry) { + _zip_error_set(error, ZIP_ER_INTERNAL, 0); + return -1; + } + + if ((entry=((struct zip_dirent *) + realloc(cd->entry, sizeof(*(cd->entry))*nentry))) == NULL) { + _zip_error_set(error, ZIP_ER_MEMORY, 0); + return -1; + } + + cd->nentry = nentry; + cd->entry = entry; + + return 0; +} + + + struct zip_cdir * _zip_cdir_new(int nentry, struct zip_error *error) { @@ -173,19 +197,23 @@ _zip_dirent_init(struct zip_dirent *de) Fills the zip directory entry zde. If bufp is non-NULL, data is taken from there and bufp is advanced - by the amount of data used; no more than left bytes are used. - Otherwise data is read from fp as needed. + by the amount of data used; otherwise data is read from fp as needed. + + if leftp is non-NULL, no more bytes than specified by it are used, + and *leftp is reduced by the number of bytes used. - If localp != 0, it reads a local header instead of a central + If local != 0, it reads a local header instead of a central directory entry. Returns 0 if successful. On error, error is filled in and -1 is returned. + + XXX: leftp and file position undefined on error. */ int _zip_dirent_read(struct zip_dirent *zde, FILE *fp, - unsigned char **bufp, unsigned int left, int localp, + unsigned char **bufp, unsigned int *leftp, int local, struct zip_error *error) { unsigned char buf[CDENTRYSIZE]; @@ -193,18 +221,19 @@ _zip_dirent_read(struct zip_dirent *zde, FILE *fp, unsigned short dostime, dosdate; unsigned int size; - if (localp) + if (local) size = LENTRYSIZE; else size = CDENTRYSIZE; - + + if (leftp && (*leftp < size)) { + _zip_error_set(error, ZIP_ER_NOZIP, 0); + return -1; + } + if (bufp) { /* use data from buffer */ cur = *bufp; - if (left < size) { - _zip_error_set(error, ZIP_ER_NOZIP, 0); - return -1; - } } else { /* read entry from disk */ @@ -212,11 +241,10 @@ _zip_dirent_read(struct zip_dirent *zde, FILE *fp, _zip_error_set(error, ZIP_ER_READ, errno); return -1; } - left = size; cur = buf; } - if (memcmp(cur, (localp ? LOCAL_MAGIC : CENTRAL_MAGIC), 4) != 0) { + if (memcmp(cur, (local ? LOCAL_MAGIC : CENTRAL_MAGIC), 4) != 0) { _zip_error_set(error, ZIP_ER_NOZIP, 0); return -1; } @@ -225,7 +253,7 @@ _zip_dirent_read(struct zip_dirent *zde, FILE *fp, /* convert buffercontents to zip_dirent */ - if (!localp) + if (!local) zde->version_madeby = _zip_read2(&cur); else zde->version_madeby = 0; @@ -245,7 +273,7 @@ _zip_dirent_read(struct zip_dirent *zde, FILE *fp, zde->filename_len = _zip_read2(&cur); zde->extrafield_len = _zip_read2(&cur); - if (localp) { + if (local) { zde->comment_len = 0; zde->disk_number = 0; zde->int_attrib = 0; @@ -263,13 +291,14 @@ _zip_dirent_read(struct zip_dirent *zde, FILE *fp, zde->extrafield = NULL; zde->comment = NULL; - if (bufp) { - if (left < CDENTRYSIZE + (zde->filename_len+zde->extrafield_len - +zde->comment_len)) { - _zip_error_set(error, ZIP_ER_NOZIP, 0); - return -1; - } + size += zde->filename_len+zde->extrafield_len+zde->comment_len; + if (leftp && (*leftp < size)) { + _zip_error_set(error, ZIP_ER_NOZIP, 0); + return -1; + } + + if (bufp) { if (zde->filename_len) { zde->filename = _zip_readstr(&cur, zde->filename_len, 1, error); if (!zde->filename) @@ -312,6 +341,8 @@ _zip_dirent_read(struct zip_dirent *zde, FILE *fp, if (bufp) *bufp = cur; + if (leftp) + *leftp -= size; return 0; } @@ -442,23 +473,22 @@ _zip_dirent_write(struct zip_dirent *zde, FILE *fp, int localp, static time_t _zip_d2u_time(int dtime, int ddate) { - struct tm *tm; - time_t now; + struct tm tm; - now = time(NULL); - tm = localtime(&now); + memset(&tm, sizeof(tm), 0); + /* let mktime decide if DST is in effect */ - tm->tm_isdst = -1; + tm.tm_isdst = -1; - tm->tm_year = ((ddate>>9)&127) + 1980 - 1900; - tm->tm_mon = ((ddate>>5)&15) - 1; - tm->tm_mday = ddate&31; + tm.tm_year = ((ddate>>9)&127) + 1980 - 1900; + tm.tm_mon = ((ddate>>5)&15) - 1; + tm.tm_mday = ddate&31; - tm->tm_hour = (dtime>>11)&31; - tm->tm_min = (dtime>>5)&63; - tm->tm_sec = (dtime<<1)&62; + tm.tm_hour = (dtime>>11)&31; + tm.tm_min = (dtime>>5)&63; + tm.tm_sec = (dtime<<1)&62; - return mktime(tm); + return mktime(&tm); } diff --git a/ext/zip/lib/zip_file_get_offset.c b/ext/zip/lib/zip_file_get_offset.c index 68f92f1fe..b96fd5e48 100644 --- a/ext/zip/lib/zip_file_get_offset.c +++ b/ext/zip/lib/zip_file_get_offset.c @@ -63,7 +63,7 @@ _zip_file_get_offset(struct zip *za, int idx) return 0; } - if (_zip_dirent_read(&de, za->zp, NULL, 0, 1, &za->error) != 0) + if (_zip_dirent_read(&de, za->zp, NULL, NULL, 1, &za->error) != 0) return 0; offset += LENTRYSIZE + de.filename_len + de.extrafield_len; diff --git a/ext/zip/lib/zip_fread.c b/ext/zip/lib/zip_fread.c index c0b71b861..00a6bdc4e 100644 --- a/ext/zip/lib/zip_fread.c +++ b/ext/zip/lib/zip_fread.c @@ -63,7 +63,7 @@ zip_fread(struct zip_file *zf, void *outbuf, size_t toread) } return 0; } - + if ((zf->flags & ZIP_ZF_DECOMP) == 0) { ret = _zip_file_fillbuf(outbuf, toread, zf); if (ret > 0) { @@ -84,25 +84,22 @@ zip_fread(struct zip_file *zf, void *outbuf, size_t toread) switch (ret) { case Z_STREAM_END: - zf->flags |= ZIP_ZF_EOF; + if (zf->zstr->total_out == out_before) { + if (zf->crc != zf->crc_orig) { + _zip_error_set(&zf->error, ZIP_ER_CRC, 0); + return -1; + } + else + return 0; + } - case Z_OK: + /* fallthrough */ - /* all ok */ - /* Z_STREAM_END probably won't happen, since we didn't - have a header */ + case Z_OK: len = zf->zstr->total_out - out_before; if (len >= zf->bytes_left || len >= toread) { - if (zf->flags & ZIP_ZF_CRC) { - zf->crc = crc32(zf->crc, (Bytef *)outbuf, len); - if (zf->flags & ZIP_ZF_EOF == 1) { - if (zf->crc != zf->crc_orig) { - _zip_error_set(&zf->error, ZIP_ER_CRC, 0); - return -1; - } - - } - } + if (zf->flags & ZIP_ZF_CRC) + zf->crc = crc32(zf->crc, (Bytef *)outbuf, len); zf->bytes_left -= len; return len; } diff --git a/ext/zip/lib/zip_open.c b/ext/zip/lib/zip_open.c index e3840197d..31e12f4fc 100644 --- a/ext/zip/lib/zip_open.c +++ b/ext/zip/lib/zip_open.c @@ -162,6 +162,7 @@ _zip_readcdir(FILE *fp, unsigned char *buf, unsigned char *eocd, int buflen, struct zip_cdir *cd; unsigned char *cdp, **bufp; int i, comlen, nentry; + unsigned int left; comlen = buf + buflen - eocd - EOCDLEN; if (comlen < 0) { @@ -215,7 +216,6 @@ _zip_readcdir(FILE *fp, unsigned char *buf, unsigned char *eocd, int buflen, } } - cdp = eocd; if (cd->size < (unsigned int)(eocd-buf)) { /* if buffer already read in, use it */ cdp = eocd - cd->size; @@ -239,14 +239,23 @@ _zip_readcdir(FILE *fp, unsigned char *buf, unsigned char *eocd, int buflen, } } - for (i=0; inentry; i++) { - if ((_zip_dirent_read(cd->entry+i, fp, bufp, eocd-cdp, 0, - error)) < 0) { + left = cd->size; + i=0; + do { + if (i == cd->nentry && left > 0) { + /* Infozip extension for more than 64k entries: + nentries wraps around, size indicates correct EOCD */ + _zip_cdir_grow(cd, cd->nentry+0x10000, error); + } + + if ((_zip_dirent_read(cd->entry+i, fp, bufp, &left, 0, error)) < 0) { cd->nentry = i; _zip_cdir_free(cd); return NULL; } - } + i++; + + } while (inentry); return cd; } @@ -295,7 +304,7 @@ _zip_checkcons(FILE *fp, struct zip_cdir *cd, struct zip_error *error) return -1; } - if (_zip_dirent_read(&temp, fp, NULL, 0, 1, error) == -1) + if (_zip_dirent_read(&temp, fp, NULL, NULL, 1, error) == -1) return -1; if (_zip_headercomp(cd->entry+i, 0, &temp, 1) != 0) { diff --git a/ext/zip/lib/zipint.h b/ext/zip/lib/zipint.h index e7e35e4dd..d72ed144d 100644 --- a/ext/zip/lib/zipint.h +++ b/ext/zip/lib/zipint.h @@ -213,13 +213,14 @@ extern const int _zip_err_type[]; int _zip_cdir_compute_crc(struct zip *, uLong *); void _zip_cdir_free(struct zip_cdir *); +int _zip_cdir_grow(struct zip_cdir *, int, struct zip_error *); struct zip_cdir *_zip_cdir_new(int, struct zip_error *); int _zip_cdir_write(struct zip_cdir *, FILE *, struct zip_error *); void _zip_dirent_finalize(struct zip_dirent *); void _zip_dirent_init(struct zip_dirent *); -int _zip_dirent_read(struct zip_dirent *, FILE *, - unsigned char **, unsigned int, int, struct zip_error *); +int _zip_dirent_read(struct zip_dirent *, FILE *, unsigned char **, + unsigned int *, int, struct zip_error *); void _zip_dirent_torrent_normalize(struct zip_dirent *); int _zip_dirent_write(struct zip_dirent *, FILE *, int, struct zip_error *); diff --git a/ext/zip/php_zip.c b/ext/zip/php_zip.c index ab2c4e7a7..c2d563fb1 100644 --- a/ext/zip/php_zip.c +++ b/ext/zip/php_zip.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_zip.c 276389 2009-02-24 23:55:14Z iliaa $ */ +/* $Id: php_zip.c 294817 2010-02-09 17:51:39Z pajoye $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -182,7 +182,7 @@ static int php_zip_extract_file(struct zip * za, char *dest, char *file, int fil len = spprintf(&file_dirname_fullpath, 0, "%s/%s", dest, file_dirname); } - php_basename(path_cleaned, path_cleaned_len, NULL, 0, &file_basename, (unsigned int *)&file_basename_len TSRMLS_CC); + php_basename(path_cleaned, path_cleaned_len, NULL, 0, &file_basename, (size_t *)&file_basename_len TSRMLS_CC); if (OPENBASEDIR_CHECKPATH(file_dirname_fullpath)) { efree(file_dirname_fullpath); @@ -1637,7 +1637,7 @@ static void php_zip_add_from_pattern(INTERNAL_FUNCTION_PARAMETERS, int type) /* file = Z_STRVAL_PP(zval_file); if (remove_all_path) { php_basename(Z_STRVAL_PP(zval_file), Z_STRLEN_PP(zval_file), NULL, 0, - &basename, (unsigned int *)&file_stripped_len TSRMLS_CC); + &basename, (size_t *)&file_stripped_len TSRMLS_CC); file_stripped = basename; } else if (remove_path && strstr(Z_STRVAL_PP(zval_file), remove_path) != NULL) { file_stripped = Z_STRVAL_PP(zval_file) + remove_path_len + 1; @@ -2674,7 +2674,7 @@ static PHP_MINFO_FUNCTION(zip) php_info_print_table_start(); php_info_print_table_row(2, "Zip", "enabled"); - php_info_print_table_row(2, "Extension Version","$Id: php_zip.c 276389 2009-02-24 23:55:14Z iliaa $"); + php_info_print_table_row(2, "Extension Version","$Id: php_zip.c 294817 2010-02-09 17:51:39Z pajoye $"); php_info_print_table_row(2, "Zip version", PHP_ZIP_VERSION_STRING); php_info_print_table_row(2, "Libzip version", "0.9.0"); diff --git a/ext/zip/php_zip.h b/ext/zip/php_zip.h index e75c11814..92374b00b 100644 --- a/ext/zip/php_zip.h +++ b/ext/zip/php_zip.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_zip.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_zip.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_ZIP_H #define PHP_ZIP_H diff --git a/ext/zip/tests/bug47667.phpt b/ext/zip/tests/bug47667.phpt index d0a4566f2..cdbf604d8 100644 --- a/ext/zip/tests/bug47667.phpt +++ b/ext/zip/tests/bug47667.phpt @@ -2,7 +2,7 @@ Bug #47667 (ZipArchive::OVERWRITE seems to have no effect) --SKIPIF-- --FILE-- @@ -33,6 +33,7 @@ if ($zip->open($filename, ZipArchive::CREATE) !== true) { } echo "files: " , $zip->numFiles; +$zip->close(); unlink($filename); diff --git a/ext/zlib/php_zlib.h b/ext/zlib/php_zlib.h index a4271324d..adb2f6eab 100644 --- a/ext/zlib/php_zlib.h +++ b/ext/zlib/php_zlib.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_zlib.h 286751 2009-08-03 18:15:30Z jani $ */ +/* $Id: php_zlib.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_ZLIB_H #define PHP_ZLIB_H diff --git a/ext/zlib/tests/bug_40189.phpt b/ext/zlib/tests/bug_40189.phpt index c4ce13a09..aedf0619a 100644 --- a/ext/zlib/tests/bug_40189.phpt +++ b/ext/zlib/tests/bug_40189.phpt @@ -23,5 +23,5 @@ var_dump(file_get_contents(dirname(__FILE__) . '/test.other')); ?> --EXPECT-- string(40) "AwCFRi98wqppK23l2/7kIY8AlyEdAgAAAEdCTUI=" -bool(false) +int(0) string(0) "" diff --git a/ext/zlib/tests/gzencode_variation1-win32.phpt b/ext/zlib/tests/gzencode_variation1-win32.phpt new file mode 100644 index 000000000..efb223b98 --- /dev/null +++ b/ext/zlib/tests/gzencode_variation1-win32.phpt @@ -0,0 +1,37 @@ +--TEST-- +Test gzencode() function : variation +--SKIPIF-- + +--FILE-- + +===Done=== +--EXPECT-- +*** Testing gzencode() : variation *** + +-- Testing multiple compression -- +string(3658) "1f8b080000000000000b010e07f1f81f8b080000000000000b6d574d6fe4c80dbdeb57d4ad2f3dfe01eb83e1ec22980e309b4562c067b64449159754dafab0b6e7d7e73d96da1e4c72184c4b2ab2c8f7c847fa25baabba98dc1a8b2b7c38bb324b713ee37f757f56cdc5c7f5b17b9d152f923b157c5ae335e0b75fedd0e2d781c6b98ea3a6ee05affe1dfc3a6527f8f09c52dcb38ba38bb5249934d6ecfe1e53a9ab76ff4c342cf2a64ed2028349fc9a8b139755685352acb82b9fbb67f8bade5cdcb698e1fcec94b7ceba3cb897e806cfc8114350dd1ebbdfa35b62d2478b0056d23ed809b9b95d696d91ce2aa97c911e3fa539c43f84c887554a4d125c9e63ff96711cc08c0866263cb37a0bbe2122ae8f6baecb2284abfb4ddf916db8354cddeef37c1afe5fa02fc7afb3db34f5b3acbdf2eb905490d8f38d7468d253a323d5ebb903760d7944d3b2024e834a99ddce77669bdd823cfbb8e899d4ad4c799677452e6029e80023a03b2374005590641f7d3877df2ad09f3c0e82a54d6a5644fd63049a37ed4bc362016fd9f51264f1e5c630727421ae930b7ed416e93e47b7c71a400390361ffbecb7561bb98f69b5da289e91becc27f08b3b724cb8704f9144d366431d0cb870c56b205deaa2e17636063761a911039fb7e4bf9f06c4f0aecd2ec80e8b41831ca7515e31286166458ea3ef71f2ce7cde2ae269c96d60525724a9c9170b713ed5750758f3cd2a361fc8b288fc92358ce884692e8ea0fe59bd969a0da2eed5831b715749eaae7178f3ebd30fb88c92105f367cce2c882955dc6bf8eca0d5d57540b3092894743ba0fd5b2dad021836191f1afc0bba14dde1642cb0b1aa6879c38907dcefa0720082b801bec61417469219175267dfa047df35b0bd1332001c28cdfafd3bcabe91e74368cdd8d8478e494c190e7ee90c67f2bde288e68ab6b15e883c995be4f8feb6c6dda4278e4f38578ddbdc7be36788daf0c3cb1d1819c73822f7000a0d1813fa94153b572315e51343b536bc64977dff163cebfd8418773261f524017e251fccc60ae29a5770ae097594d52e9c1229d87ce967a36401c46b69945afb249d101c9d420ffa9a123e232c20e76467d5d169202a2dd4c582949e013e745df7958d4b0cc4fd4377a737cd4feea7974070000f314d423e0634cb9a618fdf5dc64fd422181fd59c9230c9f6f9d18dc8fc23e9cccbc7188733b04aa57de83ebea0be3633cff5fa1ff83269be7f44f5a8d84550cc703255fd345dd402034d0b3e11a73ec6e3d4a77f4f685b614329f1b3132ae7af33d02e1e55e291fa6574b758d1f0200e7423dbc852211818043a7c9ce80aa9d59fce0401959f5ea2cf71fde90824f8c9192dbe9d329db143794675ddcf257dd7755273b67340414e3ccad12e3f661f8aad9cf9957dc1275d10a51d3934fa81e68dc6768fb8ee23e373936c8e13feab8b0f50d227f7af76f561fb0950f3d099bbc316c3892a42fb36806d8660e800fa4f43fd4b962d2097d71933a54b77ff948677848eb17bb3a88b621682cfb3bbb49cf42fed6b3944124ad8358ca688aa44dd5f2144c7c9ab16f25b9aca9654ef357ec9ad55c40d324d6cc3d9e3920b863c231d31a95d937fb5520f9c816c79b7dcecc593fb9593cc05a51ebb1eeddd5b49eb437769738d0f64adc579d372b8b7f7c0208487ee3915ebf5766e148ebd77cf4e01f3ec285047011e55838968b6494d517fe29224777b24dd3ddf933101695b102e87db805eef291b74dcfd91628fb2a53f93dbd2968ef2e598746c9204f89fba1f0246fc671610a0591806e46a1346f77c40d910a47c5e20ffb23f003c04b648327a4ed98032c1965bd35bb0044f5344248f56fdb99aa61d6451d68e33489a83bffbe6573541b2da5f64681ea12090f778b2075374778810f73965fa3626a9d41f4df2f83f7c34658cec921b5a9bde49dd5007ec882b02adc514f81aa85898b5cc98e1b137733c0a8789b7f5648d2d231b80bf74978f25d61ce08a8abd11801fd8f995e066676307192ff7641f1cc6e0dee68565b8b22ac3889cd067bf732754a6b270af1044c6a8776811a4f6d8bd0477a9f516064201b920b92d7cd4dc7eee13e6b3eb3528a82f9abb3f388ebe6a8f871393461b73816ec54c99d604174bc5a6801de13908f86aea6a7d0fea107d682bcf1ec348b83872e6b8a316ecd02eb8f8dc86a609bf59a2dd03f1dfa4079436d55e24617be1a2854d008b2b2b1705e2078a7f3946318df1c24f6bf70d4b456eca286ec2b585b28262cc048a098c3e2d5f325a92bb36f691afdc14c822da1b116c9c1c07bb362eb0a04b78834c812134230ebf2044ac2e3c0e3ad00f848dc5010f3bf917ec2fc700b7bf26dacea8440620e04f90f4d97d6dd77cfde8a05c7d3930f1e5811fb8ec5c70964dcc8187ec90e32fdd6b64eec7586413b7d55bed65c4cce39a9b6c15e70e9da94e53fc904e6286f01f5b5562c94211befbc23507e01b2a3865e2f45b5d7b591f290087a5605b82495b4e393f31aa5b37211ec40241a746d903c5eebf117a4d3ddb0d000030e1f1820e070000" +===Done=== diff --git a/ext/zlib/zlib.c b/ext/zlib/zlib.c index 8fe31422b..4d1b30a4f 100644 --- a/ext/zlib/zlib.c +++ b/ext/zlib/zlib.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -19,7 +19,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zlib.c 287423 2009-08-17 17:30:32Z jani $ */ +/* $Id: zlib.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -1046,16 +1046,23 @@ static void php_gzip_output_handler(char *output, uint output_len, char **handle do_start = (mode & PHP_OUTPUT_HANDLER_START ? 1 : 0); do_end = (mode & PHP_OUTPUT_HANDLER_END ? 1 : 0); - if (do_start && !SG(headers_sent) && !SG(request_info).no_headers) { - switch (ZLIBG(compression_coding)) { - case CODING_GZIP: - sapi_add_header_ex(ZEND_STRL("Content-Encoding: gzip"), 1, 1 TSRMLS_CC); - break; - case CODING_DEFLATE: - sapi_add_header_ex(ZEND_STRL("Content-Encoding: deflate"), 1, 1 TSRMLS_CC); - break; + if (do_start) { + if (!SG(headers_sent) && !SG(request_info).no_headers) { + switch (ZLIBG(compression_coding)) { + case CODING_GZIP: + sapi_add_header_ex(ZEND_STRL("Content-Encoding: gzip"), 1, 1 TSRMLS_CC); + break; + case CODING_DEFLATE: + sapi_add_header_ex(ZEND_STRL("Content-Encoding: deflate"), 1, 1 TSRMLS_CC); + break; + } + sapi_add_header_ex(ZEND_STRL("Vary: Accept-Encoding"), 1, 1 TSRMLS_CC); + } else { + /* Disable compression if headers can not be set (Fix for bug #49816) */ + ZLIBG(output_compression) = 0; + *handled_output = NULL; + return; } - sapi_add_header_ex(ZEND_STRL("Vary: Accept-Encoding"), 1, 1 TSRMLS_CC); } if (php_deflate_string(output, output_len, handled_output, handled_output_len, do_start, do_end TSRMLS_CC) != SUCCESS) { diff --git a/ext/zlib/zlib_filter.c b/ext/zlib/zlib_filter.c index 45b66a7c9..bda2d9589 100644 --- a/ext/zlib/zlib_filter.c +++ b/ext/zlib/zlib_filter.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zlib_filter.c 287926 2009-08-31 21:18:55Z jani $ */ +/* $Id: zlib_filter.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php.h" #include "php_zlib.h" diff --git a/ext/zlib/zlib_fopen_wrapper.c b/ext/zlib/zlib_fopen_wrapper.c index 465637941..66ab30e6d 100644 --- a/ext/zlib/zlib_fopen_wrapper.c +++ b/ext/zlib/zlib_fopen_wrapper.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zlib_fopen_wrapper.c 274034 2009-01-20 15:41:23Z felipe $ */ +/* $Id: zlib_fopen_wrapper.c 293036 2010-01-03 09:23:27Z sebastian $ */ #define _GNU_SOURCE diff --git a/ltmain.sh b/ltmain.sh index 9e71d27d8..7e2240e98 100644 --- a/ltmain.sh +++ b/ltmain.sh @@ -1,8 +1,8 @@ # 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, 2005 -# Free Software Foundation, Inc. +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, +# 2007, 2008 Free Software Foundation, Inc. # Originally by Gordon Matzigkeit , 1996 # # This program is free software; you can redistribute it and/or modify @@ -43,14 +43,22 @@ EXIT_FAILURE=1 PROGRAM=ltmain.sh PACKAGE=libtool -VERSION=1.5.20 -TIMESTAMP=" (1.1220.2.287 2005/08/31 18:54:15)" - -# 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 +VERSION=1.5.26 +TIMESTAMP=" (1.1220.2.492 2008/01/30 06:40:56)" + +# Be Bourne compatible (taken from Autoconf:_AS_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+"$@"}'='"$@"' setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh # Check that we have a working $echo. if test "X$1" = X--no-reexec; then @@ -105,11 +113,19 @@ esac # 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 +lt_env= +for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES +do + eval "if test \"\${$lt_var+set}\" = set; then + save_$lt_var=\$$lt_var + lt_env=\"$lt_var=\$$lt_var \$lt_env\" + $lt_var=C + export $lt_var + fi" +done + +if test -n "$lt_env"; then + lt_env="env $lt_env" fi # Make sure IFS has a sensible default @@ -132,13 +148,54 @@ run= show="$echo" show_help= execute_dlfiles= +duplicate_deps=no +preserve_args= lo2o="s/\\.lo\$/.${objext}/" o2lo="s/\\.${objext}\$/.lo/" +extracted_archives= +extracted_serial=0 ##################################### # Shell function definitions: # This seems to be the best place for them +# func_mktempdir [string] +# Make a temporary directory that won't clash with other running +# libtool processes, and avoids race conditions if possible. If +# given, STRING is the basename for that directory. +func_mktempdir () +{ + my_template="${TMPDIR-/tmp}/${1-$progname}" + + if test "$run" = ":"; then + # Return a directory name, but don't create it in dry-run mode + my_tmpdir="${my_template}-$$" + else + + # If mktemp works, use that first and foremost + my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` + + if test ! -d "$my_tmpdir"; then + # Failing that, at least try and use $RANDOM to avoid a race + my_tmpdir="${my_template}-${RANDOM-0}$$" + + save_mktempdir_umask=`umask` + umask 0077 + $mkdir "$my_tmpdir" + umask $save_mktempdir_umask + fi + + # If we're not in dry-run mode, bomb out on failure + test -d "$my_tmpdir" || { + $echo "cannot create temporary directory \`$my_tmpdir'" 1>&2 + exit $EXIT_FAILURE + } + fi + + $echo "X$my_tmpdir" | $Xsed +} + + # func_win32_libid arg # return the library type of file 'arg' # @@ -157,12 +214,17 @@ func_win32_libid () 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 + $SED -n -e '1,100{ + / I /{ + s,.*,import, + p + q + } + }'` + case $win32_nmres in + import*) win32_libid_type="x86 archive import";; + *) win32_libid_type="x86 archive static";; + esac fi ;; *DLL*) @@ -289,15 +351,25 @@ func_extract_archives () *) my_xabs=`pwd`"/$my_xlib" ;; esac my_xlib=`$echo "X$my_xlib" | $Xsed -e 's%^.*/%%'` - my_xdir="$my_gentop/$my_xlib" + my_xlib_u=$my_xlib + while :; do + case " $extracted_archives " in + *" $my_xlib_u "*) + extracted_serial=`expr $extracted_serial + 1` + my_xlib_u=lt$extracted_serial-$my_xlib ;; + *) break ;; + esac + done + extracted_archives="$extracted_archives $my_xlib_u" + my_xdir="$my_gentop/$my_xlib_u" $show "${rm}r $my_xdir" $run ${rm}r "$my_xdir" $show "$mkdir $my_xdir" $run $mkdir "$my_xdir" - status=$? - if test "$status" -ne 0 && test ! -d "$my_xdir"; then - exit $status + exit_status=$? + if test "$exit_status" -ne 0 && test ! -d "$my_xdir"; then + exit $exit_status fi case $host in *-darwin*) @@ -352,6 +424,8 @@ func_extract_archives () # Darwin sucks eval std_shrext=\"$shrext_cmds\" +disable_libs=no + # Parse our command line options once, thoroughly. while test "$#" -gt 0 do @@ -414,11 +488,12 @@ do ;; --version) - $echo "$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP" - $echo - $echo "Copyright (C) 2005 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." + echo "\ +$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP + +Copyright (C) 2008 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." exit $? ;; @@ -468,7 +543,11 @@ do preserve_args="$preserve_args $arg" ;; - --tag) prevopt="--tag" prev=tag ;; + --tag) + prevopt="--tag" + prev=tag + preserve_args="$preserve_args --tag" + ;; --tag=*) set tag "$optarg" ${1+"$@"} shift @@ -500,6 +579,18 @@ if test -n "$prevopt"; then exit $EXIT_FAILURE fi +case $disable_libs in +no) + ;; +shared) + build_libtool_libs=no + build_old_libs=yes + ;; +static) + build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` + ;; +esac + # 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. @@ -699,9 +790,11 @@ if test -z "$show_help"; then *.class) xform=class ;; *.cpp) xform=cpp ;; *.cxx) xform=cxx ;; - *.f90) xform=f90 ;; + *.[fF][09]?) xform=[fF][09]. ;; *.for) xform=for ;; *.java) xform=java ;; + *.obj) xform=obj ;; + *.sx) xform=sx ;; esac libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"` @@ -856,21 +949,22 @@ EOF 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 + exit_status=$? + if test "$exit_status" -ne 0 && test ! -d "${xdir}$objdir"; then + exit $exit_status fi fi if test -z "$output_obj"; then + $run $rm "$lobj" # Place PIC objects in $objdir command="$command -o $lobj" + else + $run $rm "$lobj" "$output_obj" fi - $run $rm "$lobj" "$output_obj" - $show "$command" - if $run eval "$command"; then : + if $run eval $lt_env "$command"; then : else test -n "$output_obj" && $run $rm $removelist exit $EXIT_FAILURE @@ -942,7 +1036,7 @@ EOF command="$command$suppress_output" $run $rm "$obj" "$output_obj" $show "$command" - if $run eval "$command"; then : + if $run eval $lt_env "$command"; then : else $run $rm $removelist exit $EXIT_FAILURE @@ -1061,6 +1155,7 @@ EOF no_install=no objs= non_pic_objects= + notinst_path= # paths that contain not-installed libtool libraries precious_files_regex= prefer_static_libs=no preload=no @@ -1074,6 +1169,7 @@ EOF thread_safe=no vinfo= vinfo_number=no + single_module="${wl}-single_module" func_infer_tag $base_compile @@ -1081,22 +1177,32 @@ EOF for arg do case $arg in - -all-static | -static) - if test "X$arg" = "X-all-static"; then + -all-static | -static | -static-libtool-libs) + case $arg in + -all-static) 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 + prefer_static_libs=yes + ;; + -static) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi - fi + prefer_static_libs=built + ;; + -static-libtool-libs) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + esac build_libtool_libs=no build_old_libs=yes - prefer_static_libs=yes break ;; esac @@ -1271,6 +1377,11 @@ EOF if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object="$pic_object" + non_pic_objects="$non_pic_objects $non_pic_object" fi else # Only an error if not doing a dry-run. @@ -1354,8 +1465,8 @@ EOF prev= continue ;; - darwin_framework) - compiler_flags="$compiler_flags $arg" + darwin_framework|darwin_framework_skip) + test "$prev" = "darwin_framework" && compiler_flags="$compiler_flags $arg" compile_command="$compile_command $arg" finalize_command="$finalize_command $arg" prev= @@ -1419,13 +1530,17 @@ EOF continue ;; - -framework|-arch) - prev=darwin_framework - compiler_flags="$compiler_flags $arg" + -framework|-arch|-isysroot) + case " $CC " in + *" ${arg} ${1} "* | *" ${arg} ${1} "*) + prev=darwin_framework_skip ;; + *) compiler_flags="$compiler_flags $arg" + prev=darwin_framework ;; + esac compile_command="$compile_command $arg" finalize_command="$finalize_command $arg" - continue - ;; + continue + ;; -inst-prefix-dir) prev=inst_prefix @@ -1453,7 +1568,8 @@ EOF absdir=`cd "$dir" && pwd` if test -z "$absdir"; then $echo "$modename: cannot determine absolute directory name of \`$dir'" 1>&2 - exit $EXIT_FAILURE + absdir="$dir" + notinst_path="$notinst_path $dir" fi dir="$absdir" ;; @@ -1467,10 +1583,15 @@ EOF esac case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) + testbindir=`$echo "X$dir" | $Xsed -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$dir:"*) ;; *) dllsearchpath="$dllsearchpath:$dir";; esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + *) dllsearchpath="$dllsearchpath:$testbindir";; + esac ;; esac continue @@ -1479,11 +1600,11 @@ EOF -l*) if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then case $host in - *-*-cygwin* | *-*-pw32* | *-*-beos*) + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos*) # These systems don't actually have a C or math library (as such) continue ;; - *-*-mingw* | *-*-os2*) + *-*-os2*) # These systems don't actually have a C library (as such) test "X$arg" = "X-lc" && continue ;; @@ -1495,6 +1616,15 @@ EOF # Rhapsody C and math libraries are in the System framework deplibs="$deplibs -framework System" continue + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + test "X$arg" = "X-lc" && continue + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + test "X$arg" = "X-lc" && continue + ;; esac elif test "X$arg" = "X-lc_r"; then case $host in @@ -1518,13 +1648,18 @@ EOF continue ;; - -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe) + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) compiler_flags="$compiler_flags $arg" compile_command="$compile_command $arg" finalize_command="$finalize_command $arg" continue ;; + -multi_module) + single_module="${wl}-multi_module" + continue + ;; + -module) module=yes continue @@ -1536,7 +1671,13 @@ EOF # +DA*, +DD* enable 64-bit mode on the HP compiler # -q* pass through compiler args for the IBM compiler # -m* pass through architecture-specific compiler args for GCC - -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*) + # -m*, -t[45]*, -txscale* pass through architecture-specific + # compiler args for GCC + # -p, -pg, --coverage, -fprofile-* pass through profiling flag for GCC + # -F/path gives path to uninstalled frameworks, gcc on darwin + # @file GCC response files + -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ + -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. @@ -1548,9 +1689,7 @@ EOF esac compile_command="$compile_command $arg" finalize_command="$finalize_command $arg" - if test "$with_gcc" = "yes" ; then - compiler_flags="$compiler_flags $arg" - fi + compiler_flags="$compiler_flags $arg" continue ;; @@ -1566,9 +1705,9 @@ EOF -no-install) case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin*) # The PATH hackery in wrapper scripts is required on Windows - # in order for the loader to find any dlls it needs. + # and Darwin 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 @@ -1627,7 +1766,7 @@ EOF continue ;; - -static) + -static | -static-libtool-libs) # 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 @@ -1788,6 +1927,11 @@ EOF if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object="$pic_object" + non_pic_objects="$non_pic_objects $non_pic_object" fi else # Only an error if not doing a dry-run. @@ -1893,9 +2037,9 @@ EOF 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 + exit_status=$? + if test "$exit_status" -ne 0 && test ! -d "$output_objdir"; then + exit $exit_status fi fi @@ -1958,7 +2102,6 @@ EOF 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" @@ -2005,7 +2148,7 @@ EOF lib= found=no case $deplib in - -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe) + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" @@ -2020,7 +2163,12 @@ EOF 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 + if test "$linkmode" = lib; then + searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" + else + searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" + fi + for searchdir in $searchdirs; do for search_ext in .la $std_shrext .so .a; do # Search the libtool library lib="$searchdir/lib${name}${search_ext}" @@ -2194,7 +2342,7 @@ EOF esac # case $deplib if test "$found" = yes || test -f "$lib"; then : else - $echo "$modename: cannot find the library \`$lib'" 1>&2 + $echo "$modename: cannot find the library \`$lib' or unhandled argument \`$deplib'" 1>&2 exit $EXIT_FAILURE fi @@ -2401,7 +2549,9 @@ EOF if test "$linkmode,$pass" = "prog,link"; then if test -n "$library_names" && - { test "$prefer_static_libs" = no || test -z "$old_library"; }; then + { { test "$prefer_static_libs" = no || + test "$prefer_static_libs,$installed" = "built,yes"; } || + test -z "$old_library"; }; then # We need to hardcode the library path if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then # Make sure the rpath contains only unique directories. @@ -2445,8 +2595,12 @@ EOF fi link_static=no # Whether the deplib will be linked statically + use_static_libs=$prefer_static_libs + if test "$use_static_libs" = built && test "$installed" = yes ; then + use_static_libs=no + fi if test -n "$library_names" && - { test "$prefer_static_libs" = no || test -z "$old_library"; }; then + { test "$use_static_libs" = no || test -z "$old_library"; }; then if test "$installed" = no; then notinst_deplibs="$notinst_deplibs $lib" need_relink=yes @@ -2559,11 +2713,15 @@ EOF if test "$hardcode_direct" = no; then add="$dir/$linklib" case $host in - *-*-sco3.2v5* ) add_dir="-L$dir" ;; + *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; + *-*-sysv4*uw2*) add_dir="-L$dir" ;; + *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ + *-*-unixware7*) 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 + 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 @@ -2806,12 +2964,18 @@ EOF # 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` + eval deplibdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` if test -n "$deplibrary_names" ; then for tmp in $deplibrary_names ; do depdepl=$tmp done - if test -f "$path/$depdepl" ; then + if test -f "$deplibdir/$depdepl" ; then + depdepl="$deplibdir/$depdepl" + elif test -f "$path/$depdepl" ; then depdepl="$path/$depdepl" + else + # Can't find it, oh well... + depdepl= fi # do not add paths which are already there case " $newlib_search_path " in @@ -2959,9 +3123,10 @@ EOF case $linkmode in oldlib) - if test -n "$deplibs"; then - $echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2 - fi + case " $deplibs" in + *\ -l* | *\ -L*) + $echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2 ;; + esac if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then $echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2 @@ -3089,7 +3254,7 @@ EOF # which has an extra 1 added just for fun # case $version_type in - darwin|linux|osf|windows) + darwin|linux|osf|windows|none) current=`expr $number_major + $number_minor` age="$number_minor" revision="$number_revision" @@ -3100,9 +3265,10 @@ EOF age="0" ;; irix|nonstopux) - current=`expr $number_major + $number_minor - 1` + current=`expr $number_major + $number_minor` age="$number_minor" revision="$number_minor" + lt_irix_increment=no ;; esac ;; @@ -3161,7 +3327,8 @@ EOF versuffix="$major.$age.$revision" # Darwin ld doesn't like 0 for these options... minor_current=`expr $current + 1` - verstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" + xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" ;; freebsd-aout) @@ -3175,8 +3342,11 @@ EOF ;; irix | nonstopux) - major=`expr $current - $age + 1` - + if test "X$lt_irix_increment" = "Xno"; then + major=`expr $current - $age` + else + major=`expr $current - $age + 1` + fi case $version_type in nonstopux) verstring_prefix=nonstopux ;; *) verstring_prefix=sgi ;; @@ -3313,11 +3483,11 @@ EOF 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 + #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. @@ -3369,7 +3539,12 @@ EOF ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. - test "X$arg" = "X-lc" && continue + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work ;; *) # Add libc to deplibs on all other systems if necessary. @@ -3413,13 +3588,12 @@ EOF int main() { return 0; } EOF $rm conftest - $LTCC -o conftest conftest.c $deplibs - if test "$?" -eq 0 ; then + if $LTCC $LTCFLAGS -o conftest conftest.c $deplibs; 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 "$name" != "" && test "$name" != "0"; then if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $i "*) @@ -3458,9 +3632,7 @@ EOF # 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 + if $LTCC $LTCFLAGS -o conftest conftest.c $i; then ldd_output=`ldd conftest` if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in @@ -3492,7 +3664,7 @@ EOF 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 "*** 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 @@ -3705,6 +3877,35 @@ EOF deplibs=$newdeplibs fi + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $deplibs " in + *" -L$path/$objdir "*) + new_libs="$new_libs -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$new_libs $deplib" ;; + esac + ;; + *) new_libs="$new_libs $deplib" ;; + esac + done + deplibs="$new_libs" + + # All the library-specific variables (install_libdir is set above). library_names= old_library= @@ -3749,7 +3950,10 @@ EOF 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\" + case $archive_cmds in + *\$LD*) eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\" ;; + *) eval dep_rpath=\"$hardcode_libdir_flag_spec\" ;; + esac else eval dep_rpath=\"$hardcode_libdir_flag_spec\" fi @@ -3788,6 +3992,7 @@ EOF fi lib="$output_objdir/$realname" + linknames= for link do linknames="$linknames $link" @@ -4058,9 +4263,10 @@ EOF ;; obj) - if test -n "$deplibs"; then - $echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2 - fi + case " $deplibs" in + *\ -l* | *\ -L*) + $echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2 ;; + esac if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then $echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2 @@ -4107,12 +4313,14 @@ EOF reload_conv_objs= gentop= # reload_cmds runs $LD directly, so let us get rid of - # -Wl from whole_archive_flag_spec + # -Wl from whole_archive_flag_spec and hope we can get by with + # turning comma into space.. wl= if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then - eval reload_conv_objs=\"\$reload_objs $whole_archive_flag_spec\" + eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" + reload_conv_objs=$reload_objs\ `$echo "X$tmp_whole_archive_flags" | $Xsed -e 's|,| |g'` else gentop="$output_objdir/${obj}x" generated="$generated $gentop" @@ -4219,6 +4427,35 @@ EOF ;; esac + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $compile_deplibs " in + *" -L$path/$objdir "*) + new_libs="$new_libs -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $compile_deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$new_libs $deplib" ;; + esac + ;; + *) new_libs="$new_libs $deplib" ;; + esac + done + compile_deplibs="$new_libs" + + compile_command="$compile_command $compile_deplibs" finalize_command="$finalize_command $finalize_deplibs" @@ -4263,10 +4500,15 @@ EOF fi case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) + testbindir=`$echo "X$libdir" | $Xsed -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$libdir:"*) ;; *) dllsearchpath="$dllsearchpath:$libdir";; esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + *) dllsearchpath="$dllsearchpath:$testbindir";; + esac ;; esac done @@ -4383,10 +4625,22 @@ extern \"C\" { export_symbols="$output_objdir/$outputname.exp" $run $rm $export_symbols $run eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + case $host in + *cygwin* | *mingw* ) + $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + $run eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' + ;; + esac else - $run eval "${SED} -e 's/\([ ][.*^$]\)/\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' + $run eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' $run eval 'grep -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' $run eval 'mv "$nlist"T "$nlist"' + case $host in + *cygwin* | *mingw* ) + $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + $run eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' + ;; + esac fi fi @@ -4503,16 +4757,29 @@ static const void *lt_preloaded_setup() { 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 $? + $show "(cd $output_objdir && $LTCC $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")" + $run eval '(cd $output_objdir && $LTCC $LTCFLAGS -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}%"` + case $host in + *cygwin* | *mingw* ) + if test -f "$output_objdir/${outputname}.def" ; then + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%" | $NL2SP` + finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%" | $NL2SP` + else + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` + finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` + fi + ;; + * ) + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` + finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` + ;; + esac ;; *) $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2 @@ -4525,19 +4792,19 @@ static const void *lt_preloaded_setup() { # 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@%%"` + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s% @SYMFILE@%%" | $NL2SP` + finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s% @SYMFILE@%%" | $NL2SP` 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'` + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e 's%@OUTPUT@%'"$output"'%g' | $NL2SP` link_command="$compile_command$compile_rpath" # We have no uninstalled library dependencies, so finalize right now. $show "$link_command" $run eval "$link_command" - status=$? + exit_status=$? # Delete the generated files. if test -n "$dlsyms"; then @@ -4545,7 +4812,7 @@ static const void *lt_preloaded_setup() { $run $rm "$output_objdir/${outputname}S.${objext}" fi - exit $status + exit $exit_status fi if test -n "$shlibpath_var"; then @@ -4618,7 +4885,7 @@ static const void *lt_preloaded_setup() { 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'` + relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $SP2NL | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g' | $NL2SP` else # fast_install is set to needless relink_command= @@ -4655,7 +4922,7 @@ static const void *lt_preloaded_setup() { fi done relink_command="(cd `pwd`; $relink_command)" - relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"` + relink_command=`$echo "X$relink_command" | $SP2NL | $Xsed -e "$sed_quote_subst" | $NL2SP` fi # Quote $echo for shipping. @@ -4685,10 +4952,12 @@ static const void *lt_preloaded_setup() { esac case $host in *cygwin* | *mingw* ) - cwrappersource=`$echo ${objdir}/lt-${outputname}.c` - cwrapper=`$echo ${output}.exe` - $rm $cwrappersource $cwrapper - trap "$rm $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 + output_name=`basename $output` + output_path=`dirname $output` + cwrappersource="$output_path/$objdir/lt-$output_name.c" + cwrapper="$output_path/$output_name.exe" + $rm $cwrappersource $cwrapper + trap "$rm $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 cat > $cwrappersource < #include #include +#include +#include +#include #if defined(PATH_MAX) # define LT_PATHMAX PATH_MAX @@ -4723,15 +4995,19 @@ EOF #endif #ifndef DIR_SEPARATOR -#define DIR_SEPARATOR '/' +# define DIR_SEPARATOR '/' +# define PATH_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 +# define HAVE_DOS_BASED_FILE_SYSTEM +# ifndef DIR_SEPARATOR_2 +# define DIR_SEPARATOR_2 '\\' +# endif +# ifndef PATH_SEPARATOR_2 +# define PATH_SEPARATOR_2 ';' +# endif #endif #ifndef DIR_SEPARATOR_2 @@ -4741,17 +5017,32 @@ EOF (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) #endif /* DIR_SEPARATOR_2 */ +#ifndef PATH_SEPARATOR_2 +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) +#else /* PATH_SEPARATOR_2 */ +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) +#endif /* PATH_SEPARATOR_2 */ + #define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) #define XFREE(stale) do { \ if (stale) { free ((void *) stale); stale = 0; } \ } while (0) +/* -DDEBUG is fairly common in CFLAGS. */ +#undef DEBUG +#if defined DEBUGWRAPPER +# define DEBUG(format, ...) fprintf(stderr, format, __VA_ARGS__) +#else +# define DEBUG(format, ...) +#endif + 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); +const char * base_name (const char *name); +char * find_executable(const char *wrapper); +int check_executable(const char *path); char * strendzap(char *str, const char *pat); void lt_fatal (const char *message, ...); @@ -4761,29 +5052,50 @@ main (int argc, char *argv[]) char **newargz; int i; - program_name = (char *) xstrdup ((char *) basename (argv[0])); + program_name = (char *) xstrdup (base_name (argv[0])); + DEBUG("(main) argv[0] : %s\n",argv[0]); + DEBUG("(main) program_name : %s\n",program_name); newargz = XMALLOC(char *, argc+2); EOF - cat >> $cwrappersource <> $cwrappersource <> $cwrappersource <<"EOF" - newargz[1] = fnqualify(argv[0]); + cat >> $cwrappersource <<"EOF" + newargz[1] = find_executable(argv[0]); + if (newargz[1] == NULL) + lt_fatal("Couldn't find %s", argv[0]); + DEBUG("(main) found exe at : %s\n",newargz[1]); /* 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; + + for (i=0; i> $cwrappersource <> $cwrappersource <> $cwrappersource <> $cwrappersource <<"EOF" + cat >> $cwrappersource <<"EOF" return 127; } @@ -4804,48 +5116,148 @@ xstrdup (const char *string) ; } -char * -basename (const char *name) +const char * +base_name (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] == ':') + if (isalpha ((unsigned char)name[0]) && name[1] == ':') name += 2; #endif for (base = name; *name; name++) if (IS_DIR_SEPARATOR (*name)) base = name + 1; - return (char *) base; + return base; } +int +check_executable(const char * path) +{ + struct stat st; + + DEBUG("(check_executable) : %s\n", path ? (*path ? path : "EMPTY!") : "NULL!"); + if ((!path) || (!*path)) + return 0; + + if ((stat (path, &st) >= 0) && + ( + /* MinGW & native WIN32 do not support S_IXOTH or S_IXGRP */ +#if defined (S_IXOTH) + ((st.st_mode & S_IXOTH) == S_IXOTH) || +#endif +#if defined (S_IXGRP) + ((st.st_mode & S_IXGRP) == S_IXGRP) || +#endif + ((st.st_mode & S_IXUSR) == S_IXUSR)) + ) + return 1; + else + return 0; +} + +/* Searches for the full path of the wrapper. Returns + newly allocated full path name if found, NULL otherwise */ char * -fnqualify(const char *path) +find_executable (const char* wrapper) { - size_t size; - char *p; + int has_slash = 0; + const char* p; + const char* p_next; + /* static buffer for getcwd */ char tmp[LT_PATHMAX + 1]; + int tmp_len; + char* concat_name; + + DEBUG("(find_executable) : %s\n", wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!"); - assert(path != NULL); + if ((wrapper == NULL) || (*wrapper == '\0')) + return NULL; - /* Is it qualified already? */ + /* Absolute path? */ #if defined (HAVE_DOS_BASED_FILE_SYSTEM) - if (isalpha (path[0]) && path[1] == ':') - return xstrdup (path); + if (isalpha ((unsigned char)wrapper[0]) && wrapper[1] == ':') + { + concat_name = xstrdup (wrapper); + if (check_executable(concat_name)) + return concat_name; + XFREE(concat_name); + } + else + { +#endif + if (IS_DIR_SEPARATOR (wrapper[0])) + { + concat_name = xstrdup (wrapper); + if (check_executable(concat_name)) + return concat_name; + XFREE(concat_name); + } +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + } #endif - if (IS_DIR_SEPARATOR (path[0])) - return xstrdup (path); - /* prepend the current directory */ - /* doesn't handle '~' */ + for (p = wrapper; *p; p++) + if (*p == '/') + { + has_slash = 1; + break; + } + if (!has_slash) + { + /* no slashes; search PATH */ + const char* path = getenv ("PATH"); + if (path != NULL) + { + for (p = path; *p; p = p_next) + { + const char* q; + size_t p_len; + for (q = p; *q; q++) + if (IS_PATH_SEPARATOR(*q)) + break; + p_len = q - p; + p_next = (*q == '\0' ? q : q + 1); + if (p_len == 0) + { + /* empty path: current directory */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal ("getcwd failed"); + tmp_len = strlen(tmp); + concat_name = XMALLOC(char, tmp_len + 1 + strlen(wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + } + else + { + concat_name = XMALLOC(char, p_len + 1 + strlen(wrapper) + 1); + memcpy (concat_name, p, p_len); + concat_name[p_len] = '/'; + strcpy (concat_name + p_len + 1, wrapper); + } + if (check_executable(concat_name)) + return concat_name; + XFREE(concat_name); + } + } + /* not found in PATH; assume curdir */ + } + /* Relative path | not found in path: prepend cwd */ 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; + tmp_len = strlen(tmp); + concat_name = XMALLOC(char, tmp_len + 1 + strlen(wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + + if (check_executable(concat_name)) + return concat_name; + XFREE(concat_name); + return NULL; } char * @@ -4889,16 +5301,16 @@ lt_fatal (const char *message, ...) 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 + # 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 $LTCFLAGS -s -o $cwrapper $cwrappersource + ;; + esac + $rm $output + trap "$rm $output; exit $EXIT_FAILURE" 1 2 15 $echo > $output "\ #! $SHELL @@ -4917,6 +5329,20 @@ EOF Xsed='${SED} -e 1s/^X//' sed_quote_subst='$sed_quote_subst' +# Be Bourne compatible (taken from Autoconf:_AS_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+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH @@ -5059,7 +5485,7 @@ else ;; esac $echo >> $output "\ - \$echo \"\$0: cannot exec \$program \${1+\"\$@\"}\" + \$echo \"\$0: cannot exec \$program \$*\" exit $EXIT_FAILURE fi else @@ -5128,9 +5554,9 @@ fi\ $run ${rm}r "$gentop" $show "$mkdir $gentop" $run $mkdir "$gentop" - status=$? - if test "$status" -ne 0 && test ! -d "$gentop"; then - exit $status + exit_status=$? + if test "$exit_status" -ne 0 && test ! -d "$gentop"; then + exit $exit_status fi fi @@ -5245,7 +5671,7 @@ 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"` + relink_command=`$echo "X$relink_command" | $SP2NL | $Xsed -e "$sed_quote_subst" | $NL2SP` if test "$hardcode_automatic" = yes ; then relink_command= fi @@ -5590,9 +6016,9 @@ relink_command=\"$relink_command\"" 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%"` + relink_command=`$echo "$relink_command" | $SP2NL | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%" | $NL2SP` else - relink_command=`$echo "$relink_command" | $SED "s%@inst_prefix_dir@%%"` + relink_command=`$echo "$relink_command" | $SP2NL | $SED "s%@inst_prefix_dir@%%" | $NL2SP` fi $echo "$modename: warning: relinking \`$file'" 1>&2 @@ -5797,22 +6223,11 @@ relink_command=\"$relink_command\"" 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 + tmpdir=`func_mktempdir` 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'` + relink_command=`$echo "X$relink_command" | $SP2NL | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g' | $NL2SP` $show "$relink_command" if $run eval "$relink_command"; then : @@ -5932,7 +6347,7 @@ relink_command=\"$relink_command\"" # Exit here if they wanted silent mode. test "$show" = : && exit $EXIT_SUCCESS - $echo "----------------------------------------------------------------------" + $echo "X----------------------------------------------------------------------" | $Xsed $echo "Libraries have been installed in:" for libdir in $libdirs; do $echo " $libdir" @@ -5965,7 +6380,7 @@ relink_command=\"$relink_command\"" $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 "----------------------------------------------------------------------" + $echo "X----------------------------------------------------------------------" | $Xsed exit $EXIT_SUCCESS ;; @@ -6023,8 +6438,10 @@ relink_command=\"$relink_command\"" 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 + if test ! -f "$dir/$dlname"; then + $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2 + exit $EXIT_FAILURE + fi fi ;; @@ -6088,12 +6505,12 @@ relink_command=\"$relink_command\"" 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 + for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES + do + eval "if test \"\${save_$lt_var+set}\" = set; then + $lt_var=\$save_$lt_var; export $lt_var + fi" + done # Now prepare to actually exec the command. exec_cmd="\$cmd$args" @@ -6182,9 +6599,17 @@ relink_command=\"$relink_command\"" 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 + case "$mode" in + clean) + case " $library_names " in + # " " in the beginning catches empty $dlname + *" $dlname "*) ;; + *) rmfiles="$rmfiles $objdir/$dlname" ;; + esac + test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i" + ;; + uninstall) if test -n "$library_names"; then # Do each command in the postuninstall commands. cmds=$postuninstall_cmds @@ -6217,7 +6642,8 @@ relink_command=\"$relink_command\"" IFS="$save_ifs" fi # FIXME: should reinstall the best remaining shared library. - fi + ;; + esac fi ;; @@ -6441,9 +6867,9 @@ The following components of LINK-COMMAND are treated specially: -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 + try to export only the symbols listed in SYMFILE -export-symbols-regex REGEX - try to export only the symbols matching 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 @@ -6457,9 +6883,11 @@ The following components of LINK-COMMAND are treated specially: -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 + -static do not do any dynamic linking of uninstalled libtool libraries + -static-libtool-libs + do not do any dynamic linking of libtool libraries -version-info CURRENT[:REVISION[:AGE]] - specify library version info [each variable defaults to 0] + specify library version info [each variable defaults to 0] All other options (arguments beginning with \`-') are ignored. @@ -6516,12 +6944,11 @@ exit $? # 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 +disable_libs=shared # ### 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` +disable_libs=static # ### END LIBTOOL TAG CONFIG: disable-static # Local Variables: diff --git a/main/SAPI.c b/main/SAPI.c index a4a8ed787..e6537fda8 100644 --- a/main/SAPI.c +++ b/main/SAPI.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: SAPI.c 287423 2009-08-17 17:30:32Z jani $ */ +/* $Id: SAPI.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include #include diff --git a/main/SAPI.h b/main/SAPI.h index b978bc438..2e185cb01 100644 --- a/main/SAPI.h +++ b/main/SAPI.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: SAPI.h 279522 2009-04-28 21:30:23Z stas $ */ +/* $Id: SAPI.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef SAPI_H #define SAPI_H diff --git a/main/build-defs.h.in b/main/build-defs.h.in index 5be687988..121536e78 100644 --- a/main/build-defs.h.in +++ b/main/build-defs.h.in @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: build-defs.h.in 256027 2008-03-25 02:00:32Z sixd $ */ +/* $Id: build-defs.h.in 292156 2009-12-15 11:17:47Z jani $ */ #define CONFIGURE_COMMAND "@CONFIGURE_COMMAND@" #define PHP_ADA_INCLUDE "" @@ -80,6 +80,7 @@ #define PHP_EXTENSION_DIR "@EXPANDED_EXTENSION_DIR@" #define PHP_PREFIX "@prefix@" #define PHP_BINDIR "@EXPANDED_BINDIR@" +#define PHP_SBINDIR "@EXPANDED_SBINDIR@" #define PHP_LIBDIR "@EXPANDED_LIBDIR@" #define PHP_DATADIR "@EXPANDED_DATADIR@" #define PHP_SYSCONFDIR "@EXPANDED_SYSCONFDIR@" diff --git a/main/fopen_wrappers.c b/main/fopen_wrappers.c index 3d65c85d7..20fca2891 100644 --- a/main/fopen_wrappers.c +++ b/main/fopen_wrappers.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: fopen_wrappers.c 289428 2009-10-09 17:03:56Z pajoye $ */ +/* $Id: fopen_wrappers.c 293036 2010-01-03 09:23:27Z sebastian $ */ /* {{{ includes */ @@ -386,16 +386,16 @@ PHPAPI int php_fopen_primary_script(zend_file_handle *file_handle TSRMLS_DC) #ifndef PHP_WIN32 struct stat st; #endif - char *path_info, *filename; + char *path_info; + char *filename = NULL; + char *resolved_path = NULL; int length; - filename = SG(request_info).path_translated; path_info = SG(request_info).request_uri; #if HAVE_PWD_H if (PG(user_dir) && *PG(user_dir) && path_info && '/' == path_info[0] && '~' == path_info[1]) { char *s = strchr(path_info + 2, '/'); - filename = NULL; /* discard the original filename, it must not be used */ if (s) { /* if there is no path name after the file, do not bother */ char user[32]; /* to try open the directory */ struct passwd *pw; @@ -426,39 +426,41 @@ PHPAPI int php_fopen_primary_script(zend_file_handle *file_handle TSRMLS_DC) #endif if (pw && pw->pw_dir) { spprintf(&filename, 0, "%s%c%s%c%s", pw->pw_dir, PHP_DIR_SEPARATOR, PG(user_dir), PHP_DIR_SEPARATOR, s + 1); /* Safe */ - STR_FREE(SG(request_info).path_translated); - SG(request_info).path_translated = filename; - } + } else { + filename = SG(request_info).path_translated; + } #if defined(ZTS) && defined(HAVE_GETPWNAM_R) && defined(_SC_GETPW_R_SIZE_MAX) efree(pwbuf); #endif } } else #endif - if (PG(doc_root) && path_info) { - length = strlen(PG(doc_root)); - if (IS_ABSOLUTE_PATH(PG(doc_root), length)) { - filename = emalloc(length + strlen(path_info) + 2); - if (filename) { - memcpy(filename, PG(doc_root), length); - if (!IS_SLASH(filename[length - 1])) { /* length is never 0 */ - filename[length++] = PHP_DIR_SEPARATOR; - } - if (IS_SLASH(path_info[0])) { - length--; - } - strcpy(filename + length, path_info); - STR_FREE(SG(request_info).path_translated); - SG(request_info).path_translated = filename; + if (PG(doc_root) && path_info && (length = strlen(PG(doc_root)) && + IS_ABSOLUTE_PATH(PG(doc_root), length))) { + filename = emalloc(length + strlen(path_info) + 2); + if (filename) { + memcpy(filename, PG(doc_root), length); + if (!IS_SLASH(filename[length - 1])) { /* length is never 0 */ + filename[length++] = PHP_DIR_SEPARATOR; } + if (IS_SLASH(path_info[0])) { + length--; + } + strcpy(filename + length, path_info); } - } /* if doc_root && path_info */ + } else { + filename = SG(request_info).path_translated; + } + if (filename) { - filename = zend_resolve_path(filename, strlen(filename) TSRMLS_CC); + resolved_path = zend_resolve_path(filename, strlen(filename) TSRMLS_CC); } - if (!filename) { + if (!resolved_path) { + if (SG(request_info).path_translated != filename) { + STR_FREE(filename); + } /* we have to free SG(request_info).path_translated here because * php_destroy_request_info assumes that it will get * freed when the include_names hash is emptied, but @@ -467,7 +469,7 @@ PHPAPI int php_fopen_primary_script(zend_file_handle *file_handle TSRMLS_DC) SG(request_info).path_translated = NULL; return FAILURE; } - fp = VCWD_FOPEN(filename, "rb"); + fp = VCWD_FOPEN(resolved_path, "rb"); #ifndef PHP_WIN32 /* refuse to open anything that is not a regular file */ @@ -478,15 +480,20 @@ PHPAPI int php_fopen_primary_script(zend_file_handle *file_handle TSRMLS_DC) #endif if (!fp) { + if (SG(request_info).path_translated != filename) { + STR_FREE(filename); + } STR_FREE(SG(request_info).path_translated); /* for same reason as above */ SG(request_info).path_translated = NULL; return FAILURE; } - file_handle->opened_path = expand_filepath(filename, NULL TSRMLS_CC); + file_handle->opened_path = resolved_path; - STR_FREE(SG(request_info).path_translated); /* for same reason as above */ - SG(request_info).path_translated = filename; + if (SG(request_info).path_translated != filename) { + STR_FREE(SG(request_info).path_translated); /* for same reason as above */ + SG(request_info).path_translated = filename; + } file_handle->filename = SG(request_info).path_translated; file_handle->free_filename = 0; diff --git a/main/fopen_wrappers.h b/main/fopen_wrappers.h index 36db81594..a9b191124 100644 --- a/main/fopen_wrappers.h +++ b/main/fopen_wrappers.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: fopen_wrappers.h 273621 2009-01-16 10:06:10Z pajoye $ */ +/* $Id: fopen_wrappers.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef FOPEN_WRAPPERS_H #define FOPEN_WRAPPERS_H diff --git a/main/getopt.c b/main/getopt.c index 3eb9ecfb8..55f75b2ea 100644 --- a/main/getopt.c +++ b/main/getopt.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: getopt.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: getopt.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include #include diff --git a/main/internal_functions_nw.c b/main/internal_functions_nw.c index da63dd4ae..a508df733 100644 --- a/main/internal_functions_nw.c +++ b/main/internal_functions_nw.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: internal_functions_nw.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: internal_functions_nw.c 293036 2010-01-03 09:23:27Z sebastian $ */ /* {{{ includes */ diff --git a/main/internal_functions_win32.c b/main/internal_functions_win32.c index f99c16f8e..ff531ac41 100644 --- a/main/internal_functions_win32.c +++ b/main/internal_functions_win32.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: internal_functions_win32.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: internal_functions_win32.c 293036 2010-01-03 09:23:27Z sebastian $ */ /* {{{ includes */ diff --git a/main/logos.h b/main/logos.h index 3c1d55bfc..04202da8c 100644 --- a/main/logos.h +++ b/main/logos.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: logos.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: logos.h 293036 2010-01-03 09:23:27Z sebastian $ */ #define CONTEXT_TYPE_IMAGE_GIF "Content-Type: image/gif" diff --git a/main/main.c b/main/main.c index acd0f4c52..8970d06af 100644 --- a/main/main.c +++ b/main/main.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: main.c 290034 2009-10-28 15:19:32Z pajoye $ */ +/* $Id: main.c 294507 2010-02-04 09:21:02Z pajoye $ */ /* {{{ includes */ @@ -244,12 +244,13 @@ static void php_disable_classes(TSRMLS_D) */ static PHP_INI_MH(OnUpdateTimeout) { - EG(timeout_seconds) = atoi(new_value); if (stage==PHP_INI_STAGE_STARTUP) { /* Don't set a timeout on startup, only per-request */ + EG(timeout_seconds) = atoi(new_value); return SUCCESS; } zend_unset_timeout(TSRMLS_C); + EG(timeout_seconds) = atoi(new_value); zend_set_timeout(EG(timeout_seconds), 0); return SUCCESS; } @@ -847,6 +848,27 @@ PHPAPI void php_error_docref2(const char *docref TSRMLS_DC, const char *param1, } /* }}} */ +#ifdef PHP_WIN32 +#define PHP_WIN32_ERROR_MSG_BUFFER_SIZE 512 +PHPAPI void php_win32_docref2_from_error(DWORD error, const char *param1, const char *param2 TSRMLS_DC) { + if (error == 0) { + php_error_docref2(NULL TSRMLS_CC, param1, param2, E_WARNING, "%s", strerror(errno)); + } else { + char buf[PHP_WIN32_ERROR_MSG_BUFFER_SIZE + 1]; + int buf_len; + + FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, error, 0, buf, PHP_WIN32_ERROR_MSG_BUFFER_SIZE, NULL); + buf_len = strlen(buf); + if (buf_len >= 2) { + buf[buf_len - 1] = '\0'; + buf[buf_len - 2] = '\0'; + } + php_error_docref2(NULL TSRMLS_CC, param1, param2, E_WARNING, "%s (code: %lu)", (char *)buf, error); + } +} +#undef PHP_WIN32_ERROR_MSG_BUFFER_SIZE +#endif + /* {{{ php_html_puts */ PHPAPI void php_html_puts(const char *str, uint size TSRMLS_DC) { @@ -888,6 +910,9 @@ static void php_error_cb(int type, const char *error_filename, const uint error_ if (PG(last_error_file)) { free(PG(last_error_file)); } + if (!error_filename) { + error_filename = "Unknown"; + } PG(last_error_type) = type; PG(last_error_message) = strdup(buffer); PG(last_error_file) = strdup(error_filename); @@ -976,6 +1001,7 @@ static void php_error_cb(int type, const char *error_filename, const uint error_ php_log_err(log_buffer TSRMLS_CC); efree(log_buffer); } + if (PG(display_errors) && ((module_initialized && !PG(during_request_startup)) || (PG(display_startup_errors) @@ -1004,7 +1030,12 @@ static void php_error_cb(int type, const char *error_filename, const uint error_ if ((!strcmp(sapi_module.name, "cli") || !strcmp(sapi_module.name, "cgi")) && PG(display_errors) == PHP_DISPLAY_ERRORS_STDERR ) { +#ifdef PHP_WIN32 + fprintf(stderr, "%s: %s in %s on line%d\n", error_type_str, buffer, error_filename, error_lineno); + fflush(stderr); +#else fprintf(stderr, "%s: %s in %s on line %d\n", error_type_str, buffer, error_filename, error_lineno); +#endif } else { php_printf("%s\n%s: %s in %s on line %d\n%s", STR_PRINT(prepend_string), error_type_str, buffer, error_filename, error_lineno, STR_PRINT(append_string)); } @@ -1846,7 +1877,7 @@ int php_module_startup(sapi_module_struct *sf, zend_module_entry *additional_mod #endif EG(bailout) = NULL; EG(error_reporting) = E_ALL & ~E_NOTICE; - + EG(active_symbol_table) = NULL; PG(header_is_being_sent) = 0; SG(request_info).headers_only = 0; SG(request_info).argv0 = NULL; @@ -1938,33 +1969,6 @@ int php_module_startup(sapi_module_struct *sf, zend_module_entry *additional_mod return FAILURE; } - /* Check for deprecated directives */ - { - static const char *directives[] = { - "define_syslog_variables", - "register_globals", - "register_long_arrays", - "safe_mode", - "magic_quotes_gpc", - "magic_quotes_runtime", - "magic_quotes_sybase", - NULL}; - const char **p = directives; - long val; - - while (*p) { - if (cfg_get_long((char*)*p, &val) == SUCCESS && val) { - zend_error(E_WARNING, "Directive '%s' is deprecated in PHP 5.3 and greater", *p); - } - ++p; - } - - /* This is not too nice, but since its the only one theres no need for extra stuff here */ - if (cfg_get_long("zend.ze1_compatibility_mode", &val) == SUCCESS && val) { - zend_error(E_ERROR, "zend.ze1_compatibility_mode is no longer supported in PHP 5.3 and greater"); - } - } - /* Register PHP core ini entries */ REGISTER_INI_ENTRIES(); @@ -2053,6 +2057,36 @@ int php_module_startup(sapi_module_struct *sf, zend_module_entry *additional_mod #endif module_initialized = 1; + + /* Check for deprecated directives */ + /* NOTE: If you add anything here, remember to add it also in Makefile.global! */ + { + static const char *directives[] = { + "define_syslog_variables", + "register_globals", + "register_long_arrays", + "safe_mode", + "magic_quotes_gpc", + "magic_quotes_runtime", + "magic_quotes_sybase", + NULL + }; + const char **p = directives; + long val; + + while (*p) { + if (cfg_get_long((char*)*p, &val) == SUCCESS && val) { + zend_error(E_WARNING, "Directive '%s' is deprecated in PHP 5.3 and greater", *p); + } + ++p; + } + + /* This is not too nice, but since its the only one theres no need for extra stuff here */ + if (cfg_get_long("zend.ze1_compatibility_mode", &val) == SUCCESS && val) { + zend_error(E_ERROR, "zend.ze1_compatibility_mode is no longer supported in PHP 5.3 and greater"); + } + } + sapi_deactivate(TSRMLS_C); module_startup = 0; @@ -2184,6 +2218,7 @@ PHPAPI int php_execute_script(zend_file_handle *primary_file TSRMLS_DC) * otherwise it will get opened and added to the included_files list in zend_execute_scripts */ if (primary_file->filename && + (primary_file->filename[0] != '-' || primary_file->filename[1] != 0) && primary_file->opened_path == NULL && primary_file->type != ZEND_HANDLE_FILENAME ) { @@ -2220,7 +2255,7 @@ PHPAPI int php_execute_script(zend_file_handle *primary_file TSRMLS_DC) #ifdef PHP_WIN32 zend_unset_timeout(TSRMLS_C); #endif - zend_set_timeout(EG(timeout_seconds), 0); + zend_set_timeout(INI_INT("max_execution_time"), 0); } retval = (zend_execute_scripts(ZEND_REQUIRE TSRMLS_CC, NULL, 3, prepend_file_p, primary_file, append_file_p) == SUCCESS); diff --git a/main/network.c b/main/network.c index 0d2f777cd..542c7cf9e 100644 --- a/main/network.c +++ b/main/network.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: network.c 289498 2009-10-10 12:21:08Z pajoye $ */ +/* $Id: network.c 293036 2010-01-03 09:23:27Z sebastian $ */ /*#define DEBUG_MAIN_NETWORK 1*/ diff --git a/main/output.c b/main/output.c index 4c9c65438..0ebecc488 100644 --- a/main/output.c +++ b/main/output.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: output.c 289444 2009-10-09 19:13:33Z pajoye $ */ +/* $Id: output.c 294505 2010-02-04 09:13:14Z pajoye $ */ #include "php.h" #include "ext/standard/head.h" @@ -50,6 +50,10 @@ php_output_globals output_globals; PHPAPI int php_default_output_func(const char *str, uint str_len TSRMLS_DC) { fwrite(str, 1, str_len, stderr); +/* See http://support.microsoft.com/kb/190351 */ +#ifdef PHP_WIN32 + fflush(stderr); +#endif return str_len; } /* }}} */ diff --git a/main/php.h b/main/php.h index 6655f3cb3..08cf29361 100644 --- a/main/php.h +++ b/main/php.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php.h 282827 2009-06-26 15:44:19Z johannes $ */ +/* $Id: php.h 294524 2010-02-04 10:13:54Z pajoye $ */ #ifndef PHP_H #define PHP_H @@ -309,6 +309,9 @@ PHPAPI void php_error_docref1(const char *docref TSRMLS_DC, const char *param1, PHP_ATTRIBUTE_FORMAT(printf, PHP_ATTR_FMT_OFFSET + 4, PHP_ATTR_FMT_OFFSET + 5); PHPAPI void php_error_docref2(const char *docref TSRMLS_DC, const char *param1, const char *param2, int type, const char *format, ...) PHP_ATTRIBUTE_FORMAT(printf, PHP_ATTR_FMT_OFFSET + 5, PHP_ATTR_FMT_OFFSET + 6); +#ifdef PHP_WIN32 +PHPAPI void php_win32_docref2_from_error(DWORD error, const char *param1, const char *param2 TSRMLS_DC); +#endif END_EXTERN_C() #define php_error_docref php_error_docref0 diff --git a/main/php3_compat.h b/main/php3_compat.h index 8b994b9f9..737392916 100644 --- a/main/php3_compat.h +++ b/main/php3_compat.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php3_compat.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php3_compat.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP3_COMPAT_H #define PHP3_COMPAT_H diff --git a/main/php_compat.h b/main/php_compat.h index 3c6f5928b..5381aa311 100644 --- a/main/php_compat.h +++ b/main/php_compat.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_compat.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_compat.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_COMPAT_H #define PHP_COMPAT_H diff --git a/main/php_config.h.in b/main/php_config.h.in index e75aad767..4daa3d944 100644 --- a/main/php_config.h.in +++ b/main/php_config.h.in @@ -4,7 +4,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -19,7 +19,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: acconfig.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: acconfig.h 293155 2010-01-05 20:46:53Z sebastian $ */ #if defined(__GNUC__) && __GNUC__ >= 4 # define ZEND_API __attribute__ ((visibility("default"))) @@ -377,6 +377,9 @@ /* Define if you have the memmove function. */ #undef HAVE_MEMMOVE +/* Define if you have the mempcpy function. */ +#undef HAVE_MEMPCPY + /* Define if you have the mkfifo function. */ #undef HAVE_MKFIFO @@ -545,6 +548,9 @@ /* Define if you have the strpbrk function. */ #undef HAVE_STRPBRK +/* Define if you have the strpncpy function. */ +#undef HAVE_STRPNCPY + /* Define if you have the strptime function. */ #undef HAVE_STRPTIME @@ -620,9 +626,6 @@ /* Define if you have the header file. */ #undef HAVE_ARPA_NAMESER_H -/* Define if you have the header file. */ -#undef HAVE_ARPA_NAMESER_COMPAT_H - /* Define if you have the header file. */ #undef HAVE_ASSERT_H @@ -1055,15 +1058,6 @@ /* */ #undef HAVE_LIBBIND -/* */ -#undef HAVE_NANOSLEEP - -/* */ -#undef HAVE_NANOSLEEP - -/* */ -#undef HAVE_LIBRT - /* */ #undef HAVE_FOPENCOOKIE @@ -1133,6 +1127,12 @@ /* Whether struct sockaddr has field sa_len */ #undef HAVE_SOCKADDR_SA_LEN +/* */ +#undef HAVE_NANOSLEEP + +/* */ +#undef HAVE_LIBRT + /* Define if you have the getaddrinfo function */ #undef HAVE_GETADDRINFO @@ -2441,6 +2441,12 @@ /* */ #undef HAVE_CRYPT +/* whether the compiler supports __alignof__ */ +#undef HAVE_ALIGNOF + +/* whether the compiler supports __attribute__ ((__aligned__)) */ +#undef HAVE_ATTRIBUTE_ALIGNED + /* Whether PHP has to use its own crypt_r for blowfish, des, ext des and md5 */ #undef PHP_USE_PHP_CRYPT_R @@ -2453,9 +2459,15 @@ /* Whether the system supports extended DES salt */ #undef PHP_EXT_DES_CRYPT -/* Whether the system supports extended DES salt */ +/* Whether the system supports MD5 salt */ #undef PHP_MD5_CRYPT +/* Whether the system supports SHA512 salt */ +#undef PHP_SHA512_CRYPT + +/* Whether the system supports SHA256 salt */ +#undef PHP_SHA256_CRYPT + /* Whether the system supports standard DES salt */ #undef PHP_STD_DES_CRYPT @@ -2465,6 +2477,12 @@ /* Whether the system supports extended DES salt */ #undef PHP_EXT_DES_CRYPT +/* Whether the system supports SHA512 salt */ +#undef PHP_EXT_SHA512_CRYPT + +/* Whether the system supports SHA256 salt */ +#undef PHP_EXT_SHA256_CRYPT + /* Whether PHP has to use its own crypt_r for blowfish, des and ext des */ #undef PHP_USE_PHP_CRYPT_R @@ -2732,8 +2750,8 @@ /* Whether to build mysqlnd as dynamic module */ #undef COMPILE_DL_MYSQLND -/* Use mysqlnd internal threading */ -#undef MYSQLND_THREADED +/* Enable compressed protocol support */ +#undef MYSQLND_COMPRESSION_ENABLED /* Define if int32_t type is present. */ #undef HAVE_INT32_T diff --git a/main/php_content_types.c b/main/php_content_types.c index 85bdd69fb..e38a4c5a9 100644 --- a/main/php_content_types.c +++ b/main/php_content_types.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_content_types.c 279522 2009-04-28 21:30:23Z stas $ */ +/* $Id: php_content_types.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php.h" #include "SAPI.h" diff --git a/main/php_content_types.h b/main/php_content_types.h index 9d1c91065..7547a29d5 100644 --- a/main/php_content_types.h +++ b/main/php_content_types.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_content_types.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_content_types.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_CONTENT_TYPES_H #define PHP_CONTENT_TYPES_H diff --git a/main/php_getopt.h b/main/php_getopt.h index e21d11815..34fc3f7da 100644 --- a/main/php_getopt.h +++ b/main/php_getopt.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_getopt.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_getopt.h 294892 2010-02-11 17:24:43Z johannes $ */ #ifndef PHP_GETOPT_H #define PHP_GETOPT_H @@ -41,7 +41,7 @@ typedef struct _opt_struct { BEGIN_EXTERN_C() /* holds the index of the latest fetched element from the opts array */ -PHPAPI int php_optidx; +extern PHPAPI int php_optidx; PHPAPI int php_getopt(int argc, char* const *argv, const opt_struct opts[], char **optarg, int *optind, int show_err, int arg_start); END_EXTERN_C() diff --git a/main/php_globals.h b/main/php_globals.h index 5a8942bce..dda28f2b4 100644 --- a/main/php_globals.h +++ b/main/php_globals.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_globals.h 289442 2009-10-09 19:06:10Z pajoye $ */ +/* $Id: php_globals.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_GLOBALS_H #define PHP_GLOBALS_H diff --git a/main/php_ini.c b/main/php_ini.c index f1918f4a0..294b8f2b6 100644 --- a/main/php_ini.c +++ b/main/php_ini.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_ini.c 289668 2009-10-15 13:28:55Z pajoye $ */ +/* $Id: php_ini.c 294449 2010-02-03 20:13:18Z pajoye $ */ #include "php.h" #include "ext/standard/info.h" @@ -807,7 +807,7 @@ PHPAPI void php_ini_activate_per_dir_config(char *path, uint path_len TSRMLS_DC) while ((ptr = strchr(ptr, '/')) != NULL) { *ptr = 0; /* Search for source array matching the path from configuration_hash */ - if (zend_hash_find(&configuration_hash, path, path_len, (void **) &tmp) == SUCCESS) { + if (zend_hash_find(&configuration_hash, path, strlen(path) + 1, (void **) &tmp) == SUCCESS) { php_ini_activate_config(Z_ARRVAL_P(tmp), PHP_INI_SYSTEM, PHP_INI_STAGE_ACTIVATE TSRMLS_CC); } *ptr = '/'; diff --git a/main/php_ini.h b/main/php_ini.h index 3d6cb5d1e..64406888d 100644 --- a/main/php_ini.h +++ b/main/php_ini.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_ini.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_ini.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_INI_H #define PHP_INI_H diff --git a/main/php_logos.c b/main/php_logos.c index ae6d69b45..10e8218ca 100644 --- a/main/php_logos.c +++ b/main/php_logos.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_logos.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_logos.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php.h" #include "logos.h" diff --git a/main/php_logos.h b/main/php_logos.h index 644ee1614..42c5012b4 100644 --- a/main/php_logos.h +++ b/main/php_logos.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_logos.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_logos.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef _PHP_LOGOS_H diff --git a/main/php_main.h b/main/php_main.h index 2d27f920b..64a5150c3 100644 --- a/main/php_main.h +++ b/main/php_main.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_main.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_main.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_MAIN_H #define PHP_MAIN_H diff --git a/main/php_memory_streams.h b/main/php_memory_streams.h index 6b17dcaf8..d53cb642e 100644 --- a/main/php_memory_streams.h +++ b/main/php_memory_streams.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_memory_streams.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_memory_streams.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_MEMORY_STREAM_H #define PHP_MEMORY_STREAM_H diff --git a/main/php_network.h b/main/php_network.h index 51a2071ae..0c35af834 100644 --- a/main/php_network.h +++ b/main/php_network.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_network.h 273010 2009-01-07 20:21:46Z felipe $ */ +/* $Id: php_network.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef _PHP_NETWORK_H #define _PHP_NETWORK_H @@ -34,10 +34,16 @@ #endif #ifdef PHP_WIN32 -#define EWOULDBLOCK WSAEWOULDBLOCK -#define EINPROGRESS WSAEWOULDBLOCK -# define fsync _commit -# define ftruncate(a, b) chsize(a, b) +# ifdef EWOULDBLOCK +# undef EWOULDBLOCK +# endif +# ifdef EINPROGRESS +# undef EINPROGRESS +# endif +# define EWOULDBLOCK WSAEWOULDBLOCK +# define EINPROGRESS WSAEWOULDBLOCK +# define fsync _commit +# define ftruncate(a, b) chsize(a, b) #endif /* defined(PHP_WIN32) */ #ifndef EWOULDBLOCK diff --git a/main/php_open_temporary_file.c b/main/php_open_temporary_file.c index 28623381e..583f67a41 100644 --- a/main/php_open_temporary_file.c +++ b/main/php_open_temporary_file.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_open_temporary_file.c 283130 2009-06-30 12:20:35Z iliaa $ */ +/* $Id: php_open_temporary_file.c 294726 2010-02-07 20:45:46Z pajoye $ */ #include "php.h" @@ -113,6 +113,13 @@ static int php_do_open_temporary_file(const char *path, const char *pfx, char ** return -1; } +#ifdef PHP_WIN32 + if (!php_win32_check_trailing_space(pfx, (const int)strlen(pfx))) { + SetLastError(ERROR_INVALID_NAME); + return -1; + } +#endif + if (!VCWD_GETCWD(cwd, MAXPATHLEN)) { cwd[0] = '\0'; } @@ -138,12 +145,14 @@ static int php_do_open_temporary_file(const char *path, const char *pfx, char ** } #ifdef PHP_WIN32 + if (GetTempFileName(new_state.cwd, pfx, 0, opened_path)) { /* Some versions of windows set the temp file to be read-only, * which means that opening it will fail... */ VCWD_CHMOD(opened_path, 0600); fd = VCWD_OPEN_MODE(opened_path, open_flags, 0600); } + #elif defined(HAVE_MKSTEMP) fd = mkstemp(opened_path); #else @@ -151,6 +160,7 @@ static int php_do_open_temporary_file(const char *path, const char *pfx, char ** fd = VCWD_OPEN(opened_path, open_flags); } #endif + if (fd == -1 || !opened_path_p) { efree(opened_path); } else { diff --git a/main/php_open_temporary_file.h b/main/php_open_temporary_file.h index 094ebd26b..c60e4521f 100644 --- a/main/php_open_temporary_file.h +++ b/main/php_open_temporary_file.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_open_temporary_file.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_open_temporary_file.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_OPEN_TEMPORARY_FILE_H #define PHP_OPEN_TEMPORARY_FILE_H diff --git a/main/php_output.h b/main/php_output.h index 8ad9cf593..964698f51 100644 --- a/main/php_output.h +++ b/main/php_output.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_output.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_output.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_OUTPUT_H #define PHP_OUTPUT_H diff --git a/main/php_reentrancy.h b/main/php_reentrancy.h index d076a4e40..bf2f8381d 100644 --- a/main/php_reentrancy.h +++ b/main/php_reentrancy.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_reentrancy.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_reentrancy.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_REENTRANCY_H #define PHP_REENTRANCY_H diff --git a/main/php_scandir.c b/main/php_scandir.c index d142731fc..c48cda8f0 100644 --- a/main/php_scandir.c +++ b/main/php_scandir.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_scandir.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_scandir.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php.h" #include "php_scandir.h" diff --git a/main/php_scandir.h b/main/php_scandir.h index cf74ddfee..f7e6327bd 100644 --- a/main/php_scandir.h +++ b/main/php_scandir.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_scandir.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_scandir.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_SCANDIR_H #define PHP_SCANDIR_H diff --git a/main/php_sprintf.c b/main/php_sprintf.c index d6890b673..5cb2ee0ba 100644 --- a/main/php_sprintf.c +++ b/main/php_sprintf.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_sprintf.c 280501 2009-05-14 08:21:54Z dmitry $ */ +/* $Id: php_sprintf.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include #include diff --git a/main/php_streams.h b/main/php_streams.h index 28b9c19b8..2da3a5f2e 100755 --- a/main/php_streams.h +++ b/main/php_streams.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_streams.h 279002 2009-04-19 17:10:35Z lbarnaud $ */ +/* $Id: php_streams.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_STREAMS_H #define PHP_STREAMS_H diff --git a/main/php_syslog.h b/main/php_syslog.h index 71c65cacc..971c0fcf8 100644 --- a/main/php_syslog.h +++ b/main/php_syslog.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_syslog.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_syslog.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_SYSLOG_H #define PHP_SYSLOG_H diff --git a/main/php_ticks.c b/main/php_ticks.c index 1d544e43b..b0b68e0b3 100644 --- a/main/php_ticks.c +++ b/main/php_ticks.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_ticks.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_ticks.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php.h" #include "php_ticks.h" diff --git a/main/php_ticks.h b/main/php_ticks.h index dc7ae672b..a23ac0665 100644 --- a/main/php_ticks.h +++ b/main/php_ticks.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_ticks.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_ticks.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_TICKS_H #define PHP_TICKS_H diff --git a/main/php_variables.c b/main/php_variables.c index 83b6a94dd..de80b0979 100644 --- a/main/php_variables.c +++ b/main/php_variables.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_variables.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_variables.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include #include "php.h" diff --git a/main/php_variables.h b/main/php_variables.h index 0237a2e5e..040082b4d 100644 --- a/main/php_variables.h +++ b/main/php_variables.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_variables.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_variables.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_VARIABLES_H #define PHP_VARIABLES_H diff --git a/main/php_version.h b/main/php_version.h index 7adb32efd..88ecedc02 100644 --- a/main/php_version.h +++ b/main/php_version.h @@ -2,7 +2,7 @@ /* edit configure.in to change version number */ #define PHP_MAJOR_VERSION 5 #define PHP_MINOR_VERSION 3 -#define PHP_RELEASE_VERSION 1 +#define PHP_RELEASE_VERSION 2 #define PHP_EXTRA_VERSION "" -#define PHP_VERSION "5.3.1" -#define PHP_VERSION_ID 50301 +#define PHP_VERSION "5.3.2" +#define PHP_VERSION_ID 50302 diff --git a/main/reentrancy.c b/main/reentrancy.c index 7d2410aa2..1ecf3ba93 100644 --- a/main/reentrancy.c +++ b/main/reentrancy.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: reentrancy.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: reentrancy.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include #include diff --git a/main/rfc1867.c b/main/rfc1867.c index 31b74c164..f421b23ab 100644 --- a/main/rfc1867.c +++ b/main/rfc1867.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -13,17 +13,17 @@ | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Authors: Rasmus Lerdorf | - | Jani Taskinen | + | Jani Taskinen | +----------------------------------------------------------------------+ */ -/* $Id: rfc1867.c 290025 2009-10-28 11:03:36Z pajoye $ */ +/* $Id: rfc1867.c 294031 2010-01-25 23:26:15Z johannes $ */ /* * This product includes software developed by the Apache Group * for use in the Apache HTTP server project (http://www.apache.org/). * - */ + */ #include #include "php.h" @@ -32,6 +32,7 @@ #include "php_globals.h" #include "php_variables.h" #include "rfc1867.h" +#include "ext/standard/php_string.h" #define DEBUG_FILE_UPLOAD ZEND_DEBUG @@ -43,7 +44,7 @@ PHPAPI int (*php_rfc1867_callback)(unsigned int event, void *event_data, void ** static void safe_php_register_variable(char *var, char *strval, int val_len, zval *track_vars_array, zend_bool override_protection TSRMLS_DC); #define SAFE_RETURN { \ - php_mb_flush_gpc_variables(num_vars, val_list, len_list, array_ptr TSRMLS_CC); \ + php_mb_flush_gpc_variables(num_vars, val_list, len_list, array_ptr TSRMLS_CC); \ if (lbuf) efree(lbuf); \ if (abuf) efree(abuf); \ if (array_index) efree(array_index); \ @@ -55,7 +56,7 @@ static void safe_php_register_variable(char *var, char *strval, int val_len, zva if (mbuff) efree(mbuff); \ return; } -void php_mb_flush_gpc_variables(int num_vars, char **val_list, int *len_list, zval *array_ptr TSRMLS_DC) +void php_mb_flush_gpc_variables(int num_vars, char **val_list, int *len_list, zval *array_ptr TSRMLS_DC) /* {{{ */ { int i; if (php_mb_encoding_translation(TSRMLS_C)) { @@ -63,17 +64,18 @@ void php_mb_flush_gpc_variables(int num_vars, char **val_list, int *len_list, zv php_mb_gpc_encoding_detector(val_list, len_list, num_vars, NULL TSRMLS_CC) == SUCCESS) { php_mb_gpc_encoding_converter(val_list, len_list, num_vars, NULL, NULL TSRMLS_CC); } - for (i=0; i=*num_vars_max){ - php_mb_gpc_realloc_buffer(pval_list, plen_list, num_vars_max, - 16 TSRMLS_CC); + if (*num_vars >= *num_vars_max) { + php_mb_gpc_realloc_buffer(pval_list, plen_list, num_vars_max, 16 TSRMLS_CC); /* in case realloc relocated the buffer */ val_list = *pval_list; len_list = *plen_list; @@ -104,6 +106,7 @@ void php_mb_gpc_stack_variable(char *param, char *value, char ***pval_list, int len_list[*num_vars] = strlen(value); (*num_vars)++; } +/* }}} */ #else @@ -136,7 +139,7 @@ void php_mb_gpc_stack_variable(char *param, char *value, char ***pval_list, int #define UPLOAD_ERROR_F 7 /* Failed to write file to disk */ #define UPLOAD_ERROR_X 8 /* File upload stopped by extension */ -void php_rfc1867_register_constants(TSRMLS_D) +void php_rfc1867_register_constants(TSRMLS_D) /* {{{ */ { REGISTER_MAIN_LONG_CONSTANT("UPLOAD_ERR_OK", UPLOAD_ERROR_OK, CONST_CS | CONST_PERSISTENT); REGISTER_MAIN_LONG_CONSTANT("UPLOAD_ERR_INI_SIZE", UPLOAD_ERROR_A, CONST_CS | CONST_PERSISTENT); @@ -147,26 +150,27 @@ void php_rfc1867_register_constants(TSRMLS_D) REGISTER_MAIN_LONG_CONSTANT("UPLOAD_ERR_CANT_WRITE", UPLOAD_ERROR_F, CONST_CS | CONST_PERSISTENT); REGISTER_MAIN_LONG_CONSTANT("UPLOAD_ERR_EXTENSION", UPLOAD_ERROR_X, CONST_CS | CONST_PERSISTENT); } +/* }}} */ -static void normalize_protected_variable(char *varname TSRMLS_DC) +static void normalize_protected_variable(char *varname TSRMLS_DC) /* {{{ */ { - char *s=varname, *index=NULL, *indexend=NULL, *p; - + char *s = varname, *index = NULL, *indexend = NULL, *p; + /* overjump leading space */ while (*s == ' ') { s++; } - + /* and remove it */ if (s != varname) { memmove(varname, s, strlen(s)+1); } - for (p=varname; *p && *p != '['; p++) { + for (p = varname; *p && *p != '['; p++) { switch(*p) { case ' ': case '.': - *p='_'; + *p = '_'; break; } } @@ -175,20 +179,19 @@ static void normalize_protected_variable(char *varname TSRMLS_DC) index = strchr(varname, '['); if (index) { index++; - s=index; + s = index; } else { return; } /* done? */ while (index) { - while (*index == ' ' || *index == '\r' || *index == '\n' || *index=='\t') { index++; } indexend = strchr(index, ']'); indexend = indexend ? indexend + 1 : index + strlen(index); - + if (s != index) { memmove(s, index, strlen(index)+1); s += indexend-index; @@ -201,46 +204,45 @@ static void normalize_protected_variable(char *varname TSRMLS_DC) index = s; } else { index = NULL; - } + } } - *s = '\0'; } +/* }}} */ - -static void add_protected_variable(char *varname TSRMLS_DC) +static void add_protected_variable(char *varname TSRMLS_DC) /* {{{ */ { - int dummy=1; + int dummy = 1; normalize_protected_variable(varname TSRMLS_CC); zend_hash_add(&PG(rfc1867_protected_variables), varname, strlen(varname)+1, &dummy, sizeof(int), NULL); } +/* }}} */ - -static zend_bool is_protected_variable(char *varname TSRMLS_DC) +static zend_bool is_protected_variable(char *varname TSRMLS_DC) /* {{{ */ { normalize_protected_variable(varname TSRMLS_CC); return zend_hash_exists(&PG(rfc1867_protected_variables), varname, strlen(varname)+1); } +/* }}} */ - -static void safe_php_register_variable(char *var, char *strval, int val_len, zval *track_vars_array, zend_bool override_protection TSRMLS_DC) +static void safe_php_register_variable(char *var, char *strval, int val_len, zval *track_vars_array, zend_bool override_protection TSRMLS_DC) /* {{{ */ { if (override_protection || !is_protected_variable(var TSRMLS_CC)) { php_register_variable_safe(var, strval, val_len, track_vars_array TSRMLS_CC); } } +/* }}} */ - -static void safe_php_register_variable_ex(char *var, zval *val, zval *track_vars_array, zend_bool override_protection TSRMLS_DC) +static void safe_php_register_variable_ex(char *var, zval *val, zval *track_vars_array, zend_bool override_protection TSRMLS_DC) /* {{{ */ { if (override_protection || !is_protected_variable(var TSRMLS_CC)) { php_register_variable_ex(var, val, track_vars_array TSRMLS_CC); } } +/* }}} */ - -static void register_http_post_files_variable(char *strvar, char *val, zval *http_post_files, zend_bool override_protection TSRMLS_DC) +static void register_http_post_files_variable(char *strvar, char *val, zval *http_post_files, zend_bool override_protection TSRMLS_DC) /* {{{ */ { int register_globals = PG(register_globals); @@ -248,9 +250,9 @@ static void register_http_post_files_variable(char *strvar, char *val, zval *htt safe_php_register_variable(strvar, val, strlen(val), http_post_files, override_protection TSRMLS_CC); PG(register_globals) = register_globals; } +/* }}} */ - -static void register_http_post_files_variable_ex(char *var, zval *val, zval *http_post_files, zend_bool override_protection TSRMLS_DC) +static void register_http_post_files_variable_ex(char *var, zval *val, zval *http_post_files, zend_bool override_protection TSRMLS_DC) /* {{{ */ { int register_globals = PG(register_globals); @@ -258,27 +260,24 @@ static void register_http_post_files_variable_ex(char *var, zval *val, zval *htt safe_php_register_variable_ex(var, val, http_post_files, override_protection TSRMLS_CC); PG(register_globals) = register_globals; } +/* }}} */ - -static int unlink_filename(char **filename TSRMLS_DC) +static int unlink_filename(char **filename TSRMLS_DC) /* {{{ */ { VCWD_UNLINK(*filename); return 0; } +/* }}} */ - -void destroy_uploaded_files_hash(TSRMLS_D) +void destroy_uploaded_files_hash(TSRMLS_D) /* {{{ */ { zend_hash_apply(SG(rfc1867_uploaded_files), (apply_func_t) unlink_filename TSRMLS_CC); zend_hash_destroy(SG(rfc1867_uploaded_files)); FREE_HASHTABLE(SG(rfc1867_uploaded_files)); } +/* }}} */ - -/* - * Following code is based on apache_multipart_buffer.c from libapreq-0.33 package. - * - */ +/* {{{ Following code is based on apache_multipart_buffer.c from libapreq-0.33 package. */ #define FILLUNIT (1024 * 5) @@ -297,17 +296,15 @@ typedef struct { } multipart_buffer; - typedef struct { char *key; char *value; } mime_header_entry; - /* - fill up the buffer with client data. - returns number of bytes added to buffer. -*/ + * Fill up the buffer with client data. + * Returns number of bytes added to buffer. + */ static int fill_buffer(multipart_buffer *self TSRMLS_DC) { int bytes_to_read, total_read = 0, actual_read = 0; @@ -343,7 +340,6 @@ static int fill_buffer(multipart_buffer *self TSRMLS_DC) return total_read; } - /* eof if we are out of bytes, or if we hit the final boundary */ static int multipart_buffer_eof(multipart_buffer *self TSRMLS_DC) { @@ -354,7 +350,6 @@ static int multipart_buffer_eof(multipart_buffer *self TSRMLS_DC) } } - /* create new multipart_buffer structure */ static multipart_buffer *multipart_buffer_new(char *boundary, int boundary_len) { @@ -367,7 +362,7 @@ static multipart_buffer *multipart_buffer_new(char *boundary, int boundary_len) self->bufsize = minsize; spprintf(&self->boundary, 0, "--%s", boundary); - + self->boundary_next_len = spprintf(&self->boundary_next, 0, "\n--%s", boundary); self->buf_begin = self->buffer; @@ -376,17 +371,16 @@ static multipart_buffer *multipart_buffer_new(char *boundary, int boundary_len) return self; } - /* - gets the next CRLF terminated line from the input buffer. - if it doesn't find a CRLF, and the buffer isn't completely full, returns - NULL; otherwise, returns the beginning of the null-terminated line, - minus the CRLF. - - note that we really just look for LF terminated lines. this works - around a bug in internet explorer for the macintosh which sends mime - boundaries that are only LF terminated when you use an image submit - button in a multipart/form-data form. + * Gets the next CRLF terminated line from the input buffer. + * If it doesn't find a CRLF, and the buffer isn't completely full, returns + * NULL; otherwise, returns the beginning of the null-terminated line, + * minus the CRLF. + * + * Note that we really just look for LF terminated lines. This works + * around a bug in internet explorer for the macintosh which sends mime + * boundaries that are only LF terminated when you use an image submit + * button in a multipart/form-data form. */ static char *next_line(multipart_buffer *self) { @@ -406,7 +400,7 @@ static char *next_line(multipart_buffer *self) /* bump the pointer */ self->buf_begin = ptr + 1; self->bytes_in_buffer -= (self->buf_begin - line); - + } else { /* no LF found */ /* buffer isn't completely full, fail */ @@ -422,8 +416,7 @@ static char *next_line(multipart_buffer *self) return line; } - -/* returns the next CRLF terminated line from the client */ +/* Returns the next CRLF terminated line from the client */ static char *get_line(multipart_buffer *self TSRMLS_DC) { char* ptr = next_line(self); @@ -436,7 +429,6 @@ static char *get_line(multipart_buffer *self TSRMLS_DC) return ptr; } - /* Free header entry */ static void php_free_hdr_entry(mime_header_entry *h) { @@ -448,7 +440,6 @@ static void php_free_hdr_entry(mime_header_entry *h) } } - /* finds a boundary */ static int find_boundary(multipart_buffer *self, char *boundary TSRMLS_DC) { @@ -467,14 +458,13 @@ static int find_boundary(multipart_buffer *self, char *boundary TSRMLS_DC) return 0; } - /* parse headers */ static int multipart_buffer_headers(multipart_buffer *self, zend_llist *header TSRMLS_DC) { char *line; mime_header_entry prev_entry, entry; int prev_len, cur_len; - + /* didn't find boundary, abort */ if (!find_boundary(self, self->boundary TSRMLS_CC)) { return 0; @@ -485,10 +475,9 @@ static int multipart_buffer_headers(multipart_buffer *self, zend_llist *header T while( (line = get_line(self TSRMLS_CC)) && strlen(line) > 0 ) { /* add header to table */ - char *key = line; char *value = NULL; - + /* space in the beginning means same header */ if (!isspace(line[0])) { value = strchr(line, ':'); @@ -512,7 +501,7 @@ static int multipart_buffer_headers(multipart_buffer *self, zend_llist *header T entry.value[cur_len + prev_len] = '\0'; entry.key = estrdup(prev_entry.key); - + zend_llist_remove_tail(header); } else { continue; @@ -525,7 +514,6 @@ static int multipart_buffer_headers(multipart_buffer *self, zend_llist *header T return 1; } - static char *php_mime_get_hdr_value(zend_llist header, char *key) { mime_header_entry *entry; @@ -533,7 +521,7 @@ static char *php_mime_get_hdr_value(zend_llist header, char *key) if (key == NULL) { return NULL; } - + entry = zend_llist_get_first(&header); while (entry) { if (!strcasecmp(entry->key, key)) { @@ -541,18 +529,16 @@ static char *php_mime_get_hdr_value(zend_llist header, char *key) } entry = zend_llist_get_next(&header); } - + return NULL; } - static char *php_ap_getword(char **line, char stop) { char *pos = *line, quote; char *res; while (*pos && *pos != stop) { - if ((quote = *pos) == '"' || quote == '\'') { ++pos; while (*pos && *pos != quote) { @@ -566,7 +552,6 @@ static char *php_ap_getword(char **line, char stop) ++pos; } } else ++pos; - } if (*pos == '\0') { res = estrdup(*line); @@ -584,7 +569,6 @@ static char *php_ap_getword(char **line, char stop) return res; } - static char *substring_conf(char *start, int len, char quote TSRMLS_DC) { char *result = emalloc(len + 2); @@ -615,7 +599,6 @@ static char *substring_conf(char *start, int len, char quote TSRMLS_DC) return result; } - static char *php_ap_getword_conf(char **line TSRMLS_DC) { char *str = *line, *strend, *res, quote; @@ -677,12 +660,11 @@ look_for_quote: return res; } - /* - search for a string in a fixed-length byte string. - if partial is true, partial matches are allowed at the end of the buffer. - returns NULL if not found, or a pointer to the start of the first match. -*/ + * Search for a string in a fixed-length byte string. + * If partial is true, partial matches are allowed at the end of the buffer. + * Returns NULL if not found, or a pointer to the start of the first match. + */ static void *php_ap_memstr(char *haystack, int haystacklen, char *needle, int needlen, int partial) { int len = haystacklen; @@ -706,7 +688,6 @@ static void *php_ap_memstr(char *haystack, int haystacklen, char *needle, int ne return ptr; } - /* read until a boundary condition */ static int multipart_buffer_read(multipart_buffer *self, char *buf, int bytes, int *end TSRMLS_DC) { @@ -750,7 +731,6 @@ static int multipart_buffer_read(multipart_buffer *self, char *buf, int bytes, i return len; } - /* XXX: this is horrible memory-usage-wise, but we only expect to do this on small pieces of form data. @@ -766,50 +746,60 @@ static char *multipart_buffer_read_body(multipart_buffer *self, unsigned int *le total_bytes += read_bytes; } - if (out) out[total_bytes] = '\0'; + if (out) { + out[total_bytes] = '\0'; + } *len = total_bytes; return out; } - +/* }}} */ /* * The combined READER/HANDLER * */ -SAPI_API SAPI_POST_HANDLER_FUNC(rfc1867_post_handler) +SAPI_API SAPI_POST_HANDLER_FUNC(rfc1867_post_handler) /* {{{ */ { - char *boundary, *s=NULL, *boundary_end = NULL, *start_arr=NULL, *array_index=NULL; - char *temp_filename=NULL, *lbuf=NULL, *abuf=NULL; - int boundary_len=0, total_bytes=0, cancel_upload=0, is_arr_upload=0, array_len=0; - int max_file_size=0, skip_upload=0, anonindex=0, is_anonymous; - zval *http_post_files=NULL; HashTable *uploaded_files=NULL; + char *boundary, *s = NULL, *boundary_end = NULL, *start_arr = NULL, *array_index = NULL; + char *temp_filename = NULL, *lbuf = NULL, *abuf = NULL; + int boundary_len = 0, total_bytes = 0, cancel_upload = 0, is_arr_upload = 0, array_len = 0; + int max_file_size = 0, skip_upload = 0, anonindex = 0, is_anonymous; + zval *http_post_files = NULL; + HashTable *uploaded_files = NULL; #if HAVE_MBSTRING && !defined(COMPILE_DL_MBSTRING) int str_len = 0, num_vars = 0, num_vars_max = 2*10, *len_list = NULL; char **val_list = NULL; #endif multipart_buffer *mbuff; zval *array_ptr = (zval *) arg; - int fd=-1; + int fd = -1; zend_llist header; void *event_extra_data = NULL; int llen = 0; - char *max_uploads = INI_STR("max_file_uploads"); - int upload_cnt = 0; + int upload_cnt = INI_INT("max_file_uploads"); - if (max_uploads && *max_uploads) { - upload_cnt = atoi(max_uploads); - } - - if (SG(request_info).content_length > SG(post_max_size)) { + if (SG(post_max_size) > 0 && SG(request_info).content_length > SG(post_max_size)) { sapi_module.sapi_error(E_WARNING, "POST Content-Length of %ld bytes exceeds the limit of %ld bytes", SG(request_info).content_length, SG(post_max_size)); return; } /* Get the boundary */ boundary = strstr(content_type_dup, "boundary"); - if (!boundary || !(boundary=strchr(boundary, '='))) { + if (!boundary) { + int content_type_len = strlen(content_type_dup); + char *content_type_lcase = estrndup(content_type_dup, content_type_len); + + php_strtolower(content_type_lcase, content_type_len); + boundary = strstr(content_type_lcase, "boundary"); + if (boundary) { + boundary = content_type_dup + (boundary - content_type_lcase); + } + efree(content_type_lcase); + } + + if (!boundary || !(boundary = strchr(boundary, '='))) { sapi_module.sapi_error(E_WARNING, "Missing boundary in multipart/form-data POST data"); return; } @@ -820,7 +810,7 @@ SAPI_API SAPI_POST_HANDLER_FUNC(rfc1867_post_handler) if (boundary[0] == '"') { boundary++; boundary_end = strchr(boundary, '"'); - if (!boundary_end) { + if (!boundary_end) { sapi_module.sapi_error(E_WARNING, "Invalid boundary in multipart/form-data POST data"); return; } @@ -871,8 +861,8 @@ SAPI_API SAPI_POST_HANDLER_FUNC(rfc1867_post_handler) while (!multipart_buffer_eof(mbuff TSRMLS_CC)) { char buff[FILLUNIT]; - char *cd=NULL,*param=NULL,*filename=NULL, *tmp=NULL; - size_t blen=0, wlen=0; + char *cd = NULL, *param = NULL, *filename = NULL, *tmp = NULL; + size_t blen = 0, wlen = 0; off_t offset; zend_llist_clean(&header); @@ -882,16 +872,16 @@ SAPI_API SAPI_POST_HANDLER_FUNC(rfc1867_post_handler) } if ((cd = php_mime_get_hdr_value(header, "Content-Disposition"))) { - char *pair=NULL; - int end=0; - + char *pair = NULL; + int end = 0; + while (isspace(*cd)) { ++cd; } while (*cd && (pair = php_ap_getword(&cd, ';'))) { - char *key=NULL, *word = pair; + char *key = NULL, *word = pair; while (isspace(*cd)) { ++cd; @@ -899,7 +889,7 @@ SAPI_API SAPI_POST_HANDLER_FUNC(rfc1867_post_handler) if (strchr(pair, '=')) { key = php_ap_getword(&pair, '='); - + if (!strcasecmp(key, "name")) { if (param) { efree(param); @@ -948,8 +938,7 @@ SAPI_API SAPI_POST_HANDLER_FUNC(rfc1867_post_handler) #if HAVE_MBSTRING && !defined(COMPILE_DL_MBSTRING) if (php_mb_encoding_translation(TSRMLS_C)) { - php_mb_gpc_stack_variable(param, value, &val_list, &len_list, - &num_vars, &num_vars_max TSRMLS_CC); + php_mb_gpc_stack_variable(param, value, &val_list, &len_list, &num_vars, &num_vars_max TSRMLS_CC); } else { safe_php_register_variable(param, value, new_val_len, array_ptr, 0 TSRMLS_CC); } @@ -989,7 +978,7 @@ SAPI_API SAPI_POST_HANDLER_FUNC(rfc1867_post_handler) sapi_module.sapi_error(E_WARNING, "File Upload Mime headers garbled"); goto fileupload_done; } - + if (!param) { is_anonymous = 1; param = emalloc(MAX_SIZE_ANONNAME); @@ -997,12 +986,12 @@ SAPI_API SAPI_POST_HANDLER_FUNC(rfc1867_post_handler) } else { is_anonymous = 0; } - + /* New Rule: never repair potential malicious user input */ if (!skip_upload) { char *tmp = param; long c = 0; - + while (*tmp) { if (*tmp == '[') { c++; @@ -1017,7 +1006,7 @@ SAPI_API SAPI_POST_HANDLER_FUNC(rfc1867_post_handler) skip_upload = 1; break; } - tmp++; + tmp++; } } @@ -1027,12 +1016,12 @@ SAPI_API SAPI_POST_HANDLER_FUNC(rfc1867_post_handler) /* Handle file */ fd = php_open_temporary_fd_ex(PG(upload_tmp_dir), "php", &temp_filename, 1 TSRMLS_CC); upload_cnt--; - if (fd==-1) { + if (fd == -1) { sapi_module.sapi_error(E_WARNING, "File upload error - unable to create a temporary file"); cancel_upload = UPLOAD_ERROR_E; } } - + if (!skip_upload && php_rfc1867_callback != NULL) { multipart_event_file_start event_file_start; @@ -1047,21 +1036,20 @@ SAPI_API SAPI_POST_HANDLER_FUNC(rfc1867_post_handler) } efree(temp_filename); } - temp_filename=""; + temp_filename = ""; efree(param); efree(filename); continue; } } - if (skip_upload) { efree(param); efree(filename); continue; } - if(strlen(filename) == 0) { + if (strlen(filename) == 0) { #if DEBUG_FILE_UPLOAD sapi_module.sapi_error(E_NOTICE, "No file uploaded"); #endif @@ -1085,8 +1073,7 @@ SAPI_API SAPI_POST_HANDLER_FUNC(rfc1867_post_handler) continue; } } - - + if (PG(upload_max_filesize) > 0 && (total_bytes+blen) > PG(upload_max_filesize)) { #if DEBUG_FILE_UPLOAD sapi_module.sapi_error(E_NOTICE, "upload_max_filesize of %ld bytes exceeded - file [%s=%s] not saved", PG(upload_max_filesize), param, filename); @@ -1098,9 +1085,8 @@ SAPI_API SAPI_POST_HANDLER_FUNC(rfc1867_post_handler) #endif cancel_upload = UPLOAD_ERROR_B; } else if (blen > 0) { - wlen = write(fd, buff, blen); - + if (wlen == -1) { /* write failed */ #if DEBUG_FILE_UPLOAD @@ -1115,11 +1101,10 @@ SAPI_API SAPI_POST_HANDLER_FUNC(rfc1867_post_handler) } else { total_bytes += wlen; } - offset += wlen; - } + } } - if (fd!=-1) { /* may not be initialized if file could not be created */ + if (fd != -1) { /* may not be initialized if file could not be created */ close(fd); } if (!cancel_upload && !end) { @@ -1129,12 +1114,11 @@ SAPI_API SAPI_POST_HANDLER_FUNC(rfc1867_post_handler) cancel_upload = UPLOAD_ERROR_C; } #if DEBUG_FILE_UPLOAD - if(strlen(filename) > 0 && total_bytes == 0 && !cancel_upload) { + if (strlen(filename) > 0 && total_bytes == 0 && !cancel_upload) { sapi_module.sapi_error(E_WARNING, "Uploaded file size 0 - file [%s=%s] not saved", param, filename); cancel_upload = 5; } -#endif - +#endif if (php_rfc1867_callback != NULL) { multipart_event_file_end event_file_end; @@ -1153,15 +1137,14 @@ SAPI_API SAPI_POST_HANDLER_FUNC(rfc1867_post_handler) } efree(temp_filename); } - temp_filename=""; + temp_filename = ""; } else { zend_hash_add(SG(rfc1867_uploaded_files), temp_filename, strlen(temp_filename) + 1, &temp_filename, sizeof(char *), NULL); } /* is_arr_upload is true when name of file upload field * ends in [.*] - * start_arr is set to point to 1st [ - */ + * start_arr is set to point to 1st [ */ is_arr_upload = (start_arr = strchr(param,'[')) && (param[strlen(param)-1] == ']'); if (is_arr_upload) { @@ -1169,16 +1152,16 @@ SAPI_API SAPI_POST_HANDLER_FUNC(rfc1867_post_handler) if (array_index) { efree(array_index); } - array_index = estrndup(start_arr+1, array_len-2); + array_index = estrndup(start_arr + 1, array_len - 2); } - + /* Add $foo_name */ if (llen < strlen(param) + MAX_SIZE_OF_INDEX + 1) { llen = strlen(param); lbuf = (char *) safe_erealloc(lbuf, llen, 1, MAX_SIZE_OF_INDEX + 1); llen += MAX_SIZE_OF_INDEX + 1; } - + if (is_arr_upload) { if (abuf) efree(abuf); abuf = estrndup(param, strlen(param)-array_len); @@ -1189,14 +1172,13 @@ SAPI_API SAPI_POST_HANDLER_FUNC(rfc1867_post_handler) #if HAVE_MBSTRING && !defined(COMPILE_DL_MBSTRING) if (php_mb_encoding_translation(TSRMLS_C)) { - if (num_vars>=num_vars_max){ - php_mb_gpc_realloc_buffer(&val_list, &len_list, &num_vars_max, - 1 TSRMLS_CC); + if (num_vars >= num_vars_max) { + php_mb_gpc_realloc_buffer(&val_list, &len_list, &num_vars_max, 1 TSRMLS_CC); } val_list[num_vars] = filename; len_list[num_vars] = strlen(filename); num_vars++; - if(php_mb_gpc_encoding_detector(val_list, len_list, num_vars, NULL TSRMLS_CC) == SUCCESS) { + if (php_mb_gpc_encoding_detector(val_list, len_list, num_vars, NULL TSRMLS_CC) == SUCCESS) { str_len = strlen(filename); php_mb_gpc_encoding_converter(&filename, &str_len, 1, NULL, NULL TSRMLS_CC); } @@ -1207,13 +1189,12 @@ SAPI_API SAPI_POST_HANDLER_FUNC(rfc1867_post_handler) num_vars--; goto filedone; } -#endif +#endif /* The \ check should technically be needed for win32 systems only where * it is a valid path separator. However, IE in all it's wisdom always sends * the full path of the file on the user's filesystem, which means that unless - * the user does basename() they get a bogus file name. Until IE's user base drops - * to nill or problem is fixed this code must remain enabled for all systems. - */ + * the user does basename() they get a bogus file name. Until IE's user base drops + * to nill or problem is fixed this code must remain enabled for all systems. */ s = strrchr(filename, '\\'); if ((tmp = strrchr(filename, '/')) > s) { s = tmp; @@ -1229,9 +1210,9 @@ SAPI_API SAPI_POST_HANDLER_FUNC(rfc1867_post_handler) #endif #if HAVE_MBSTRING && !defined(COMPILE_DL_MBSTRING) -filedone: +filedone: #endif - + if (!is_anonymous) { if (s && s > filename) { safe_php_register_variable(lbuf, s+1, strlen(s+1), NULL, 0 TSRMLS_CC); @@ -1253,11 +1234,11 @@ filedone: } efree(filename); s = NULL; - + /* Possible Content-Type: */ if (cancel_upload || !(cd = php_mime_get_hdr_value(header, "Content-Type"))) { cd = ""; - } else { + } else { /* fix for Opera 6.01 */ s = strchr(cd, ';'); if (s != NULL) { @@ -1302,7 +1283,7 @@ filedone: ZVAL_STRING(&zfilename, temp_filename, 1); safe_php_register_variable_ex(param, &zfilename, NULL, 1 TSRMLS_CC); } - + /* Add $foo[tmp_name] */ if (is_arr_upload) { snprintf(lbuf, llen, "%s[tmp_name][%s]", abuf, array_index); @@ -1327,8 +1308,8 @@ filedone: } else { file_size.value.lval = total_bytes; file_size.type = IS_LONG; - } - + } + if (is_arr_upload) { snprintf(lbuf, llen, "%s[error][%s]", abuf, array_index); } else { @@ -1344,7 +1325,7 @@ filedone: } if (!is_anonymous) { safe_php_register_variable_ex(lbuf, &file_size, NULL, 0 TSRMLS_CC); - } + } /* Add $foo[size] */ if (is_arr_upload) { @@ -1357,16 +1338,18 @@ filedone: efree(param); } } + fileupload_done: if (php_rfc1867_callback != NULL) { multipart_event_end event_end; - + event_end.post_bytes_processed = SG(read_post_bytes); php_rfc1867_callback(MULTIPART_EVENT_END, &event_end, &event_extra_data TSRMLS_CC); } - + SAFE_RETURN; } +/* }}} */ /* * Local variables: diff --git a/main/rfc1867.h b/main/rfc1867.h index 7038fadc7..b7f2c929f 100644 --- a/main/rfc1867.h +++ b/main/rfc1867.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: rfc1867.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: rfc1867.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef RFC1867_H #define RFC1867_H diff --git a/main/safe_mode.c b/main/safe_mode.c index f57626fdc..9d628d14a 100644 --- a/main/safe_mode.c +++ b/main/safe_mode.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: safe_mode.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: safe_mode.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php.h" diff --git a/main/safe_mode.h b/main/safe_mode.h index cd52b11e5..263b83e91 100644 --- a/main/safe_mode.h +++ b/main/safe_mode.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: safe_mode.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: safe_mode.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef SAFE_MODE_H #define SAFE_MODE_H diff --git a/main/snprintf.c b/main/snprintf.c index 0a3f5a46b..b0ce2033a 100644 --- a/main/snprintf.c +++ b/main/snprintf.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: snprintf.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: snprintf.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php.h" diff --git a/main/snprintf.h b/main/snprintf.h index 8b21c8a3e..11e7a599b 100644 --- a/main/snprintf.h +++ b/main/snprintf.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: snprintf.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: snprintf.h 293036 2010-01-03 09:23:27Z sebastian $ */ /* diff --git a/main/spprintf.c b/main/spprintf.c index eb9e46915..c6af477af 100644 --- a/main/spprintf.c +++ b/main/spprintf.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: spprintf.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: spprintf.c 293036 2010-01-03 09:23:27Z sebastian $ */ /* This is the spprintf implementation. * It has emerged from apache snprintf. See original header: diff --git a/main/spprintf.h b/main/spprintf.h index 7e5661480..78e3be199 100644 --- a/main/spprintf.h +++ b/main/spprintf.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: spprintf.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: spprintf.h 293036 2010-01-03 09:23:27Z sebastian $ */ /* diff --git a/main/streams/cast.c b/main/streams/cast.c index f42494601..2e9ad810c 100644 --- a/main/streams/cast.c +++ b/main/streams/cast.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: cast.c 279036 2009-04-20 08:28:44Z pajoye $ */ +/* $Id: cast.c 294462 2010-02-03 20:49:03Z pajoye $ */ #define _GNU_SOURCE #include "php.h" @@ -30,7 +30,7 @@ #include "php_streams_int.h" /* Under BSD, emulate fopencookie using funopen */ -#if HAVE_FUNOPEN +#if defined(HAVE_FUNOPEN) && !defined(HAVE_FOPENCOOKIE) typedef struct { int (*reader)(void *, char *, int); int (*writer)(void *, const char *, int); @@ -43,13 +43,14 @@ FILE *fopencookie(void *cookie, const char *mode, COOKIE_IO_FUNCTIONS_T *funcs) return funopen(cookie, funcs->reader, funcs->writer, funcs->seeker, funcs->closer); } # define HAVE_FOPENCOOKIE 1 +# define PHP_EMULATE_FOPENCOOKIE 1 # define PHP_STREAM_COOKIE_FUNCTIONS &stream_cookie_functions -#elif HAVE_FOPENCOOKIE +#elif defined(HAVE_FOPENCOOKIE) # define PHP_STREAM_COOKIE_FUNCTIONS stream_cookie_functions #endif /* {{{ STDIO with fopencookie */ -#if HAVE_FUNOPEN +#if defined(PHP_EMULATE_FOPENCOOKIE) /* use our fopencookie emulation */ static int stream_cookie_reader(void *cookie, char *buffer, int size) { @@ -80,8 +81,7 @@ static int stream_cookie_closer(void *cookie) stream->fclose_stdiocast = PHP_STREAM_FCLOSE_NONE; return php_stream_close(stream); } - -#elif HAVE_FOPENCOOKIE +#elif defined(HAVE_FOPENCOOKIE) static ssize_t stream_cookie_reader(void *cookie, char *buffer, size_t size) { ssize_t ret; @@ -96,7 +96,7 @@ static ssize_t stream_cookie_writer(void *cookie, const char *buffer, size_t siz return php_stream_write(((php_stream *)cookie), (char *)buffer, size); } -#ifdef COOKIE_SEEKER_USES_OFF64_T +# ifdef COOKIE_SEEKER_USES_OFF64_T static int stream_cookie_seeker(void *cookie, __off64_t *position, int whence) { TSRMLS_FETCH(); @@ -107,13 +107,13 @@ static int stream_cookie_seeker(void *cookie, __off64_t *position, int whence) return -1; return 0; } -#else +# else static int stream_cookie_seeker(void *cookie, off_t position, int whence) { TSRMLS_FETCH(); return php_stream_seek((php_stream *)cookie, position, whence); } -#endif +# endif static int stream_cookie_closer(void *cookie) { @@ -124,7 +124,7 @@ static int stream_cookie_closer(void *cookie) stream->fclose_stdiocast = PHP_STREAM_FCLOSE_NONE; return php_stream_close(stream); } -#endif /* elif HAVE_FOPENCOOKIE */ +#endif /* elif defined(HAVE_FOPENCOOKIE) */ #if HAVE_FOPENCOOKIE static COOKIE_IO_FUNCTIONS_T stream_cookie_functions = diff --git a/main/streams/filter.c b/main/streams/filter.c index e08efe643..02aaf644f 100644 --- a/main/streams/filter.c +++ b/main/streams/filter.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: filter.c 273087 2009-01-08 17:01:58Z lbarnaud $ */ +/* $Id: filter.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php.h" #include "php_globals.h" diff --git a/main/streams/glob_wrapper.c b/main/streams/glob_wrapper.c index 955aa806f..cf5976738 100755 --- a/main/streams/glob_wrapper.c +++ b/main/streams/glob_wrapper.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: glob_wrapper.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: glob_wrapper.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php.h" #include "php_streams_int.h" diff --git a/main/streams/memory.c b/main/streams/memory.c index 062524649..099194719 100644 --- a/main/streams/memory.c +++ b/main/streams/memory.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: memory.c 289437 2009-10-09 17:45:03Z pajoye $ */ +/* $Id: memory.c 293036 2010-01-03 09:23:27Z sebastian $ */ #define _GNU_SOURCE #include "php.h" diff --git a/main/streams/mmap.c b/main/streams/mmap.c index 78d8a66ea..2e75aad8a 100644 --- a/main/streams/mmap.c +++ b/main/streams/mmap.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: mmap.c 280678 2009-05-17 14:58:10Z lbarnaud $ */ +/* $Id: mmap.c 293036 2010-01-03 09:23:27Z sebastian $ */ /* Memory Mapping interface for streams */ #include "php.h" diff --git a/main/streams/php_stream_context.h b/main/streams/php_stream_context.h index a45808b25..fb244266e 100644 --- a/main/streams/php_stream_context.h +++ b/main/streams/php_stream_context.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_stream_context.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_stream_context.h 293036 2010-01-03 09:23:27Z sebastian $ */ /* Stream context and status notification related definitions */ diff --git a/main/streams/php_stream_filter_api.h b/main/streams/php_stream_filter_api.h index 4f1477008..7eb36935c 100644 --- a/main/streams/php_stream_filter_api.h +++ b/main/streams/php_stream_filter_api.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -19,7 +19,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_stream_filter_api.h 273087 2009-01-08 17:01:58Z lbarnaud $ */ +/* $Id: php_stream_filter_api.h 293036 2010-01-03 09:23:27Z sebastian $ */ /* The filter API works on the principle of "Bucket-Brigades". This is * partially inspired by the Apache 2 method of doing things, although diff --git a/main/streams/php_stream_glob_wrapper.h b/main/streams/php_stream_glob_wrapper.h index 63b4cf076..67fd2dd7e 100755 --- a/main/streams/php_stream_glob_wrapper.h +++ b/main/streams/php_stream_glob_wrapper.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_stream_glob_wrapper.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_stream_glob_wrapper.h 293036 2010-01-03 09:23:27Z sebastian $ */ PHPAPI extern php_stream_wrapper php_glob_stream_wrapper; PHPAPI extern php_stream_ops php_glob_stream_ops; diff --git a/main/streams/php_stream_mmap.h b/main/streams/php_stream_mmap.h index a3a2dbf6c..625eae01c 100644 --- a/main/streams/php_stream_mmap.h +++ b/main/streams/php_stream_mmap.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_stream_mmap.h 280678 2009-05-17 14:58:10Z lbarnaud $ */ +/* $Id: php_stream_mmap.h 293036 2010-01-03 09:23:27Z sebastian $ */ /* Memory Mapping interface for streams. * The intention is to provide a uniform interface over the most common diff --git a/main/streams/php_stream_plain_wrapper.h b/main/streams/php_stream_plain_wrapper.h index 36031719b..a6532872b 100644 --- a/main/streams/php_stream_plain_wrapper.h +++ b/main/streams/php_stream_plain_wrapper.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_stream_plain_wrapper.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_stream_plain_wrapper.h 293036 2010-01-03 09:23:27Z sebastian $ */ /* definitions for the plain files wrapper */ diff --git a/main/streams/php_stream_transport.h b/main/streams/php_stream_transport.h index ec32b1eb6..1cc378690 100644 --- a/main/streams/php_stream_transport.h +++ b/main/streams/php_stream_transport.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_stream_transport.h 275024 2009-02-02 09:41:46Z pajoye $ */ +/* $Id: php_stream_transport.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef PHP_WIN32 #include "config.w32.h" #include diff --git a/main/streams/php_stream_userspace.h b/main/streams/php_stream_userspace.h index 625c22b21..7147a4b0e 100644 --- a/main/streams/php_stream_userspace.h +++ b/main/streams/php_stream_userspace.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_stream_userspace.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_stream_userspace.h 293036 2010-01-03 09:23:27Z sebastian $ */ /* for user-space streams */ diff --git a/main/streams/php_streams_int.h b/main/streams/php_streams_int.h index b0a1f3327..113c518aa 100644 --- a/main/streams/php_streams_int.h +++ b/main/streams/php_streams_int.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_streams_int.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_streams_int.h 293036 2010-01-03 09:23:27Z sebastian $ */ #if ZEND_DEBUG @@ -49,7 +49,10 @@ #define CHUNK_SIZE 8192 #ifdef PHP_WIN32 -#define EWOULDBLOCK WSAEWOULDBLOCK +# ifdef EWOULDBLOCK +# undef EWOULDBLOCK +# endif +# define EWOULDBLOCK WSAEWOULDBLOCK #endif #ifndef S_ISREG diff --git a/main/streams/plain_wrapper.c b/main/streams/plain_wrapper.c index 549d38292..e7642d9d4 100644 --- a/main/streams/plain_wrapper.c +++ b/main/streams/plain_wrapper.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: plain_wrapper.c 290578 2009-11-12 15:05:03Z johannes $ */ +/* $Id: plain_wrapper.c 295417 2010-02-23 15:04:29Z pajoye $ */ #include "php.h" #include "php_globals.h" @@ -39,6 +39,9 @@ #include "SAPI.h" #include "php_streams_int.h" +#ifdef PHP_WIN32 +# include "win32/winutil.h" +#endif #define php_stream_fopen_from_fd_int(fd, mode, persistent_id) _php_stream_fopen_from_fd_int((fd), (mode), (persistent_id) STREAMS_CC TSRMLS_CC) #define php_stream_fopen_from_fd_int_rel(fd, mode, persistent_id) _php_stream_fopen_from_fd_int((fd), (mode), (persistent_id) STREAMS_REL_CC TSRMLS_CC) @@ -387,9 +390,6 @@ static int php_stdiop_close(php_stream *stream, int close_handle TSRMLS_DC) #endif if (close_handle) { - if (data->lock_flag != LOCK_UN) { - php_stream_lock(stream, LOCK_UN); - } if (data->file) { if (data->is_process_pipe) { errno = 0; @@ -866,6 +866,10 @@ static php_stream *php_plain_files_dir_opener(php_stream_wrapper *wrapper, char dir = VCWD_OPENDIR(path); #ifdef PHP_WIN32 + if (!dir) { + php_win32_docref2_from_error(GetLastError(), path, path TSRMLS_CC); + } + if (dir && dir->finished) { closedir(dir); dir = NULL; @@ -1063,6 +1067,17 @@ static int php_plain_files_rename(php_stream_wrapper *wrapper, char *url_from, c return 0; } +#ifdef PHP_WIN32 + if (!php_win32_check_trailing_space(url_from, strlen(url_from))) { + php_win32_docref2_from_error(ERROR_INVALID_NAME, url_from, url_to TSRMLS_CC); + return 0; + } + if (!php_win32_check_trailing_space(url_to, strlen(url_to))) { + php_win32_docref2_from_error(ERROR_INVALID_NAME, url_from, url_to TSRMLS_CC); + return 0; + } +#endif + if ((p = strstr(url_from, "://")) != NULL) { url_from = p + 3; } @@ -1083,12 +1098,13 @@ static int php_plain_files_rename(php_stream_wrapper *wrapper, char *url_from, c ret = VCWD_RENAME(url_from, url_to); if (ret == -1) { -#ifdef EXDEV +#ifndef PHP_WIN32 +# ifdef EXDEV if (errno == EXDEV) { struct stat sb; if (php_copy_file(url_from, url_to TSRMLS_CC) == SUCCESS) { if (VCWD_STAT(url_from, &sb) == 0) { -#if !defined(TSRM_WIN32) && !defined(NETWARE) +# if !defined(TSRM_WIN32) && !defined(NETWARE) if (VCWD_CHMOD(url_to, sb.st_mode)) { if (errno == EPERM) { php_error_docref2(NULL TSRMLS_CC, url_from, url_to, E_WARNING, "%s", strerror(errno)); @@ -1107,7 +1123,7 @@ static int php_plain_files_rename(php_stream_wrapper *wrapper, char *url_from, c php_error_docref2(NULL TSRMLS_CC, url_from, url_to, E_WARNING, "%s", strerror(errno)); return 0; } -#endif +# endif VCWD_UNLINK(url_from); return 1; } @@ -1115,8 +1131,14 @@ static int php_plain_files_rename(php_stream_wrapper *wrapper, char *url_from, c php_error_docref2(NULL TSRMLS_CC, url_from, url_to, E_WARNING, "%s", strerror(errno)); return 0; } +# endif #endif + +#ifdef PHP_WIN32 + php_win32_docref2_from_error(GetLastError(), url_from, url_to TSRMLS_CC); +#else php_error_docref2(NULL TSRMLS_CC, url_from, url_to, E_WARNING, "%s", strerror(errno)); +#endif return 0; } @@ -1221,6 +1243,9 @@ static int php_plain_files_mkdir(php_stream_wrapper *wrapper, char *dir, int mod static int php_plain_files_rmdir(php_stream_wrapper *wrapper, char *url, int options, php_stream_context *context TSRMLS_DC) { +#if PHP_WIN32 + int url_len = strlen(url); +#endif if (PG(safe_mode) &&(!php_checkuid(url, NULL, CHECKUID_CHECK_FILE_AND_DIR))) { return 0; } @@ -1229,6 +1254,13 @@ static int php_plain_files_rmdir(php_stream_wrapper *wrapper, char *url, int opt return 0; } +#if PHP_WIN32 + if (!php_win32_check_trailing_space(url, url_len)) { + php_error_docref1(NULL TSRMLS_CC, url, E_WARNING, "%s", strerror(ENOENT)); + return 0; + } +#endif + if (VCWD_RMDIR(url) < 0) { php_error_docref1(NULL TSRMLS_CC, url, E_WARNING, "%s", strerror(errno)); return 0; diff --git a/main/streams/streams.c b/main/streams/streams.c index c2b4e3f85..44843d25c 100755 --- a/main/streams/streams.c +++ b/main/streams/streams.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -19,7 +19,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: streams.c 280678 2009-05-17 14:58:10Z lbarnaud $ */ +/* $Id: streams.c 294550 2010-02-05 00:39:31Z pajoye $ */ #define _GNU_SOURCE #include "php.h" @@ -1396,7 +1396,7 @@ PHPAPI size_t _php_stream_copy_to_stream_ex(php_stream *src, php_stream *dest, s /* we've got at least 1 byte to read. * less than 1 is an error */ - if (haveread > 0) { + if (haveread > 0 || src->eof) { return SUCCESS; } return FAILURE; @@ -1858,22 +1858,9 @@ PHPAPI php_stream *_php_stream_open_wrapper_ex(char *path, char *mode, int optio php_stream_wrapper_log_error(wrapper, options ^ REPORT_ERRORS TSRMLS_CC, "wrapper does not support stream open"); } else { - /* refcount++ to make sure the context doesn't get destroyed - * if open() fails and stream is closed */ - if (context) { - zend_list_addref(context->rsrc_id); - } - stream = wrapper->wops->stream_opener(wrapper, path_to_open, mode, options ^ REPORT_ERRORS, opened_path, context STREAMS_REL_CC TSRMLS_CC); - - /* if open() succeeded and context was not used, do refcount-- - * XXX if a wrapper didn't actually use context (no way to know that) - * and open() failed, refcount will stay increased */ - if (context && stream && !stream->context) { - zend_list_delete(context->rsrc_id); - } } /* if the caller asked for a persistent stream but the wrapper did not @@ -1974,7 +1961,17 @@ PHPAPI php_stream *_php_stream_open_wrapper_ex(char *path, char *mode, int optio PHPAPI php_stream_context *php_stream_context_set(php_stream *stream, php_stream_context *context) { php_stream_context *oldcontext = stream->context; + TSRMLS_FETCH(); + stream->context = context; + + if (context) { + zend_list_addref(context->rsrc_id); + } + if (oldcontext) { + zend_list_delete(oldcontext->rsrc_id); + } + return oldcontext; } diff --git a/main/streams/transports.c b/main/streams/transports.c index 1ac6677d9..a35efb2df 100644 --- a/main/streams/transports.c +++ b/main/streams/transports.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: transports.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: transports.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php.h" #include "php_streams_int.h" @@ -134,7 +134,7 @@ PHPAPI php_stream *_php_stream_xport_create(const char *name, long namelen, int context STREAMS_REL_CC TSRMLS_CC); if (stream) { - stream->context = context; + php_stream_context_set(stream, context); if ((flags & STREAM_XPORT_SERVER) == 0) { /* client */ diff --git a/main/streams/userspace.c b/main/streams/userspace.c index 74e2f9173..106cfe621 100644 --- a/main/streams/userspace.c +++ b/main/streams/userspace.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: userspace.c 280151 2009-05-08 11:35:12Z bjori $ */ +/* $Id: userspace.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php.h" #include "php_globals.h" diff --git a/main/streams/xp_socket.c b/main/streams/xp_socket.c index 214c0118b..9b039ca93 100644 --- a/main/streams/xp_socket.c +++ b/main/streams/xp_socket.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: xp_socket.c 289416 2009-10-09 14:20:17Z pajoye $ */ +/* $Id: xp_socket.c 294453 2010-02-03 20:21:40Z pajoye $ */ #include "php.h" #include "ext/standard/file.h" @@ -223,7 +223,11 @@ static int php_sockop_flush(php_stream *stream TSRMLS_DC) static int php_sockop_stat(php_stream *stream, php_stream_statbuf *ssb TSRMLS_DC) { php_netstream_data_t *sock = (php_netstream_data_t*)stream->abstract; +#if ZEND_WIN32 + return 0; +#else return fstat(sock->socket, &ssb->sb); +#endif } static inline int sock_sendto(php_netstream_data_t *sock, char *buf, size_t buflen, int flags, @@ -396,6 +400,10 @@ static int php_sockop_set_option(php_stream *stream, int option, int value, void } #endif + case PHP_STREAM_OPTION_WRITE_BUFFER: + php_stream_set_chunk_size(stream, (ptrparam ? *(size_t *)ptrparam : PHP_SOCK_CHUNK_SIZE)); + return PHP_STREAM_OPTION_RETURN_OK; + default: return PHP_STREAM_OPTION_RETURN_NOTIMPL; } diff --git a/main/strlcat.c b/main/strlcat.c index fe4ca4207..38218dd7c 100644 --- a/main/strlcat.c +++ b/main/strlcat.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: strlcat.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: strlcat.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php.h" diff --git a/main/strlcpy.c b/main/strlcpy.c index d3b474667..6faa21a6c 100644 --- a/main/strlcpy.c +++ b/main/strlcpy.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: strlcpy.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: strlcpy.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php.h" diff --git a/main/win32_internal_function_disabled.h b/main/win32_internal_function_disabled.h index 6681064bd..a2cd16ec1 100644 --- a/main/win32_internal_function_disabled.h +++ b/main/win32_internal_function_disabled.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: win32_internal_function_disabled.h 273638 2009-01-16 13:52:13Z pajoye $ */ +/* $Id: win32_internal_function_disabled.h 293036 2010-01-03 09:23:27Z sebastian $ */ /* 5 means the min version is 5 (XP/2000), 6 (2k8/vista), etc. */ diff --git a/main/win95nt.h b/main/win95nt.h index 789294554..d88f0631b 100644 --- a/main/win95nt.h +++ b/main/win95nt.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: win95nt.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: win95nt.h 293036 2010-01-03 09:23:27Z sebastian $ */ /* Defines and types for Windows 95/NT */ #define HAVE_DECLARED_TIMEZONE diff --git a/netware/start.c b/netware/start.c index 4cb4653f1..43510fc22 100644 --- a/netware/start.c +++ b/netware/start.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | diff --git a/run-tests.php b/run-tests.php index 81f218b10..3eeba95c1 100755 --- a/run-tests.php +++ b/run-tests.php @@ -4,7 +4,7 @@ +----------------------------------------------------------------------+ | PHP Version 5, 6 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -24,7 +24,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: run-tests.php 286503 2009-07-29 10:06:55Z cellog $ */ +/* $Id: run-tests.php 293036 2010-01-03 09:23:27Z sebastian $ */ /* Sanity check to ensure that pcre extension needed by this script is available. * In the event it is not, print a nice error message indicating that this script will @@ -80,6 +80,13 @@ if (PHP_VERSION_ID < 50300) { } } +// (unicode) is available from 6.0.0 +if (PHP_VERSION_ID < 60000) { + define('STRING_TYPE', 'string'); +} else { + define('STRING_TYPE', 'unicode'); +} + // If timezone is not set, use UTC. if (ini_get('date.timezone') == '') { date_default_timezone_set('UTC'); @@ -355,8 +362,8 @@ function save_or_mail_results() if ($sum_results['FAILED']) { foreach ($PHP_FAILED_TESTS['FAILED'] as $test_info) { $failed_tests_data .= $sep . $test_info['name'] . $test_info['info']; - $failed_tests_data .= $sep . file_get_contents(realpath($test_info['output'])); - $failed_tests_data .= $sep . file_get_contents(realpath($test_info['diff'])); + $failed_tests_data .= $sep . file_get_contents(realpath($test_info['output']), FILE_BINARY); + $failed_tests_data .= $sep . file_get_contents(realpath($test_info['diff']), FILE_BINARY); $failed_tests_data .= $sep . "\n\n"; } $status = "failed"; @@ -634,7 +641,7 @@ if (isset($argc) && $argc > 1) { $html_output = is_resource($html_file); break; case '--version': - echo '$Revision: 286503 $' . "\n"; + echo '$Revision: 293036 $' . "\n"; exit(1); default: @@ -1130,6 +1137,21 @@ function show_file_block($file, $block, $section = null) } } +function binary_section($section) +{ + return PHP_MAJOR_VERSION < 6 || + ( + $section == 'FILE' || + $section == 'FILEEOF' || + $section == 'EXPECT' || + $section == 'EXPECTF' || + $section == 'EXPECTREGEX' || + $section == 'EXPECTHEADERS' || + $section == 'SKIPIF' || + $section == 'CLEAN' + ); +} + // // Run an individual test case. // @@ -1159,7 +1181,7 @@ TEST $file // Load the sections of the test file. $section_text = array('TEST' => ''); - $fp = fopen($file, "rt") or error("Cannot open test file: $file"); + $fp = fopen($file, "rb") or error("Cannot open test file: $file"); $borked = false; $bork_info = ''; @@ -1187,28 +1209,42 @@ TEST $file while (!feof($fp)) { $line = fgets($fp); + if ($line === false) { + break; + } + // Match the beginning of a section. - if (preg_match('/^--([_A-Z]+)--/', $line, $r)) { + if (preg_match(b'/^--([_A-Z]+)--/', $line, $r)) { $section = $r[1]; + settype($section, STRING_TYPE); if (isset($section_text[$section])) { $bork_info = "duplicated $section section"; $borked = true; } - $section_text[$section] = ''; + $section_text[$section] = binary_section($section) ? b'' : ''; $secfile = $section == 'FILE' || $section == 'FILEEOF' || $section == 'FILE_EXTERNAL'; $secdone = false; continue; } + if (!binary_section($section)) { + $line = unicode_decode($line, "utf-8"); + if ($line == false) { + $bork_info = "cannot read test"; + $borked = true; + break; + } + } + // Add to the section text. if (!$secdone) { $section_text[$section] .= $line; } // End of actual test? - if ($secfile && preg_match('/^===DONE===\s*$/', $line)) { + if ($secfile && preg_match(b'/^===DONE===\s*$/', $line)) { $secdone = true; } } @@ -1233,7 +1269,7 @@ TEST $file } if (@count($section_text['FILEEOF']) == 1) { - $section_text['FILE'] = preg_replace("/[\r\n]+$/", '', $section_text['FILEEOF']); + $section_text['FILE'] = preg_replace(b"/[\r\n]+$/", b'', $section_text['FILEEOF']); unset($section_text['FILEEOF']); } @@ -1242,7 +1278,7 @@ TEST $file $section_text['FILE_EXTERNAL'] = dirname($file) . '/' . trim(str_replace('..', '', $section_text['FILE_EXTERNAL'])); if (file_exists($section_text['FILE_EXTERNAL'])) { - $section_text['FILE'] = file_get_contents($section_text['FILE_EXTERNAL']); + $section_text['FILE'] = file_get_contents($section_text['FILE_EXTERNAL'], FILE_BINARY); unset($section_text['FILE_EXTERNAL']); } else { $bork_info = "could not load --FILE_EXTERNAL-- " . dirname($file) . '/' . trim($section_text['FILE_EXTERNAL']); @@ -1426,7 +1462,7 @@ TEST $file $env['USE_ZEND_ALLOC'] = '1'; } - $output = system_with_timeout("$extra $php $pass_options -q $ini_settings $test_skipif", $env); + $output = system_with_timeout("$extra $php $pass_options -q $ini_settings -d display_errors=0 $test_skipif", $env); if (!$cfg['keep']['skip']) { @unlink($test_skipif); @@ -1776,7 +1812,9 @@ COMMAND $cmd // quote a non re portion of the string $temp = $temp . preg_quote(substr($wanted_re, $startOffset, ($start - $startOffset)), b'/'); // add the re unquoted. - $temp = $temp . b'(' . substr($wanted_re, $start+2, ($end - $start-2)). b')'; + if ($end > $start) { + $temp = $temp . b'(' . substr($wanted_re, $start+2, ($end - $start-2)). b')'; + } $startOffset = $end + 2; } $wanted_re = $temp; @@ -1956,7 +1994,7 @@ $output function comp_line($l1, $l2, $is_reg) { if ($is_reg) { - return preg_match((binary) "/^$l1$/s", (binary) $l2); + return preg_match(b'/^'. (binary) $l1 . b'$/s', (binary) $l2); } else { return !strcmp((binary) $l1, (binary) $l2); } diff --git a/sapi/aolserver/aolserver.c b/sapi/aolserver/aolserver.c index 2cb8048af..7cc8cdd65 100644 --- a/sapi/aolserver/aolserver.c +++ b/sapi/aolserver/aolserver.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -22,7 +22,7 @@ * - CGI/1.1 conformance */ -/* $Id: aolserver.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: aolserver.c 293036 2010-01-03 09:23:27Z sebastian $ */ /* conflict between PHP and AOLserver headers */ #define Debug php_Debug @@ -205,7 +205,7 @@ static void php_info_aolserver(ZEND_MODULE_INFO_FUNC_ARGS) int i; php_info_print_table_start(); - php_info_print_table_row(2, "SAPI module version", "$Id: aolserver.c 272370 2008-12-31 11:15:49Z sebastian $"); + php_info_print_table_row(2, "SAPI module version", "$Id: aolserver.c 293036 2010-01-03 09:23:27Z sebastian $"); php_info_print_table_row(2, "Build date", Ns_InfoBuildDate()); php_info_print_table_row(2, "Config file path", Ns_InfoConfigFile()); php_info_print_table_row(2, "Error Log path", Ns_InfoErrorLog()); @@ -245,7 +245,7 @@ ZEND_BEGIN_ARG_INFO(arginfo_aolserver_getallheaders, 0) ZEND_END_ARG_INFO() /* }}} */ -const static zend_function_entry aolserver_functions[] = { +static const zend_function_entry aolserver_functions[] = { PHP_FE(getallheaders, arginfo_aolserver_getallheaders) {NULL, NULL, NULL} }; diff --git a/sapi/apache/libpre.c b/sapi/apache/libpre.c index 2fc8c2ac4..ea11f9f70 100644 --- a/sapi/apache/libpre.c +++ b/sapi/apache/libpre.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: libpre.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: libpre.c 293036 2010-01-03 09:23:27Z sebastian $ */ #ifdef NETWARE diff --git a/sapi/apache/mod_php5.c b/sapi/apache/mod_php5.c index ce0f81967..68b2d70cc 100644 --- a/sapi/apache/mod_php5.c +++ b/sapi/apache/mod_php5.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ | PHP 4.0 patches by Zeev Suraski | +----------------------------------------------------------------------+ */ -/* $Id: mod_php5.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: mod_php5.c 294572 2010-02-05 19:34:47Z pajoye $ */ #include "php_apache_http.h" #include "http_conf_globals.h" @@ -196,6 +196,8 @@ static int sapi_apache_header_handler(sapi_header_struct *sapi_header, sapi_head if (!strcasecmp(header_name, "Content-Type")) { r->content_type = pstrdup(r->pool, header_content); + } else if (!strcasecmp(header_name, "Content-Length")) { + ap_set_content_length(r, strtol(header_content, (char **)NULL, 10)); } else if (!strcasecmp(header_name, "Set-Cookie")) { table_add(r->headers_out, header_name, header_content); } else if (op == SAPI_HEADER_REPLACE) { diff --git a/sapi/apache/mod_php5.h b/sapi/apache/mod_php5.h index 7f7c159e1..adbb7831b 100644 --- a/sapi/apache/mod_php5.h +++ b/sapi/apache/mod_php5.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -15,7 +15,7 @@ | Author: Rasmus Lerdorf | +----------------------------------------------------------------------+ */ -/* $Id: mod_php5.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: mod_php5.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef MOD_PHP5_H #define MOD_PHP5_H diff --git a/sapi/apache/php_apache.c b/sapi/apache/php_apache.c index 09e8a6519..e323bfb4a 100644 --- a/sapi/apache/php_apache.c +++ b/sapi/apache/php_apache.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ | David Sklar | +----------------------------------------------------------------------+ */ -/* $Id: php_apache.c 272840 2009-01-05 16:24:26Z iliaa $ */ +/* $Id: php_apache.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php_apache_http.h" diff --git a/sapi/apache/php_apache_http.h b/sapi/apache/php_apache_http.h index 936484a15..44d09275f 100644 --- a/sapi/apache/php_apache_http.h +++ b/sapi/apache/php_apache_http.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_apache_http.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_apache_http.h 293036 2010-01-03 09:23:27Z sebastian $ */ #define NO_REGEX_EXTRA_H diff --git a/sapi/apache/sapi_apache.c b/sapi/apache/sapi_apache.c index dce6e5bcc..c2d97a5b4 100644 --- a/sapi/apache/sapi_apache.c +++ b/sapi/apache/sapi_apache.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -19,7 +19,7 @@ | Stig Bakken | +----------------------------------------------------------------------+ */ -/* $Id: sapi_apache.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: sapi_apache.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php_apache_http.h" diff --git a/sapi/apache2filter/apache_config.c b/sapi/apache2filter/apache_config.c index e06b16856..b9626cb62 100644 --- a/sapi/apache2filter/apache_config.c +++ b/sapi/apache2filter/apache_config.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: apache_config.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: apache_config.c 293036 2010-01-03 09:23:27Z sebastian $ */ #define ZEND_INCLUDE_FULL_WINDOWS_HEADERS diff --git a/sapi/apache2filter/php_apache.h b/sapi/apache2filter/php_apache.h index 3f54fa714..6ec8c3767 100644 --- a/sapi/apache2filter/php_apache.h +++ b/sapi/apache2filter/php_apache.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_apache.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_apache.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_APACHE_H #define PHP_APACHE_H diff --git a/sapi/apache2filter/php_functions.c b/sapi/apache2filter/php_functions.c index d0b662f6c..159e5c5c8 100644 --- a/sapi/apache2filter/php_functions.c +++ b/sapi/apache2filter/php_functions.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_functions.c 272840 2009-01-05 16:24:26Z iliaa $ */ +/* $Id: php_functions.c 293036 2010-01-03 09:23:27Z sebastian $ */ #define ZEND_INCLUDE_FULL_WINDOWS_HEADERS diff --git a/sapi/apache2filter/sapi_apache2.c b/sapi/apache2filter/sapi_apache2.c index 22f368edd..0c6c274f3 100644 --- a/sapi/apache2filter/sapi_apache2.c +++ b/sapi/apache2filter/sapi_apache2.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: sapi_apache2.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: sapi_apache2.c 294572 2010-02-05 19:34:47Z pajoye $ */ #include @@ -127,6 +127,8 @@ php_apache_sapi_header_handler(sapi_header_struct *sapi_header, sapi_header_op_e if (!strcasecmp(sapi_header->header, "content-type")) ctx->r->content_type = apr_pstrdup(ctx->r->pool, val); + else if (!strcasecmp(sapi_header->header, "content-length")) + ap_set_content_length(ctx->r, strtol(val, (char **)NULL, 10)); else if (op == SAPI_HEADER_REPLACE) apr_table_set(ctx->r->headers_out, sapi_header->header, val); else diff --git a/sapi/apache2handler/apache_config.c b/sapi/apache2handler/apache_config.c index 8057050e4..15e25b5fa 100644 --- a/sapi/apache2handler/apache_config.c +++ b/sapi/apache2handler/apache_config.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: apache_config.c 272413 2008-12-31 14:45:14Z bjori $ */ +/* $Id: apache_config.c 293036 2010-01-03 09:23:27Z sebastian $ */ #define ZEND_INCLUDE_FULL_WINDOWS_HEADERS diff --git a/sapi/apache2handler/mod_php5.c b/sapi/apache2handler/mod_php5.c index 038a7122a..56ec28b2f 100644 --- a/sapi/apache2handler/mod_php5.c +++ b/sapi/apache2handler/mod_php5.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: mod_php5.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: mod_php5.c 293036 2010-01-03 09:23:27Z sebastian $ */ #define ZEND_INCLUDE_FULL_WINDOWS_HEADERS diff --git a/sapi/apache2handler/php_apache.h b/sapi/apache2handler/php_apache.h index 8573967a9..a7ad1cc86 100644 --- a/sapi/apache2handler/php_apache.h +++ b/sapi/apache2handler/php_apache.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_apache.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_apache.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_APACHE_H #define PHP_APACHE_H diff --git a/sapi/apache2handler/php_functions.c b/sapi/apache2handler/php_functions.c index 87bed1113..8f8dd3446 100644 --- a/sapi/apache2handler/php_functions.c +++ b/sapi/apache2handler/php_functions.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_functions.c 273971 2009-01-19 19:32:40Z scottmac $ */ +/* $Id: php_functions.c 293036 2010-01-03 09:23:27Z sebastian $ */ #define ZEND_INCLUDE_FULL_WINDOWS_HEADERS diff --git a/sapi/apache2handler/sapi_apache2.c b/sapi/apache2handler/sapi_apache2.c index 62504af42..d54ce4bd3 100644 --- a/sapi/apache2handler/sapi_apache2.c +++ b/sapi/apache2handler/sapi_apache2.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: sapi_apache2.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: sapi_apache2.c 294572 2010-02-05 19:34:47Z pajoye $ */ #define ZEND_INCLUDE_FULL_WINDOWS_HEADERS @@ -109,7 +109,7 @@ php_apache_sapi_header_handler(sapi_header_struct *sapi_header, sapi_header_op_e ptr = val; *val = '\0'; - + do { val++; } while (*val == ' '); @@ -119,6 +119,8 @@ php_apache_sapi_header_handler(sapi_header_struct *sapi_header, sapi_header_op_e efree(ctx->content_type); } ctx->content_type = estrdup(val); + } else if (!strcasecmp(sapi_header->header, "content-length")) { + ap_set_content_length(ctx->r, strtol(val, (char **)NULL, 10)); } else if (op == SAPI_HEADER_REPLACE) { apr_table_set(ctx->r->headers_out, sapi_header->header, val); } else { @@ -151,8 +153,8 @@ php_apache_sapi_send_headers(sapi_headers_struct *sapi_headers TSRMLS_DC) apr_table_set(ctx->r->subprocess_env, "force-response-1.0", "true"); } } - - /* call ap_set_content_type only once, else each time we call it, + + /* call ap_set_content_type only once, else each time we call it, configured output filters for that content type will be added */ if (!ctx->content_type) { ctx->content_type = sapi_get_default_content_type(TSRMLS_C); @@ -192,7 +194,7 @@ php_apache_sapi_read_post(char *buf, uint count_bytes TSRMLS_DC) buf += len; len = count_bytes - tlen; } - + return tlen; } @@ -238,7 +240,11 @@ php_apache_sapi_getenv(char *name, size_t name_len TSRMLS_DC) { php_struct *ctx = SG(server_context); const char *env_var; - + + if (ctx == NULL) { + return NULL; + } + env_var = apr_table_get(ctx->r->subprocess_env, name); return (char *) env_var; @@ -316,7 +322,8 @@ static void php_apache_sapi_log_message_ex(char *msg, request_rec *r) } } -static time_t php_apache_sapi_get_request_time(TSRMLS_D) { +static time_t php_apache_sapi_get_request_time(TSRMLS_D) +{ php_struct *ctx = SG(server_context); return apr_time_sec(ctx->r->request_time); } @@ -500,12 +507,12 @@ typedef struct { uint str_len; php_conf_rec *c = ap_get_module_config(r->per_dir_config, &php5_module); - for (zend_hash_internal_pointer_reset(&c->config); - zend_hash_get_current_key_ex(&c->config, &str, &str_len, NULL, 0, NULL) == HASH_KEY_IS_STRING; - zend_hash_move_forward(&c->config) + for (zend_hash_internal_pointer_reset(&c->config); + zend_hash_get_current_key_ex(&c->config, &str, &str_len, NULL, 0, NULL) == HASH_KEY_IS_STRING; + zend_hash_move_forward(&c->config) ) { zend_restore_ini_entry(str, str_len, ZEND_INI_STAGE_SHUTDOWN); - } + } } if (p) { ((php_struct *)SG(server_context))->r = p; @@ -555,7 +562,7 @@ normal: } /* Give a 404 if PATH_INFO is used but is explicitly disabled in - * the configuration; default behaviour is to accept. */ + * the configuration; default behaviour is to accept. */ if (r->used_path_info == AP_REQ_REJECT_PATH_INFO && r->path_info && r->path_info[0]) { PHPAP_INI_OFF; @@ -603,17 +610,17 @@ zend_first_try { if (!parent_req) { parent_req = ctx->r; } - if (parent_req && parent_req->handler && - strcmp(parent_req->handler, PHP_MAGIC_TYPE) && - strcmp(parent_req->handler, PHP_SOURCE_MAGIC_TYPE) && + if (parent_req && parent_req->handler && + strcmp(parent_req->handler, PHP_MAGIC_TYPE) && + strcmp(parent_req->handler, PHP_SOURCE_MAGIC_TYPE) && strcmp(parent_req->handler, PHP_SCRIPT)) { if (php_apache_request_ctor(r, ctx TSRMLS_CC)!=SUCCESS) { zend_bailout(); } } - - /* - * check if comming due to ErrorDocument + + /* + * check if comming due to ErrorDocument * We make a special exception of 413 (Invalid POST request) as the invalidity of the request occurs * during processing of the request by PHP during POST processing. Therefor we need to re-use the exiting * PHP instance to handle the request rather then creating a new one. diff --git a/sapi/apache_hooks/mod_php5.c b/sapi/apache_hooks/mod_php5.c index 53d38ec91..03ded2294 100644 --- a/sapi/apache_hooks/mod_php5.c +++ b/sapi/apache_hooks/mod_php5.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ | PHP 4.0 patches by Zeev Suraski | +----------------------------------------------------------------------+ */ -/* $Id: mod_php5.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: mod_php5.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php_apache_http.h" diff --git a/sapi/apache_hooks/mod_php5.h b/sapi/apache_hooks/mod_php5.h index 4bb98ad04..229ba3e81 100644 --- a/sapi/apache_hooks/mod_php5.h +++ b/sapi/apache_hooks/mod_php5.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -15,7 +15,7 @@ | Author: Rasmus Lerdorf | +----------------------------------------------------------------------+ */ -/* $Id: mod_php5.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: mod_php5.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef MOD_PHP5_H #define MOD_PHP5_H diff --git a/sapi/apache_hooks/php_apache.c b/sapi/apache_hooks/php_apache.c index f26328645..4bc0b14ff 100644 --- a/sapi/apache_hooks/php_apache.c +++ b/sapi/apache_hooks/php_apache.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ | David Sklar | +----------------------------------------------------------------------+ */ -/* $Id: php_apache.c 277250 2009-03-16 10:13:18Z pajoye $ */ +/* $Id: php_apache.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php_apache_http.h" diff --git a/sapi/apache_hooks/sapi_apache.c b/sapi/apache_hooks/sapi_apache.c index c4a26af07..0dbee9d36 100644 --- a/sapi/apache_hooks/sapi_apache.c +++ b/sapi/apache_hooks/sapi_apache.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -19,7 +19,7 @@ | Stig Bakken | +----------------------------------------------------------------------+ */ -/* $Id: sapi_apache.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: sapi_apache.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php_apache_http.h" diff --git a/sapi/caudium/caudium.c b/sapi/caudium/caudium.c index c1d89a3a7..4b59c5781 100644 --- a/sapi/caudium/caudium.c +++ b/sapi/caudium/caudium.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: caudium.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: caudium.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php.h" #ifdef HAVE_CAUDIUM @@ -444,7 +444,7 @@ static void php_info_caudium(ZEND_MODULE_INFO_FUNC_ARGS) { /* char buf[512]; */ php_info_print_table_start(); - php_info_print_table_row(2, "SAPI module version", "$Id: caudium.c 272370 2008-12-31 11:15:49Z sebastian $"); + php_info_print_table_row(2, "SAPI module version", "$Id: caudium.c 293036 2010-01-03 09:23:27Z sebastian $"); /* php_info_print_table_row(2, "Build date", Ns_InfoBuildDate()); php_info_print_table_row(2, "Config file path", Ns_InfoConfigFile()); php_info_print_table_row(2, "Error Log path", Ns_InfoErrorLog()); diff --git a/sapi/cgi/cgi_main.c b/sapi/cgi/cgi_main.c index c01dce1dd..c189d3de9 100644 --- a/sapi/cgi/cgi_main.c +++ b/sapi/cgi/cgi_main.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -21,7 +21,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: cgi_main.c 289795 2009-10-20 12:57:44Z tony2001 $ */ +/* $Id: cgi_main.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php.h" #include "php_globals.h" @@ -1634,8 +1634,9 @@ int main(int argc, char *argv[]) * in case some server does something different than above */ (!CGIG(redirect_status_env) || !getenv(CGIG(redirect_status_env))) ) { - SG(sapi_headers).http_response_code = 400; - PUTS("Security Alert! The PHP CGI cannot be accessed directly.\n\n\ + zend_try { + SG(sapi_headers).http_response_code = 400; + PUTS("Security Alert! The PHP CGI cannot be accessed directly.\n\n\

    This PHP CGI binary was compiled with force-cgi-redirect enabled. This\n\ means that a page will only be served up if the REDIRECT_STATUS CGI variable is\n\ set, e.g. via an Apache Action directive.

    \n\ @@ -1644,7 +1645,8 @@ manual page for CGI security.

    \n\

    For more information about changing this behaviour or re-enabling this webserver,\n\ consult the installation file that came with this distribution, or visit \n\ the manual page.

    \n"); - + } zend_catch { + } zend_end_try(); #if defined(ZTS) && !defined(PHP_DEBUG) /* XXX we're crashing here in msvc6 debug builds at * php_message_handler_for_zend:839 because @@ -1922,9 +1924,9 @@ consult the installation file that came with this distribution, or visit \n\ SG(request_info).no_headers = 1; } #if ZEND_DEBUG - php_printf("PHP %s (%s) (built: %s %s) (DEBUG)\nCopyright (c) 1997-2009 The PHP Group\n%s", PHP_VERSION, sapi_module.name, __DATE__, __TIME__, get_zend_version()); + php_printf("PHP %s (%s) (built: %s %s) (DEBUG)\nCopyright (c) 1997-2010 The PHP Group\n%s", PHP_VERSION, sapi_module.name, __DATE__, __TIME__, get_zend_version()); #else - php_printf("PHP %s (%s) (built: %s %s)\nCopyright (c) 1997-2009 The PHP Group\n%s", PHP_VERSION, sapi_module.name, __DATE__, __TIME__, get_zend_version()); + php_printf("PHP %s (%s) (built: %s %s)\nCopyright (c) 1997-2010 The PHP Group\n%s", PHP_VERSION, sapi_module.name, __DATE__, __TIME__, get_zend_version()); #endif php_request_shutdown((void *) 0); exit_status = 0; @@ -2040,13 +2042,16 @@ consult the installation file that came with this distribution, or visit \n\ */ if (cgi || fastcgi || SG(request_info).path_translated) { if (php_fopen_primary_script(&file_handle TSRMLS_CC) == FAILURE) { - if (errno == EACCES) { - SG(sapi_headers).http_response_code = 403; - PUTS("Access denied.\n"); - } else { - SG(sapi_headers).http_response_code = 404; - PUTS("No input file specified.\n"); - } + zend_try { + if (errno == EACCES) { + SG(sapi_headers).http_response_code = 403; + PUTS("Access denied.\n"); + } else { + SG(sapi_headers).http_response_code = 404; + PUTS("No input file specified.\n"); + } + } zend_catch { + } zend_end_try(); /* we want to serve more requests if this is fastcgi * so cleanup and continue, request shutdown is * handled later */ diff --git a/sapi/cgi/fastcgi.c b/sapi/cgi/fastcgi.c index 156a689c5..df2dc3169 100644 --- a/sapi/cgi/fastcgi.c +++ b/sapi/cgi/fastcgi.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: fastcgi.c 287777 2009-08-26 19:17:32Z pajoye $ */ +/* $Id: fastcgi.c 293777 2010-01-20 16:02:28Z johannes $ */ #include "php.h" #include "fastcgi.h" @@ -255,6 +255,9 @@ void fcgi_shutdown(void) zend_hash_destroy(&fcgi_mgmt_vars); } is_fastcgi = 0; + if (allowed_clients) { + free(allowed_clients); + } } #ifdef _WIN32 diff --git a/sapi/cgi/fastcgi.h b/sapi/cgi/fastcgi.h index c4f62b8da..76217379b 100644 --- a/sapi/cgi/fastcgi.h +++ b/sapi/cgi/fastcgi.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: fastcgi.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: fastcgi.h 293036 2010-01-03 09:23:27Z sebastian $ */ /* FastCGI protocol */ diff --git a/sapi/cli/php.1.in b/sapi/cli/php.1.in index 52161973d..c800e127f 100644 --- a/sapi/cli/php.1.in +++ b/sapi/cli/php.1.in @@ -1,4 +1,4 @@ -.TH PHP 1 "2009" "The PHP Group" "Scripting Language" +.TH PHP 1 "2010" "The PHP Group" "Scripting Language" .SH NAME .TP 15 php \- PHP Command Line Interface 'CLI' @@ -69,7 +69,7 @@ specified by \-F to be executed. You can access the input line by \fB$argn\fP. While processing the input lines .B $argi contains the number of the actual line being processed. Further more -the paramters \-B and \-E can be used to execute +the parameters \-B and \-E can be used to execute .IR code (see \-r) before and after all input lines have been processed respectively. Notice that the @@ -304,6 +304,9 @@ Shows information about extension .IR name Shows configuration for extension .B name +.TP +.B \-\-ini +Show configuration file names .SH FILES .TP 15 .B php\-cli.ini @@ -315,7 +318,7 @@ The standard configuration file will only be used when cannot be found. .SH EXAMPLES .TP 5 -\fIphp -r 'echo "Hello World\\n";'\fP +\fIphp \-r 'echo "Hello World\\n";'\fP This command simply writes the text "Hello World" to standard out. .TP \fIphp \-r 'print_r(gd_info());'\fP @@ -339,7 +342,7 @@ configuration information. If you then combine those two Using this PHP command you can count the lines being input. .TP \fIphp \-R '@$l+=count(file($argn));' \-E 'echo "Lines:$l\\n";'\fP -In this example PHP expects each input line beeing a file. It counts all lines +In this example PHP expects each input line being a file. It counts all lines of the files specified by each input line and shows the summarized result. You may combine this with tools like find and change the php scriptlet. .TP @@ -366,7 +369,7 @@ such a first line as shown below: .PD 1 .P .SH SEE ALSO -For a description of PHP see: +For a more or less complete description of PHP look here: .PD 0 .P .B http://www.php.net/manual/ @@ -395,7 +398,7 @@ contributors all around the world. .SH VERSION INFORMATION This manpage describes \fBphp\fP, version @PHP_VERSION@. .SH COPYRIGHT -Copyright \(co 1997\-2009 The PHP Group +Copyright \(co 1997\-2010 The PHP Group .LP This source file is subject to version 3.01 of the PHP license, that is bundled with this package in the file LICENSE, and is diff --git a/sapi/cli/php_cli.c b/sapi/cli/php_cli.c index aeade0940..2b372906b 100644 --- a/sapi/cli/php_cli.c +++ b/sapi/cli/php_cli.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -20,7 +20,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_cli.c 287973 2009-09-02 20:02:17Z pajoye $ */ +/* $Id: php_cli.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php.h" #include "php_globals.h" @@ -76,8 +76,10 @@ #endif #if (HAVE_LIBREADLINE || HAVE_LIBEDIT) && !defined(COMPILE_DL_READLINE) +#if HAVE_LIBEDIT +#include +#else #include -#if !HAVE_LIBEDIT #include #endif #include "php_cli_readline.h" @@ -829,7 +831,7 @@ int main(int argc, char *argv[]) } request_started = 1; - php_printf("PHP %s (%s) (built: %s %s) %s\nCopyright (c) 1997-2009 The PHP Group\n%s", + php_printf("PHP %s (%s) (built: %s %s) %s\nCopyright (c) 1997-2010 The PHP Group\n%s", PHP_VERSION, sapi_module.name, __DATE__, __TIME__, #if ZEND_DEBUG && defined(HAVE_GCOV) "(DEBUG GCOV)", diff --git a/sapi/cli/php_cli_readline.c b/sapi/cli/php_cli_readline.c index 66010d7b0..f76f94885 100644 --- a/sapi/cli/php_cli_readline.c +++ b/sapi/cli/php_cli_readline.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_cli_readline.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_cli_readline.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php.h" @@ -49,8 +49,10 @@ #include #endif +#if HAVE_LIBEDIT +#include +#else #include -#if !HAVE_LIBEDIT #include #endif diff --git a/sapi/cli/php_cli_readline.h b/sapi/cli/php_cli_readline.h index d2fd65935..ce68321bc 100644 --- a/sapi/cli/php_cli_readline.h +++ b/sapi/cli/php_cli_readline.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_cli_readline.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_cli_readline.h 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php.h" diff --git a/sapi/cli/tests/006.phpt b/sapi/cli/tests/006.phpt index e322d7ef7..530bfbd9f 100644 --- a/sapi/cli/tests/006.phpt +++ b/sapi/cli/tests/006.phpt @@ -79,7 +79,7 @@ string(%d) "Extension [ extension #%d pcre version ] { - Parameters [5] { Parameter #0 [ $regex ] Parameter #1 [ $replace ] - Parameter #2 [ $subject ] + Parameter #2 [ $subject ] Parameter #3 [ $limit ] Parameter #4 [ &$count ] } @@ -99,7 +99,7 @@ string(%d) "Extension [ extension #%d pcre version ] { - Parameters [5] { Parameter #0 [ $regex ] Parameter #1 [ $replace ] - Parameter #2 [ $subject ] + Parameter #2 [ $subject ] Parameter #3 [ $limit ] Parameter #4 [ &$count ] } diff --git a/sapi/continuity/capi.c b/sapi/continuity/capi.c index 250fa1424..9e9421112 100644 --- a/sapi/continuity/capi.c +++ b/sapi/continuity/capi.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -110,7 +110,7 @@ PHP_MSHUTDOWN_FUNCTION(continuity) PHP_MINFO_FUNCTION(continuity) { php_info_print_table_start(); - php_info_print_table_row(2, "Continuity Module Revision", "$Revision: 272370 $"); + php_info_print_table_row(2, "Continuity Module Revision", "$Revision: 293036 $"); php_info_print_table_row(2, "Server Version", conFget_build()); #ifdef CONTINUITY_CDPEXT php_info_print_table_row(2,"CDP Extensions", "enabled"); diff --git a/sapi/embed/php_embed.c b/sapi/embed/php_embed.c index e32c3a387..85040b19f 100644 --- a/sapi/embed/php_embed.c +++ b/sapi/embed/php_embed.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -15,7 +15,7 @@ | Author: Edin Kadribasic | +----------------------------------------------------------------------+ */ -/* $Id: php_embed.c 286569 2009-07-30 20:20:56Z garretts $ */ +/* $Id: php_embed.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php_embed.h" #include "ext/standard/php_standard.h" diff --git a/sapi/embed/php_embed.h b/sapi/embed/php_embed.h index 19d1c982e..983b1aaad 100644 --- a/sapi/embed/php_embed.h +++ b/sapi/embed/php_embed.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -15,7 +15,7 @@ | Author: Edin Kadribasic | +----------------------------------------------------------------------+ */ -/* $Id: php_embed.h 286569 2009-07-30 20:20:56Z garretts $ */ +/* $Id: php_embed.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef _PHP_EMBED_H_ #define _PHP_EMBED_H_ diff --git a/sapi/isapi/php5isapi.c b/sapi/isapi/php5isapi.c index 0f44efe4a..60e37b9c6 100644 --- a/sapi/isapi/php5isapi.c +++ b/sapi/isapi/php5isapi.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ | Ben Mansell (Zeus Support) | +----------------------------------------------------------------------+ */ -/* $Id: php5isapi.c 278022 2009-03-30 14:24:16Z kalle $ */ +/* $Id: php5isapi.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php.h" #include diff --git a/sapi/milter/php_milter.c b/sapi/milter/php_milter.c index baa62b2de..22f58c3cf 100644 --- a/sapi/milter/php_milter.c +++ b/sapi/milter/php_milter.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_milter.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_milter.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php.h" #include "php_globals.h" @@ -1102,7 +1102,7 @@ int main(int argc, char *argv[]) } SG(headers_sent) = 1; SG(request_info).no_headers = 1; - php_printf("PHP %s (%s) (built: %s %s)\nCopyright (c) 1997-2009 The PHP Group\n%s", PHP_VERSION, sapi_module.name, __DATE__, __TIME__, get_zend_version()); + php_printf("PHP %s (%s) (built: %s %s)\nCopyright (c) 1997-2010 The PHP Group\n%s", PHP_VERSION, sapi_module.name, __DATE__, __TIME__, get_zend_version()); php_end_ob_buffers(1 TSRMLS_CC); exit(1); break; diff --git a/sapi/nsapi/nsapi.c b/sapi/nsapi/nsapi.c index cf088b1d6..dc6eb4019 100644 --- a/sapi/nsapi/nsapi.c +++ b/sapi/nsapi/nsapi.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: nsapi.c 286722 2009-08-03 10:13:49Z thetaphi $ */ +/* $Id: nsapi.c 293036 2010-01-03 09:23:27Z sebastian $ */ /* * PHP includes @@ -68,6 +68,12 @@ */ #include "nsapi.h" +/* fix for gcc4 visibility issue */ +#ifndef PHP_WIN32 +# undef NSAPI_PUBLIC +# define NSAPI_PUBLIC PHPAPI +#endif + #define NSLS_D struct nsapi_request_context *request_context #define NSLS_DC , NSLS_D #define NSLS_C request_context @@ -131,14 +137,6 @@ static size_t nsapi_client_size = sizeof(nsapi_client)/sizeof(nsapi_client[0]); /* this parameters to "Service"/"Error" are NSAPI ones which should not be php.ini keys and are excluded */ static char *nsapi_exclude_from_ini_entries[] = { "fn", "type", "method", "directive", "code", "reason", "script", "bucket", NULL }; -static char *nsapi_strdup(char *str) -{ - if (str != NULL) { - return STRDUP(str); - } - return NULL; -} - static void nsapi_free(void *addr) { if (addr != NULL) { @@ -314,7 +312,7 @@ PHP_MSHUTDOWN_FUNCTION(nsapi) PHP_MINFO_FUNCTION(nsapi) { php_info_print_table_start(); - php_info_print_table_row(2, "NSAPI Module Revision", "$Revision: 286722 $"); + php_info_print_table_row(2, "NSAPI Module Revision", "$Revision: 293036 $"); php_info_print_table_row(2, "Server Software", system_version()); php_info_print_table_row(2, "Sub-requests with nsapi_virtual()", (nsapi_servact_service)?((zend_ini_long("zlib.output_compression", sizeof("zlib.output_compression"), 0))?"not supported with zlib.output_compression":"enabled"):"not supported on this platform" ); @@ -500,7 +498,7 @@ static int php_nsapi_remove_header(sapi_header_struct *sapi_header TSRMLS_DC) nsapi_request_context *rc = (nsapi_request_context *)SG(server_context); /* copy the header, because NSAPI needs reformatting and we do not want to change the parameter */ - header_name = nsapi_strdup(sapi_header->header); + header_name = pool_strdup(rc->sn->pool, sapi_header->header); /* extract name, this works, if only the header without ':' is given, too */ if (p = strchr(header_name, ':')) { @@ -514,7 +512,7 @@ static int php_nsapi_remove_header(sapi_header_struct *sapi_header TSRMLS_DC) /* remove the header */ param_free(pblock_remove(header_name, rc->rq->srvhdrs)); - nsapi_free(header_name); + pool_free(rc->sn->pool, header_name); return ZEND_HASH_APPLY_KEEP; } @@ -538,7 +536,7 @@ static int sapi_nsapi_header_handler(sapi_header_struct *sapi_header, sapi_heade case SAPI_HEADER_ADD: case SAPI_HEADER_REPLACE: /* copy the header, because NSAPI needs reformatting and we do not want to change the parameter */ - header_name = nsapi_strdup(sapi_header->header); + header_name = pool_strdup(rc->sn->pool, sapi_header->header); /* split header and align pointer for content */ header_content = strchr(header_name, ':'); @@ -561,7 +559,7 @@ static int sapi_nsapi_header_handler(sapi_header_struct *sapi_header, sapi_heade pblock_nvinsert(header_name, header_content, rc->rq->srvhdrs); } - nsapi_free(header_name); + pool_free(rc->sn->pool, header_name); return SAPI_HEADER_ADD; default: @@ -734,8 +732,8 @@ static void sapi_nsapi_register_server_variables(zval *track_vars_array TSRMLS_D /* DOCUMENT_ROOT */ if (value = request_translate_uri("/", rc->sn)) { - value[strlen(value) - 1] = '\0'; - php_register_variable("DOCUMENT_ROOT", value, track_vars_array TSRMLS_CC); + pos = strlen(value); + php_register_variable_safe("DOCUMENT_ROOT", value, pos-1, track_vars_array TSRMLS_CC); nsapi_free(value); } @@ -750,6 +748,8 @@ static void sapi_nsapi_register_server_variables(zval *track_vars_array TSRMLS_D /* Create full Request-URI & Script-Name */ if (SG(request_info).request_uri) { + pos = strlen(SG(request_info).request_uri); + if (SG(request_info).query_string) { spprintf(&value, 0, "%s?%s", SG(request_info).request_uri, SG(request_info).query_string); if (value) { @@ -757,21 +757,16 @@ static void sapi_nsapi_register_server_variables(zval *track_vars_array TSRMLS_D efree(value); } } else { - php_register_variable("REQUEST_URI", SG(request_info).request_uri, track_vars_array TSRMLS_CC); + php_register_variable_safe("REQUEST_URI", SG(request_info).request_uri, pos, track_vars_array TSRMLS_CC); } - if (value = nsapi_strdup(SG(request_info).request_uri)) { - if (rc->path_info) { - pos = strlen(SG(request_info).request_uri) - strlen(rc->path_info); - if (pos>=0) { - value[pos] = '\0'; - } else { - value[0]='\0'; - } + if (rc->path_info) { + pos -= strlen(rc->path_info); + if (pos<0) { + pos = 0; } - php_register_variable("SCRIPT_NAME", value, track_vars_array TSRMLS_CC); - nsapi_free(value); } + php_register_variable_safe("SCRIPT_NAME", SG(request_info).request_uri, pos, track_vars_array TSRMLS_CC); } php_register_variable("SCRIPT_FILENAME", SG(request_info).path_translated, track_vars_array TSRMLS_CC); @@ -1014,21 +1009,25 @@ int NSAPI_PUBLIC php5_execute(pblock *pb, Session *sn, Request *rq) } } - request_context = (nsapi_request_context *)MALLOC(sizeof(nsapi_request_context)); + request_context = (nsapi_request_context *)pool_malloc(sn->pool, sizeof(nsapi_request_context)); + if (!request_context) { + log_error(LOG_CATASTROPHE, pblock_findval("fn", pb), sn, rq, "Insufficient memory to process PHP request!"); + return REQ_ABORTED; + } request_context->pb = pb; request_context->sn = sn; request_context->rq = rq; request_context->read_post_bytes = 0; request_context->fixed_script = fixed_script; request_context->http_error = (error_directive) ? rq->status_num : 0; - request_context->path_info = nsapi_strdup(path_info); + request_context->path_info = path_info; SG(server_context) = request_context; - SG(request_info).query_string = nsapi_strdup(query_string); - SG(request_info).request_uri = nsapi_strdup(uri); - SG(request_info).request_method = nsapi_strdup(request_method); - SG(request_info).path_translated = nsapi_strdup(path_translated); - SG(request_info).content_type = nsapi_strdup(content_type); + SG(request_info).query_string = query_string; + SG(request_info).request_uri = uri; + SG(request_info).request_method = request_method; + SG(request_info).path_translated = path_translated; + SG(request_info).content_type = content_type; SG(request_info).content_length = (content_length == NULL) ? 0 : strtoul(content_length, 0, 0); SG(sapi_headers).http_response_code = (error_directive) ? rq->status_num : 200; @@ -1068,14 +1067,7 @@ int NSAPI_PUBLIC php5_execute(pblock *pb, Session *sn, Request *rq) } } - nsapi_free(request_context->path_info); - nsapi_free(SG(request_info).query_string); - nsapi_free(SG(request_info).request_uri); - nsapi_free((void*)(SG(request_info).request_method)); - nsapi_free(SG(request_info).path_translated); - nsapi_free((void*)(SG(request_info).content_type)); - - FREE(request_context); + pool_free(sn->pool, request_context); SG(server_context) = NULL; return retval; diff --git a/sapi/phttpd/php_phttpd.h b/sapi/phttpd/php_phttpd.h index a827d8cb7..168c58af6 100644 --- a/sapi/phttpd/php_phttpd.h +++ b/sapi/phttpd/php_phttpd.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | diff --git a/sapi/phttpd/phttpd.c b/sapi/phttpd/phttpd.c index 2934abfbf..11df607db 100644 --- a/sapi/phttpd/phttpd.c +++ b/sapi/phttpd/phttpd.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | diff --git a/sapi/pi3web/pi3web_sapi.c b/sapi/pi3web/pi3web_sapi.c index 7af5d5061..f6cd9b614 100644 --- a/sapi/pi3web/pi3web_sapi.c +++ b/sapi/pi3web/pi3web_sapi.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -21,7 +21,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: pi3web_sapi.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: pi3web_sapi.c 293036 2010-01-03 09:23:27Z sebastian $ */ #define ZEND_INCLUDE_FULL_WINDOWS_HEADERS @@ -57,7 +57,7 @@ static void php_info_pi3web(ZEND_MODULE_INFO_FUNC_ARGS) PUTS("\n"); PUTS("\n"); php_info_print_table_header(2, "Information Field", "Value"); - php_info_print_table_row(2, "Pi3Web SAPI module version", "$Id: pi3web_sapi.c 272370 2008-12-31 11:15:49Z sebastian $"); + php_info_print_table_row(2, "Pi3Web SAPI module version", "$Id: pi3web_sapi.c 293036 2010-01-03 09:23:27Z sebastian $"); php_info_print_table_row(2, "Server Name Stamp", HTTPCore_getServerStamp()); snprintf(variable_buf, 511, "%d", HTTPCore_debugEnabled()); php_info_print_table_row(2, "Debug Enabled", variable_buf); diff --git a/sapi/roxen/roxen.c b/sapi/roxen/roxen.c index eabe14d63..614a89e29 100644 --- a/sapi/roxen/roxen.c +++ b/sapi/roxen/roxen.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: roxen.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: roxen.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php.h" #ifdef HAVE_ROXEN @@ -438,7 +438,7 @@ static void php_info_roxen(ZEND_MODULE_INFO_FUNC_ARGS) { /* char buf[512]; */ php_info_print_table_start(); - php_info_print_table_row(2, "SAPI module version", "$Id: roxen.c 272370 2008-12-31 11:15:49Z sebastian $"); + php_info_print_table_row(2, "SAPI module version", "$Id: roxen.c 293036 2010-01-03 09:23:27Z sebastian $"); /* php_info_print_table_row(2, "Build date", Ns_InfoBuildDate()); php_info_print_table_row(2, "Config file path", Ns_InfoConfigFile()); php_info_print_table_row(2, "Error Log path", Ns_InfoErrorLog()); diff --git a/sapi/thttpd/php_thttpd.h b/sapi/thttpd/php_thttpd.h index cc6f4f7bd..43e9ad807 100644 --- a/sapi/thttpd/php_thttpd.h +++ b/sapi/thttpd/php_thttpd.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | diff --git a/sapi/thttpd/thttpd.c b/sapi/thttpd/thttpd.c index 187bddf65..f2530ecf5 100644 --- a/sapi/thttpd/thttpd.c +++ b/sapi/thttpd/thttpd.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: thttpd.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: thttpd.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php.h" #include "SAPI.h" diff --git a/sapi/tux/php_tux.c b/sapi/tux/php_tux.c index c94ed0845..df66a76e7 100644 --- a/sapi/tux/php_tux.c +++ b/sapi/tux/php_tux.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | diff --git a/sapi/webjames/php_webjames.h b/sapi/webjames/php_webjames.h index eac8b11b8..a0532c7a3 100644 --- a/sapi/webjames/php_webjames.h +++ b/sapi/webjames/php_webjames.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | diff --git a/sapi/webjames/webjames.c b/sapi/webjames/webjames.c index 6783b5ed1..bbe5084e6 100644 --- a/sapi/webjames/webjames.c +++ b/sapi/webjames/webjames.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | diff --git a/server-tests.php b/server-tests.php index 42d43998e..051a1cfa0 100755 --- a/server-tests.php +++ b/server-tests.php @@ -3,7 +3,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | diff --git a/tests/basic/bug46313-win.phpt b/tests/basic/bug46313-win.phpt index a85178995..1971e807b 100644 --- a/tests/basic/bug46313-win.phpt +++ b/tests/basic/bug46313-win.phpt @@ -60,6 +60,6 @@ string(12) "o1" bool(true) string(%d) "%s" bool(true) -PHP Warning: Directive 'register_globals' is deprecated in PHP 5.3 and greater in Unknown on line 0 -PHP Warning: Directive 'magic_quotes_gpc' is deprecated in PHP 5.3 and greater in Unknown on line 0 +Warning: Directive 'register_globals' is deprecated in PHP 5.3 and greater in Unknown on line 0 +Warning: Directive 'magic_quotes_gpc' is deprecated in PHP 5.3 and greater in Unknown on line 0 diff --git a/tests/basic/bug46313.phpt b/tests/basic/bug46313.phpt index 275b26796..924114161 100644 --- a/tests/basic/bug46313.phpt +++ b/tests/basic/bug46313.phpt @@ -6,6 +6,7 @@ Bug #46313 (Magic quotes broke $_FILES) magic_quotes_gpc=1 file_uploads=1 register_globals=1 +display_errors=0 --POST_RAW-- Content-Type: multipart/form-data; boundary=---------------------------20896060251896012921717172737 -----------------------------20896060251896012921717172737 diff --git a/tests/basic/bug46759.phpt b/tests/basic/bug46759.phpt index c5db2b9bb..d35cd534c 100644 --- a/tests/basic/bug46759.phpt +++ b/tests/basic/bug46759.phpt @@ -1,6 +1,7 @@ --TEST-- Testing magic_quotes_gpc --INI-- +display_errors=0 magic_quotes_gpc=1 --GET-- a='&b="&c=\" diff --git a/tests/classes/interface_constant_inheritance_001.phpt b/tests/classes/interface_constant_inheritance_001.phpt index ae3e71e7a..f982a4a64 100644 --- a/tests/classes/interface_constant_inheritance_001.phpt +++ b/tests/classes/interface_constant_inheritance_001.phpt @@ -14,4 +14,4 @@ echo "Done\n"; ?> --EXPECTF-- -Fatal error: Cannot inherit previously-inherited constant FOO from interface I1 in %s on line 6 \ No newline at end of file +Fatal error: Cannot inherit previously-inherited or override constant FOO from interface I1 in %s on line 6 diff --git a/tests/classes/interface_constant_inheritance_002.phpt b/tests/classes/interface_constant_inheritance_002.phpt index d5001baa3..af4ce695f 100644 --- a/tests/classes/interface_constant_inheritance_002.phpt +++ b/tests/classes/interface_constant_inheritance_002.phpt @@ -14,4 +14,4 @@ echo "Done\n"; ?> --EXPECTF-- -Fatal error: Cannot inherit previously-inherited constant FOO from interface I in %s on line 6 \ No newline at end of file +Fatal error: Cannot inherit previously-inherited or override constant FOO from interface I in %s on line 6 diff --git a/tests/classes/interface_constant_inheritance_003.phpt b/tests/classes/interface_constant_inheritance_003.phpt index a3ba815ed..6b4139bd9 100644 --- a/tests/classes/interface_constant_inheritance_003.phpt +++ b/tests/classes/interface_constant_inheritance_003.phpt @@ -17,4 +17,4 @@ echo "Done\n"; ?> --EXPECTF-- -Fatal error: Cannot inherit previously-inherited constant FOO from interface I2 in %s on line 10 +Fatal error: Cannot inherit previously-inherited or override constant FOO from interface I2 in %s on line 10 diff --git a/tests/output/ob_011.phpt b/tests/output/ob_011.phpt index 996ed3925..a90fd56f8 100644 --- a/tests/output/ob_011.phpt +++ b/tests/output/ob_011.phpt @@ -1,8 +1,7 @@ --TEST-- output buffering - fatalism --XFAIL-- -This test will fail until the fix in version 1.178 of ext/main/output.c -is backported from php 6 +This test will fail until the fix in revision r214155 is backported from php 6 --FILE-- | # +----------------------------------------------------------------------+ # -# $Id: Makefile 289764 2009-10-19 19:05:58Z pajoye $ +# $Id: Makefile 289763 2009-10-19 19:02:12Z pajoye $ # This is the makefile template for the win32 build CC="$(CL)" diff --git a/win32/build/config.w32 b/win32/build/config.w32 index 67b9fe6fd..5f10c7e6a 100644 --- a/win32/build/config.w32 +++ b/win32/build/config.w32 @@ -1,5 +1,5 @@ // vim:ft=javascript -// $Id: config.w32 289764 2009-10-19 19:05:58Z pajoye $ +// $Id: config.w32 291639 2009-12-03 11:50:32Z kalle $ // "Master" config file; think of it as a configure.in // equivalent. @@ -15,6 +15,7 @@ if (!CL) { // 1310 is vs.net 2003 // 1400 is vs.net 2005 // 1500 is vs.net 2008 +// 1600 is vs.net 2010 // Which version of the compiler do we have? VCVERS = probe_binary(CL).substr(0, 5).replace('.', ''); STDOUT.WriteLine(" Detected compiler " + VC_VERSIONS[VCVERS]); @@ -113,13 +114,13 @@ DEFINE("BASE_INCLUDES", "/I . /I main /I Zend /I TSRM /I ext "); // CFLAGS for building the PHP dll DEFINE("CFLAGS_PHP", "/D _USRDLL /D PHP5DLLTS_EXPORTS /D PHP_EXPORTS \ -/D LIBZEND_EXPORTS /D TSRM_EXPORTS /D SAPI_EXPORTS /D WINVER=0x400"); +/D LIBZEND_EXPORTS /D TSRM_EXPORTS /D SAPI_EXPORTS /D WINVER=0x500"); DEFINE('CFLAGS_PHP_OBJ', '$(CFLAGS_PHP) $(STATIC_EXT_CFLAGS)'); // General CFLAGS for building objects DEFINE("CFLAGS", "/nologo /FD $(BASE_INCLUDES) /D _WINDOWS \ -/D ZEND_WIN32=1 /D PHP_WIN32=1 /D WIN32 /D _MBCS"); +/D ZEND_WIN32=1 /D PHP_WIN32=1 /D WIN32 /D _MBCS /W3 "); if (VCVERS < 1400) { // Enable automatic precompiled headers @@ -147,7 +148,7 @@ if (VCVERS >= 1400) { } } -ARG_WITH('mp', 'Tell VC9 use up to [n,auto,disable] processes for compilation', 'auto'); +ARG_WITH('mp', 'Tell VC9+ use up to [n,auto,disable] processes for compilation', 'auto'); if (VCVERS >= 1500 && PHP_MP != 'disable') { // no from disable-all if(PHP_MP == 'auto' || PHP_MP == 'no') { @@ -177,7 +178,7 @@ DEFINE("LIBS", "kernel32.lib ole32.lib user32.lib advapi32.lib shell32.lib ws2_3 // Set some debug/release specific options if (PHP_DEBUG == "yes") { - ADD_FLAG("CFLAGS", "/LDd /MDd /Gm /Od /D _DEBUG /D ZEND_DEBUG=1 " + + ADD_FLAG("CFLAGS", "/LDd /MDd /W3 /Gm /Od /D _DEBUG /D ZEND_DEBUG=1 " + (X64?"/Zi":"/ZI")); ADD_FLAG("LDFLAGS", "/debug"); // Avoid problems when linking to release libraries that use the release diff --git a/win32/build/config.w32.h.in b/win32/build/config.w32.h.in index e585e0ab5..27ff05258 100644 --- a/win32/build/config.w32.h.in +++ b/win32/build/config.w32.h.in @@ -1,6 +1,6 @@ /* Build Configuration Template for Win32. - $Id: config.w32.h.in 282624 2009-06-23 06:56:45Z kalle $ + $Id: config.w32.h.in 291951 2009-12-10 14:08:19Z pajoye $ */ /* Define the minimum supported version */ @@ -28,6 +28,8 @@ #define PHP_EXT_DES_CRYPT 1 #define PHP_MD5_CRYPT 1 #define PHP_BLOWFISH_CRYPT 1 +#define PHP_SHA512_CRYPT 1 +#define PHP_SHA256_CRYPT 1 /* PHP Runtime Configuration */ #define PHP_URL_FOPEN 1 diff --git a/win32/build/confutils.js b/win32/build/confutils.js index 28b5e0d86..ed3f2424f 100644 --- a/win32/build/confutils.js +++ b/win32/build/confutils.js @@ -41,6 +41,7 @@ VC_VERSIONS[1300] = 'MSVC7 (Visual C++ 2002)'; VC_VERSIONS[1310] = 'MSVC7.1 (Visual C++ 2003)'; VC_VERSIONS[1400] = 'MSVC8 (Visual C++ 2005)'; VC_VERSIONS[1500] = 'MSVC9 (Visual C++ 2008)'; +VC_VERSIONS[1600] = 'MSVC10 (Visual C++ 2010)'; var VC_VERSIONS_SHORT = new Array(); VC_VERSIONS_SHORT[1200] = 'VC6'; @@ -48,6 +49,7 @@ VC_VERSIONS_SHORT[1300] = 'VC7'; VC_VERSIONS_SHORT[1310] = 'VC7.1'; VC_VERSIONS_SHORT[1400] = 'VC8'; VC_VERSIONS_SHORT[1500] = 'VC9'; +VC_VERSIONS_SHORT[1600] = 'VC10'; if (PROGRAM_FILES == null) { PROGRAM_FILES = "C:\\Program Files"; diff --git a/win32/build/deplister.c b/win32/build/deplister.c index f6f1ce5ad..79191f0b6 100644 --- a/win32/build/deplister.c +++ b/win32/build/deplister.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: deplister.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: deplister.c 293036 2010-01-03 09:23:27Z sebastian $ */ /* This little application will list the DLL dependencies for a PE * module to it's stdout for use by distro/installer building tools */ diff --git a/win32/globals.c b/win32/globals.c index f14380aeb..6f8389e6b 100755 --- a/win32/globals.c +++ b/win32/globals.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: globals.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: globals.c 293036 2010-01-03 09:23:27Z sebastian $ */ #include "php.h" #include "php_win32_globals.h" diff --git a/win32/grp.h b/win32/grp.h index 2d9c014f0..fbf226f6d 100644 --- a/win32/grp.h +++ b/win32/grp.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: grp.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: grp.h 293036 2010-01-03 09:23:27Z sebastian $ */ struct group { char *gr_name; diff --git a/win32/php_stdbool.h b/win32/php_stdbool.h new file mode 100644 index 000000000..83c808f60 --- /dev/null +++ b/win32/php_stdbool.h @@ -0,0 +1,11 @@ +#ifndef _STDBOOL_H +#define _STDBOOL_H +#if !defined(__BOOL_DEFINED) +# define bool short + +/* The other macros must be usable in preprocessor directives. */ +# define false 0 +# define true 1 +# define __bool_true_false_are_defined 1 +# endif +#endif /* _STDBOOL_H */ diff --git a/win32/php_stdint.h b/win32/php_stdint.h index 6eb8ce48f..5df1df477 100644 --- a/win32/php_stdint.h +++ b/win32/php_stdint.h @@ -238,7 +238,12 @@ typedef uint64_t uintmax_t; #define INTMAX_C INT64_C #define UINTMAX_C UINT64_C -static __inline int64_t llabs( int64_t i ) { return i >= 0? i: -i; } +#if _MSC_VER < 1600 +static __inline int64_t llabs(int64_t i) +{ + return i >= 0 ? i: -i; +} +#endif #endif // __STDC_CONSTANT_MACROS ] diff --git a/win32/php_win32_globals.h b/win32/php_win32_globals.h index 9d0d653b1..d818aac0f 100755 --- a/win32/php_win32_globals.h +++ b/win32/php_win32_globals.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_win32_globals.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: php_win32_globals.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef PHP_WIN32_GLOBALS_H #define PHP_WIN32_GLOBALS_H diff --git a/win32/select.c b/win32/select.c index 26f729462..b163e3f62 100644 --- a/win32/select.c +++ b/win32/select.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -21,7 +21,7 @@ #ifdef PHP_WIN32 -/* $Id: select.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: select.c 293036 2010-01-03 09:23:27Z sebastian $ */ /* Win32 select() will only work with sockets, so we roll our own implementation here. * - If you supply only sockets, this simply passes through to winsock select(). diff --git a/win32/select.h b/win32/select.h index 7670f57ea..3f3de9e16 100644 --- a/win32/select.h +++ b/win32/select.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: select.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: select.h 293036 2010-01-03 09:23:27Z sebastian $ */ PHPAPI int php_select(int max_fd, fd_set *rfds, fd_set *wfds, fd_set *efds, struct timeval *tv); diff --git a/win32/sockets.c b/win32/sockets.c index 4b3d274e0..44764f782 100644 --- a/win32/sockets.c +++ b/win32/sockets.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -19,7 +19,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: sockets.c 274392 2009-01-23 15:49:49Z kalle $ */ +/* $Id: sockets.c 293036 2010-01-03 09:23:27Z sebastian $ */ /* Code originally from ext/sockets */ diff --git a/win32/sockets.h b/win32/sockets.h index 633137dd9..3d8bc34f1 100644 --- a/win32/sockets.h +++ b/win32/sockets.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -19,7 +19,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: sockets.h 274392 2009-01-23 15:49:49Z kalle $ */ +/* $Id: sockets.h 293036 2010-01-03 09:23:27Z sebastian $ */ /* Code originally from ext/sockets */ diff --git a/win32/syslog.h b/win32/syslog.h index 1270a9524..331ca1151 100644 --- a/win32/syslog.h +++ b/win32/syslog.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: syslog.h 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: syslog.h 293036 2010-01-03 09:23:27Z sebastian $ */ #ifndef SYSLOG_H #define SYSLOG_H diff --git a/win32/winutil.c b/win32/winutil.c index 244ecff3d..7845f8900 100644 --- a/win32/winutil.c +++ b/win32/winutil.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: winutil.c 272370 2008-12-31 11:15:49Z sebastian $ */ +/* $Id: winutil.c 294726 2010-02-07 20:45:46Z pajoye $ */ #include "php.h" @@ -31,3 +31,18 @@ PHPAPI char *php_win_err(int error) return (buf ? (char *) buf : ""); } + +int php_win32_check_trailing_space(const char * path, const int path_len) { + if (path_len < 1) { + return 1; + } + if (path) { + if (path[0] == ' ' || path[path_len - 1] == ' ') { + return 0; + } else { + return 1; + } + } else { + return 0; + } +} diff --git a/win32/winutil.h b/win32/winutil.h index f232d273e..8ee75752d 100644 --- a/win32/winutil.h +++ b/win32/winutil.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2009 The PHP Group | + | Copyright (c) 1997-2010 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -19,3 +19,4 @@ PHPAPI char *php_win_err(int error); #define php_win_err() php_win_err(GetLastError()) +int php_win32_check_trailing_space(const char * path, const int path_len); -- cgit v1.2.3
    Pi3Web Server Information